From 6a7b980a4270360a539230c0d9c73d71b80c6c31 Mon Sep 17 00:00:00 2001 From: Neil Campbell Date: Tue, 23 Dec 2025 23:49:33 +0800 Subject: [PATCH 01/12] chore: updating a portion of the template to use algosdk decoupled packages --- .../projects/p-py-frontend/src/components/AppCalls.tsx | 9 +++++++-- .../projects/p-tls-frontend/src/components/AppCalls.tsx | 9 +++++++-- .../projects/p-ts-frontend/src/components/AppCalls.tsx | 9 +++++++-- .../projects/s-py-frontend/src/components/AppCalls.tsx | 9 +++++++-- .../projects/s-tls-frontend/src/components/AppCalls.tsx | 9 +++++++-- .../projects/s-ts-frontend/src/components/AppCalls.tsx | 9 +++++++-- template_content/inject_content/AppCalls.tsx.jinja | 9 +++++++-- 7 files changed, 49 insertions(+), 14 deletions(-) diff --git a/examples/p-py/projects/p-py-frontend/src/components/AppCalls.tsx b/examples/p-py/projects/p-py-frontend/src/components/AppCalls.tsx index 1268994..55fb808 100644 --- a/examples/p-py/projects/p-py-frontend/src/components/AppCalls.tsx +++ b/examples/p-py/projects/p-py-frontend/src/components/AppCalls.tsx @@ -5,6 +5,7 @@ import { HelloWorldFactory } from '../contracts/HelloWorld' import { OnSchemaBreak, OnUpdate } from '@algorandfoundation/algokit-utils/types/app' import { getAlgodConfigFromViteEnvironment, getIndexerConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' import { AlgorandClient } from '@algorandfoundation/algokit-utils' +import { encodeTransactionRaw } from '@algorandfoundation/algokit-utils/transact' interface AppCallsInterface { openModal: boolean @@ -15,7 +16,7 @@ const AppCalls = ({ openModal, setModalState }: AppCallsInterface) => { const [loading, setLoading] = useState(false) const [contractInput, setContractInput] = useState('') const { enqueueSnackbar } = useSnackbar() - const { transactionSigner, activeAddress } = useWallet() + const { signTransactions, activeAddress } = useWallet() const algodConfig = getAlgodConfigFromViteEnvironment() const indexerConfig = getIndexerConfigFromViteEnvironment() @@ -23,7 +24,11 @@ const AppCalls = ({ openModal, setModalState }: AppCallsInterface) => { algodConfig, indexerConfig, }) - algorand.setDefaultSigner(transactionSigner) + algorand.setDefaultSigner(async (txnGroup, indexesToSign) => { + const encoded = txnGroup.map((txn) => encodeTransactionRaw(txn)) + const signed = await signTransactions(encoded, indexesToSign) + return signed.filter((s): s is Uint8Array => s !== null) + }) const sendAppCall = async () => { setLoading(true) diff --git a/examples/p-tls/projects/p-tls-frontend/src/components/AppCalls.tsx b/examples/p-tls/projects/p-tls-frontend/src/components/AppCalls.tsx index 8a37e8d..a03f337 100644 --- a/examples/p-tls/projects/p-tls-frontend/src/components/AppCalls.tsx +++ b/examples/p-tls/projects/p-tls-frontend/src/components/AppCalls.tsx @@ -4,6 +4,7 @@ import { useState } from 'react' import { CalculatorFactory } from '../contracts/Calculator' import { getAlgodConfigFromViteEnvironment, getIndexerConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' import { AlgorandClient } from '@algorandfoundation/algokit-utils' +import { encodeTransactionRaw } from '@algorandfoundation/algokit-utils/transact' interface AppCallsInterface { openModal: boolean @@ -14,7 +15,7 @@ const AppCalls = ({ openModal, setModalState }: AppCallsInterface) => { const [loading, setLoading] = useState(false) const [contractInput, setContractInput] = useState('') const { enqueueSnackbar } = useSnackbar() - const { transactionSigner, activeAddress } = useWallet() + const { signTransactions, activeAddress } = useWallet() const algodConfig = getAlgodConfigFromViteEnvironment() const indexerConfig = getIndexerConfigFromViteEnvironment() @@ -22,7 +23,11 @@ const AppCalls = ({ openModal, setModalState }: AppCallsInterface) => { algodConfig, indexerConfig, }) - algorand.setDefaultSigner(transactionSigner) + algorand.setDefaultSigner(async (txnGroup, indexesToSign) => { + const encoded = txnGroup.map((txn) => encodeTransactionRaw(txn)) + const signed = await signTransactions(encoded, indexesToSign) + return signed.filter((s): s is Uint8Array => s !== null) + }) const sendAppCall = async () => { setLoading(true) diff --git a/examples/p-ts/projects/p-ts-frontend/src/components/AppCalls.tsx b/examples/p-ts/projects/p-ts-frontend/src/components/AppCalls.tsx index 1268994..55fb808 100644 --- a/examples/p-ts/projects/p-ts-frontend/src/components/AppCalls.tsx +++ b/examples/p-ts/projects/p-ts-frontend/src/components/AppCalls.tsx @@ -5,6 +5,7 @@ import { HelloWorldFactory } from '../contracts/HelloWorld' import { OnSchemaBreak, OnUpdate } from '@algorandfoundation/algokit-utils/types/app' import { getAlgodConfigFromViteEnvironment, getIndexerConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' import { AlgorandClient } from '@algorandfoundation/algokit-utils' +import { encodeTransactionRaw } from '@algorandfoundation/algokit-utils/transact' interface AppCallsInterface { openModal: boolean @@ -15,7 +16,7 @@ const AppCalls = ({ openModal, setModalState }: AppCallsInterface) => { const [loading, setLoading] = useState(false) const [contractInput, setContractInput] = useState('') const { enqueueSnackbar } = useSnackbar() - const { transactionSigner, activeAddress } = useWallet() + const { signTransactions, activeAddress } = useWallet() const algodConfig = getAlgodConfigFromViteEnvironment() const indexerConfig = getIndexerConfigFromViteEnvironment() @@ -23,7 +24,11 @@ const AppCalls = ({ openModal, setModalState }: AppCallsInterface) => { algodConfig, indexerConfig, }) - algorand.setDefaultSigner(transactionSigner) + algorand.setDefaultSigner(async (txnGroup, indexesToSign) => { + const encoded = txnGroup.map((txn) => encodeTransactionRaw(txn)) + const signed = await signTransactions(encoded, indexesToSign) + return signed.filter((s): s is Uint8Array => s !== null) + }) const sendAppCall = async () => { setLoading(true) diff --git a/examples/s-py/projects/s-py-frontend/src/components/AppCalls.tsx b/examples/s-py/projects/s-py-frontend/src/components/AppCalls.tsx index 1268994..55fb808 100644 --- a/examples/s-py/projects/s-py-frontend/src/components/AppCalls.tsx +++ b/examples/s-py/projects/s-py-frontend/src/components/AppCalls.tsx @@ -5,6 +5,7 @@ import { HelloWorldFactory } from '../contracts/HelloWorld' import { OnSchemaBreak, OnUpdate } from '@algorandfoundation/algokit-utils/types/app' import { getAlgodConfigFromViteEnvironment, getIndexerConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' import { AlgorandClient } from '@algorandfoundation/algokit-utils' +import { encodeTransactionRaw } from '@algorandfoundation/algokit-utils/transact' interface AppCallsInterface { openModal: boolean @@ -15,7 +16,7 @@ const AppCalls = ({ openModal, setModalState }: AppCallsInterface) => { const [loading, setLoading] = useState(false) const [contractInput, setContractInput] = useState('') const { enqueueSnackbar } = useSnackbar() - const { transactionSigner, activeAddress } = useWallet() + const { signTransactions, activeAddress } = useWallet() const algodConfig = getAlgodConfigFromViteEnvironment() const indexerConfig = getIndexerConfigFromViteEnvironment() @@ -23,7 +24,11 @@ const AppCalls = ({ openModal, setModalState }: AppCallsInterface) => { algodConfig, indexerConfig, }) - algorand.setDefaultSigner(transactionSigner) + algorand.setDefaultSigner(async (txnGroup, indexesToSign) => { + const encoded = txnGroup.map((txn) => encodeTransactionRaw(txn)) + const signed = await signTransactions(encoded, indexesToSign) + return signed.filter((s): s is Uint8Array => s !== null) + }) const sendAppCall = async () => { setLoading(true) diff --git a/examples/s-tls/projects/s-tls-frontend/src/components/AppCalls.tsx b/examples/s-tls/projects/s-tls-frontend/src/components/AppCalls.tsx index 8a37e8d..a03f337 100644 --- a/examples/s-tls/projects/s-tls-frontend/src/components/AppCalls.tsx +++ b/examples/s-tls/projects/s-tls-frontend/src/components/AppCalls.tsx @@ -4,6 +4,7 @@ import { useState } from 'react' import { CalculatorFactory } from '../contracts/Calculator' import { getAlgodConfigFromViteEnvironment, getIndexerConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' import { AlgorandClient } from '@algorandfoundation/algokit-utils' +import { encodeTransactionRaw } from '@algorandfoundation/algokit-utils/transact' interface AppCallsInterface { openModal: boolean @@ -14,7 +15,7 @@ const AppCalls = ({ openModal, setModalState }: AppCallsInterface) => { const [loading, setLoading] = useState(false) const [contractInput, setContractInput] = useState('') const { enqueueSnackbar } = useSnackbar() - const { transactionSigner, activeAddress } = useWallet() + const { signTransactions, activeAddress } = useWallet() const algodConfig = getAlgodConfigFromViteEnvironment() const indexerConfig = getIndexerConfigFromViteEnvironment() @@ -22,7 +23,11 @@ const AppCalls = ({ openModal, setModalState }: AppCallsInterface) => { algodConfig, indexerConfig, }) - algorand.setDefaultSigner(transactionSigner) + algorand.setDefaultSigner(async (txnGroup, indexesToSign) => { + const encoded = txnGroup.map((txn) => encodeTransactionRaw(txn)) + const signed = await signTransactions(encoded, indexesToSign) + return signed.filter((s): s is Uint8Array => s !== null) + }) const sendAppCall = async () => { setLoading(true) diff --git a/examples/s-ts/projects/s-ts-frontend/src/components/AppCalls.tsx b/examples/s-ts/projects/s-ts-frontend/src/components/AppCalls.tsx index 1268994..55fb808 100644 --- a/examples/s-ts/projects/s-ts-frontend/src/components/AppCalls.tsx +++ b/examples/s-ts/projects/s-ts-frontend/src/components/AppCalls.tsx @@ -5,6 +5,7 @@ import { HelloWorldFactory } from '../contracts/HelloWorld' import { OnSchemaBreak, OnUpdate } from '@algorandfoundation/algokit-utils/types/app' import { getAlgodConfigFromViteEnvironment, getIndexerConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' import { AlgorandClient } from '@algorandfoundation/algokit-utils' +import { encodeTransactionRaw } from '@algorandfoundation/algokit-utils/transact' interface AppCallsInterface { openModal: boolean @@ -15,7 +16,7 @@ const AppCalls = ({ openModal, setModalState }: AppCallsInterface) => { const [loading, setLoading] = useState(false) const [contractInput, setContractInput] = useState('') const { enqueueSnackbar } = useSnackbar() - const { transactionSigner, activeAddress } = useWallet() + const { signTransactions, activeAddress } = useWallet() const algodConfig = getAlgodConfigFromViteEnvironment() const indexerConfig = getIndexerConfigFromViteEnvironment() @@ -23,7 +24,11 @@ const AppCalls = ({ openModal, setModalState }: AppCallsInterface) => { algodConfig, indexerConfig, }) - algorand.setDefaultSigner(transactionSigner) + algorand.setDefaultSigner(async (txnGroup, indexesToSign) => { + const encoded = txnGroup.map((txn) => encodeTransactionRaw(txn)) + const signed = await signTransactions(encoded, indexesToSign) + return signed.filter((s): s is Uint8Array => s !== null) + }) const sendAppCall = async () => { setLoading(true) diff --git a/template_content/inject_content/AppCalls.tsx.jinja b/template_content/inject_content/AppCalls.tsx.jinja index 0cf4410..a55510e 100644 --- a/template_content/inject_content/AppCalls.tsx.jinja +++ b/template_content/inject_content/AppCalls.tsx.jinja @@ -9,6 +9,7 @@ import { OnSchemaBreak, OnUpdate } from '@algorandfoundation/algokit-utils/types {%- endif %} import { getAlgodConfigFromViteEnvironment, getIndexerConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' import { AlgorandClient } from '@algorandfoundation/algokit-utils' +import { encodeTransactionRaw } from '@algorandfoundation/algokit-utils/transact' interface AppCallsInterface { openModal: boolean @@ -19,7 +20,7 @@ const AppCalls = ({ openModal, setModalState }: AppCallsInterface) => { const [loading, setLoading] = useState(false) const [contractInput, setContractInput] = useState('') const { enqueueSnackbar } = useSnackbar() - const { transactionSigner, activeAddress } = useWallet() + const { signTransactions, activeAddress } = useWallet() const algodConfig = getAlgodConfigFromViteEnvironment() const indexerConfig = getIndexerConfigFromViteEnvironment() @@ -27,7 +28,11 @@ const AppCalls = ({ openModal, setModalState }: AppCallsInterface) => { algodConfig, indexerConfig, }) - algorand.setDefaultSigner(transactionSigner) + algorand.setDefaultSigner(async (txnGroup, indexesToSign) => { + const encoded = txnGroup.map((txn) => encodeTransactionRaw(txn)) + const signed = await signTransactions(encoded, indexesToSign) + return signed.filter((s): s is Uint8Array => s !== null) + }) const sendAppCall = async () => { setLoading(true) From 4ea4c51a82c70f70fd003e2f4c3a7d9fa86946f7 Mon Sep 17 00:00:00 2001 From: p2arthur Date: Sun, 8 Mar 2026 23:27:26 -0700 Subject: [PATCH 02/12] test: add test harness to override template generator references and enable using specific versions instead of stable from algokit cli --- tests/test_templates.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/tests/test_templates.py b/tests/test_templates.py index 60d3670..4391449 100644 --- a/tests/test_templates.py +++ b/tests/test_templates.py @@ -1,3 +1,4 @@ +import os import re import shutil import subprocess @@ -151,9 +152,7 @@ def run_init( ) process.stdin.write(answer) process.stdin.flush() - time.sleep(0.1) - # Get the output stdout, stderr = process.communicate() @@ -238,6 +237,25 @@ def get_answered_questions_from_copier_yaml( answers["contract_template"] = contract_template answers["ide_vscode"] = "yes" if ide_vscode else "no" + frontend_template_url = os.getenv("FRONTEND_TEMPLATE_URL") + frontend_template_ref = os.getenv("FRONTEND_TEMPLATE_REF") + contract_template_url = os.getenv("CONTRACT_TEMPLATE_URL") + contract_template_ref = os.getenv("CONTRACT_TEMPLATE_REF") + contract_template_url = os.getenv( + f"{contract_template.upper()}_CONTRACT_TEMPLATE_URL", contract_template_url + ) + contract_template_ref = os.getenv( + f"{contract_template.upper()}_CONTRACT_TEMPLATE_REF", contract_template_ref + ) + if frontend_template_url: + answers["frontend_template_url"] = frontend_template_url + if frontend_template_ref: + answers["frontend_template_ref"] = frontend_template_ref + if contract_template_url: + answers["contract_template_url"] = contract_template_url + if contract_template_ref: + answers["contract_template_ref"] = contract_template_ref + return answers From 56e9ba9d5aa5f8e5d45c90b5c6957d4f4a13cc65 Mon Sep 17 00:00:00 2001 From: p2arthur Date: Sun, 8 Mar 2026 23:31:31 -0700 Subject: [PATCH 03/12] chore: Update algokit init tasks to use --template-url and --template-url-ref when overrides are provided --- copier.yaml | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/copier.yaml b/copier.yaml index b5996b1..ce8cd27 100644 --- a/copier.yaml +++ b/copier.yaml @@ -9,7 +9,10 @@ _tasks: -a include_github_workflow_template "no"' - "echo '==== 2/4 - Initializing frontend template ===='" - - 'algokit init -t react -n {{ project_name }}-frontend --no-git --no-ide --no-bootstrap + - 'algokit init {{ "--template-url \"" ~ (frontend_template_url if frontend_template_url else "gh:algorandfoundation/algokit-react-frontend-template") ~ "\" --UNSAFE-SECURITY-accept-template-url" if (frontend_template_url or frontend_template_ref) else "-t react" }} -n {{ project_name }}-frontend --no-git --no-ide --no-bootstrap + {% if frontend_template_ref %} + --template-url-ref "{{ frontend_template_ref }}" + {% endif %} -a author_email "{{ author_email }}" -a author_name "{{ author_name }}" -a preset_name "{{ preset_name }}" @@ -19,7 +22,10 @@ _tasks: -a use_github_actions "{{ use_github_actions }}"' - "echo '==== 3/4 - Initializing contract template ===='" - - 'algokit init -t {{ contract_template }} -n {{ project_name }}-contracts --no-git --no-ide --no-bootstrap + - 'algokit init {{ "--template-url \"" ~ (contract_template_url if contract_template_url else ("gh:algorandfoundation/algokit-python-template" if contract_template == "python" else "gh:algorandfoundation/algokit-typescript-template" if contract_template == "typescript" else "gh:algorand-devrel/tealscript-algokit-template")) ~ "\" --UNSAFE-SECURITY-accept-template-url" if (contract_template_url or (contract_template_ref and (contract_template != "tealscript" or contract_template_ref != "prep/beta-release"))) else "-t " ~ contract_template }} -n {{ project_name }}-contracts --no-git --no-ide --no-bootstrap + {% if contract_template_ref and (contract_template != "tealscript" or contract_template_ref != "prep/beta-release") %} + --template-url-ref "{{ contract_template_ref }}" + {% endif %} -a author_email "{{ author_email }}" -a author_name "{{ author_name }}" -a preset_name "{{ preset_name }}" @@ -50,6 +56,30 @@ contract_template: TealScript: tealscript default: python +frontend_template_url: + type: str + help: Override source URL for frontend child template. + when: false + default: '' + +frontend_template_ref: + type: str + help: Override git ref (branch/tag) for frontend child template. + when: false + default: 'prep/beta-release' + +contract_template_url: + type: str + help: Override source URL for contract child template. + when: false + default: '' + +contract_template_ref: + type: str + help: Override git ref (branch/tag) for contract child template. + when: false + default: 'prep/beta-release' + project_name: type: str help: Name for this project. From e3b8e4e49439c4fe986353314e3ffe39818a5388 Mon Sep 17 00:00:00 2001 From: p2arthur Date: Sun, 8 Mar 2026 23:33:02 -0700 Subject: [PATCH 04/12] chore: update examples + remove empty pull_request_template.md file --- .github/pull_request_template.md | 5 -- .../.algokit/.copier-answers.yml | 2 +- .../{{ contract_name }}/deploy-config.ts.j2 | 2 +- ...tests %}contract.e2e.spec.ts{% endif %}.j2 | 3 +- .../projects/p-ts-contracts/.prettierrc.js | 12 +-- .../p-ts-contracts/.vscode/tasks.json | 8 +- .../p-ts/projects/p-ts-contracts/README.md | 2 +- .../projects/p-ts-contracts/eslint.config.mjs | 26 ++++--- .../p-ts/projects/p-ts-contracts/package.json | 14 ++-- .../hello_world/contract.algo.spec.ts | 18 ++--- .../hello_world/contract.algo.ts | 4 +- .../hello_world/contract.e2e.spec.ts | 66 ++++++++-------- .../hello_world/deploy-config.ts | 25 ++++--- .../p-ts-contracts/smart_contracts/index.ts | 54 ++++++------- .../projects/p-ts-contracts/tsconfig.json | 28 +++---- .../p-ts-contracts/tsconfig.test.json | 14 ---- .../projects/p-ts-contracts/vitest.config.mts | 10 +-- .../.algokit/.copier-answers.yml | 2 +- .../p-ts/projects/p-ts-frontend/.env.template | 3 + .../p-ts/projects/p-ts-frontend/package.json | 10 +-- .../p-ts-frontend/src/components/Transact.tsx | 11 ++- .../p-ts-frontend/src/contracts/HelloWorld.ts | 75 +++++++------------ .../p-ts-frontend/src/interfaces/network.ts | 7 +- .../p-ts/projects/p-ts-frontend/tsconfig.json | 4 +- .../projects/p-ts-frontend/tsconfig.node.json | 4 +- .../.algokit/.copier-answers.yml | 2 +- .../{{ contract_name }}/deploy-config.ts.j2 | 2 +- ...tests %}contract.e2e.spec.ts{% endif %}.j2 | 3 +- .../s-ts/projects/s-ts-contracts/README.md | 2 +- .../s-ts/projects/s-ts-contracts/package.json | 14 ++-- .../hello_world/deploy-config.ts | 2 +- .../s-ts-contracts/smart_contracts/index.ts | 9 ++- .../projects/s-ts-contracts/tsconfig.json | 30 +++----- .../.algokit/.copier-answers.yml | 2 +- .../s-ts/projects/s-ts-frontend/.env.template | 3 + .../s-ts/projects/s-ts-frontend/package.json | 10 +-- .../s-ts-frontend/src/components/Transact.tsx | 11 ++- .../s-ts-frontend/src/contracts/HelloWorld.ts | 75 +++++++------------ .../s-ts-frontend/src/interfaces/network.ts | 7 +- .../s-ts/projects/s-ts-frontend/tsconfig.json | 4 +- .../projects/s-ts-frontend/tsconfig.node.json | 4 +- 41 files changed, 267 insertions(+), 322 deletions(-) delete mode 100644 .github/pull_request_template.md delete mode 100644 examples/p-ts/projects/p-ts-contracts/tsconfig.test.json diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md deleted file mode 100644 index fabab73..0000000 --- a/.github/pull_request_template.md +++ /dev/null @@ -1,5 +0,0 @@ -## Proposed Changes - -- -- -- diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/.copier-answers.yml b/examples/p-ts/projects/p-ts-contracts/.algokit/.copier-answers.yml index 719485c..2741db7 100644 --- a/examples/p-ts/projects/p-ts-contracts/.algokit/.copier-answers.yml +++ b/examples/p-ts/projects/p-ts-contracts/.algokit/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 0.3.7 +_commit: 0.3.7-16-g0ed1ece _src_path: gh:algorandfoundation/algokit-typescript-template author_email: None author_name: None diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 index 4626980..b1c76dd 100644 --- a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 +++ b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 @@ -23,7 +23,7 @@ export async function deploy() { }) } - const method = 'hello' + const method = 'hello' const response = await appClient.send.hello({ args: { name: 'world' }, }) diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 index 146e270..b94556a 100644 --- a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 +++ b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 @@ -1,6 +1,5 @@ -import { Config } from '@algorandfoundation/algokit-utils' +import { Config, Address } from '@algorandfoundation/algokit-utils' import { algorandFixture } from '@algorandfoundation/algokit-utils/testing' -import { Address } from 'algosdk' import { beforeAll, beforeEach, describe, expect, test } from 'vitest' import { {{ contract_name.split('_')|map('capitalize')|join }}Factory } from '../artifacts/{{ contract_name }}/{{ contract_name.split('_')|map('capitalize')|join }}Client' diff --git a/examples/p-ts/projects/p-ts-contracts/.prettierrc.js b/examples/p-ts/projects/p-ts-contracts/.prettierrc.js index c484d0e..87263da 100644 --- a/examples/p-ts/projects/p-ts-contracts/.prettierrc.js +++ b/examples/p-ts/projects/p-ts-contracts/.prettierrc.js @@ -1,10 +1,4 @@ -module.exports = { +export default { singleQuote: true, - jsxSingleQuote: false, - semi: false, - tabWidth: 2, - trailingComma: 'all', - printWidth: 120, - endOfLine: 'lf', - arrowParens: 'always', -} + jsxSingleQuote: true, +}; diff --git a/examples/p-ts/projects/p-ts-contracts/.vscode/tasks.json b/examples/p-ts/projects/p-ts-contracts/.vscode/tasks.json index 55310ab..808a8cb 100644 --- a/examples/p-ts/projects/p-ts-contracts/.vscode/tasks.json +++ b/examples/p-ts/projects/p-ts-contracts/.vscode/tasks.json @@ -59,7 +59,13 @@ { "label": "Analyze TEAL contracts with AlgoKit Tealer integration", "command": "algokit", - "args": ["task", "analyze", "${workspaceFolder}/.algokit", "--recursive", "--force"], + "args": [ + "task", + "analyze", + "${workspaceFolder}/.algokit", + "--recursive", + "--force" + ], "options": { "cwd": "${workspaceFolder}" }, diff --git a/examples/p-ts/projects/p-ts-contracts/README.md b/examples/p-ts/projects/p-ts-contracts/README.md index 2282623..90a9ef6 100644 --- a/examples/p-ts/projects/p-ts-contracts/README.md +++ b/examples/p-ts/projects/p-ts-contracts/README.md @@ -154,7 +154,7 @@ This project makes use of Algorand TypeScript to build Algorand smart contracts. - [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-ts) - A set of core Algorand utilities that make it easier to build solutions on Algorand. - [NPM](https://www.npmjs.com/): TypeScript packaging and dependency management. - [TypeScript](https://www.typescriptlang.org/): Strongly typed programming language that builds on JavaScript -- [ts-node-dev](https://github.com/wclr/ts-node-dev): TypeScript development execution environment- [Prettier](https://prettier.io/): A code formatter.- [ESLint](https://eslint.org/): A JavaScript / TypeScript linter. +- [tsx](https://github.com/wclr/tsx): TypeScript development execution environment- [Prettier](https://prettier.io/): A code formatter.- [ESLint](https://eslint.org/): A JavaScript / TypeScript linter. - [vitest](https://vitest.dev/): Automated testing. - [better-npm-audit](https://github.com/jeemok/better-npm-audit#readme): Tool for scanning JavaScript / TypeScript environments for packages with known vulnerabilities. diff --git a/examples/p-ts/projects/p-ts-contracts/eslint.config.mjs b/examples/p-ts/projects/p-ts-contracts/eslint.config.mjs index 17227c7..8147a69 100644 --- a/examples/p-ts/projects/p-ts-contracts/eslint.config.mjs +++ b/examples/p-ts/projects/p-ts-contracts/eslint.config.mjs @@ -1,14 +1,18 @@ -import eslint from '@eslint/js' -import tseslint from 'typescript-eslint' -import globals from 'globals' +import eslint from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import globals from 'globals'; -export default tseslint.config(eslint.configs.recommended, tseslint.configs.recommended, { - languageOptions: { - globals: { - ...globals.node, +export default tseslint.config( + eslint.configs.recommended, + tseslint.configs.recommended, + { + languageOptions: { + globals: { + ...globals.node, + }, + }, + rules: { + '@typescript-eslint/explicit-member-accessibility': 'warn', }, }, - rules: { - '@typescript-eslint/explicit-member-accessibility': 'warn', - }, -}) +); diff --git a/examples/p-ts/projects/p-ts-contracts/package.json b/examples/p-ts/projects/p-ts-contracts/package.json index 5ab70fb..a4bc636 100644 --- a/examples/p-ts/projects/p-ts-contracts/package.json +++ b/examples/p-ts/projects/p-ts-contracts/package.json @@ -3,10 +3,11 @@ "version": "1.0.0", "description": "Smart contract deployer", "main": "smart_contracts/index.ts", + "type": "module", "scripts": { "build": "algokit compile ts smart_contracts --output-source-map --out-dir artifacts && algokit generate client smart_contracts/artifacts --output {app_spec_dir}/{contract_name}Client.ts", - "deploy": "ts-node-dev --transpile-only --watch .env -r dotenv/config smart_contracts/index.ts", - "deploy:ci": "ts-node --transpile-only -r dotenv/config smart_contracts/index.ts", + "deploy": "tsx watch -r dotenv/config smart_contracts/index.ts", + "deploy:ci": "tsx -r dotenv/config smart_contracts/index.ts", "lint": "eslint smart_contracts", "lint:fix": "eslint smart_contracts --fix", "audit": "better-npm-audit audit", @@ -23,20 +24,19 @@ "@algorandfoundation/algorand-typescript": "^1.0.1" }, "devDependencies": { - "@algorandfoundation/algokit-client-generator": "^6.0.0", - "@algorandfoundation/algokit-utils": "^9.0.0", - "@algorandfoundation/algokit-utils-debug": "^1.0.4", + "@algorandfoundation/algokit-client-generator": "^7.0.0-alpha.5", + "@algorandfoundation/algokit-utils": "^10.0.0-alpha.40", + "@algorandfoundation/algokit-utils-debug": "^2.0.0-alpha.2", "@algorandfoundation/puya-ts": "^1.0.1", "@rollup/plugin-typescript": "^12.1.2", "@tsconfig/node22": "^22.0.0", - "algosdk": "^3.0.0", "better-npm-audit": "^3.11.0", "dotenv": "^16.4.7", "eslint": "^9.18.0", "@eslint/js": "^9.18.0", "typescript-eslint": "^8.19.1", "prettier": "^3.4.2", - "ts-node-dev": "^2.0.0", + "tsx": "^4.19.3", "@algorandfoundation/algorand-typescript-testing": "^1.0.1", "vitest": "^2.1.8", "@vitest/coverage-v8": "^2.1.8", diff --git a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.spec.ts b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.spec.ts index 664eb72..3cf33c3 100644 --- a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.spec.ts +++ b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.spec.ts @@ -1,14 +1,14 @@ -import { TestExecutionContext } from '@algorandfoundation/algorand-typescript-testing' -import { describe, expect, it } from 'vitest' -import { HelloWorld } from './contract.algo' +import { TestExecutionContext } from '@algorandfoundation/algorand-typescript-testing'; +import { describe, expect, it } from 'vitest'; +import { HelloWorld } from './contract.algo'; describe('HelloWorld contract', () => { - const ctx = new TestExecutionContext() + const ctx = new TestExecutionContext(); it('Logs the returned value when sayHello is called', () => { - const contract = ctx.contract.create(HelloWorld) + const contract = ctx.contract.create(HelloWorld); - const result = contract.hello('Sally') + const result = contract.hello('Sally'); - expect(result).toBe('Hello, Sally') - }) -}) + expect(result).toBe('Hello, Sally'); + }); +}); diff --git a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.ts b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.ts index 5e2fcfe..099d3f5 100644 --- a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.ts +++ b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.ts @@ -1,7 +1,7 @@ -import { Contract } from '@algorandfoundation/algorand-typescript' +import { Contract } from '@algorandfoundation/algorand-typescript'; export class HelloWorld extends Contract { public hello(name: string): string { - return `Hello, ${name}` + return `Hello, ${name}`; } } diff --git a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.e2e.spec.ts b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.e2e.spec.ts index 981099c..2c6db91 100644 --- a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.e2e.spec.ts +++ b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.e2e.spec.ts @@ -1,53 +1,57 @@ -import { Config } from '@algorandfoundation/algokit-utils' -import { registerDebugEventHandlers } from '@algorandfoundation/algokit-utils-debug' -import { algorandFixture } from '@algorandfoundation/algokit-utils/testing' -import { Address } from 'algosdk' -import { beforeAll, beforeEach, describe, expect, test } from 'vitest' -import { HelloWorldFactory } from '../artifacts/hello_world/HelloWorldClient' +import { Config, Address } from '@algorandfoundation/algokit-utils'; +import { registerDebugEventHandlers } from '@algorandfoundation/algokit-utils-debug'; +import { algorandFixture } from '@algorandfoundation/algokit-utils/testing'; +import { beforeAll, beforeEach, describe, expect, test } from 'vitest'; +import { HelloWorldFactory } from '../artifacts/hello_world/HelloWorldClient'; describe('HelloWorld contract', () => { - const localnet = algorandFixture() + const localnet = algorandFixture(); beforeAll(() => { Config.configure({ debug: true, // traceAll: true, - }) - registerDebugEventHandlers() - }) - beforeEach(localnet.newScope) + }); + registerDebugEventHandlers(); + }); + beforeEach(localnet.newScope); const deploy = async (account: Address) => { - const factory = localnet.algorand.client.getTypedAppFactory(HelloWorldFactory, { - defaultSender: account, - }) + const factory = localnet.algorand.client.getTypedAppFactory( + HelloWorldFactory, + { + defaultSender: account, + }, + ); const { appClient } = await factory.deploy({ onUpdate: 'append', onSchemaBreak: 'append', - }) - return { client: appClient } - } + }); + return { client: appClient }; + }; test('says hello', async () => { - const { testAccount } = localnet.context - const { client } = await deploy(testAccount) + const { testAccount } = localnet.context; + const { client } = await deploy(testAccount); - const result = await client.send.hello({ args: { name: 'World' } }) + const result = await client.send.hello({ args: { name: 'World' } }); - expect(result.return).toBe('Hello, World') - }) + expect(result.return).toBe('Hello, World'); + }); test('simulate says hello with correct budget consumed', async () => { - const { testAccount } = localnet.context - const { client } = await deploy(testAccount) + const { testAccount } = localnet.context; + const { client } = await deploy(testAccount); const result = await client .newGroup() .hello({ args: { name: 'World' } }) .hello({ args: { name: 'Jane' } }) - .simulate() - - expect(result.returns[0]).toBe('Hello, World') - expect(result.returns[1]).toBe('Hello, Jane') - expect(result.simulateResponse.txnGroups[0].appBudgetConsumed).toBeLessThan(100) - }) -}) + .simulate(); + + expect(result.returns[0]).toBe('Hello, World'); + expect(result.returns[1]).toBe('Hello, Jane'); + expect(result.simulateResponse.txnGroups[0].appBudgetConsumed).toBeLessThan( + 100, + ); + }); +}); diff --git a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/deploy-config.ts b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/deploy-config.ts index 6cf7f14..8dd48e0 100644 --- a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/deploy-config.ts +++ b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/deploy-config.ts @@ -1,18 +1,21 @@ -import { AlgorandClient } from '@algorandfoundation/algokit-utils' -import { HelloWorldFactory } from '../artifacts/hello_world/HelloWorldClient' +import { AlgorandClient } from '@algorandfoundation/algokit-utils'; +import { HelloWorldFactory } from '../artifacts/hello_world/HelloWorldClient'; // Below is a showcase of various deployment options you can use in TypeScript Client export async function deploy() { - console.log('=== Deploying HelloWorld ===') + console.log('=== Deploying HelloWorld ==='); - const algorand = AlgorandClient.fromEnvironment() - const deployer = await algorand.account.fromEnvironment('DEPLOYER') + const algorand = AlgorandClient.fromEnvironment(); + const deployer = await algorand.account.fromEnvironment('DEPLOYER'); const factory = algorand.client.getTypedAppFactory(HelloWorldFactory, { defaultSender: deployer.addr, - }) + }); - const { appClient, result } = await factory.deploy({ onUpdate: 'append', onSchemaBreak: 'append' }) + const { appClient, result } = await factory.deploy({ + onUpdate: 'append', + onSchemaBreak: 'append', + }); // If app was just created fund the app account if (['create', 'replace'].includes(result.operationPerformed)) { @@ -20,14 +23,14 @@ export async function deploy() { amount: (1).algo(), sender: deployer.addr, receiver: appClient.appAddress, - }) + }); } - const method = 'hello' + const method = 'hello'; const response = await appClient.send.hello({ args: { name: 'world' }, - }) + }); console.log( `Called ${method} on ${appClient.appClient.appName} (${appClient.appClient.appId}) with name = world, received: ${response.return}`, - ) + ); } diff --git a/examples/p-ts/projects/p-ts-contracts/smart_contracts/index.ts b/examples/p-ts/projects/p-ts-contracts/smart_contracts/index.ts index d152f49..ccc455f 100644 --- a/examples/p-ts/projects/p-ts-contracts/smart_contracts/index.ts +++ b/examples/p-ts/projects/p-ts-contracts/smart_contracts/index.ts @@ -1,8 +1,9 @@ -import { Config } from '@algorandfoundation/algokit-utils' -import { registerDebugEventHandlers } from '@algorandfoundation/algokit-utils-debug' -import { consoleLogger } from '@algorandfoundation/algokit-utils/types/logging' -import * as fs from 'node:fs' -import * as path from 'node:path' +import { Config } from '@algorandfoundation/algokit-utils'; +import { registerDebugEventHandlers } from '@algorandfoundation/algokit-utils-debug'; +import { consoleLogger } from '@algorandfoundation/algokit-utils/logging'; +import * as fs from 'node:fs'; +import * as path from 'node:path'; +import { fileURLToPath } from 'node:url'; // Uncomment the traceAll option to enable auto generation of AVM Debugger compliant sourceMap and simulation trace file for all AVM calls. // Learn more about using AlgoKit AVM Debugger to debug your TEAL source codes and inspect various kinds of Algorand transactions in atomic groups -> https://github.com/algorandfoundation/algokit-avm-vscode-Debugger @@ -11,20 +12,23 @@ Config.configure({ logger: consoleLogger, debug: true, // traceAll: true, -}) -registerDebugEventHandlers() +}); +registerDebugEventHandlers(); // base directory -const baseDir = path.resolve(__dirname) +const baseDir = path.dirname(fileURLToPath(import.meta.url)); // function to validate and dynamically import a module async function importDeployerIfExists(dir: string) { - const deployerPath = path.resolve(dir, 'deploy-config') - if (fs.existsSync(deployerPath + '.ts') || fs.existsSync(deployerPath + '.js')) { - const deployer = await import(deployerPath) - return { ...deployer, name: path.basename(dir) } + const deployerPath = path.resolve(dir, 'deploy-config'); + if ( + fs.existsSync(deployerPath + '.ts') || + fs.existsSync(deployerPath + '.js') + ) { + const deployer = await import(deployerPath); + return { ...deployer, name: path.basename(dir) }; } - return null + return null; } // get a list of all deployers from the subdirectories @@ -32,31 +36,31 @@ async function getDeployers() { const directories = fs .readdirSync(baseDir, { withFileTypes: true }) .filter((dirent) => dirent.isDirectory()) - .map((dirent) => path.resolve(baseDir, dirent.name)) + .map((dirent) => path.resolve(baseDir, dirent.name)); - const deployers = await Promise.all(directories.map(importDeployerIfExists)) - return deployers.filter((deployer) => deployer !== null) // Filter out null values + const deployers = await Promise.all(directories.map(importDeployerIfExists)); + return deployers.filter((deployer) => deployer !== null); // Filter out null values } // execute all the deployers -;(async () => { - const contractName = process.argv.length > 2 ? process.argv[2] : undefined - const contractDeployers = await getDeployers() +(async () => { + const contractName = process.argv.length > 2 ? process.argv[2] : undefined; + const contractDeployers = await getDeployers(); const filteredDeployers = contractName ? contractDeployers.filter((deployer) => deployer.name === contractName) - : contractDeployers + : contractDeployers; if (contractName && filteredDeployers.length === 0) { - console.warn(`No deployer found for contract name: ${contractName}`) - return + console.warn(`No deployer found for contract name: ${contractName}`); + return; } for (const deployer of filteredDeployers) { try { - await deployer.deploy() + await deployer.deploy(); } catch (e) { - console.error(`Error deploying ${deployer.name}:`, e) + console.error(`Error deploying ${deployer.name}:`, e); } } -})() +})(); diff --git a/examples/p-ts/projects/p-ts-contracts/tsconfig.json b/examples/p-ts/projects/p-ts-contracts/tsconfig.json index a1e51b7..6cc09d9 100644 --- a/examples/p-ts/projects/p-ts-contracts/tsconfig.json +++ b/examples/p-ts/projects/p-ts-contracts/tsconfig.json @@ -1,24 +1,14 @@ { + "extends": "@tsconfig/node22/tsconfig.json", "compilerOptions": { - "target": "ES2020", - "declaration": true, - "declarationMap": true, - "sourceMap": true, - "strict": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "allowJs": false, - "allowSyntheticDefaultImports": true, - "module": "CommonJS", - "moduleResolution": "Node", - "resolveJsonModule": true, - "isolatedModules": true, "noEmit": true, - "lib": ["ESNext"] + "target": "ES2023", + "module": "ESNext", + "lib": ["ES2023"], + "moduleResolution": "Bundler", + "resolveJsonModule": true, + "esModuleInterop": true }, - "include": ["smart_contracts/**/*.ts"], - "exclude": ["node_modules", "dist", "coverage"] + "include": ["**/*.ts", "**/*.mts"], + "exclude": ["node_modules"] } diff --git a/examples/p-ts/projects/p-ts-contracts/tsconfig.test.json b/examples/p-ts/projects/p-ts-contracts/tsconfig.test.json deleted file mode 100644 index 6cc09d9..0000000 --- a/examples/p-ts/projects/p-ts-contracts/tsconfig.test.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "@tsconfig/node22/tsconfig.json", - "compilerOptions": { - "noEmit": true, - "target": "ES2023", - "module": "ESNext", - "lib": ["ES2023"], - "moduleResolution": "Bundler", - "resolveJsonModule": true, - "esModuleInterop": true - }, - "include": ["**/*.ts", "**/*.mts"], - "exclude": ["node_modules"] -} diff --git a/examples/p-ts/projects/p-ts-contracts/vitest.config.mts b/examples/p-ts/projects/p-ts-contracts/vitest.config.mts index 023dc0d..6d6b97d 100644 --- a/examples/p-ts/projects/p-ts-contracts/vitest.config.mts +++ b/examples/p-ts/projects/p-ts-contracts/vitest.config.mts @@ -1,6 +1,6 @@ -import { puyaTsTransformer } from '@algorandfoundation/algorand-typescript-testing/vitest-transformer' -import typescript from '@rollup/plugin-typescript' -import { defineConfig } from 'vitest/config' +import { puyaTsTransformer } from '@algorandfoundation/algorand-typescript-testing/vitest-transformer'; +import typescript from '@rollup/plugin-typescript'; +import { defineConfig } from 'vitest/config'; export default defineConfig({ esbuild: {}, @@ -12,10 +12,10 @@ export default defineConfig({ }, plugins: [ typescript({ - tsconfig: './tsconfig.test.json', + tsconfig: './tsconfig.json', transformers: { before: [puyaTsTransformer], }, }), ], -}) +}); diff --git a/examples/p-ts/projects/p-ts-frontend/.algokit/.copier-answers.yml b/examples/p-ts/projects/p-ts-frontend/.algokit/.copier-answers.yml index 3e2a5d9..5636d7d 100644 --- a/examples/p-ts/projects/p-ts-frontend/.algokit/.copier-answers.yml +++ b/examples/p-ts/projects/p-ts-frontend/.algokit/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 1.1.1 +_commit: 1.1.1-13-gc5abe59 _src_path: gh:algorandfoundation/algokit-react-frontend-template author_email: None author_name: None diff --git a/examples/p-ts/projects/p-ts-frontend/.env.template b/examples/p-ts/projects/p-ts-frontend/.env.template index eb4b229..5dfbb2d 100644 --- a/examples/p-ts/projects/p-ts-frontend/.env.template +++ b/examples/p-ts/projects/p-ts-frontend/.env.template @@ -65,3 +65,6 @@ VITE_KMD_PASSWORD="" # VITE_INDEXER_SERVER="https://mainnet-idx.algonode.cloud" # VITE_INDEXER_PORT="" + +# Add your Web3Auth Client ID here if you want to test Web3Auth integration on TestNet or Mainnet +# VITE_WEB3_AUTH_CLIENT_ID="" \ No newline at end of file diff --git a/examples/p-ts/projects/p-ts-frontend/package.json b/examples/p-ts/projects/p-ts-frontend/package.json index 0592346..5db411d 100644 --- a/examples/p-ts/projects/p-ts-frontend/package.json +++ b/examples/p-ts/projects/p-ts-frontend/package.json @@ -12,7 +12,7 @@ "npm": ">=9.0" }, "devDependencies": { - "@algorandfoundation/algokit-client-generator": "^5.0.0", + "@algorandfoundation/algokit-client-generator": "^7.0.0-alpha.5", "@types/node": "^18.17.14", "@types/react": "^18.2.11", "@types/react-dom": "^18.2.4", @@ -35,12 +35,12 @@ "vite-plugin-node-polyfills": "^0.22.0" }, "dependencies": { - "@algorandfoundation/algokit-utils": "^9.0.0", + "@algorandfoundation/algokit-utils": "^10.0.0-alpha.40", "@blockshake/defly-connect": "^1.2.1", "@perawallet/connect": "^1.4.1", - "@txnlab/use-wallet": "^4.0.0", - "@txnlab/use-wallet-react": "^4.0.0", - "algosdk": "^3.0.0", + "@txnlab/use-wallet": "^4.6.0", + "@txnlab/use-wallet-react": "^4.6.0", + "@web3auth/modal": "^9.7.0", "daisyui": "^4.0.0", "notistack": "^3.0.1", "react": "^18.2.0", diff --git a/examples/p-ts/projects/p-ts-frontend/src/components/Transact.tsx b/examples/p-ts/projects/p-ts-frontend/src/components/Transact.tsx index 2ba3e96..3f8191d 100644 --- a/examples/p-ts/projects/p-ts-frontend/src/components/Transact.tsx +++ b/examples/p-ts/projects/p-ts-frontend/src/components/Transact.tsx @@ -1,4 +1,5 @@ import { algo, AlgorandClient } from '@algorandfoundation/algokit-utils' +import { encodeTransactionRaw } from '@algorandfoundation/algokit-utils/transact' import { useWallet } from '@txnlab/use-wallet-react' import { useSnackbar } from 'notistack' import { useState } from 'react' @@ -18,12 +19,12 @@ const Transact = ({ openModal, setModalState }: TransactInterface) => { const { enqueueSnackbar } = useSnackbar() - const { transactionSigner, activeAddress } = useWallet() + const { signTransactions, activeAddress } = useWallet() const handleSubmitAlgo = async () => { setLoading(true) - if (!transactionSigner || !activeAddress) { + if (!signTransactions || !activeAddress) { enqueueSnackbar('Please connect wallet first', { variant: 'warning' }) return } @@ -31,7 +32,11 @@ const Transact = ({ openModal, setModalState }: TransactInterface) => { try { enqueueSnackbar('Sending transaction...', { variant: 'info' }) const result = await algorand.send.payment({ - signer: transactionSigner, + signer: async (txnGroup, indexesToSign) => { + const encoded = txnGroup.map((txn) => encodeTransactionRaw(txn)) + const signed = await signTransactions(encoded, indexesToSign) + return signed.filter((s): s is Uint8Array => s !== null) + }, sender: activeAddress, receiver: receiverAddress, amount: algo(1), diff --git a/examples/p-ts/projects/p-ts-frontend/src/contracts/HelloWorld.ts b/examples/p-ts/projects/p-ts-frontend/src/contracts/HelloWorld.ts index 5b0f375..3165097 100644 --- a/examples/p-ts/projects/p-ts-frontend/src/contracts/HelloWorld.ts +++ b/examples/p-ts/projects/p-ts-frontend/src/contracts/HelloWorld.ts @@ -2,29 +2,19 @@ /** * This file was automatically generated by @algorandfoundation/algokit-client-generator. * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^7 + * requires: @algorandfoundation/algokit-utils: ^10 */ import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app' -import { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56' -import { - AppClient as _AppClient, - AppClientMethodCallParams, - AppClientParams, - AppClientBareCallParams, - CallOnComplete, - AppClientCompilationParams, - ResolveAppClientByCreatorAndName, - ResolveAppClientByNetwork, - CloneAppClientParams, -} from '@algorandfoundation/algokit-utils/types/app-client' -import { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer' -import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' -import SimulateResponse = modelsv2.SimulateResponse - -export const APP_SPEC: Arc56Contract = {"name":"HelloWorld","structs":{},"methods":[{"name":"hello","args":[{"type":"string","name":"name"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[37],"errorMessage":"OnCompletion must be NoOp && can only call when creating"},{"pc":[26],"errorMessage":"OnCompletion must be NoOp && can only call when not creating"},{"pc":[47],"errorMessage":"invalid array length header"},{"pc":[55],"errorMessage":"invalid number of bytes for arc4.dynamic_array"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgSGVsbG9Xb3JsZCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2hlbGxvX3JvdXRlQDMKICAgIGVycgoKbWFpbl9oZWxsb19yb3V0ZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gcHVibGljIGhlbGxvKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGIgaGVsbG8KCm1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgSGVsbG9Xb3JsZCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LmFsZ28udHM6OkhlbGxvV29ybGQuaGVsbG9bcm91dGluZ10oKSAtPiB2b2lkOgpoZWxsbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIHB1YmxpYyBoZWxsbyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBwdXNoaW50IDAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5hbGdvLnRzOjUKICAgIC8vIHJldHVybiBgSGVsbG8sICR7bmFtZX1gCiAgICBwdXNoYnl0ZXMgIkhlbGxvLCAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIHB1YmxpYyBoZWxsbyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcgewogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgAQCvs4RNhoAjgEAAQAxGRQxGBBEQgALMRkUMRgUEESBAUM2GgFJgQBZgQIISwEVEkRXAgCAB0hlbGxvLCBMUEkVFlcGAkxQgAQVH3x1TFCwgQFD","clear":"C4EBQw=="},"compilerInfo":{"compiler":"puya","compilerVersion":{"major":5,"minor":3,"patch":2}},"events":[],"templateVariables":{}} as unknown as Arc56Contract +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"HelloWorld","structs":{},"methods":[{"name":"hello","args":[{"type":"string","name":"name"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[37],"errorMessage":"OnCompletion must be NoOp && can only call when creating"},{"pc":[26],"errorMessage":"OnCompletion must be NoOp && can only call when not creating"},{"pc":[47],"errorMessage":"invalid array length header"},{"pc":[55],"errorMessage":"invalid number of bytes for arc4.dynamic_array"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgSGVsbG9Xb3JsZCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2hlbGxvX3JvdXRlQDMKICAgIGVycgoKbWFpbl9oZWxsb19yb3V0ZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gcHVibGljIGhlbGxvKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGIgaGVsbG8KCm1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgSGVsbG9Xb3JsZCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LmFsZ28udHM6OkhlbGxvV29ybGQuaGVsbG9bcm91dGluZ10oKSAtPiB2b2lkOgpoZWxsbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIHB1YmxpYyBoZWxsbyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBwdXNoaW50IDAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5hbGdvLnRzOjUKICAgIC8vIHJldHVybiBgSGVsbG8sICR7bmFtZX1gCiAgICBwdXNoYnl0ZXMgIkhlbGxvLCAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIHB1YmxpYyBoZWxsbyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcgewogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgAQCvs4RNhoAjgEAAQAxGRQxGBBEQgALMRkUMRgUEESBAUM2GgFJgQBZgQIISwEVEkRXAgCAB0hlbGxvLCBMUEkVFlcGAkxQgAQVH3x1TFCwgQFD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract /** * A state record containing binary data @@ -137,7 +127,7 @@ export type MethodReturn = HelloWorldTy * Defines supported create method params for this smart contract */ export type HelloWorldCreateCallParams = - | Expand + | Expand /** * Defines arguments required for the deploy method. */ @@ -258,7 +248,7 @@ export class HelloWorldFactory { * @param params The params for the bare (raw) call * @returns The params for a create call */ - bare: (params?: Expand) => { + bare: (params?: Expand) => { return this.appFactory.params.bare.create(params) }, }, @@ -279,7 +269,7 @@ export class HelloWorldFactory { * @param params The params for the bare (raw) call * @returns The transaction for a create call */ - bare: (params?: Expand) => { + bare: (params?: Expand) => { return this.appFactory.createTransaction.bare.create(params) }, }, @@ -300,7 +290,7 @@ export class HelloWorldFactory { * @param params The params for the bare (raw) call * @returns The create result */ - bare: async (params?: Expand) => { + bare: async (params?: Expand) => { const result = await this.appFactory.send.bare.create(params) return { result: result.result, appClient: new HelloWorldClient(result.appClient) } }, @@ -336,15 +326,7 @@ export class HelloWorldClient { appSpec: APP_SPEC, }) } - - /** - * Checks for decode errors on the given return value and maps the return value to the return type for the given method - * @returns The typed return value or undefined if there was no value - */ - decodeReturnValue(method: TSignature, returnValue: ABIReturn | undefined) { - return returnValue !== undefined ? getArc56ReturnValue>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined - } - + /** * Returns a new `HelloWorldClient` client, resolving the app by creator address and name * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). @@ -412,7 +394,7 @@ export class HelloWorldClient { * @param params The params for the smart contract call * @returns The call params */ - hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + hello: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { return this.appClient.params.call(HelloWorldParamsFactory.hello(params)) }, @@ -438,7 +420,7 @@ export class HelloWorldClient { * @param params The params for the smart contract call * @returns The call transaction */ - hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + hello: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { return this.appClient.createTransaction.call(HelloWorldParamsFactory.hello(params)) }, @@ -464,7 +446,7 @@ export class HelloWorldClient { * @param params The params for the smart contract call * @returns The call result */ - hello: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + hello: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { const result = await this.appClient.send.call(HelloWorldParamsFactory.hello(params)) return {...result, return: result.return as unknown as (undefined | HelloWorldReturns['hello(string)string'])} }, @@ -474,7 +456,7 @@ export class HelloWorldClient { /** * Clone this app client with different params * - * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. * @returns A new app client with the altered params */ public clone(params: CloneAppClientParams) { @@ -487,18 +469,16 @@ export class HelloWorldClient { state = { } - public newGroup(): HelloWorldComposer { + public newGroup(composerConfig?: TransactionComposerConfig): HelloWorldComposer { const client = this - const composer = this.algorand.newGroup() + const composer = this.algorand.newGroup(composerConfig) let promiseChain:Promise = Promise.resolve() - const resultMappers: Array any)> = [] return { /** * Add a hello(string)string method call against the HelloWorld contract */ - hello(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + hello(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hello(params))) - resultMappers.push((v) => client.decodeReturnValue('hello(string)string', v)) return this }, /** @@ -521,7 +501,7 @@ export class HelloWorldClient { const result = await (!options ? composer.simulate() : composer.simulate(options)) return { ...result, - returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + returns: result.returns?.map(val => val.returnValue) } }, async send(params?: SendParams) { @@ -529,7 +509,7 @@ export class HelloWorldClient { const result = await composer.send(params) return { ...result, - returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + returns: result.returns?.map(val => val.returnValue) } } } as unknown as HelloWorldComposer @@ -539,7 +519,6 @@ export type HelloWorldComposer = { /** * Calls the hello(string)string ABI method. * - * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ @@ -548,7 +527,7 @@ export type HelloWorldComposer = { /** * Makes a clear_state call to an existing instance of the HelloWorld smart contract. * - * @param args The arguments for the bare call + * @param params Any additional parameters for the bare call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ clearState(params?: AppClientBareCallParams): HelloWorldComposer<[...TReturns, undefined]> @@ -575,7 +554,7 @@ export type HelloWorldComposer = { */ send(params?: SendParams): Promise> } -export type HelloWorldComposerResults = Expand = Expand diff --git a/examples/p-ts/projects/p-ts-frontend/src/interfaces/network.ts b/examples/p-ts/projects/p-ts-frontend/src/interfaces/network.ts index a458edc..fdb97ae 100644 --- a/examples/p-ts/projects/p-ts-frontend/src/interfaces/network.ts +++ b/examples/p-ts/projects/p-ts-frontend/src/interfaces/network.ts @@ -1,5 +1,4 @@ -import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/types/network-client' -import type { TokenHeader } from 'algosdk/dist/types/client/urlTokenBaseHTTPClient' +import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/network-client' export interface AlgoViteClientConfig extends AlgoClientConfig { /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ @@ -7,7 +6,7 @@ export interface AlgoViteClientConfig extends AlgoClientConfig { /** The port to use e.g. 4001, 443, etc. */ port: string | number /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string | TokenHeader + token: string /** String representing current Algorand Network type (testnet/mainnet and etc) */ network: string } @@ -18,7 +17,7 @@ export interface AlgoViteKMDConfig extends AlgoClientConfig { /** The port to use e.g. 4001, 443, etc. */ port: string | number /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string | TokenHeader + token: string /** KMD wallet name */ wallet: string /** KMD wallet password */ diff --git a/examples/p-ts/projects/p-ts-frontend/tsconfig.json b/examples/p-ts/projects/p-ts-frontend/tsconfig.json index 5cde02a..855bfc3 100644 --- a/examples/p-ts/projects/p-ts-frontend/tsconfig.json +++ b/examples/p-ts/projects/p-ts-frontend/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, - "module": "ES2022" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + "module": "ESNext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, "declaration": true /* Generates corresponding '.d.ts' file. */, "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, "sourceMap": true /* Generates corresponding '.map' file. */, @@ -15,7 +15,7 @@ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, "allowJs": false, "allowSyntheticDefaultImports": true, - "moduleResolution": "Node", + "moduleResolution": "Bundler", "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, diff --git a/examples/p-ts/projects/p-ts-frontend/tsconfig.node.json b/examples/p-ts/projects/p-ts-frontend/tsconfig.node.json index 9d31e2a..e32f207 100644 --- a/examples/p-ts/projects/p-ts-frontend/tsconfig.node.json +++ b/examples/p-ts/projects/p-ts-frontend/tsconfig.node.json @@ -1,8 +1,8 @@ { "compilerOptions": { "composite": true, - "module": "ESNext", - "moduleResolution": "Node", + "module": "NodeNext", + "moduleResolution": "NodeNext", "allowSyntheticDefaultImports": true }, "include": ["vite.config.ts"] diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/.copier-answers.yml b/examples/s-ts/projects/s-ts-contracts/.algokit/.copier-answers.yml index ec8d6d2..0551700 100644 --- a/examples/s-ts/projects/s-ts-contracts/.algokit/.copier-answers.yml +++ b/examples/s-ts/projects/s-ts-contracts/.algokit/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 0.3.7 +_commit: 0.3.7-16-g0ed1ece _src_path: gh:algorandfoundation/algokit-typescript-template author_email: None author_name: None diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 index 4626980..b1c76dd 100644 --- a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 +++ b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 @@ -23,7 +23,7 @@ export async function deploy() { }) } - const method = 'hello' + const method = 'hello' const response = await appClient.send.hello({ args: { name: 'world' }, }) diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 index 146e270..b94556a 100644 --- a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 +++ b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 @@ -1,6 +1,5 @@ -import { Config } from '@algorandfoundation/algokit-utils' +import { Config, Address } from '@algorandfoundation/algokit-utils' import { algorandFixture } from '@algorandfoundation/algokit-utils/testing' -import { Address } from 'algosdk' import { beforeAll, beforeEach, describe, expect, test } from 'vitest' import { {{ contract_name.split('_')|map('capitalize')|join }}Factory } from '../artifacts/{{ contract_name }}/{{ contract_name.split('_')|map('capitalize')|join }}Client' diff --git a/examples/s-ts/projects/s-ts-contracts/README.md b/examples/s-ts/projects/s-ts-contracts/README.md index 4303b31..1fe031d 100644 --- a/examples/s-ts/projects/s-ts-contracts/README.md +++ b/examples/s-ts/projects/s-ts-contracts/README.md @@ -98,7 +98,7 @@ This project makes use of Algorand TypeScript to build Algorand smart contracts. - [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-ts) - A set of core Algorand utilities that make it easier to build solutions on Algorand. - [NPM](https://www.npmjs.com/): TypeScript packaging and dependency management. - [TypeScript](https://www.typescriptlang.org/): Strongly typed programming language that builds on JavaScript -- [ts-node-dev](https://github.com/wclr/ts-node-dev): TypeScript development execution environment +- [tsx](https://github.com/wclr/tsx): TypeScript development execution environment It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. diff --git a/examples/s-ts/projects/s-ts-contracts/package.json b/examples/s-ts/projects/s-ts-contracts/package.json index ce7ecfb..bda8b65 100644 --- a/examples/s-ts/projects/s-ts-contracts/package.json +++ b/examples/s-ts/projects/s-ts-contracts/package.json @@ -3,10 +3,11 @@ "version": "1.0.0", "description": "Smart contract deployer", "main": "smart_contracts/index.ts", + "type": "module", "scripts": { "build": "algokit compile ts smart_contracts --output-source-map --out-dir artifacts && algokit generate client smart_contracts/artifacts --output {app_spec_dir}/{contract_name}Client.ts", - "deploy": "ts-node-dev --transpile-only --watch .env -r dotenv/config smart_contracts/index.ts", - "deploy:ci": "ts-node --transpile-only -r dotenv/config smart_contracts/index.ts", + "deploy": "tsx watch -r dotenv/config smart_contracts/index.ts", + "deploy:ci": "tsx -r dotenv/config smart_contracts/index.ts", "check-types": "tsc --noEmit" }, "engines": { @@ -17,15 +18,14 @@ "@algorandfoundation/algorand-typescript": "^1.0.1" }, "devDependencies": { - "@algorandfoundation/algokit-client-generator": "^6.0.0", - "@algorandfoundation/algokit-utils": "^9.0.0", - "@algorandfoundation/algokit-utils-debug": "^1.0.4", + "@algorandfoundation/algokit-client-generator": "^7.0.0-alpha.5", + "@algorandfoundation/algokit-utils": "^10.0.0-alpha.40", + "@algorandfoundation/algokit-utils-debug": "^2.0.0-alpha.2", "@algorandfoundation/puya-ts": "^1.0.1", "@rollup/plugin-typescript": "^12.1.2", "@tsconfig/node22": "^22.0.0", - "algosdk": "^3.0.0", "dotenv": "^16.4.7", - "ts-node-dev": "^2.0.0", + "tsx": "^4.19.3", "typescript": "^5.7.3" }, "overrides": { diff --git a/examples/s-ts/projects/s-ts-contracts/smart_contracts/hello_world/deploy-config.ts b/examples/s-ts/projects/s-ts-contracts/smart_contracts/hello_world/deploy-config.ts index 6b9d652..6cf7f14 100644 --- a/examples/s-ts/projects/s-ts-contracts/smart_contracts/hello_world/deploy-config.ts +++ b/examples/s-ts/projects/s-ts-contracts/smart_contracts/hello_world/deploy-config.ts @@ -23,7 +23,7 @@ export async function deploy() { }) } - const method = 'hello' + const method = 'hello' const response = await appClient.send.hello({ args: { name: 'world' }, }) diff --git a/examples/s-ts/projects/s-ts-contracts/smart_contracts/index.ts b/examples/s-ts/projects/s-ts-contracts/smart_contracts/index.ts index 6030d0e..d643cd8 100644 --- a/examples/s-ts/projects/s-ts-contracts/smart_contracts/index.ts +++ b/examples/s-ts/projects/s-ts-contracts/smart_contracts/index.ts @@ -1,8 +1,9 @@ import { Config } from '@algorandfoundation/algokit-utils' import { registerDebugEventHandlers } from '@algorandfoundation/algokit-utils-debug' -import { consoleLogger } from '@algorandfoundation/algokit-utils/types/logging' +import { consoleLogger } from '@algorandfoundation/algokit-utils/logging' import * as fs from 'node:fs' import * as path from 'node:path' +import { fileURLToPath } from 'node:url' // Uncomment the traceAll option to enable auto generation of AVM Debugger compliant sourceMap and simulation trace file for all AVM calls. // Learn more about using AlgoKit AVM Debugger to debug your TEAL source codes and inspect various kinds of Algorand transactions in atomic groups -> https://github.com/algorandfoundation/algokit-avm-vscode-Debugger @@ -15,7 +16,7 @@ Config.configure({ registerDebugEventHandlers() // base directory -const baseDir = path.resolve(__dirname) +const baseDir = path.dirname(fileURLToPath(import.meta.url)) // function to validate and dynamically import a module async function importDeployerIfExists(dir: string) { @@ -42,9 +43,9 @@ async function getDeployers() { (async () => { const contractName = process.argv.length > 2 ? process.argv[2] : undefined const contractDeployers = await getDeployers() - + const filteredDeployers = contractName - ? contractDeployers.filter(deployer => deployer.name === contractName) + ? contractDeployers.filter((deployer) => deployer.name === contractName) : contractDeployers if (contractName && filteredDeployers.length === 0) { diff --git a/examples/s-ts/projects/s-ts-contracts/tsconfig.json b/examples/s-ts/projects/s-ts-contracts/tsconfig.json index d989075..6cc09d9 100644 --- a/examples/s-ts/projects/s-ts-contracts/tsconfig.json +++ b/examples/s-ts/projects/s-ts-contracts/tsconfig.json @@ -1,26 +1,14 @@ { + "extends": "@tsconfig/node22/tsconfig.json", "compilerOptions": { - "target": "ES2020", - "declaration": true, - "declarationMap": true, - "sourceMap": true, - "strict": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "allowJs": false, - "allowSyntheticDefaultImports": true, - "module": "CommonJS", - "moduleResolution": "Node", - "resolveJsonModule": true, - "isolatedModules": true, "noEmit": true, - "lib": [ - "ESNext" - ], + "target": "ES2023", + "module": "ESNext", + "lib": ["ES2023"], + "moduleResolution": "Bundler", + "resolveJsonModule": true, + "esModuleInterop": true }, - "include": ["smart_contracts/**/*.ts"], - "exclude": ["node_modules", "dist", "coverage"] + "include": ["**/*.ts", "**/*.mts"], + "exclude": ["node_modules"] } diff --git a/examples/s-ts/projects/s-ts-frontend/.algokit/.copier-answers.yml b/examples/s-ts/projects/s-ts-frontend/.algokit/.copier-answers.yml index 3692b48..00e96a6 100644 --- a/examples/s-ts/projects/s-ts-frontend/.algokit/.copier-answers.yml +++ b/examples/s-ts/projects/s-ts-frontend/.algokit/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 1.1.1 +_commit: 1.1.1-13-gc5abe59 _src_path: gh:algorandfoundation/algokit-react-frontend-template author_email: None author_name: None diff --git a/examples/s-ts/projects/s-ts-frontend/.env.template b/examples/s-ts/projects/s-ts-frontend/.env.template index eb4b229..5dfbb2d 100644 --- a/examples/s-ts/projects/s-ts-frontend/.env.template +++ b/examples/s-ts/projects/s-ts-frontend/.env.template @@ -65,3 +65,6 @@ VITE_KMD_PASSWORD="" # VITE_INDEXER_SERVER="https://mainnet-idx.algonode.cloud" # VITE_INDEXER_PORT="" + +# Add your Web3Auth Client ID here if you want to test Web3Auth integration on TestNet or Mainnet +# VITE_WEB3_AUTH_CLIENT_ID="" \ No newline at end of file diff --git a/examples/s-ts/projects/s-ts-frontend/package.json b/examples/s-ts/projects/s-ts-frontend/package.json index 0e50c2e..1bbbe97 100644 --- a/examples/s-ts/projects/s-ts-frontend/package.json +++ b/examples/s-ts/projects/s-ts-frontend/package.json @@ -12,7 +12,7 @@ "npm": ">=9.0" }, "devDependencies": { - "@algorandfoundation/algokit-client-generator": "^5.0.0", + "@algorandfoundation/algokit-client-generator": "^7.0.0-alpha.5", "@types/node": "^18.17.14", "@types/react": "^18.2.11", "@types/react-dom": "^18.2.4", @@ -24,12 +24,12 @@ "vite-plugin-node-polyfills": "^0.22.0" }, "dependencies": { - "@algorandfoundation/algokit-utils": "^9.0.0", + "@algorandfoundation/algokit-utils": "^10.0.0-alpha.40", "@blockshake/defly-connect": "^1.2.1", "@perawallet/connect": "^1.4.1", - "@txnlab/use-wallet": "^4.0.0", - "@txnlab/use-wallet-react": "^4.0.0", - "algosdk": "^3.0.0", + "@txnlab/use-wallet": "^4.6.0", + "@txnlab/use-wallet-react": "^4.6.0", + "@web3auth/modal": "^9.7.0", "notistack": "^3.0.1", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/examples/s-ts/projects/s-ts-frontend/src/components/Transact.tsx b/examples/s-ts/projects/s-ts-frontend/src/components/Transact.tsx index 59d7cdd..36b1ec7 100644 --- a/examples/s-ts/projects/s-ts-frontend/src/components/Transact.tsx +++ b/examples/s-ts/projects/s-ts-frontend/src/components/Transact.tsx @@ -1,4 +1,5 @@ import { algo, AlgorandClient } from '@algorandfoundation/algokit-utils' +import { encodeTransactionRaw } from '@algorandfoundation/algokit-utils/transact' import { useWallet } from '@txnlab/use-wallet-react' import { useSnackbar } from 'notistack' import { useState } from 'react' @@ -18,12 +19,12 @@ const Transact = ({ openModal, setModalState }: TransactInterface) => { const { enqueueSnackbar } = useSnackbar() - const { transactionSigner, activeAddress } = useWallet() + const { signTransactions, activeAddress } = useWallet() const handleSubmitAlgo = async () => { setLoading(true) - if (!transactionSigner || !activeAddress) { + if (!signTransactions || !activeAddress) { enqueueSnackbar('Please connect wallet first', { variant: 'warning' }) return } @@ -31,7 +32,11 @@ const Transact = ({ openModal, setModalState }: TransactInterface) => { try { enqueueSnackbar('Sending transaction...', { variant: 'info' }) const result = await algorand.send.payment({ - signer: transactionSigner, + signer: async (txnGroup, indexesToSign) => { + const encoded = txnGroup.map((txn) => encodeTransactionRaw(txn)) + const signed = await signTransactions(encoded, indexesToSign) + return signed.filter((s): s is Uint8Array => s !== null) + }, sender: activeAddress, receiver: receiverAddress, amount: algo(1), diff --git a/examples/s-ts/projects/s-ts-frontend/src/contracts/HelloWorld.ts b/examples/s-ts/projects/s-ts-frontend/src/contracts/HelloWorld.ts index 36f013c..df17c1b 100644 --- a/examples/s-ts/projects/s-ts-frontend/src/contracts/HelloWorld.ts +++ b/examples/s-ts/projects/s-ts-frontend/src/contracts/HelloWorld.ts @@ -2,29 +2,19 @@ /** * This file was automatically generated by @algorandfoundation/algokit-client-generator. * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^7 + * requires: @algorandfoundation/algokit-utils: ^10 */ import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app' -import { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56' -import { - AppClient as _AppClient, - AppClientMethodCallParams, - AppClientParams, - AppClientBareCallParams, - CallOnComplete, - AppClientCompilationParams, - ResolveAppClientByCreatorAndName, - ResolveAppClientByNetwork, - CloneAppClientParams, -} from '@algorandfoundation/algokit-utils/types/app-client' -import { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer' -import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' -import SimulateResponse = modelsv2.SimulateResponse - -export const APP_SPEC: Arc56Contract = {"name":"HelloWorld","structs":{},"methods":[{"name":"hello","args":[{"type":"string","name":"name"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[37],"errorMessage":"OnCompletion must be NoOp && can only call when creating"},{"pc":[26],"errorMessage":"OnCompletion must be NoOp && can only call when not creating"},{"pc":[47],"errorMessage":"invalid array length header"},{"pc":[55],"errorMessage":"invalid number of bytes for arc4.dynamic_array"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgSGVsbG9Xb3JsZCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2hlbGxvX3JvdXRlQDMKICAgIGVycgoKbWFpbl9oZWxsb19yb3V0ZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gaGVsbG8obmFtZTogc3RyaW5nKTogc3RyaW5nIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiBoZWxsbwoKbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBIZWxsb1dvcmxkIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czo6SGVsbG9Xb3JsZC5oZWxsb1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmhlbGxvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gaGVsbG8obmFtZTogc3RyaW5nKTogc3RyaW5nIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgcHVzaGludCAwIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czo1CiAgICAvLyByZXR1cm4gYEhlbGxvLCAke25hbWV9YAogICAgcHVzaGJ5dGVzICJIZWxsbywgIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBoZWxsbyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcgewogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgAQCvs4RNhoAjgEAAQAxGRQxGBBEQgALMRkUMRgUEESBAUM2GgFJgQBZgQIISwEVEkRXAgCAB0hlbGxvLCBMUEkVFlcGAkxQgAQVH3x1TFCwgQFD","clear":"C4EBQw=="},"compilerInfo":{"compiler":"puya","compilerVersion":{"major":5,"minor":3,"patch":2}},"events":[],"templateVariables":{}} as unknown as Arc56Contract +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"HelloWorld","structs":{},"methods":[{"name":"hello","args":[{"type":"string","name":"name"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[37],"errorMessage":"OnCompletion must be NoOp && can only call when creating"},{"pc":[26],"errorMessage":"OnCompletion must be NoOp && can only call when not creating"},{"pc":[47],"errorMessage":"invalid array length header"},{"pc":[55],"errorMessage":"invalid number of bytes for arc4.dynamic_array"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgSGVsbG9Xb3JsZCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2hlbGxvX3JvdXRlQDMKICAgIGVycgoKbWFpbl9oZWxsb19yb3V0ZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gaGVsbG8obmFtZTogc3RyaW5nKTogc3RyaW5nIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiBoZWxsbwoKbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBIZWxsb1dvcmxkIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czo6SGVsbG9Xb3JsZC5oZWxsb1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmhlbGxvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gaGVsbG8obmFtZTogc3RyaW5nKTogc3RyaW5nIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgcHVzaGludCAwIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czo1CiAgICAvLyByZXR1cm4gYEhlbGxvLCAke25hbWV9YAogICAgcHVzaGJ5dGVzICJIZWxsbywgIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBoZWxsbyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcgewogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgAQCvs4RNhoAjgEAAQAxGRQxGBBEQgALMRkUMRgUEESBAUM2GgFJgQBZgQIISwEVEkRXAgCAB0hlbGxvLCBMUEkVFlcGAkxQgAQVH3x1TFCwgQFD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract /** * A state record containing binary data @@ -137,7 +127,7 @@ export type MethodReturn = HelloWorldTy * Defines supported create method params for this smart contract */ export type HelloWorldCreateCallParams = - | Expand + | Expand /** * Defines arguments required for the deploy method. */ @@ -258,7 +248,7 @@ export class HelloWorldFactory { * @param params The params for the bare (raw) call * @returns The params for a create call */ - bare: (params?: Expand) => { + bare: (params?: Expand) => { return this.appFactory.params.bare.create(params) }, }, @@ -279,7 +269,7 @@ export class HelloWorldFactory { * @param params The params for the bare (raw) call * @returns The transaction for a create call */ - bare: (params?: Expand) => { + bare: (params?: Expand) => { return this.appFactory.createTransaction.bare.create(params) }, }, @@ -300,7 +290,7 @@ export class HelloWorldFactory { * @param params The params for the bare (raw) call * @returns The create result */ - bare: async (params?: Expand) => { + bare: async (params?: Expand) => { const result = await this.appFactory.send.bare.create(params) return { result: result.result, appClient: new HelloWorldClient(result.appClient) } }, @@ -336,15 +326,7 @@ export class HelloWorldClient { appSpec: APP_SPEC, }) } - - /** - * Checks for decode errors on the given return value and maps the return value to the return type for the given method - * @returns The typed return value or undefined if there was no value - */ - decodeReturnValue(method: TSignature, returnValue: ABIReturn | undefined) { - return returnValue !== undefined ? getArc56ReturnValue>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined - } - + /** * Returns a new `HelloWorldClient` client, resolving the app by creator address and name * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). @@ -412,7 +394,7 @@ export class HelloWorldClient { * @param params The params for the smart contract call * @returns The call params */ - hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + hello: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { return this.appClient.params.call(HelloWorldParamsFactory.hello(params)) }, @@ -438,7 +420,7 @@ export class HelloWorldClient { * @param params The params for the smart contract call * @returns The call transaction */ - hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + hello: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { return this.appClient.createTransaction.call(HelloWorldParamsFactory.hello(params)) }, @@ -464,7 +446,7 @@ export class HelloWorldClient { * @param params The params for the smart contract call * @returns The call result */ - hello: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + hello: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { const result = await this.appClient.send.call(HelloWorldParamsFactory.hello(params)) return {...result, return: result.return as unknown as (undefined | HelloWorldReturns['hello(string)string'])} }, @@ -474,7 +456,7 @@ export class HelloWorldClient { /** * Clone this app client with different params * - * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. * @returns A new app client with the altered params */ public clone(params: CloneAppClientParams) { @@ -487,18 +469,16 @@ export class HelloWorldClient { state = { } - public newGroup(): HelloWorldComposer { + public newGroup(composerConfig?: TransactionComposerConfig): HelloWorldComposer { const client = this - const composer = this.algorand.newGroup() + const composer = this.algorand.newGroup(composerConfig) let promiseChain:Promise = Promise.resolve() - const resultMappers: Array any)> = [] return { /** * Add a hello(string)string method call against the HelloWorld contract */ - hello(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + hello(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hello(params))) - resultMappers.push((v) => client.decodeReturnValue('hello(string)string', v)) return this }, /** @@ -521,7 +501,7 @@ export class HelloWorldClient { const result = await (!options ? composer.simulate() : composer.simulate(options)) return { ...result, - returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + returns: result.returns?.map(val => val.returnValue) } }, async send(params?: SendParams) { @@ -529,7 +509,7 @@ export class HelloWorldClient { const result = await composer.send(params) return { ...result, - returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + returns: result.returns?.map(val => val.returnValue) } } } as unknown as HelloWorldComposer @@ -539,7 +519,6 @@ export type HelloWorldComposer = { /** * Calls the hello(string)string ABI method. * - * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ @@ -548,7 +527,7 @@ export type HelloWorldComposer = { /** * Makes a clear_state call to an existing instance of the HelloWorld smart contract. * - * @param args The arguments for the bare call + * @param params Any additional parameters for the bare call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ clearState(params?: AppClientBareCallParams): HelloWorldComposer<[...TReturns, undefined]> @@ -575,7 +554,7 @@ export type HelloWorldComposer = { */ send(params?: SendParams): Promise> } -export type HelloWorldComposerResults = Expand = Expand diff --git a/examples/s-ts/projects/s-ts-frontend/src/interfaces/network.ts b/examples/s-ts/projects/s-ts-frontend/src/interfaces/network.ts index a458edc..fdb97ae 100644 --- a/examples/s-ts/projects/s-ts-frontend/src/interfaces/network.ts +++ b/examples/s-ts/projects/s-ts-frontend/src/interfaces/network.ts @@ -1,5 +1,4 @@ -import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/types/network-client' -import type { TokenHeader } from 'algosdk/dist/types/client/urlTokenBaseHTTPClient' +import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/network-client' export interface AlgoViteClientConfig extends AlgoClientConfig { /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ @@ -7,7 +6,7 @@ export interface AlgoViteClientConfig extends AlgoClientConfig { /** The port to use e.g. 4001, 443, etc. */ port: string | number /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string | TokenHeader + token: string /** String representing current Algorand Network type (testnet/mainnet and etc) */ network: string } @@ -18,7 +17,7 @@ export interface AlgoViteKMDConfig extends AlgoClientConfig { /** The port to use e.g. 4001, 443, etc. */ port: string | number /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string | TokenHeader + token: string /** KMD wallet name */ wallet: string /** KMD wallet password */ diff --git a/examples/s-ts/projects/s-ts-frontend/tsconfig.json b/examples/s-ts/projects/s-ts-frontend/tsconfig.json index 443b6bd..a0f5661 100644 --- a/examples/s-ts/projects/s-ts-frontend/tsconfig.json +++ b/examples/s-ts/projects/s-ts-frontend/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, - "module": "ES2022" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + "module": "ESNext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, "declaration": true /* Generates corresponding '.d.ts' file. */, "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, "sourceMap": true /* Generates corresponding '.map' file. */, @@ -15,7 +15,7 @@ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, "allowJs": false, "allowSyntheticDefaultImports": true, - "moduleResolution": "Node", + "moduleResolution": "Bundler", "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, diff --git a/examples/s-ts/projects/s-ts-frontend/tsconfig.node.json b/examples/s-ts/projects/s-ts-frontend/tsconfig.node.json index 9d31e2a..e32f207 100644 --- a/examples/s-ts/projects/s-ts-frontend/tsconfig.node.json +++ b/examples/s-ts/projects/s-ts-frontend/tsconfig.node.json @@ -1,8 +1,8 @@ { "compilerOptions": { "composite": true, - "module": "ESNext", - "moduleResolution": "Node", + "module": "NodeNext", + "moduleResolution": "NodeNext", "allowSyntheticDefaultImports": true }, "include": ["vite.config.ts"] From de76dfaf93e49e982910e1bcb26004c548ad2bf9 Mon Sep 17 00:00:00 2001 From: p2arthur Date: Sun, 8 Mar 2026 23:38:53 -0700 Subject: [PATCH 05/12] chore: remove default template ref - makes ref an input that if empty defualts to algkit cli prod templates --- copier.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/copier.yaml b/copier.yaml index ce8cd27..e0b3ea2 100644 --- a/copier.yaml +++ b/copier.yaml @@ -22,8 +22,8 @@ _tasks: -a use_github_actions "{{ use_github_actions }}"' - "echo '==== 3/4 - Initializing contract template ===='" - - 'algokit init {{ "--template-url \"" ~ (contract_template_url if contract_template_url else ("gh:algorandfoundation/algokit-python-template" if contract_template == "python" else "gh:algorandfoundation/algokit-typescript-template" if contract_template == "typescript" else "gh:algorand-devrel/tealscript-algokit-template")) ~ "\" --UNSAFE-SECURITY-accept-template-url" if (contract_template_url or (contract_template_ref and (contract_template != "tealscript" or contract_template_ref != "prep/beta-release"))) else "-t " ~ contract_template }} -n {{ project_name }}-contracts --no-git --no-ide --no-bootstrap - {% if contract_template_ref and (contract_template != "tealscript" or contract_template_ref != "prep/beta-release") %} + - 'algokit init {{ "--template-url \"" ~ (contract_template_url if contract_template_url else ("gh:algorandfoundation/algokit-python-template" if contract_template == "python" else "gh:algorandfoundation/algokit-typescript-template" if contract_template == "typescript" else "gh:algorand-devrel/tealscript-algokit-template")) ~ "\" --UNSAFE-SECURITY-accept-template-url" if (contract_template_url or contract_template_ref) else "-t " ~ contract_template }} -n {{ project_name }}-contracts --no-git --no-ide --no-bootstrap + {% if contract_template_ref %} --template-url-ref "{{ contract_template_ref }}" {% endif %} -a author_email "{{ author_email }}" @@ -66,7 +66,7 @@ frontend_template_ref: type: str help: Override git ref (branch/tag) for frontend child template. when: false - default: 'prep/beta-release' + default: '' contract_template_url: type: str @@ -78,7 +78,7 @@ contract_template_ref: type: str help: Override git ref (branch/tag) for contract child template. when: false - default: 'prep/beta-release' + default: '' project_name: type: str From 5214399915a87ecc6536bd785a216993ac059351 Mon Sep 17 00:00:00 2001 From: p2arthur Date: Mon, 9 Mar 2026 17:55:46 -0700 Subject: [PATCH 06/12] ci: update check-python workflow to pass provider template url refs --- .github/workflows/check-python.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/check-python.yaml b/.github/workflows/check-python.yaml index 9cb918d..65e5c91 100644 --- a/.github/workflows/check-python.yaml +++ b/.github/workflows/check-python.yaml @@ -51,6 +51,9 @@ jobs: - name: Run tests shell: bash + env: + FRONTEND_TEMPLATE_URL: gh:algorandfoundation/algokit-react-frontend-template + FRONTEND_TEMPLATE_REF: prep/beta-release run: | set -o pipefail poetry run pytest --junitxml=pytest-junit.xml -n 1 From 2177351d7fc31bcc221ec9c0414e61c306165336 Mon Sep 17 00:00:00 2001 From: p2arthur Date: Mon, 9 Mar 2026 18:22:04 -0700 Subject: [PATCH 07/12] chore: update examples manually --- .github/workflows/check-python.yaml | 4 +- examples/p-py/.algokit/.copier-answers.yml | 4 +- .../.algokit/.copier-answers.yml | 2 +- .../{{ contract_name }}/deploy_config.py.j2 | 4 +- .../projects/p-py-contracts/pyproject.toml | 9 +- .../hello_world/deploy_config.py | 4 +- .../tests/hello_world_client_test.py | 12 +- .../.algokit/.copier-answers.yml | 2 +- .../p-py/projects/p-py-frontend/.env.template | 3 + .../p-py/projects/p-py-frontend/package.json | 10 +- .../p-py-frontend/src/components/Transact.tsx | 11 +- .../p-py-frontend/src/contracts/AppCall.ts | 558 ++ .../src/contracts/AppExpectingEffects.ts | 630 +++ .../src/contracts/Arc4InnerTxnsContract.ts | 556 ++ .../src/contracts/Arc4PrimitiveOpsContract.ts | 3982 ++++++++++++++ .../src/contracts/BoxContract.ts | 2352 +++++++++ .../p-py-frontend/src/contracts/Contract.ts | 621 +++ .../p-py-frontend/src/contracts/ContractV0.ts | 621 +++ .../p-py-frontend/src/contracts/ContractV1.ts | 621 +++ .../src/contracts/CryptoOpsContract.ts | 1422 +++++ .../src/contracts/DynamicArrayInitContract.ts | 755 +++ .../src/contracts/DynamicItxnGroup.ts | 629 +++ .../src/contracts/GlobalStateContract.ts | 2649 ++++++++++ .../src/contracts/GlobalStateValidator.ts | 557 ++ .../p-py-frontend/src/contracts/HelloWorld.ts | 75 +- .../src/contracts/ITxnOpsContract.ts | 554 ++ .../src/contracts/ImmutableArrayContract.ts | 2231 ++++++++ .../contracts/ImmutableArrayInitContract.ts | 755 +++ .../src/contracts/LocalStateContract.ts | 1746 ++++++ .../src/contracts/MiscellaneousOpsContract.ts | 3082 +++++++++++ .../src/contracts/PrimitiveOpsContract.ts | 4701 +++++++++++++++++ .../src/contracts/SignaturesContract.ts | 1203 +++++ .../src/contracts/StateAcctParamsGet.ts | 1319 +++++ .../contracts/StateAcctParamsGetContract.ts | 1526 ++++++ .../src/contracts/StateAppGlobalContract.ts | 1018 ++++ .../src/contracts/StateAppGlobalExContract.ts | 551 ++ .../src/contracts/StateAppLocalContract.ts | 1197 +++++ .../src/contracts/StateAppLocalExContract.ts | 635 +++ .../src/contracts/StateAppParamsContract.ts | 1112 ++++ .../contracts/StateAssetHoldingContract.ts | 631 +++ .../src/contracts/StateAssetParamsContract.ts | 1319 +++++ .../src/contracts/StateMutations.ts | 880 +++ .../src/contracts/StaticSizeContract.ts | 1009 ++++ .../src/contracts/TuplesContract.ts | 558 ++ .../src/contracts/VerifierContract.ts | 554 ++ .../p-py-frontend/src/interfaces/network.ts | 7 +- .../p-py/projects/p-py-frontend/tsconfig.json | 4 +- .../projects/p-py-frontend/tsconfig.node.json | 4 +- 48 files changed, 42604 insertions(+), 85 deletions(-) create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/AppCall.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/AppExpectingEffects.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/Arc4InnerTxnsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/Arc4PrimitiveOpsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/BoxContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/Contract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ContractV0.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ContractV1.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/CryptoOpsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/DynamicArrayInitContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/DynamicItxnGroup.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateValidator.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ITxnOpsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayInitContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/LocalStateContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/MiscellaneousOpsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/PrimitiveOpsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/SignaturesContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGet.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGetContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalExContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalExContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppParamsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAssetHoldingContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAssetParamsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateMutations.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StaticSizeContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/TuplesContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/VerifierContract.ts diff --git a/.github/workflows/check-python.yaml b/.github/workflows/check-python.yaml index 65e5c91..15eed9d 100644 --- a/.github/workflows/check-python.yaml +++ b/.github/workflows/check-python.yaml @@ -52,8 +52,8 @@ jobs: - name: Run tests shell: bash env: - FRONTEND_TEMPLATE_URL: gh:algorandfoundation/algokit-react-frontend-template - FRONTEND_TEMPLATE_REF: prep/beta-release + FRONTEND_TEMPLATE_URL: gh:algorandfoundation/algokit-react-frontend-template # If empty defaults to production templates on algokit cli + FRONTEND_TEMPLATE_REF: prep/beta-release # If empty defaults to production templates on algokit cli run: | set -o pipefail poetry run pytest --junitxml=pytest-junit.xml -n 1 diff --git a/examples/p-py/.algokit/.copier-answers.yml b/examples/p-py/.algokit/.copier-answers.yml index 24a5aee..e14c54a 100644 --- a/examples/p-py/.algokit/.copier-answers.yml +++ b/examples/p-py/.algokit/.copier-answers.yml @@ -1,6 +1,6 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: -_src_path: +_commit: 2.1.8-6-g5214399 +_src_path: /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpearc_7jg/template author_email: None author_name: None cloud_provider: netlify diff --git a/examples/p-py/projects/p-py-contracts/.algokit/.copier-answers.yml b/examples/p-py/projects/p-py-contracts/.algokit/.copier-answers.yml index eb301fd..ac678d7 100644 --- a/examples/p-py/projects/p-py-contracts/.algokit/.copier-answers.yml +++ b/examples/p-py/projects/p-py-contracts/.algokit/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 1.8.1 +_commit: 1.8.1-13-g270c4a5 _src_path: gh:algorandfoundation/algokit-python-template author_email: None author_name: None diff --git a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy_config.py.j2 b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy_config.py.j2 index a2ff46d..194ba5e 100644 --- a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy_config.py.j2 +++ b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy_config.py.j2 @@ -16,7 +16,7 @@ def deploy() -> None: deployer_ = algorand.account.from_environment("DEPLOYER") factory = algorand.client.get_typed_app_factory( - {{ contract_name.split('_')|map('capitalize')|join }}Factory, default_sender=deployer_.address + {{ contract_name.split('_')|map('capitalize')|join }}Factory, default_sender=deployer_.addr ) app_client, result = factory.deploy( @@ -31,7 +31,7 @@ def deploy() -> None: algorand.send.payment( algokit_utils.PaymentParams( amount=algokit_utils.AlgoAmount(algo=1), - sender=deployer_.address, + sender=deployer_.addr, receiver=app_client.app_address, ) ) diff --git a/examples/p-py/projects/p-py-contracts/pyproject.toml b/examples/p-py/projects/p-py-contracts/pyproject.toml index ad5bfb8..e8c0604 100644 --- a/examples/p-py/projects/p-py-contracts/pyproject.toml +++ b/examples/p-py/projects/p-py-contracts/pyproject.toml @@ -8,13 +8,13 @@ package-mode = false [tool.poetry.dependencies] python = "^3.12" -algokit-utils = "^4.0.0" +algokit-utils = "^5.0.0a13" python-dotenv = "^1.0.0" algorand-python = "^3" -algorand-python-testing = "^1" +algorand-python-testing = {git = "https://github.com/algorandfoundation/algorand-python-testing.git", branch = "refactor/util-v5"} [tool.poetry.group.dev.dependencies] -algokit-client-generator = "^2.1.0" +algokit-client-generator = "^3.0.0a3" black = {extras = ["d"], version = "*"} ruff = "^0.9.4" mypy = "^1" @@ -58,9 +58,8 @@ disallow_any_unimported = true disallow_any_expr = true disallow_any_decorated = true disallow_any_explicit = true -untyped_calls_exclude = ["algosdk"] # Remove if you prefer to use mypy's default behavior against -# untyped algosdk types +# untyped types [[tool.mypy.overrides]] module = "tests.*" disallow_any_expr = false diff --git a/examples/p-py/projects/p-py-contracts/smart_contracts/hello_world/deploy_config.py b/examples/p-py/projects/p-py-contracts/smart_contracts/hello_world/deploy_config.py index 364edf6..cf0bb15 100644 --- a/examples/p-py/projects/p-py-contracts/smart_contracts/hello_world/deploy_config.py +++ b/examples/p-py/projects/p-py-contracts/smart_contracts/hello_world/deploy_config.py @@ -16,7 +16,7 @@ def deploy() -> None: deployer_ = algorand.account.from_environment("DEPLOYER") factory = algorand.client.get_typed_app_factory( - HelloWorldFactory, default_sender=deployer_.address + HelloWorldFactory, default_sender=deployer_.addr ) app_client, result = factory.deploy( @@ -31,7 +31,7 @@ def deploy() -> None: algorand.send.payment( algokit_utils.PaymentParams( amount=algokit_utils.AlgoAmount(algo=1), - sender=deployer_.address, + sender=deployer_.addr, receiver=app_client.app_address, ) ) diff --git a/examples/p-py/projects/p-py-contracts/tests/hello_world_client_test.py b/examples/p-py/projects/p-py-contracts/tests/hello_world_client_test.py index 6a9c447..1ce278f 100644 --- a/examples/p-py/projects/p-py-contracts/tests/hello_world_client_test.py +++ b/examples/p-py/projects/p-py-contracts/tests/hello_world_client_test.py @@ -1,9 +1,9 @@ import algokit_utils import pytest from algokit_utils import ( + AddressWithSigners, AlgoAmount, AlgorandClient, - SigningAccount, ) from smart_contracts.artifacts.hello_world.hello_world_client import ( @@ -13,20 +13,20 @@ @pytest.fixture() -def deployer(algorand_client: AlgorandClient) -> SigningAccount: +def deployer(algorand_client: AlgorandClient) -> AddressWithSigners: account = algorand_client.account.from_environment("DEPLOYER") algorand_client.account.ensure_funded_from_environment( - account_to_fund=account.address, min_spending_balance=AlgoAmount.from_algo(10) + account_to_fund=account.addr, min_spending_balance=AlgoAmount.from_algo(10) ) return account @pytest.fixture() def hello_world_client( - algorand_client: AlgorandClient, deployer: SigningAccount + algorand_client: AlgorandClient, deployer: AddressWithSigners ) -> HelloWorldClient: factory = algorand_client.client.get_typed_app_factory( - HelloWorldFactory, default_sender=deployer.address + HelloWorldFactory, default_sender=deployer.addr ) client, _ = factory.deploy( @@ -52,4 +52,4 @@ def test_simulate_says_hello_with_correct_budget_consumed( ) assert result.returns[0].value == "Hello, World" assert result.returns[1].value == "Hello, Jane" - assert result.simulate_response["txn-groups"][0]["app-budget-consumed"] < 100 + assert result.simulate_response.txn_groups[0].app_budget_consumed < 100 diff --git a/examples/p-py/projects/p-py-frontend/.algokit/.copier-answers.yml b/examples/p-py/projects/p-py-frontend/.algokit/.copier-answers.yml index cfeea6e..7af32d8 100644 --- a/examples/p-py/projects/p-py-frontend/.algokit/.copier-answers.yml +++ b/examples/p-py/projects/p-py-frontend/.algokit/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 1.1.1 +_commit: 1.1.1-13-gc5abe59 _src_path: gh:algorandfoundation/algokit-react-frontend-template author_email: None author_name: None diff --git a/examples/p-py/projects/p-py-frontend/.env.template b/examples/p-py/projects/p-py-frontend/.env.template index eb4b229..5dfbb2d 100644 --- a/examples/p-py/projects/p-py-frontend/.env.template +++ b/examples/p-py/projects/p-py-frontend/.env.template @@ -65,3 +65,6 @@ VITE_KMD_PASSWORD="" # VITE_INDEXER_SERVER="https://mainnet-idx.algonode.cloud" # VITE_INDEXER_PORT="" + +# Add your Web3Auth Client ID here if you want to test Web3Auth integration on TestNet or Mainnet +# VITE_WEB3_AUTH_CLIENT_ID="" \ No newline at end of file diff --git a/examples/p-py/projects/p-py-frontend/package.json b/examples/p-py/projects/p-py-frontend/package.json index bac0511..1704502 100644 --- a/examples/p-py/projects/p-py-frontend/package.json +++ b/examples/p-py/projects/p-py-frontend/package.json @@ -12,7 +12,7 @@ "npm": ">=9.0" }, "devDependencies": { - "@algorandfoundation/algokit-client-generator": "^5.0.0", + "@algorandfoundation/algokit-client-generator": "^7.0.0-alpha.5", "@types/node": "^18.17.14", "@types/react": "^18.2.11", "@types/react-dom": "^18.2.4", @@ -35,12 +35,12 @@ "vite-plugin-node-polyfills": "^0.22.0" }, "dependencies": { - "@algorandfoundation/algokit-utils": "^9.0.0", + "@algorandfoundation/algokit-utils": "^10.0.0-alpha.40", "@blockshake/defly-connect": "^1.2.1", "@perawallet/connect": "^1.4.1", - "@txnlab/use-wallet": "^4.0.0", - "@txnlab/use-wallet-react": "^4.0.0", - "algosdk": "^3.0.0", + "@txnlab/use-wallet": "^4.6.0", + "@txnlab/use-wallet-react": "^4.6.0", + "@web3auth/modal": "^9.7.0", "daisyui": "^4.0.0", "notistack": "^3.0.1", "react": "^18.2.0", diff --git a/examples/p-py/projects/p-py-frontend/src/components/Transact.tsx b/examples/p-py/projects/p-py-frontend/src/components/Transact.tsx index 2ba3e96..3f8191d 100644 --- a/examples/p-py/projects/p-py-frontend/src/components/Transact.tsx +++ b/examples/p-py/projects/p-py-frontend/src/components/Transact.tsx @@ -1,4 +1,5 @@ import { algo, AlgorandClient } from '@algorandfoundation/algokit-utils' +import { encodeTransactionRaw } from '@algorandfoundation/algokit-utils/transact' import { useWallet } from '@txnlab/use-wallet-react' import { useSnackbar } from 'notistack' import { useState } from 'react' @@ -18,12 +19,12 @@ const Transact = ({ openModal, setModalState }: TransactInterface) => { const { enqueueSnackbar } = useSnackbar() - const { transactionSigner, activeAddress } = useWallet() + const { signTransactions, activeAddress } = useWallet() const handleSubmitAlgo = async () => { setLoading(true) - if (!transactionSigner || !activeAddress) { + if (!signTransactions || !activeAddress) { enqueueSnackbar('Please connect wallet first', { variant: 'warning' }) return } @@ -31,7 +32,11 @@ const Transact = ({ openModal, setModalState }: TransactInterface) => { try { enqueueSnackbar('Sending transaction...', { variant: 'info' }) const result = await algorand.send.payment({ - signer: transactionSigner, + signer: async (txnGroup, indexesToSign) => { + const encoded = txnGroup.map((txn) => encodeTransactionRaw(txn)) + const signed = await signTransactions(encoded, indexesToSign) + return signed.filter((s): s is Uint8Array => s !== null) + }, sender: activeAddress, receiver: receiverAddress, amount: algo(1), diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/AppCall.ts b/examples/p-py/projects/p-py-frontend/src/contracts/AppCall.ts new file mode 100644 index 0000000..c61e144 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/AppCall.ts @@ -0,0 +1,558 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"AppCall","structs":{},"methods":[{"name":"some_value","args":[],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NAogICAgLy8gY2xhc3MgQXBwQ2FsbChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANQogICAgcHVzaGJ5dGVzIDB4ZDM0NzllNjUgLy8gbWV0aG9kICJzb21lX3ZhbHVlKCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3NvbWVfdmFsdWVfcm91dGVAMwogICAgZXJyCgptYWluX3NvbWVfdmFsdWVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIHNvbWVfdmFsdWUKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyZWF0ZWRBcHBBc3NldC5vdGhlci5BcHBDYWxsLnNvbWVfdmFsdWVbcm91dGluZ10oKSAtPiB2b2lkOgpzb21lX3ZhbHVlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9vdGhlci5weTo3CiAgICAvLyByZXR1cm4gR2xvYmFsLmdyb3VwX3NpemUgKiAoVHhuLmdyb3VwX2luZGV4ICsgMSkKICAgIGdsb2JhbCBHcm91cFNpemUKICAgIHR4biBHcm91cEluZGV4CiAgICBwdXNoaW50IDEKICAgICsKICAgICoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcHVzaGludCAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgATTR55lNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEMyBDEWgQEICxaABBUffHVMULCBAUM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the AppCall contract + */ +export type AppCallArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'some_value()uint64': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'some_value()uint64': [] + } +} + +/** + * The return type for each method + */ +export type AppCallReturns = { + 'some_value()uint64': bigint +} + +/** + * Defines the types of available calls and state of the AppCall smart contract. + */ +export type AppCallTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'some_value()uint64' | 'some_value', { + argsObj: AppCallArgs['obj']['some_value()uint64'] + argsTuple: AppCallArgs['tuple']['some_value()uint64'] + returns: AppCallReturns['some_value()uint64'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type AppCallSignatures = keyof AppCallTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type AppCallNonVoidMethodSignatures = keyof AppCallTypes['methods'] extends infer T ? T extends keyof AppCallTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the AppCall smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = AppCallTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the AppCall smart contract to the method's return type + */ +export type MethodReturn = AppCallTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type AppCallCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type AppCallDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: AppCallCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the AppCall smart contract + */ +export abstract class AppCallParamsFactory { + /** + * Constructs a no op call for the some_value()uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static someValue(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'some_value()uint64' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the AppCall smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class AppCallFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `AppCallFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new AppCallClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new AppCallClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the AppCall smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: AppCallDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new AppCallClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AppCall smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AppCall smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AppCall smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new AppCallClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the AppCall smart contract + */ +export class AppCallClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `AppCallClient` + * + * @param appClient An `AppClient` instance which has been created with the AppCall app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `AppCallClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `AppCallClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new AppCallClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `AppCallClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new AppCallClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the AppCall smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the AppCall smart contract using the `some_value()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + someValue: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(AppCallParamsFactory.someValue(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the AppCall smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the AppCall smart contract using the `some_value()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + someValue: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(AppCallParamsFactory.someValue(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the AppCall smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the AppCall smart contract using the `some_value()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + someValue: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(AppCallParamsFactory.someValue(params)) + return {...result, return: result.return as unknown as (undefined | AppCallReturns['some_value()uint64'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new AppCallClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current AppCall app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): AppCallComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a some_value()uint64 method call against the AppCall contract + */ + someValue(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.someValue(params))) + return this + }, + /** + * Add a clear state call to the AppCall contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as AppCallComposer + } +} +export type AppCallComposer = { + /** + * Calls the some_value()uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + someValue(params?: CallParams): AppCallComposer<[...TReturns, AppCallReturns['some_value()uint64'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the AppCall smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): AppCallComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): AppCallComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type AppCallComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/AppExpectingEffects.ts b/examples/p-py/projects/p-py-frontend/src/contracts/AppExpectingEffects.ts new file mode 100644 index 0000000..1a953ef --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/AppExpectingEffects.ts @@ -0,0 +1,630 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"AppExpectingEffects","structs":{},"methods":[{"name":"create_group","args":[{"type":"acfg","name":"asset_create"},{"type":"appl","name":"app_create"}],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"log_group","args":[{"type":"appl","name":"app_call"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[159],"errorMessage":"application log value is not the result of an ABI return"},{"pc":[96],"errorMessage":"expected app created"},{"pc":[81],"errorMessage":"expected asset created"},{"pc":[105],"errorMessage":"expected correct app id"},{"pc":[90],"errorMessage":"expected correct asset id"},{"pc":[139],"errorMessage":"expected correct method called"},{"pc":[145],"errorMessage":"expected logs"},{"pc":[65],"errorMessage":"transaction type is acfg"},{"pc":[75,126],"errorMessage":"transaction type is appl"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBBcHBFeHBlY3RpbmdFZmZlY3RzKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg2ZDNhMDQzOSAweDYyYTBlZjYyIC8vIG1ldGhvZCAiY3JlYXRlX2dyb3VwKGFjZmcsYXBwbCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19ncm91cChhcHBsKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGVfZ3JvdXAgbG9nX2dyb3VwCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyZWF0ZWRBcHBBc3NldC5jb250cmFjdC5BcHBFeHBlY3RpbmdFZmZlY3RzLmNyZWF0ZV9ncm91cFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZV9ncm91cDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFjZmcKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjExCiAgICAvLyBhc3NlcnQgYXNzZXRfY3JlYXRlLmNyZWF0ZWRfYXNzZXQuaWQsICJleHBlY3RlZCBhc3NldCBjcmVhdGVkIgogICAgZGlnIDEKICAgIGd0eG5zIENyZWF0ZWRBc3NldElECiAgICBkdXAKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCBjcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjEzCiAgICAvLyBvcC5nYWlkKGFzc2V0X2NyZWF0ZS5ncm91cF9pbmRleCkgPT0gYXNzZXRfY3JlYXRlLmNyZWF0ZWRfYXNzZXQuaWQKICAgIHVuY292ZXIgMgogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgZ2FpZHMKICAgIGRpZyAxCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToxMi0xNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5nYWlkKGFzc2V0X2NyZWF0ZS5ncm91cF9pbmRleCkgPT0gYXNzZXRfY3JlYXRlLmNyZWF0ZWRfYXNzZXQuaWQKICAgIC8vICksICJleHBlY3RlZCBjb3JyZWN0IGFzc2V0IGlkIgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgYXNzZXQgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MTUKICAgIC8vIGFzc2VydCBhcHBfY3JlYXRlLmNyZWF0ZWRfYXBwLmlkLCAiZXhwZWN0ZWQgYXBwIGNyZWF0ZWQiCiAgICBkaWcgMQogICAgZ3R4bnMgQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcCBjcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjE3CiAgICAvLyBvcC5nYWlkKGFwcF9jcmVhdGUuZ3JvdXBfaW5kZXgpID09IGFwcF9jcmVhdGUuY3JlYXRlZF9hcHAuaWQKICAgIHVuY292ZXIgMgogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgZ2FpZHMKICAgIGRpZyAxCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToxNi0xOAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5nYWlkKGFwcF9jcmVhdGUuZ3JvdXBfaW5kZXgpID09IGFwcF9jcmVhdGUuY3JlYXRlZF9hcHAuaWQKICAgIC8vICksICJleHBlY3RlZCBjb3JyZWN0IGFwcCBpZCIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGFwcCBpZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcmVhdGVkQXBwQXNzZXQuY29udHJhY3QuQXBwRXhwZWN0aW5nRWZmZWN0cy5sb2dfZ3JvdXBbcm91dGluZ10oKSAtPiB2b2lkOgpsb2dfZ3JvdXA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgYXBwX2NhbGwuYXBwX2FyZ3MoMCkgPT0gYXJjNC5hcmM0X3NpZ25hdHVyZSgKICAgIGR1cAogICAgcHVzaGludCAwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToyNC0yNgogICAgLy8gYXNzZXJ0IGFwcF9jYWxsLmFwcF9hcmdzKDApID09IGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgInNvbWVfdmFsdWUoKXVpbnQ2NCIKICAgIC8vICksICJleHBlY3RlZCBjb3JyZWN0IG1ldGhvZCBjYWxsZWQiCiAgICBwdXNoYnl0ZXMgMHhkMzQ3OWU2NSAvLyBtZXRob2QgInNvbWVfdmFsdWUoKXVpbnQ2NCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBtZXRob2QgY2FsbGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjI3CiAgICAvLyBhc3NlcnQgYXBwX2NhbGwubnVtX2xvZ3MgPT0gMSwgImV4cGVjdGVkIGxvZ3MiCiAgICBkdXAKICAgIGd0eG5zIE51bUxvZ3MKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxvZ3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MjkKICAgIC8vIGFyYzQuVUludDY0LmZyb21fbG9nKGFwcF9jYWxsLmxhc3RfbG9nKQogICAgZHVwCiAgICBndHhucyBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjMwCiAgICAvLyA9PSAoYXBwX2NhbGwuZ3JvdXBfaW5kZXggKyAxKSAqIEdsb2JhbC5ncm91cF9zaXplCiAgICBzd2FwCiAgICBndHhucyBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgKgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToyOS0zMAogICAgLy8gYXJjNC5VSW50NjQuZnJvbV9sb2coYXBwX2NhbGwubGFzdF9sb2cpCiAgICAvLyA9PSAoYXBwX2NhbGwuZ3JvdXBfaW5kZXggKyAxKSAqIEdsb2JhbC5ncm91cF9zaXplCiAgICBpdG9iCiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MjgtMzEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgYXJjNC5VSW50NjQuZnJvbV9sb2coYXBwX2NhbGwubGFzdF9sb2cpCiAgICAvLyAgICAgPT0gKGFwcF9jYWxsLmdyb3VwX2luZGV4ICsgMSkgKiBHbG9iYWwuZ3JvdXBfc2l6ZQogICAgLy8gKQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQYmAQQVH3x1MRtBAB0xGRREMRhEggIEbToEOQRioO9iNhoAjgIACQBIADEZFDEYFBBDMRaBAglJOBCBAxJEMRYiCUk4ECMSREsBODxJRE8COBY9SwESREsBOD1JRE8COBY9SwESREwWTBZQKExQsCJDMRYiCUk4ECMSREmBAMIagATTR55lEkRJODsiEkRJOD5JVwQATFcABCgSREw4FiIIMgQLFqhEIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the AppExpectingEffects contract + */ +export type AppExpectingEffectsArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'create_group(acfg,appl)(uint64,uint64)': { + assetCreate?: AppMethodCallTransactionArgument + appCreate: AppMethodCallTransactionArgument + } + 'log_group(appl)void': { + appCall: AppMethodCallTransactionArgument + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'create_group(acfg,appl)(uint64,uint64)': [assetCreate: AppMethodCallTransactionArgument | undefined, appCreate: AppMethodCallTransactionArgument] + 'log_group(appl)void': [appCall: AppMethodCallTransactionArgument] + } +} + +/** + * The return type for each method + */ +export type AppExpectingEffectsReturns = { + 'create_group(acfg,appl)(uint64,uint64)': [bigint, bigint] + 'log_group(appl)void': void +} + +/** + * Defines the types of available calls and state of the AppExpectingEffects smart contract. + */ +export type AppExpectingEffectsTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'create_group(acfg,appl)(uint64,uint64)' | 'create_group', { + argsObj: AppExpectingEffectsArgs['obj']['create_group(acfg,appl)(uint64,uint64)'] + argsTuple: AppExpectingEffectsArgs['tuple']['create_group(acfg,appl)(uint64,uint64)'] + returns: AppExpectingEffectsReturns['create_group(acfg,appl)(uint64,uint64)'] + }> + & Record<'log_group(appl)void' | 'log_group', { + argsObj: AppExpectingEffectsArgs['obj']['log_group(appl)void'] + argsTuple: AppExpectingEffectsArgs['tuple']['log_group(appl)void'] + returns: AppExpectingEffectsReturns['log_group(appl)void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type AppExpectingEffectsSignatures = keyof AppExpectingEffectsTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type AppExpectingEffectsNonVoidMethodSignatures = keyof AppExpectingEffectsTypes['methods'] extends infer T ? T extends keyof AppExpectingEffectsTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the AppExpectingEffects smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = AppExpectingEffectsTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the AppExpectingEffects smart contract to the method's return type + */ +export type MethodReturn = AppExpectingEffectsTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type AppExpectingEffectsCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type AppExpectingEffectsDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: AppExpectingEffectsCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the AppExpectingEffects smart contract + */ +export abstract class AppExpectingEffectsParamsFactory { + /** + * Constructs a no op call for the create_group(acfg,appl)(uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static createGroup(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'create_group(acfg,appl)(uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.assetCreate, params.args.appCreate], + } + } + /** + * Constructs a no op call for the log_group(appl)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static logGroup(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'log_group(appl)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.appCall], + } + } +} + +/** + * A factory to create and deploy one or more instance of the AppExpectingEffects smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class AppExpectingEffectsFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `AppExpectingEffectsFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new AppExpectingEffectsClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new AppExpectingEffectsClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the AppExpectingEffects smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: AppExpectingEffectsDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new AppExpectingEffectsClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AppExpectingEffects smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AppExpectingEffects smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AppExpectingEffects smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new AppExpectingEffectsClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the AppExpectingEffects smart contract + */ +export class AppExpectingEffectsClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `AppExpectingEffectsClient` + * + * @param appClient An `AppClient` instance which has been created with the AppExpectingEffects app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `AppExpectingEffectsClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `AppExpectingEffectsClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new AppExpectingEffectsClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `AppExpectingEffectsClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new AppExpectingEffectsClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the AppExpectingEffects smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the AppExpectingEffects smart contract using the `create_group(acfg,appl)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + createGroup: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(AppExpectingEffectsParamsFactory.createGroup(params)) + }, + + /** + * Makes a call to the AppExpectingEffects smart contract using the `log_group(appl)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + logGroup: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(AppExpectingEffectsParamsFactory.logGroup(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the AppExpectingEffects smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the AppExpectingEffects smart contract using the `create_group(acfg,appl)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + createGroup: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(AppExpectingEffectsParamsFactory.createGroup(params)) + }, + + /** + * Makes a call to the AppExpectingEffects smart contract using the `log_group(appl)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + logGroup: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(AppExpectingEffectsParamsFactory.logGroup(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the AppExpectingEffects smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the AppExpectingEffects smart contract using the `create_group(acfg,appl)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + createGroup: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(AppExpectingEffectsParamsFactory.createGroup(params)) + return {...result, return: result.return as unknown as (undefined | AppExpectingEffectsReturns['create_group(acfg,appl)(uint64,uint64)'])} + }, + + /** + * Makes a call to the AppExpectingEffects smart contract using the `log_group(appl)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + logGroup: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(AppExpectingEffectsParamsFactory.logGroup(params)) + return {...result, return: result.return as unknown as (undefined | AppExpectingEffectsReturns['log_group(appl)void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new AppExpectingEffectsClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current AppExpectingEffects app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): AppExpectingEffectsComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a create_group(acfg,appl)(uint64,uint64) method call against the AppExpectingEffects contract + */ + createGroup(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createGroup(params))) + return this + }, + /** + * Add a log_group(appl)void method call against the AppExpectingEffects contract + */ + logGroup(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.logGroup(params))) + return this + }, + /** + * Add a clear state call to the AppExpectingEffects contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as AppExpectingEffectsComposer + } +} +export type AppExpectingEffectsComposer = { + /** + * Calls the create_group(acfg,appl)(uint64,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + createGroup(params?: CallParams): AppExpectingEffectsComposer<[...TReturns, AppExpectingEffectsReturns['create_group(acfg,appl)(uint64,uint64)'] | undefined]> + + /** + * Calls the log_group(appl)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + logGroup(params?: CallParams): AppExpectingEffectsComposer<[...TReturns, AppExpectingEffectsReturns['log_group(appl)void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the AppExpectingEffects smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): AppExpectingEffectsComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): AppExpectingEffectsComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type AppExpectingEffectsComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/Arc4InnerTxnsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/Arc4InnerTxnsContract.ts new file mode 100644 index 0000000..afe3303 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/Arc4InnerTxnsContract.ts @@ -0,0 +1,556 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"Arc4InnerTxnsContract","structs":{},"methods":[{"name":"opt_in_dummy_asset","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0SW5uZXJUeG5zL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIEFyYzRJbm5lclR4bnNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANQogICAgcHVzaGJ5dGVzIDB4YWIzOWM1NWEgLy8gbWV0aG9kICJvcHRfaW5fZHVtbXlfYXNzZXQodWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX29wdF9pbl9kdW1teV9hc3NldF9yb3V0ZUAzCiAgICBlcnIKCm1haW5fb3B0X2luX2R1bW15X2Fzc2V0X3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIG9wdF9pbl9kdW1teV9hc3NldAoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNElubmVyVHhucy5jb250cmFjdC5BcmM0SW5uZXJUeG5zQ29udHJhY3Qub3B0X2luX2R1bW15X2Fzc2V0W3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luX2R1bW15X2Fzc2V0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRJbm5lclR4bnMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo3LTExCiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0SW5uZXJUeG5zL2NvbnRyYWN0LnB5OjkKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRJbm5lclR4bnMvY29udHJhY3QucHk6Ny04CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo3LTExCiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgASrOcVaNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEM2GgEXsTIKshSyEYEEshCBALIBs4EBQw==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the Arc4InnerTxnsContract contract + */ +export type Arc4InnerTxnsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'opt_in_dummy_asset(uint64)void': { + asset: bigint | number + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'opt_in_dummy_asset(uint64)void': [asset: bigint | number] + } +} + +/** + * The return type for each method + */ +export type Arc4InnerTxnsContractReturns = { + 'opt_in_dummy_asset(uint64)void': void +} + +/** + * Defines the types of available calls and state of the Arc4InnerTxnsContract smart contract. + */ +export type Arc4InnerTxnsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'opt_in_dummy_asset(uint64)void' | 'opt_in_dummy_asset', { + argsObj: Arc4InnerTxnsContractArgs['obj']['opt_in_dummy_asset(uint64)void'] + argsTuple: Arc4InnerTxnsContractArgs['tuple']['opt_in_dummy_asset(uint64)void'] + returns: Arc4InnerTxnsContractReturns['opt_in_dummy_asset(uint64)void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type Arc4InnerTxnsContractSignatures = keyof Arc4InnerTxnsContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the Arc4InnerTxnsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = Arc4InnerTxnsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the Arc4InnerTxnsContract smart contract to the method's return type + */ +export type MethodReturn = Arc4InnerTxnsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type Arc4InnerTxnsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type Arc4InnerTxnsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: Arc4InnerTxnsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the Arc4InnerTxnsContract smart contract + */ +export abstract class Arc4InnerTxnsContractParamsFactory { + /** + * Constructs a no op call for the opt_in_dummy_asset(uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static optInDummyAsset(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'opt_in_dummy_asset(uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset], + } + } +} + +/** + * A factory to create and deploy one or more instance of the Arc4InnerTxnsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class Arc4InnerTxnsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `Arc4InnerTxnsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new Arc4InnerTxnsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new Arc4InnerTxnsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the Arc4InnerTxnsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: Arc4InnerTxnsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new Arc4InnerTxnsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Arc4InnerTxnsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Arc4InnerTxnsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Arc4InnerTxnsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new Arc4InnerTxnsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the Arc4InnerTxnsContract smart contract + */ +export class Arc4InnerTxnsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `Arc4InnerTxnsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the Arc4InnerTxnsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `Arc4InnerTxnsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `Arc4InnerTxnsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new Arc4InnerTxnsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `Arc4InnerTxnsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new Arc4InnerTxnsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the Arc4InnerTxnsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the Arc4InnerTxnsContract smart contract using the `opt_in_dummy_asset(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + optInDummyAsset: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4InnerTxnsContractParamsFactory.optInDummyAsset(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the Arc4InnerTxnsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the Arc4InnerTxnsContract smart contract using the `opt_in_dummy_asset(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + optInDummyAsset: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4InnerTxnsContractParamsFactory.optInDummyAsset(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the Arc4InnerTxnsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the Arc4InnerTxnsContract smart contract using the `opt_in_dummy_asset(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + optInDummyAsset: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4InnerTxnsContractParamsFactory.optInDummyAsset(params)) + return {...result, return: result.return as unknown as (undefined | Arc4InnerTxnsContractReturns['opt_in_dummy_asset(uint64)void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new Arc4InnerTxnsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current Arc4InnerTxnsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): Arc4InnerTxnsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a opt_in_dummy_asset(uint64)void method call against the Arc4InnerTxnsContract contract + */ + optInDummyAsset(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optInDummyAsset(params))) + return this + }, + /** + * Add a clear state call to the Arc4InnerTxnsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as Arc4InnerTxnsContractComposer + } +} +export type Arc4InnerTxnsContractComposer = { + /** + * Calls the opt_in_dummy_asset(uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + optInDummyAsset(params?: CallParams): Arc4InnerTxnsContractComposer<[...TReturns, Arc4InnerTxnsContractReturns['opt_in_dummy_asset(uint64)void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the Arc4InnerTxnsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): Arc4InnerTxnsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): Arc4InnerTxnsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type Arc4InnerTxnsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/Arc4PrimitiveOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/Arc4PrimitiveOpsContract.ts new file mode 100644 index 0000000..355f633 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/Arc4PrimitiveOpsContract.ts @@ -0,0 +1,3982 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"Arc4PrimitiveOpsContract","structs":{},"methods":[{"name":"verify_uintn_uintn_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_init","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint32"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_init","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint256"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint32"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint256"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint32"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint256"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_as_uint64","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_as_biguint","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint512"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn64_as_uint64","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn64_as_biguint","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint512"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ufixednxm_bytes","args":[{"type":"ufixed32x8","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bigufixednxm_bytes","args":[{"type":"ufixed256x16","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ufixednxm_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"ufixed32x8"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bigufixednxm_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"ufixed256x16"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ufixednxm_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"ufixed32x8"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bigufixednxm_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"ufixed256x16"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_init","args":[{"type":"string","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_add","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_eq","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_bytes","args":[{"type":"string","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bool_bytes","args":[{"type":"bool","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bool_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bool_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_emit","args":[{"type":"string","name":"a"},{"type":"uint512","name":"b"},{"type":"uint64","name":"c"},{"type":"byte[]","name":"d"},{"type":"uint64","name":"e"},{"type":"bool","name":"f"},{"type":"byte[]","name":"g"},{"type":"string","name":"h"},{"type":"uint64","name":"m"},{"type":"uint256","name":"n"},{"type":"ufixed32x8","name":"o"},{"type":"ufixed256x16","name":"p"},{"type":"bool","name":"q"},{"type":"byte[]","name":"r"},{"type":"byte[]","name":"s"},{"type":"byte[]","name":"t"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[{"name":"SwappedArc4","args":[{"type":"uint64","name":"m"},{"type":"uint256","name":"n"},{"type":"ufixed32x8","name":"o"},{"type":"ufixed256x16","name":"p"},{"type":"bool","name":"q"},{"type":"uint8[3]","name":"r"},{"type":"uint16[]","name":"s"},{"type":"(uint32,uint64,string)","name":"t"}]},{"name":"Swapped","args":[{"type":"string","name":"field1"},{"type":"uint512","name":"field2"},{"type":"uint64","name":"field3"},{"type":"byte[]","name":"field4"},{"type":"uint64","name":"field5"},{"type":"bool","name":"field6"},{"type":"byte[]","name":"field7"},{"type":"string","name":"field8"},{"type":"uint64","name":"field9"},{"type":"uint256","name":"field10"},{"type":"ufixed32x8","name":"field11"},{"type":"ufixed256x16","name":"field12"},{"type":"bool","name":"field13"},{"type":"uint8[3]","name":"field14"},{"type":"uint16[]","name":"field15"},{"type":"(uint32,uint64,string)","name":"field16"}]}],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[1579,1599,1788,1808,1933,1982],"errorMessage":"application log value is not the result of an ABI return"},{"pc":[1855],"errorMessage":"max array length exceeded"},{"pc":[411,424,457,468,503,514,549,562,595,608,641,652,687,698,733,746,779,792,825,836,871,882,917,930,963,976,1009,1020,1055,1066,1101,1114,1147,1160,1193,1204,1239,1250,1285,1298,1331,1344,1377,1388,1423,1434,1469,1482,1509,1531,1617,1626,1650,1659,1679,1699,1707],"errorMessage":"overflow"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDggNjQgMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4MDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjYKICAgIC8vIGNsYXNzIEFyYzRQcmltaXRpdmVPcHNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANTcKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDk2ZjE0MTE2IDB4ZWQ2NjYwOTYgMHgyY2EwMzUyYiAweDg1OTA3ZDQwIDB4MmNiZWM0NWIgMHgwNzY2NmZkOSAweDM3MGJhYmQzIDB4MmI2YjNlZjAgMHgzMzlkYTk3YyAweDc4OThlZDk3IDB4MWYxMzBjZWMgMHhjNzQ4NjY0ZSAweDdhNDYwY2IxIDB4ZGNhYjFmMDEgMHg5N2Q5MDY0ZCAweGNlMDZjMmEwIDB4ZGNkYmNlZTAgMHg3N2E0YjY4ZCAweDRmNTQwNjI2IDB4MDk1YWVkNDEgMHhlM2I3ZTkxOCAweDU1MzM3MDA4IDB4OWJiMWNkNjYgMHg4MTQ4NGQ5ZCAweDlhMDNkZjEwIDB4ZDNmMGU0NGIgMHg5ODJkYjIzMyAweGFmZmJkZjBlIDB4Mjg4YWY3NmUgMHg4YmQ4NGEwNCAweDMwMmI4YTBhIDB4MzM3YWUyMGIgMHg2ZTI1OTI3MCAweDc5ZTM1Zjc3IDB4MGYxNTc0ZmUgMHhiMmNiMTNiZSAweGQwNTllZWE3IDB4NGNjNGMxNTcgMHgzZDE3YWM2ZSAweGY3ZjNkNWZjIDB4ZjhjOGY4ZDUgMHg0M2Y3MTYyYSAweDQyZTA5MDc1IDB4ZDk1NmY1NzUgMHg2YzAxNjBkZiAweGE4OTAxNTBiIDB4MGIyZjRjM2YgMHg5ZGI5ZDMyNyAweGU0ZDk1MGExIDB4YjYwNWU4MGMgLy8gbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5faW5pdChieXRlW10pdWludDMyIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5faW5pdChieXRlW10pdWludDI1NiIsIG1ldGhvZCAidmVyaWZ5X3VpbnRuX2Zyb21fYnl0ZXMoYnl0ZVtdKXVpbnQzMiIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRuX2Zyb21fYnl0ZXMoYnl0ZVtdKXVpbnQyNTYiLCBtZXRob2QgInZlcmlmeV91aW50bl9mcm9tX2xvZyhieXRlW10pdWludDMyIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fZnJvbV9sb2coYnl0ZVtdKXVpbnQyNTYiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl9hc191aW50NjQoYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRuX2FzX2JpZ3VpbnQoYnl0ZVtdKXVpbnQ1MTIiLCBtZXRob2QgInZlcmlmeV91aW50bjY0X2FzX3VpbnQ2NChieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludG42NF9hc19iaWd1aW50KGJ5dGVbXSl1aW50NTEyIiwgbWV0aG9kICJ2ZXJpZnlfdWZpeGVkbnhtX2J5dGVzKHVmaXhlZDMyeDgpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWZpeGVkbnhtX2J5dGVzKHVmaXhlZDI1NngxNilieXRlW10iLCBtZXRob2QgInZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlcyhieXRlW10pdWZpeGVkMzJ4OCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VmaXhlZG54bV9mcm9tX2J5dGVzKGJ5dGVbXSl1Zml4ZWQyNTZ4MTYiLCBtZXRob2QgInZlcmlmeV91Zml4ZWRueG1fZnJvbV9sb2coYnl0ZVtdKXVmaXhlZDMyeDgiLCBtZXRob2QgInZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9sb2coYnl0ZVtdKXVmaXhlZDI1NngxNiIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19pbml0KHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfYWRkKHN0cmluZyxzdHJpbmcpc3RyaW5nIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2VxKHN0cmluZyxzdHJpbmcpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19ieXRlcyhzdHJpbmcpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2Zyb21fYnl0ZXMoYnl0ZVtdKXN0cmluZyIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19mcm9tX2xvZyhieXRlW10pc3RyaW5nIiwgbWV0aG9kICJ2ZXJpZnlfYm9vbF9ieXRlcyhib29sKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Jvb2xfZnJvbV9ieXRlcyhieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2Jvb2xfZnJvbV9sb2coYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9lbWl0KHN0cmluZyx1aW50NTEyLHVpbnQ2NCxieXRlW10sdWludDY0LGJvb2wsYnl0ZVtdLHN0cmluZyx1aW50NjQsdWludDI1Nix1Zml4ZWQzMng4LHVmaXhlZDI1NngxNixib29sLGJ5dGVbXSxieXRlW10sYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfdWludG5fdWludG5fZXEgdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2VxIHZlcmlmeV91aW50bl9iaWd1aW50bl9lcSB2ZXJpZnlfYmlndWludG5fYmlndWludG5fZXEgdmVyaWZ5X3VpbnRuX3VpbnRuX25lIHZlcmlmeV9iaWd1aW50bl91aW50bl9uZSB2ZXJpZnlfdWludG5fYmlndWludG5fbmUgdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX25lIHZlcmlmeV91aW50bl91aW50bl9sdCB2ZXJpZnlfYmlndWludG5fdWludG5fbHQgdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX2x0IHZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9sdCB2ZXJpZnlfdWludG5fdWludG5fbGUgdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2xlIHZlcmlmeV91aW50bl9iaWd1aW50bl9sZSB2ZXJpZnlfYmlndWludG5fYmlndWludG5fbGUgdmVyaWZ5X3VpbnRuX3VpbnRuX2d0IHZlcmlmeV9iaWd1aW50bl91aW50bl9ndCB2ZXJpZnlfdWludG5fYmlndWludG5fZ3QgdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX2d0IHZlcmlmeV91aW50bl91aW50bl9nZSB2ZXJpZnlfYmlndWludG5fdWludG5fZ2UgdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX2dlIHZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9nZSB2ZXJpZnlfdWludG5faW5pdCB2ZXJpZnlfYmlndWludG5faW5pdCB2ZXJpZnlfdWludG5fZnJvbV9ieXRlcyB2ZXJpZnlfYmlndWludG5fZnJvbV9ieXRlcyB2ZXJpZnlfdWludG5fZnJvbV9sb2cgdmVyaWZ5X2JpZ3VpbnRuX2Zyb21fbG9nIHZlcmlmeV9iaWd1aW50bl9hc191aW50NjQgdmVyaWZ5X2JpZ3VpbnRuX2FzX2JpZ3VpbnQgdmVyaWZ5X3VpbnRuNjRfYXNfdWludDY0IHZlcmlmeV91aW50bjY0X2FzX2JpZ3VpbnQgdmVyaWZ5X3VmaXhlZG54bV9ieXRlcyB2ZXJpZnlfYmlndWZpeGVkbnhtX2J5dGVzIHZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlcyB2ZXJpZnlfYmlndWZpeGVkbnhtX2Zyb21fYnl0ZXMgdmVyaWZ5X3VmaXhlZG54bV9mcm9tX2xvZyB2ZXJpZnlfYmlndWZpeGVkbnhtX2Zyb21fbG9nIHZlcmlmeV9zdHJpbmdfaW5pdCB2ZXJpZnlfc3RyaW5nX2FkZCB2ZXJpZnlfc3RyaW5nX2VxIHZlcmlmeV9zdHJpbmdfYnl0ZXMgdmVyaWZ5X3N0cmluZ19mcm9tX2J5dGVzIHZlcmlmeV9zdHJpbmdfZnJvbV9sb2cgdmVyaWZ5X2Jvb2xfYnl0ZXMgdmVyaWZ5X2Jvb2xfZnJvbV9ieXRlcyB2ZXJpZnlfYm9vbF9mcm9tX2xvZyB2ZXJpZnlfZW1pdAogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU3OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX3VpbnRuX2VxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX3VpbnRuX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTEKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpID09IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl91aW50bl9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl91aW50bl9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID09IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPT0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOQogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID09IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSAhPSBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBifAogICAgZGlnIDIKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgIT0gYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSAhPSBhcmM0LlVJbnQ1MTIoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjUzCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgIT0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGIhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fbHQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpIDwgYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBjb3ZlciAyCiAgICBifAogICAgYjwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2x0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgPCBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9sdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9sdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPCBhcmM0LlVJbnQ1MTIoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiPAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fbHQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzcKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA8IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODMKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpIDw9IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fdWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fdWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA8PSBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fYmlndWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fYmlndWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpIDw9IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgPD0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fZ3Rbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPiBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBifAogICAgZGlnIDIKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2d0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2d0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTMKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA+IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9ndFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9ndDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTE5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSA+IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fZ3Rbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID4gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPj0gYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBjb3ZlciAyCiAgICBifAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fdWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fdWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID49IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fYmlndWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fYmlndWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPj0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID49IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPj0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX2luaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTU0CiAgICAvLyByZXR1cm4gYXJjNC5VSW50MzIoYV9iaWd1aW50KQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgcHVzaGludCA0CiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2luaXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5faW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQyNTYoYV9iaWd1aW50KQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHB1c2hpbnQgMzIKICAgIGJ6ZXJvCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fZnJvbV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9mcm9tX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2Zyb21fYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9mcm9tX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDMyLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl9mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl9mcm9tX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gcmV0dXJuIGFyYzQuVUludDI1Ni5mcm9tX2xvZyhhKQogICAgZHVwCiAgICBleHRyYWN0IDYgMAogICAgc3dhcAogICAgZXh0cmFjdCAyIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBsb2cgdmFsdWUgaXMgbm90IHRoZSByZXN1bHQgb2YgYW4gQUJJIHJldHVybgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYXNfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX2FzX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxODAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQyNTYoYV9iaWd1aW50KS5hc191aW50NjQoKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHB1c2hpbnQgMzIKICAgIGJ6ZXJvCiAgICBifAogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAtCiAgICBpbnRjXzEgLy8gOAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZXh0cmFjdDMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2FzX2JpZ3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYXNfYmlndWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxODUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQyNTYoYV9iaWd1aW50KS5hc19iaWd1aW50KCkKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBwdXNoaW50IDMyCiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIGJ8CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bjY0X2FzX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bjY0X2FzX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuNjRfYXNfYmlndWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bjY0X2FzX2JpZ3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KS5hc19iaWd1aW50KCkKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgYnwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VmaXhlZG54bV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91Zml4ZWRueG1fYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWZpeGVkbnhtX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VmaXhlZG54bV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91Zml4ZWRueG1fZnJvbV9sb2dbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWZpeGVkbnhtX2Zyb21fbG9nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI1CiAgICAvLyByZXR1cm4gYXJjNC5VRml4ZWROeE1bdHlwaW5nLkxpdGVyYWxbMzJdLCB0eXBpbmcuTGl0ZXJhbFs4XV0uZnJvbV9sb2coYSkKICAgIGR1cAogICAgZXh0cmFjdCA2IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMiA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gbG9nIHZhbHVlIGlzIG5vdCB0aGUgcmVzdWx0IG9mIGFuIEFCSSByZXR1cm4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VmaXhlZG54bV9mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzEKICAgIC8vIHJldHVybiBhcmM0LkJpZ1VGaXhlZE54TVt0eXBpbmcuTGl0ZXJhbFsyNTZdLCB0eXBpbmcuTGl0ZXJhbFsxNl1dLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjM1CiAgICAvLyByZXN1bHQgPSBhcmM0LlN0cmluZyhTdHJpbmcoIkhlbGxvLCAiKSArIGEpCiAgICBwdXNoYnl0ZXMgIkhlbGxvLCAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2FkZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfYWRkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0MAogICAgLy8gcmVzdWx0ID0gYSArIGIKICAgIGV4dHJhY3QgMiAwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfZXFbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQ1CiAgICAvLyByZXR1cm4gYSA9PSBiCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2Zyb21fYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2Zyb21fYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2Zyb21fbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N0cmluZ19mcm9tX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gcmV0dXJuIGFyYzQuU3RyaW5nLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ib29sX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jvb2xfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYm9vbF9mcm9tX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jvb2xfZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ib29sX2Zyb21fbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jvb2xfZnJvbV9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNzAKICAgIC8vIHJldHVybiBhcmM0LkJvb2wuZnJvbV9sb2coYSkKICAgIGR1cAogICAgZXh0cmFjdCA2IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMiA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gbG9nIHZhbHVlIGlzIG5vdCB0aGUgcmVzdWx0IG9mIGFuIEFCSSByZXR1cm4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2VtaXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZW1pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50MTYKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZHVwCiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk2CiAgICAvLyBhcmM0LmVtaXQoU3dhcHBlZEFyYzQobSwgbiwgbywgcCwgcSwgYXJjNF9yLCBhcmM0X3MsIGFyYzRfdCkpCiAgICBkaWcgNwogICAgZGlnIDcKICAgIGNvbmNhdAogICAgZGlnIDYKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDA1NAogICAgY29uY2F0CiAgICBkaWcgMgogICAgbGVuCiAgICBwdXNoaW50IDg0CiAgICBkaWcgMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHg2NmJiMDMzMyAvLyBtZXRob2QgIlN3YXBwZWRBcmM0KHVpbnQ2NCx1aW50MjU2LHVmaXhlZDMyeDgsdWZpeGVkMjU2eDE2LGJvb2wsdWludDhbM10sdWludDE2W10sKHVpbnQzMix1aW50NjQsc3RyaW5nKSkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk3LTMxNQogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgICJTd2FwcGVkIiwKICAgIC8vICAgICBhLAogICAgLy8gICAgIGIsCiAgICAvLyAgICAgYywKICAgIC8vICAgICBkLmNvcHkoKSwKICAgIC8vICAgICBlLAogICAgLy8gICAgIGYsCiAgICAvLyAgICAgZy5jb3B5KCksCiAgICAvLyAgICAgaCwKICAgIC8vICAgICBtLAogICAgLy8gICAgIG4sCiAgICAvLyAgICAgbywKICAgIC8vICAgICBwLAogICAgLy8gICAgIHEsCiAgICAvLyAgICAgYXJjNF9yLmNvcHkoKSwKICAgIC8vICAgICBhcmM0X3MuY29weSgpLAogICAgLy8gICAgIGFyYzRfdCwKICAgIC8vICkKICAgIGRpZyAxNgogICAgbGVuCiAgICBwdXNoaW50IDE3MwogICAgKwogICAgcHVzaGJ5dGVzIDB4MDBhZAogICAgdW5jb3ZlciAxNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDE2CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBkaWcgMTUKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDE0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIGRpZyAxMgogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMTEKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweGVjMzMxOWJiIC8vIG1ldGhvZCAiU3dhcHBlZChzdHJpbmcsdWludDUxMix1aW50NjQsYnl0ZVtdLHVpbnQ2NCxib29sLGJ5dGVbXSxzdHJpbmcsdWludDY0LHVpbnQyNTYsdWZpeGVkMzJ4OCx1Zml4ZWQyNTZ4MTYsYm9vbCx1aW50OFszXSx1aW50MTZbXSwodWludDMyLHVpbnQ2NCxzdHJpbmcpKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxNi0zMzQKICAgIC8vIGFyYzQuZW1pdCgKICAgIC8vICAgICAiU3dhcHBlZChzdHJpbmcsdWludDUxMix1aW50NjQsYnl0ZVtdLHVpbnQ2NCxib29sLGJ5dGVbXSxzdHJpbmcsdWludDY0LHVpbnQyNTYsdWZpeGVkMzJ4OCx1Zml4ZWQyNTZ4MTYsYm9vbCx1aW50OFszXSx1aW50MTZbXSwodWludDMyLHVpbnQ2NCxzdHJpbmcpKSIsCiAgICAvLyAgICAgYSwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGMsCiAgICAvLyAgICAgZC5jb3B5KCksCiAgICAvLyAgICAgZSwKICAgIC8vICAgICBmLAogICAgLy8gICAgIGcuY29weSgpLAogICAgLy8gICAgIGgsCiAgICAvLyAgICAgbSwKICAgIC8vICAgICBuLAogICAgLy8gICAgIG8sCiAgICAvLyAgICAgcCwKICAgIC8vICAgICBxLAogICAgLy8gICAgIGFyYzRfci5jb3B5KCksCiAgICAvLyAgICAgYXJjNF9zLmNvcHkoKSwKICAgIC8vICAgICBhcmM0X3QsCiAgICAvLyApCiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAQhAACYCBBUffHUBADEbQQFtMRkURDEYRIIyBJbxQRYE7WZglgQsoDUrBIWQfUAELL7EWwQHZm/ZBDcLq9MEK2s+8AQznal8BHiY7ZcEHxMM7ATHSGZOBHpGDLEE3KsfAQSX2QZNBM4GwqAE3NvO4AR3pLaNBE9UBiYECVrtQQTjt+kYBFUzcAgEm7HNZgSBSE2dBJoD3xAE0/DkSwSYLbIzBK/73w4EKIr3bgSL2EoEBDArigoEM3riCwRuJZJwBHnjX3cEDxV0/gSyyxO+BNBZ7qcETMTBVwQ9F6xuBPfz1fwE+Mj41QRD9xYqBELgkHUE2Vb1dQRsAWDfBKiQFQsECy9MPwSdudMnBOTZUKEEtgXoDDYaAI4yAAkANwBlAJMAwQDvAR0BSwF5AacB1QIDAjECXwKNArsC6QMXA0UDcwOhA88D/QQrBFkEbwSFBJEEnQSxBMUE5gUEBRgFNAVFBVYFYgVuBYIFlgW1BdAF4gXzBf8GEwYkBjAGRAAxGRQxGBQQQzYaAVcCADYaAlcCAEsBFSMORCOvTwJLAatLAhUjDkROAquoKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08Cq0sBFSMORCOvTwKrqCklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAqtLARUkDkQkr08Cq6gpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwJLAatLAhUkDkROAquoKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08CSwGrSwIVIw5ETgKrqSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAqtLARUjDkQjr08Cq6kpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwKrSwEVJA5EJK9PAqupKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08CSwGrSwIVJA5ETgKrqSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAksBq0sCFSMORE4Cq6QpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwKrSwEVIw5EI69PAqukKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08Cq0sBFSQORCSvTwKrpCklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAksBq0sCFSQORE4Cq6QpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwJLAatLAhUjDkROAqumKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08Cq0sBFSMORCOvTwKrpiklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAqtLARUkDkQkr08Cq6YpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwJLAatLAhUkDkROAqumKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08CSwGrSwIVIw5ETgKrpSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAqtLARUjDkQjr08Cq6UpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwKrSwEVJA5EJK9PAqulKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08CSwGrSwIVJA5ETgKrpSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAksBq0sCFSMORE4Cq6cpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwKrSwEVIw5EI69PAqunKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08Cq0sBFSQORCSvTwKrpyklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAksBq0sCFSQORE4Cq6cpJU8CVChMULAiQzYaAVcCAEkVgQQORIEEr6soTFCwIkM2GgFXAgBJFYEgDkSBIK+rKExQsCJDNhoBVwIAKExQsCJDNhoBVwIAKExQsCJDNhoBSVcGAExXAgQoEkQoTFCwIkM2GgFJVwYATFcCBCgSRChMULAiQzYaAVcCAEkVgSAORIEgr6tJkyQOREkVIwkjWChMULAiQzYaAVcCAEkVgSAORIEgr6tJFSQORCSvqyhMULAiQzYaAVcCAEkVIw5EI6+rKExQsCJDNhoBVwIASRUjDkQjr6tJFSQORCSvqyhMULAiQzYaAUkVFlcGAkxQKExQsCJDNhoBSRUWVwYCTFAoTFCwIkM2GgFXAgAoTFCwIkM2GgFXAgAoTFCwIkM2GgFJVwYATFcCBCgSRChMULAiQzYaAUlXBgBMVwIEKBJEKExQsCJDNhoBVwIAgAdIZWxsbywgTFBJFRZXBgJMUChMULAiQzYaATYaAlcCAFBJVwIAFRZXBgJcAChMULAiQzYaATYaAhIpJU8CVChMULAiQzYaAUkVFlcGAkxQKExQsCJDNhoBVwIAKExQsCJDNhoBSVcGAExXAgQoEkQoTFCwIkM2GgFJFRZXBgJMUChMULAiQzYaAVcCAChMULAiQzYaAUlXBgBMVwIEKBJEKExQsCJDNhoBNhoCNhoDNhoENhoFNhoGNhoHNhoINhoJNhoKNhoLNhoMNhoNNhoOVwIANhoPSSVZSwGBAllSVwIANhoPSYECWUsBFVJXAgBLB0sHUEsGUEsFUEsEUEsDUIACAFRQSwIVgVRLAQgWVwYCTwJMUEsDUEsCUIAEZrsDM0xQsEsQFYGtAQiAAgCtTxFQTxBQSwEWVwYCUEsPFU8CCExPDlBPDVBLARZXBgJQSwwVTwIISRZXBgJPAkxQSwsVTwIITE8KUE8JUE8IUE8HUE8GUE8FUEsBFlcGAlBMTwIIFlcGAlBPBlBPBVBPBFBPA1BPAlBMUIAE7DMZu0xQSbCwIkM=","clear":"C4EBQw=="},"events":[{"name":"SwappedArc4","args":[{"type":"uint64","name":"m"},{"type":"uint256","name":"n"},{"type":"ufixed32x8","name":"o"},{"type":"ufixed256x16","name":"p"},{"type":"bool","name":"q"},{"type":"uint8[3]","name":"r"},{"type":"uint16[]","name":"s"},{"type":"(uint32,uint64,string)","name":"t"}]},{"name":"Swapped","args":[{"type":"string","name":"field1"},{"type":"uint512","name":"field2"},{"type":"uint64","name":"field3"},{"type":"byte[]","name":"field4"},{"type":"uint64","name":"field5"},{"type":"bool","name":"field6"},{"type":"byte[]","name":"field7"},{"type":"string","name":"field8"},{"type":"uint64","name":"field9"},{"type":"uint256","name":"field10"},{"type":"ufixed32x8","name":"field11"},{"type":"ufixed256x16","name":"field12"},{"type":"bool","name":"field13"},{"type":"uint8[3]","name":"field14"},{"type":"uint16[]","name":"field15"},{"type":"(uint32,uint64,string)","name":"field16"}]}],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the Arc4PrimitiveOpsContract contract + */ +export type Arc4PrimitiveOpsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_uintn_uintn_eq(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_uintn_eq(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_biguintn_eq(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_biguintn_eq(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_uintn_ne(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_uintn_ne(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_biguintn_ne(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_biguintn_ne(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_uintn_lt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_uintn_lt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_biguintn_lt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_biguintn_lt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_uintn_le(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_uintn_le(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_biguintn_le(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_biguintn_le(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_uintn_gt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_uintn_gt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_biguintn_gt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_biguintn_gt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_uintn_ge(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_uintn_ge(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_biguintn_ge(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_biguintn_ge(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_init(byte[])uint32': { + a: Uint8Array + } + 'verify_biguintn_init(byte[])uint256': { + a: Uint8Array + } + 'verify_uintn_from_bytes(byte[])uint32': { + a: Uint8Array + } + 'verify_biguintn_from_bytes(byte[])uint256': { + a: Uint8Array + } + 'verify_uintn_from_log(byte[])uint32': { + a: Uint8Array + } + 'verify_biguintn_from_log(byte[])uint256': { + a: Uint8Array + } + 'verify_biguintn_as_uint64(byte[])uint64': { + a: Uint8Array + } + 'verify_biguintn_as_biguint(byte[])uint512': { + a: Uint8Array + } + 'verify_uintn64_as_uint64(byte[])uint64': { + a: Uint8Array + } + 'verify_uintn64_as_biguint(byte[])uint512': { + a: Uint8Array + } + 'verify_ufixednxm_bytes(ufixed32x8)byte[]': { + a: number + } + 'verify_bigufixednxm_bytes(ufixed256x16)byte[]': { + a: number + } + 'verify_ufixednxm_from_bytes(byte[])ufixed32x8': { + a: Uint8Array + } + 'verify_bigufixednxm_from_bytes(byte[])ufixed256x16': { + a: Uint8Array + } + 'verify_ufixednxm_from_log(byte[])ufixed32x8': { + a: Uint8Array + } + 'verify_bigufixednxm_from_log(byte[])ufixed256x16': { + a: Uint8Array + } + 'verify_string_init(string)string': { + a: string + } + 'verify_string_add(string,string)string': { + a: string + b: string + } + 'verify_string_eq(string,string)bool': { + a: string + b: string + } + 'verify_string_bytes(string)byte[]': { + a: string + } + 'verify_string_from_bytes(byte[])string': { + a: Uint8Array + } + 'verify_string_from_log(byte[])string': { + a: Uint8Array + } + 'verify_bool_bytes(bool)byte[]': { + a: boolean + } + 'verify_bool_from_bytes(byte[])bool': { + a: Uint8Array + } + 'verify_bool_from_log(byte[])bool': { + a: Uint8Array + } + 'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void': { + a: string + b: bigint | number + c: bigint | number + d: Uint8Array + e: bigint | number + f: boolean + g: Uint8Array + h: string + m: bigint | number + n: bigint | number + o: number + p: number + q: boolean + r: Uint8Array + s: Uint8Array + t: Uint8Array + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_uintn_uintn_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_uintn_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_biguintn_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_biguintn_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_uintn_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_uintn_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_biguintn_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_biguintn_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_uintn_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_uintn_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_biguintn_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_biguintn_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_uintn_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_uintn_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_biguintn_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_biguintn_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_uintn_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_uintn_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_biguintn_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_biguintn_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_uintn_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_uintn_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_biguintn_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_biguintn_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_init(byte[])uint32': [a: Uint8Array] + 'verify_biguintn_init(byte[])uint256': [a: Uint8Array] + 'verify_uintn_from_bytes(byte[])uint32': [a: Uint8Array] + 'verify_biguintn_from_bytes(byte[])uint256': [a: Uint8Array] + 'verify_uintn_from_log(byte[])uint32': [a: Uint8Array] + 'verify_biguintn_from_log(byte[])uint256': [a: Uint8Array] + 'verify_biguintn_as_uint64(byte[])uint64': [a: Uint8Array] + 'verify_biguintn_as_biguint(byte[])uint512': [a: Uint8Array] + 'verify_uintn64_as_uint64(byte[])uint64': [a: Uint8Array] + 'verify_uintn64_as_biguint(byte[])uint512': [a: Uint8Array] + 'verify_ufixednxm_bytes(ufixed32x8)byte[]': [a: number] + 'verify_bigufixednxm_bytes(ufixed256x16)byte[]': [a: number] + 'verify_ufixednxm_from_bytes(byte[])ufixed32x8': [a: Uint8Array] + 'verify_bigufixednxm_from_bytes(byte[])ufixed256x16': [a: Uint8Array] + 'verify_ufixednxm_from_log(byte[])ufixed32x8': [a: Uint8Array] + 'verify_bigufixednxm_from_log(byte[])ufixed256x16': [a: Uint8Array] + 'verify_string_init(string)string': [a: string] + 'verify_string_add(string,string)string': [a: string, b: string] + 'verify_string_eq(string,string)bool': [a: string, b: string] + 'verify_string_bytes(string)byte[]': [a: string] + 'verify_string_from_bytes(byte[])string': [a: Uint8Array] + 'verify_string_from_log(byte[])string': [a: Uint8Array] + 'verify_bool_bytes(bool)byte[]': [a: boolean] + 'verify_bool_from_bytes(byte[])bool': [a: Uint8Array] + 'verify_bool_from_log(byte[])bool': [a: Uint8Array] + 'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void': [a: string, b: bigint | number, c: bigint | number, d: Uint8Array, e: bigint | number, f: boolean, g: Uint8Array, h: string, m: bigint | number, n: bigint | number, o: number, p: number, q: boolean, r: Uint8Array, s: Uint8Array, t: Uint8Array] + } +} + +/** + * The return type for each method + */ +export type Arc4PrimitiveOpsContractReturns = { + 'verify_uintn_uintn_eq(byte[],byte[])bool': boolean + 'verify_biguintn_uintn_eq(byte[],byte[])bool': boolean + 'verify_uintn_biguintn_eq(byte[],byte[])bool': boolean + 'verify_biguintn_biguintn_eq(byte[],byte[])bool': boolean + 'verify_uintn_uintn_ne(byte[],byte[])bool': boolean + 'verify_biguintn_uintn_ne(byte[],byte[])bool': boolean + 'verify_uintn_biguintn_ne(byte[],byte[])bool': boolean + 'verify_biguintn_biguintn_ne(byte[],byte[])bool': boolean + 'verify_uintn_uintn_lt(byte[],byte[])bool': boolean + 'verify_biguintn_uintn_lt(byte[],byte[])bool': boolean + 'verify_uintn_biguintn_lt(byte[],byte[])bool': boolean + 'verify_biguintn_biguintn_lt(byte[],byte[])bool': boolean + 'verify_uintn_uintn_le(byte[],byte[])bool': boolean + 'verify_biguintn_uintn_le(byte[],byte[])bool': boolean + 'verify_uintn_biguintn_le(byte[],byte[])bool': boolean + 'verify_biguintn_biguintn_le(byte[],byte[])bool': boolean + 'verify_uintn_uintn_gt(byte[],byte[])bool': boolean + 'verify_biguintn_uintn_gt(byte[],byte[])bool': boolean + 'verify_uintn_biguintn_gt(byte[],byte[])bool': boolean + 'verify_biguintn_biguintn_gt(byte[],byte[])bool': boolean + 'verify_uintn_uintn_ge(byte[],byte[])bool': boolean + 'verify_biguintn_uintn_ge(byte[],byte[])bool': boolean + 'verify_uintn_biguintn_ge(byte[],byte[])bool': boolean + 'verify_biguintn_biguintn_ge(byte[],byte[])bool': boolean + 'verify_uintn_init(byte[])uint32': number + 'verify_biguintn_init(byte[])uint256': bigint + 'verify_uintn_from_bytes(byte[])uint32': number + 'verify_biguintn_from_bytes(byte[])uint256': bigint + 'verify_uintn_from_log(byte[])uint32': number + 'verify_biguintn_from_log(byte[])uint256': bigint + 'verify_biguintn_as_uint64(byte[])uint64': bigint + 'verify_biguintn_as_biguint(byte[])uint512': bigint + 'verify_uintn64_as_uint64(byte[])uint64': bigint + 'verify_uintn64_as_biguint(byte[])uint512': bigint + 'verify_ufixednxm_bytes(ufixed32x8)byte[]': Uint8Array + 'verify_bigufixednxm_bytes(ufixed256x16)byte[]': Uint8Array + 'verify_ufixednxm_from_bytes(byte[])ufixed32x8': number + 'verify_bigufixednxm_from_bytes(byte[])ufixed256x16': number + 'verify_ufixednxm_from_log(byte[])ufixed32x8': number + 'verify_bigufixednxm_from_log(byte[])ufixed256x16': number + 'verify_string_init(string)string': string + 'verify_string_add(string,string)string': string + 'verify_string_eq(string,string)bool': boolean + 'verify_string_bytes(string)byte[]': Uint8Array + 'verify_string_from_bytes(byte[])string': string + 'verify_string_from_log(byte[])string': string + 'verify_bool_bytes(bool)byte[]': Uint8Array + 'verify_bool_from_bytes(byte[])bool': boolean + 'verify_bool_from_log(byte[])bool': boolean + 'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void': void +} + +/** + * Defines the types of available calls and state of the Arc4PrimitiveOpsContract smart contract. + */ +export type Arc4PrimitiveOpsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_uintn_uintn_eq(byte[],byte[])bool' | 'verify_uintn_uintn_eq', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_eq(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_eq(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_eq(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_uintn_eq(byte[],byte[])bool' | 'verify_biguintn_uintn_eq', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_eq(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_eq(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_eq(byte[],byte[])bool'] + }> + & Record<'verify_uintn_biguintn_eq(byte[],byte[])bool' | 'verify_uintn_biguintn_eq', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_eq(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_eq(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_eq(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_biguintn_eq(byte[],byte[])bool' | 'verify_biguintn_biguintn_eq', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_eq(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_eq(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_eq(byte[],byte[])bool'] + }> + & Record<'verify_uintn_uintn_ne(byte[],byte[])bool' | 'verify_uintn_uintn_ne', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_ne(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_ne(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ne(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_uintn_ne(byte[],byte[])bool' | 'verify_biguintn_uintn_ne', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_ne(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_ne(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ne(byte[],byte[])bool'] + }> + & Record<'verify_uintn_biguintn_ne(byte[],byte[])bool' | 'verify_uintn_biguintn_ne', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_ne(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_ne(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ne(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_biguintn_ne(byte[],byte[])bool' | 'verify_biguintn_biguintn_ne', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_ne(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_ne(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ne(byte[],byte[])bool'] + }> + & Record<'verify_uintn_uintn_lt(byte[],byte[])bool' | 'verify_uintn_uintn_lt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_lt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_lt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_lt(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_uintn_lt(byte[],byte[])bool' | 'verify_biguintn_uintn_lt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_lt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_lt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_lt(byte[],byte[])bool'] + }> + & Record<'verify_uintn_biguintn_lt(byte[],byte[])bool' | 'verify_uintn_biguintn_lt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_lt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_lt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_lt(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_biguintn_lt(byte[],byte[])bool' | 'verify_biguintn_biguintn_lt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_lt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_lt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_lt(byte[],byte[])bool'] + }> + & Record<'verify_uintn_uintn_le(byte[],byte[])bool' | 'verify_uintn_uintn_le', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_le(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_le(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_le(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_uintn_le(byte[],byte[])bool' | 'verify_biguintn_uintn_le', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_le(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_le(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_le(byte[],byte[])bool'] + }> + & Record<'verify_uintn_biguintn_le(byte[],byte[])bool' | 'verify_uintn_biguintn_le', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_le(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_le(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_le(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_biguintn_le(byte[],byte[])bool' | 'verify_biguintn_biguintn_le', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_le(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_le(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_le(byte[],byte[])bool'] + }> + & Record<'verify_uintn_uintn_gt(byte[],byte[])bool' | 'verify_uintn_uintn_gt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_gt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_gt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_gt(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_uintn_gt(byte[],byte[])bool' | 'verify_biguintn_uintn_gt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_gt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_gt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_gt(byte[],byte[])bool'] + }> + & Record<'verify_uintn_biguintn_gt(byte[],byte[])bool' | 'verify_uintn_biguintn_gt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_gt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_gt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_gt(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_biguintn_gt(byte[],byte[])bool' | 'verify_biguintn_biguintn_gt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_gt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_gt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_gt(byte[],byte[])bool'] + }> + & Record<'verify_uintn_uintn_ge(byte[],byte[])bool' | 'verify_uintn_uintn_ge', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_ge(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_ge(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ge(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_uintn_ge(byte[],byte[])bool' | 'verify_biguintn_uintn_ge', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_ge(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_ge(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ge(byte[],byte[])bool'] + }> + & Record<'verify_uintn_biguintn_ge(byte[],byte[])bool' | 'verify_uintn_biguintn_ge', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_ge(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_ge(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ge(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_biguintn_ge(byte[],byte[])bool' | 'verify_biguintn_biguintn_ge', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_ge(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_ge(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ge(byte[],byte[])bool'] + }> + & Record<'verify_uintn_init(byte[])uint32' | 'verify_uintn_init', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_init(byte[])uint32'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_init(byte[])uint32'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_init(byte[])uint32'] + }> + & Record<'verify_biguintn_init(byte[])uint256' | 'verify_biguintn_init', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_init(byte[])uint256'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_init(byte[])uint256'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_init(byte[])uint256'] + }> + & Record<'verify_uintn_from_bytes(byte[])uint32' | 'verify_uintn_from_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_from_bytes(byte[])uint32'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_from_bytes(byte[])uint32'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_from_bytes(byte[])uint32'] + }> + & Record<'verify_biguintn_from_bytes(byte[])uint256' | 'verify_biguintn_from_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_from_bytes(byte[])uint256'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_from_bytes(byte[])uint256'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_from_bytes(byte[])uint256'] + }> + & Record<'verify_uintn_from_log(byte[])uint32' | 'verify_uintn_from_log', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_from_log(byte[])uint32'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_from_log(byte[])uint32'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_from_log(byte[])uint32'] + }> + & Record<'verify_biguintn_from_log(byte[])uint256' | 'verify_biguintn_from_log', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_from_log(byte[])uint256'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_from_log(byte[])uint256'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_from_log(byte[])uint256'] + }> + & Record<'verify_biguintn_as_uint64(byte[])uint64' | 'verify_biguintn_as_uint64', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_as_uint64(byte[])uint64'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_as_uint64(byte[])uint64'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_as_uint64(byte[])uint64'] + }> + & Record<'verify_biguintn_as_biguint(byte[])uint512' | 'verify_biguintn_as_biguint', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_as_biguint(byte[])uint512'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_as_biguint(byte[])uint512'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_as_biguint(byte[])uint512'] + }> + & Record<'verify_uintn64_as_uint64(byte[])uint64' | 'verify_uintn64_as_uint64', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn64_as_uint64(byte[])uint64'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn64_as_uint64(byte[])uint64'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn64_as_uint64(byte[])uint64'] + }> + & Record<'verify_uintn64_as_biguint(byte[])uint512' | 'verify_uintn64_as_biguint', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn64_as_biguint(byte[])uint512'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn64_as_biguint(byte[])uint512'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn64_as_biguint(byte[])uint512'] + }> + & Record<'verify_ufixednxm_bytes(ufixed32x8)byte[]' | 'verify_ufixednxm_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_ufixednxm_bytes(ufixed32x8)byte[]'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_ufixednxm_bytes(ufixed32x8)byte[]'] + returns: Arc4PrimitiveOpsContractReturns['verify_ufixednxm_bytes(ufixed32x8)byte[]'] + }> + & Record<'verify_bigufixednxm_bytes(ufixed256x16)byte[]' | 'verify_bigufixednxm_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bigufixednxm_bytes(ufixed256x16)byte[]'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bigufixednxm_bytes(ufixed256x16)byte[]'] + returns: Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_bytes(ufixed256x16)byte[]'] + }> + & Record<'verify_ufixednxm_from_bytes(byte[])ufixed32x8' | 'verify_ufixednxm_from_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_ufixednxm_from_bytes(byte[])ufixed32x8'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_ufixednxm_from_bytes(byte[])ufixed32x8'] + returns: Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_bytes(byte[])ufixed32x8'] + }> + & Record<'verify_bigufixednxm_from_bytes(byte[])ufixed256x16' | 'verify_bigufixednxm_from_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'] + returns: Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'] + }> + & Record<'verify_ufixednxm_from_log(byte[])ufixed32x8' | 'verify_ufixednxm_from_log', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_ufixednxm_from_log(byte[])ufixed32x8'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_ufixednxm_from_log(byte[])ufixed32x8'] + returns: Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_log(byte[])ufixed32x8'] + }> + & Record<'verify_bigufixednxm_from_log(byte[])ufixed256x16' | 'verify_bigufixednxm_from_log', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bigufixednxm_from_log(byte[])ufixed256x16'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bigufixednxm_from_log(byte[])ufixed256x16'] + returns: Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_log(byte[])ufixed256x16'] + }> + & Record<'verify_string_init(string)string' | 'verify_string_init', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_init(string)string'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_init(string)string'] + returns: Arc4PrimitiveOpsContractReturns['verify_string_init(string)string'] + }> + & Record<'verify_string_add(string,string)string' | 'verify_string_add', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_add(string,string)string'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_add(string,string)string'] + returns: Arc4PrimitiveOpsContractReturns['verify_string_add(string,string)string'] + }> + & Record<'verify_string_eq(string,string)bool' | 'verify_string_eq', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_eq(string,string)bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_eq(string,string)bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_string_eq(string,string)bool'] + }> + & Record<'verify_string_bytes(string)byte[]' | 'verify_string_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_bytes(string)byte[]'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_bytes(string)byte[]'] + returns: Arc4PrimitiveOpsContractReturns['verify_string_bytes(string)byte[]'] + }> + & Record<'verify_string_from_bytes(byte[])string' | 'verify_string_from_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_from_bytes(byte[])string'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_from_bytes(byte[])string'] + returns: Arc4PrimitiveOpsContractReturns['verify_string_from_bytes(byte[])string'] + }> + & Record<'verify_string_from_log(byte[])string' | 'verify_string_from_log', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_from_log(byte[])string'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_from_log(byte[])string'] + returns: Arc4PrimitiveOpsContractReturns['verify_string_from_log(byte[])string'] + }> + & Record<'verify_bool_bytes(bool)byte[]' | 'verify_bool_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bool_bytes(bool)byte[]'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bool_bytes(bool)byte[]'] + returns: Arc4PrimitiveOpsContractReturns['verify_bool_bytes(bool)byte[]'] + }> + & Record<'verify_bool_from_bytes(byte[])bool' | 'verify_bool_from_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bool_from_bytes(byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bool_from_bytes(byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_bool_from_bytes(byte[])bool'] + }> + & Record<'verify_bool_from_log(byte[])bool' | 'verify_bool_from_log', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bool_from_log(byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bool_from_log(byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_bool_from_log(byte[])bool'] + }> + & Record<'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void' | 'verify_emit', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'] + returns: Arc4PrimitiveOpsContractReturns['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type Arc4PrimitiveOpsContractSignatures = keyof Arc4PrimitiveOpsContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type Arc4PrimitiveOpsContractNonVoidMethodSignatures = keyof Arc4PrimitiveOpsContractTypes['methods'] extends infer T ? T extends keyof Arc4PrimitiveOpsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the Arc4PrimitiveOpsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = Arc4PrimitiveOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the Arc4PrimitiveOpsContract smart contract to the method's return type + */ +export type MethodReturn = Arc4PrimitiveOpsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type Arc4PrimitiveOpsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type Arc4PrimitiveOpsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: Arc4PrimitiveOpsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the Arc4PrimitiveOpsContract smart contract + */ +export abstract class Arc4PrimitiveOpsContractParamsFactory { + /** + * Constructs a no op call for the verify_uintn_uintn_eq(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnUintnEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_uintn_eq(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_uintn_eq(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnUintnEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_uintn_eq(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_biguintn_eq(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnBiguintnEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_biguintn_eq(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_biguintn_eq(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnBiguintnEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_biguintn_eq(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_uintn_ne(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnUintnNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_uintn_ne(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_uintn_ne(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnUintnNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_uintn_ne(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_biguintn_ne(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnBiguintnNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_biguintn_ne(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_biguintn_ne(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnBiguintnNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_biguintn_ne(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_uintn_lt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnUintnLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_uintn_lt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_uintn_lt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnUintnLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_uintn_lt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_biguintn_lt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnBiguintnLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_biguintn_lt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_biguintn_lt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnBiguintnLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_biguintn_lt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_uintn_le(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnUintnLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_uintn_le(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_uintn_le(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnUintnLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_uintn_le(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_biguintn_le(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnBiguintnLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_biguintn_le(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_biguintn_le(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnBiguintnLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_biguintn_le(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_uintn_gt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnUintnGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_uintn_gt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_uintn_gt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnUintnGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_uintn_gt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_biguintn_gt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnBiguintnGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_biguintn_gt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_biguintn_gt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnBiguintnGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_biguintn_gt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_uintn_ge(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnUintnGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_uintn_ge(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_uintn_ge(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnUintnGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_uintn_ge(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_biguintn_ge(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnBiguintnGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_biguintn_ge(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_biguintn_ge(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnBiguintnGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_biguintn_ge(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_init(byte[])uint32 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_init(byte[])uint32' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_biguintn_init(byte[])uint256 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_init(byte[])uint256' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_uintn_from_bytes(byte[])uint32 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_from_bytes(byte[])uint32' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_biguintn_from_bytes(byte[])uint256 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_from_bytes(byte[])uint256' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_uintn_from_log(byte[])uint32 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_from_log(byte[])uint32' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_biguintn_from_log(byte[])uint256 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_from_log(byte[])uint256' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_biguintn_as_uint64(byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnAsUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_as_uint64(byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_biguintn_as_biguint(byte[])uint512 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnAsBiguint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_as_biguint(byte[])uint512' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_uintn64_as_uint64(byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintn64AsUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn64_as_uint64(byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_uintn64_as_biguint(byte[])uint512 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintn64AsBiguint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn64_as_biguint(byte[])uint512' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_ufixednxm_bytes(ufixed32x8)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUfixednxmBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ufixednxm_bytes(ufixed32x8)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bigufixednxm_bytes(ufixed256x16)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBigufixednxmBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bigufixednxm_bytes(ufixed256x16)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_ufixednxm_from_bytes(byte[])ufixed32x8 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUfixednxmFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ufixednxm_from_bytes(byte[])ufixed32x8' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bigufixednxm_from_bytes(byte[])ufixed256x16 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBigufixednxmFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bigufixednxm_from_bytes(byte[])ufixed256x16' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_ufixednxm_from_log(byte[])ufixed32x8 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUfixednxmFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ufixednxm_from_log(byte[])ufixed32x8' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bigufixednxm_from_log(byte[])ufixed256x16 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBigufixednxmFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bigufixednxm_from_log(byte[])ufixed256x16' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_string_init(string)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_init(string)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_string_add(string,string)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringAdd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_add(string,string)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_string_eq(string,string)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_eq(string,string)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_string_bytes(string)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_bytes(string)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_string_from_bytes(byte[])string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_from_bytes(byte[])string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_string_from_log(byte[])string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_from_log(byte[])string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bool_bytes(bool)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBoolBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bool_bytes(bool)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bool_from_bytes(byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBoolFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bool_from_bytes(byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bool_from_log(byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBoolFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bool_from_log(byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEmit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d, params.args.e, params.args.f, params.args.g, params.args.h, params.args.m, params.args.n, params.args.o, params.args.p, params.args.q, params.args.r, params.args.s, params.args.t], + } + } +} + +/** + * A factory to create and deploy one or more instance of the Arc4PrimitiveOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class Arc4PrimitiveOpsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `Arc4PrimitiveOpsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new Arc4PrimitiveOpsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new Arc4PrimitiveOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the Arc4PrimitiveOpsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: Arc4PrimitiveOpsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new Arc4PrimitiveOpsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Arc4PrimitiveOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Arc4PrimitiveOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Arc4PrimitiveOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new Arc4PrimitiveOpsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the Arc4PrimitiveOpsContract smart contract + */ +export class Arc4PrimitiveOpsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `Arc4PrimitiveOpsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the Arc4PrimitiveOpsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `Arc4PrimitiveOpsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `Arc4PrimitiveOpsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new Arc4PrimitiveOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `Arc4PrimitiveOpsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new Arc4PrimitiveOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the Arc4PrimitiveOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnUintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnUintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnBiguintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnBiguintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnUintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnUintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnBiguintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnBiguintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnUintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnUintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnBiguintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnBiguintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnUintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnUintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnBiguintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnBiguintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnUintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnUintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnBiguintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnBiguintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnUintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnUintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnBiguintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnBiguintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_init(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnInit(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_init(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnInit(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_bytes(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_bytes(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_log(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_log(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnAsUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsUint64(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_biguint(byte[])uint512` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnAsBiguint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsBiguint(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintn64AsUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsUint64(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_biguint(byte[])uint512` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintn64AsBiguint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsBiguint(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_bytes(ufixed32x8)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUfixednxmBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_bytes(ufixed256x16)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBigufixednxmBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_bytes(byte[])ufixed32x8` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUfixednxmFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_bytes(byte[])ufixed256x16` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBigufixednxmFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_log(byte[])ufixed32x8` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUfixednxmFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_log(byte[])ufixed256x16` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBigufixednxmFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringInit(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_add(string,string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringAdd(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_eq(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_bytes(string)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_bytes(byte[])string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_log(byte[])string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_bytes(bool)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBoolBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_bytes(byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBoolFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_log(byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBoolFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEmit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyEmit(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the Arc4PrimitiveOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnUintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnUintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnBiguintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnBiguintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnUintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnUintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnBiguintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnBiguintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnUintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnUintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnBiguintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnBiguintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnUintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnUintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnBiguintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnBiguintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnUintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnUintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnBiguintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnBiguintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnUintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnUintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnBiguintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnBiguintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_init(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnInit(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_init(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnInit(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_bytes(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_bytes(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_log(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_log(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnAsUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsUint64(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_biguint(byte[])uint512` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnAsBiguint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsBiguint(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintn64AsUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsUint64(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_biguint(byte[])uint512` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintn64AsBiguint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsBiguint(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_bytes(ufixed32x8)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUfixednxmBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_bytes(ufixed256x16)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBigufixednxmBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_bytes(byte[])ufixed32x8` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUfixednxmFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_bytes(byte[])ufixed256x16` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBigufixednxmFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_log(byte[])ufixed32x8` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUfixednxmFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_log(byte[])ufixed256x16` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBigufixednxmFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringInit(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_add(string,string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringAdd(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_eq(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_bytes(string)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_bytes(byte[])string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_log(byte[])string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_bytes(bool)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBoolBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_bytes(byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBoolFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_log(byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBoolFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEmit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyEmit(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the Arc4PrimitiveOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnUintnEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnEq(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_eq(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnUintnEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnEq(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_eq(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnBiguintnEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnEq(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_eq(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnBiguintnEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnEq(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_eq(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnUintnNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnNe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ne(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnUintnNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnNe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ne(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnBiguintnNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnNe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ne(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnBiguintnNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnNe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ne(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnUintnLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_lt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnUintnLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_lt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnBiguintnLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_lt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnBiguintnLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_lt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnUintnLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_le(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnUintnLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_le(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnBiguintnLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_le(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnBiguintnLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_le(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnUintnGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_gt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnUintnGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_gt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnBiguintnGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_gt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnBiguintnGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_gt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnUintnGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ge(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnUintnGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ge(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnBiguintnGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ge(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnBiguintnGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ge(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_init(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnInit(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_init(byte[])uint32'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_init(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnInit(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_init(byte[])uint256'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_bytes(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_from_bytes(byte[])uint32'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_bytes(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_from_bytes(byte[])uint256'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_log(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromLog(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_from_log(byte[])uint32'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_log(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromLog(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_from_log(byte[])uint256'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnAsUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsUint64(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_as_uint64(byte[])uint64'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_biguint(byte[])uint512` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnAsBiguint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsBiguint(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_as_biguint(byte[])uint512'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintn64AsUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsUint64(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn64_as_uint64(byte[])uint64'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_biguint(byte[])uint512` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintn64AsBiguint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsBiguint(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn64_as_biguint(byte[])uint512'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_bytes(ufixed32x8)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUfixednxmBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_ufixednxm_bytes(ufixed32x8)byte[]'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_bytes(ufixed256x16)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBigufixednxmBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_bytes(ufixed256x16)byte[]'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_bytes(byte[])ufixed32x8` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUfixednxmFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_bytes(byte[])ufixed32x8'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_bytes(byte[])ufixed256x16` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBigufixednxmFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_log(byte[])ufixed32x8` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUfixednxmFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromLog(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_log(byte[])ufixed32x8'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_log(byte[])ufixed256x16` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBigufixednxmFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromLog(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_log(byte[])ufixed256x16'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringInit(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_init(string)string'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_add(string,string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringAdd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringAdd(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_add(string,string)string'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_eq(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringEq(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_eq(string,string)bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_bytes(string)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_bytes(string)byte[]'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_bytes(byte[])string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_from_bytes(byte[])string'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_log(byte[])string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromLog(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_from_log(byte[])string'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_bytes(bool)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBoolBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bool_bytes(bool)byte[]'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_bytes(byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBoolFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bool_from_bytes(byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_log(byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBoolFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromLog(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bool_from_log(byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEmit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyEmit(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new Arc4PrimitiveOpsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current Arc4PrimitiveOpsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): Arc4PrimitiveOpsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_uintn_uintn_eq(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnUintnEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnEq(params))) + return this + }, + /** + * Add a verify_biguintn_uintn_eq(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnUintnEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnEq(params))) + return this + }, + /** + * Add a verify_uintn_biguintn_eq(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnBiguintnEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnEq(params))) + return this + }, + /** + * Add a verify_biguintn_biguintn_eq(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnBiguintnEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnEq(params))) + return this + }, + /** + * Add a verify_uintn_uintn_ne(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnUintnNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnNe(params))) + return this + }, + /** + * Add a verify_biguintn_uintn_ne(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnUintnNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnNe(params))) + return this + }, + /** + * Add a verify_uintn_biguintn_ne(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnBiguintnNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnNe(params))) + return this + }, + /** + * Add a verify_biguintn_biguintn_ne(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnBiguintnNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnNe(params))) + return this + }, + /** + * Add a verify_uintn_uintn_lt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnUintnLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnLt(params))) + return this + }, + /** + * Add a verify_biguintn_uintn_lt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnUintnLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnLt(params))) + return this + }, + /** + * Add a verify_uintn_biguintn_lt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnBiguintnLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnLt(params))) + return this + }, + /** + * Add a verify_biguintn_biguintn_lt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnBiguintnLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnLt(params))) + return this + }, + /** + * Add a verify_uintn_uintn_le(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnUintnLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnLe(params))) + return this + }, + /** + * Add a verify_biguintn_uintn_le(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnUintnLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnLe(params))) + return this + }, + /** + * Add a verify_uintn_biguintn_le(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnBiguintnLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnLe(params))) + return this + }, + /** + * Add a verify_biguintn_biguintn_le(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnBiguintnLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnLe(params))) + return this + }, + /** + * Add a verify_uintn_uintn_gt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnUintnGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnGt(params))) + return this + }, + /** + * Add a verify_biguintn_uintn_gt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnUintnGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnGt(params))) + return this + }, + /** + * Add a verify_uintn_biguintn_gt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnBiguintnGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnGt(params))) + return this + }, + /** + * Add a verify_biguintn_biguintn_gt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnBiguintnGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnGt(params))) + return this + }, + /** + * Add a verify_uintn_uintn_ge(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnUintnGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnGe(params))) + return this + }, + /** + * Add a verify_biguintn_uintn_ge(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnUintnGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnGe(params))) + return this + }, + /** + * Add a verify_uintn_biguintn_ge(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnBiguintnGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnGe(params))) + return this + }, + /** + * Add a verify_biguintn_biguintn_ge(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnBiguintnGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnGe(params))) + return this + }, + /** + * Add a verify_uintn_init(byte[])uint32 method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnInit(params))) + return this + }, + /** + * Add a verify_biguintn_init(byte[])uint256 method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnInit(params))) + return this + }, + /** + * Add a verify_uintn_from_bytes(byte[])uint32 method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnFromBytes(params))) + return this + }, + /** + * Add a verify_biguintn_from_bytes(byte[])uint256 method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnFromBytes(params))) + return this + }, + /** + * Add a verify_uintn_from_log(byte[])uint32 method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnFromLog(params))) + return this + }, + /** + * Add a verify_biguintn_from_log(byte[])uint256 method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnFromLog(params))) + return this + }, + /** + * Add a verify_biguintn_as_uint64(byte[])uint64 method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnAsUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnAsUint64(params))) + return this + }, + /** + * Add a verify_biguintn_as_biguint(byte[])uint512 method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnAsBiguint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnAsBiguint(params))) + return this + }, + /** + * Add a verify_uintn64_as_uint64(byte[])uint64 method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintn64AsUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintn64AsUint64(params))) + return this + }, + /** + * Add a verify_uintn64_as_biguint(byte[])uint512 method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintn64AsBiguint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintn64AsBiguint(params))) + return this + }, + /** + * Add a verify_ufixednxm_bytes(ufixed32x8)byte[] method call against the Arc4PrimitiveOpsContract contract + */ + verifyUfixednxmBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUfixednxmBytes(params))) + return this + }, + /** + * Add a verify_bigufixednxm_bytes(ufixed256x16)byte[] method call against the Arc4PrimitiveOpsContract contract + */ + verifyBigufixednxmBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBigufixednxmBytes(params))) + return this + }, + /** + * Add a verify_ufixednxm_from_bytes(byte[])ufixed32x8 method call against the Arc4PrimitiveOpsContract contract + */ + verifyUfixednxmFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUfixednxmFromBytes(params))) + return this + }, + /** + * Add a verify_bigufixednxm_from_bytes(byte[])ufixed256x16 method call against the Arc4PrimitiveOpsContract contract + */ + verifyBigufixednxmFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBigufixednxmFromBytes(params))) + return this + }, + /** + * Add a verify_ufixednxm_from_log(byte[])ufixed32x8 method call against the Arc4PrimitiveOpsContract contract + */ + verifyUfixednxmFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUfixednxmFromLog(params))) + return this + }, + /** + * Add a verify_bigufixednxm_from_log(byte[])ufixed256x16 method call against the Arc4PrimitiveOpsContract contract + */ + verifyBigufixednxmFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBigufixednxmFromLog(params))) + return this + }, + /** + * Add a verify_string_init(string)string method call against the Arc4PrimitiveOpsContract contract + */ + verifyStringInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringInit(params))) + return this + }, + /** + * Add a verify_string_add(string,string)string method call against the Arc4PrimitiveOpsContract contract + */ + verifyStringAdd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringAdd(params))) + return this + }, + /** + * Add a verify_string_eq(string,string)bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyStringEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringEq(params))) + return this + }, + /** + * Add a verify_string_bytes(string)byte[] method call against the Arc4PrimitiveOpsContract contract + */ + verifyStringBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringBytes(params))) + return this + }, + /** + * Add a verify_string_from_bytes(byte[])string method call against the Arc4PrimitiveOpsContract contract + */ + verifyStringFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringFromBytes(params))) + return this + }, + /** + * Add a verify_string_from_log(byte[])string method call against the Arc4PrimitiveOpsContract contract + */ + verifyStringFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringFromLog(params))) + return this + }, + /** + * Add a verify_bool_bytes(bool)byte[] method call against the Arc4PrimitiveOpsContract contract + */ + verifyBoolBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBoolBytes(params))) + return this + }, + /** + * Add a verify_bool_from_bytes(byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBoolFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBoolFromBytes(params))) + return this + }, + /** + * Add a verify_bool_from_log(byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBoolFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBoolFromLog(params))) + return this + }, + /** + * Add a verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void method call against the Arc4PrimitiveOpsContract contract + */ + verifyEmit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEmit(params))) + return this + }, + /** + * Add a clear state call to the Arc4PrimitiveOpsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as Arc4PrimitiveOpsContractComposer + } +} +export type Arc4PrimitiveOpsContractComposer = { + /** + * Calls the verify_uintn_uintn_eq(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnUintnEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_eq(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_uintn_eq(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnUintnEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_eq(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_biguintn_eq(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnBiguintnEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_eq(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_biguintn_eq(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnBiguintnEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_eq(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_uintn_ne(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnUintnNe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ne(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_uintn_ne(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnUintnNe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ne(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_biguintn_ne(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnBiguintnNe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ne(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_biguintn_ne(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnBiguintnNe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ne(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_uintn_lt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnUintnLt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_lt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_uintn_lt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnUintnLt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_lt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_biguintn_lt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnBiguintnLt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_lt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_biguintn_lt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnBiguintnLt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_lt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_uintn_le(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnUintnLe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_le(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_uintn_le(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnUintnLe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_le(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_biguintn_le(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnBiguintnLe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_le(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_biguintn_le(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnBiguintnLe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_le(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_uintn_gt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnUintnGt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_gt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_uintn_gt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnUintnGt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_gt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_biguintn_gt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnBiguintnGt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_gt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_biguintn_gt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnBiguintnGt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_gt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_uintn_ge(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnUintnGe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ge(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_uintn_ge(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnUintnGe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ge(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_biguintn_ge(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnBiguintnGe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ge(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_biguintn_ge(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnBiguintnGe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ge(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_init(byte[])uint32 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnInit(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_init(byte[])uint32'] | undefined]> + + /** + * Calls the verify_biguintn_init(byte[])uint256 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnInit(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_init(byte[])uint256'] | undefined]> + + /** + * Calls the verify_uintn_from_bytes(byte[])uint32 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_from_bytes(byte[])uint32'] | undefined]> + + /** + * Calls the verify_biguintn_from_bytes(byte[])uint256 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_from_bytes(byte[])uint256'] | undefined]> + + /** + * Calls the verify_uintn_from_log(byte[])uint32 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_from_log(byte[])uint32'] | undefined]> + + /** + * Calls the verify_biguintn_from_log(byte[])uint256 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_from_log(byte[])uint256'] | undefined]> + + /** + * Calls the verify_biguintn_as_uint64(byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnAsUint64(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_as_uint64(byte[])uint64'] | undefined]> + + /** + * Calls the verify_biguintn_as_biguint(byte[])uint512 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnAsBiguint(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_as_biguint(byte[])uint512'] | undefined]> + + /** + * Calls the verify_uintn64_as_uint64(byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintn64AsUint64(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn64_as_uint64(byte[])uint64'] | undefined]> + + /** + * Calls the verify_uintn64_as_biguint(byte[])uint512 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintn64AsBiguint(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn64_as_biguint(byte[])uint512'] | undefined]> + + /** + * Calls the verify_ufixednxm_bytes(ufixed32x8)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUfixednxmBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_ufixednxm_bytes(ufixed32x8)byte[]'] | undefined]> + + /** + * Calls the verify_bigufixednxm_bytes(ufixed256x16)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBigufixednxmBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_bytes(ufixed256x16)byte[]'] | undefined]> + + /** + * Calls the verify_ufixednxm_from_bytes(byte[])ufixed32x8 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUfixednxmFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_bytes(byte[])ufixed32x8'] | undefined]> + + /** + * Calls the verify_bigufixednxm_from_bytes(byte[])ufixed256x16 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBigufixednxmFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'] | undefined]> + + /** + * Calls the verify_ufixednxm_from_log(byte[])ufixed32x8 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUfixednxmFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_log(byte[])ufixed32x8'] | undefined]> + + /** + * Calls the verify_bigufixednxm_from_log(byte[])ufixed256x16 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBigufixednxmFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_log(byte[])ufixed256x16'] | undefined]> + + /** + * Calls the verify_string_init(string)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringInit(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_init(string)string'] | undefined]> + + /** + * Calls the verify_string_add(string,string)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringAdd(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_add(string,string)string'] | undefined]> + + /** + * Calls the verify_string_eq(string,string)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_eq(string,string)bool'] | undefined]> + + /** + * Calls the verify_string_bytes(string)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_bytes(string)byte[]'] | undefined]> + + /** + * Calls the verify_string_from_bytes(byte[])string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_from_bytes(byte[])string'] | undefined]> + + /** + * Calls the verify_string_from_log(byte[])string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_from_log(byte[])string'] | undefined]> + + /** + * Calls the verify_bool_bytes(bool)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBoolBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bool_bytes(bool)byte[]'] | undefined]> + + /** + * Calls the verify_bool_from_bytes(byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBoolFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bool_from_bytes(byte[])bool'] | undefined]> + + /** + * Calls the verify_bool_from_log(byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBoolFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bool_from_log(byte[])bool'] | undefined]> + + /** + * Calls the verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEmit(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the Arc4PrimitiveOpsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): Arc4PrimitiveOpsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type Arc4PrimitiveOpsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/BoxContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/BoxContract.ts new file mode 100644 index 0000000..146a2d5 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/BoxContract.ts @@ -0,0 +1,2352 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"BoxContract","structs":{"InnerStruct":[{"name":"c","type":"uint64"},{"name":"arrArr","type":"uint64[][]"},{"name":"d","type":"uint64"}],"LargeStruct":[{"name":"a","type":"byte[1024]"},{"name":"b","type":"byte[1024]"},{"name":"c","type":"byte[1024]"},{"name":"d","type":"byte[1024]"},{"name":"e","type":"uint64"},{"name":"f","type":"byte[1024]"},{"name":"g","type":"byte[1024]"},{"name":"h","type":"uint64"}],"NestedStruct":[{"name":"a","type":"uint64"},{"name":"inner","type":"InnerStruct"},{"name":"woah","type":"(uint64,uint64[][],uint64)[]"},{"name":"b","type":"uint64"}]},"methods":[{"name":"store_enums","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"read_enums","args":[],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_boxes","args":[{"type":"uint64","name":"a"},{"type":"byte[]","name":"b"},{"type":"string","name":"c"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"boxes_exist","args":[],"returns":{"type":"(bool,bool,bool,bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"check_keys","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"read_boxes","args":[],"returns":{"type":"(uint64,byte[],string,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"indirect_extract_and_replace","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"delete_boxes","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"slice_box","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"arc4_box","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"create_many_ints","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_many_ints","args":[{"type":"uint64","name":"index"},{"type":"uint64","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"sum_many_ints","args":[],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_box_ref","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_nested_struct","args":[{"type":"(uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64)","struct":"NestedStruct","name":"struct"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"nested_write","args":[{"type":"uint64","name":"index"},{"type":"uint64","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"nested_read","args":[{"type":"uint64","name":"i1"},{"type":"uint64","name":"i2"},{"type":"uint64","name":"i3"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"create_bools","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_bool","args":[{"type":"uint64","name":"index"},{"type":"bool","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"sum_bools","args":[{"type":"uint64","name":"stop_at_total"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_test","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_set","args":[{"type":"uint64","name":"key"},{"type":"string","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_get","args":[{"type":"uint64","name":"key"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_del","args":[{"type":"uint64","name":"key"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_exists","args":[{"type":"uint64","name":"key"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{"oca":{"keyType":"AVMString","valueType":"uint64","key":"b2Nh"},"txn":{"keyType":"AVMString","valueType":"uint64","key":"dHhu"},"box_a":{"keyType":"AVMString","valueType":"uint64","key":"Ym94X2E="},"box_b":{"keyType":"AVMString","valueType":"byte[]","key":"Yg=="},"box_c":{"keyType":"AVMBytes","valueType":"string","key":"Qk9YX0M="},"box_d":{"keyType":"AVMString","valueType":"AVMBytes","key":"Ym94X2Q="},"many_ints":{"keyType":"AVMString","valueType":"uint64[513]","key":"bWFueV9pbnRz"},"box_ref":{"keyType":"AVMString","valueType":"AVMBytes","key":"Ym94X3JlZg=="},"box_large":{"keyType":"AVMString","valueType":"LargeStruct","key":"Ym94X2xhcmdl"},"too_many_bools":{"keyType":"AVMString","valueType":"bool[33000]","key":"dG9vX21hbnlfYm9vbHM="}}},"maps":{"global":{},"local":{},"box":{"box_map":{"keyType":"uint64","valueType":"AVMString","prefix":""}}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[842],"errorMessage":"check Box exists"},{"pc":[486],"errorMessage":"check self.box_a exists"},{"pc":[851],"errorMessage":"check self.box_b exists"},{"pc":[514,857],"errorMessage":"check self.box_c exists"},{"pc":[1932],"errorMessage":"check self.box_map entry exists"},{"pc":[1178],"errorMessage":"check self.many_ints exists"},{"pc":[378],"errorMessage":"check self.oca exists"},{"pc":[1795],"errorMessage":"check self.too_many_bools exists"},{"pc":[390],"errorMessage":"check self.txn exists"},{"pc":[1773],"errorMessage":"index access is out of bounds"},{"pc":[1398,1425,1492,1517,1539,1587,1614,1660,1685,1710],"errorMessage":"index out of bounds"},{"pc":[1228],"errorMessage":"no data"},{"pc":[1329],"errorMessage":"struct.a is truthy"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDIgMCA4IDQwOTYgNDA5OCA0MTM4CiAgICBieXRlY2Jsb2NrICJib3giIDB4NDI0ZjU4NWY0MyAiYmxvYiIgImJveF9sYXJnZSIgMHgxNTFmN2M3NSAiYm94X2EiICJib3hfZCIgImIiICJ0b29fbWFueV9ib29scyIgIm1hbnlfaW50cyIgIjAiIDB4MDAwMjM0MzIgMHg2ODY1NmM2YzZmIDB4NmY2MzYxIDB4NzQ3ODZlIDB4MDY4MTAxICJib3hfcmVmIiAiZGVmYXVsdCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo1OQogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDM0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhmMjZjNmQ0MiAweGVmMTg2Y2Y3IDB4N2QzNzI5NmUgMHhmMTNkZDkzNyAweDMzMzI1ZDNkIDB4YTYxNzQ4MTIgMHhmYWJjYjg4NSAweGQ1NjZjNjMyIDB4MDRlZjQ5NzEgMHgyM2VjYjMyYyAweDAxOTk0MDhkIDB4NzcyMDU5Y2EgMHgwMTI2M2RmNiAweGVlZjc1ODE2IDB4OTk2NDk3YWUgMHg2Y2VjNzJmZiAweDZmOWQxMDc1IDB4NTllZjM3NjAgMHhhYTY2NmI5NiAweGRmYmRkNjM2IDB4YjUzMjkxM2EgMHhjMjlmMTY2OSAweDljODg4YzA5IDB4ZTZmNjg1MDYgMHg4ZWUyYzM2NCAvLyBtZXRob2QgInN0b3JlX2VudW1zKCl2b2lkIiwgbWV0aG9kICJyZWFkX2VudW1zKCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInNldF9ib3hlcyh1aW50NjQsYnl0ZVtdLHN0cmluZyl2b2lkIiwgbWV0aG9kICJib3hlc19leGlzdCgpKGJvb2wsYm9vbCxib29sLGJvb2wpIiwgbWV0aG9kICJjaGVja19rZXlzKCl2b2lkIiwgbWV0aG9kICJyZWFkX2JveGVzKCkodWludDY0LGJ5dGVbXSxzdHJpbmcsdWludDY0KSIsIG1ldGhvZCAiaW5kaXJlY3RfZXh0cmFjdF9hbmRfcmVwbGFjZSgpdm9pZCIsIG1ldGhvZCAiZGVsZXRlX2JveGVzKCl2b2lkIiwgbWV0aG9kICJzbGljZV9ib3goKXZvaWQiLCBtZXRob2QgImFyYzRfYm94KCl2b2lkIiwgbWV0aG9kICJjcmVhdGVfbWFueV9pbnRzKCl2b2lkIiwgbWV0aG9kICJzZXRfbWFueV9pbnRzKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAic3VtX21hbnlfaW50cygpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2JveF9yZWYoKXZvaWQiLCBtZXRob2QgInNldF9uZXN0ZWRfc3RydWN0KCh1aW50NjQsKHVpbnQ2NCx1aW50NjRbXVtdLHVpbnQ2NCksKHVpbnQ2NCx1aW50NjRbXVtdLHVpbnQ2NClbXSx1aW50NjQpKXZvaWQiLCBtZXRob2QgIm5lc3RlZF93cml0ZSh1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgIm5lc3RlZF9yZWFkKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiY3JlYXRlX2Jvb2xzKCl2b2lkIiwgbWV0aG9kICJzZXRfYm9vbCh1aW50NjQsYm9vbCl2b2lkIiwgbWV0aG9kICJzdW1fYm9vbHModWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiYm94X21hcF90ZXN0KCl2b2lkIiwgbWV0aG9kICJib3hfbWFwX3NldCh1aW50NjQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImJveF9tYXBfZ2V0KHVpbnQ2NClzdHJpbmciLCBtZXRob2QgImJveF9tYXBfZGVsKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJib3hfbWFwX2V4aXN0cyh1aW50NjQpYm9vbCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHN0b3JlX2VudW1zIHJlYWRfZW51bXMgc2V0X2JveGVzIGJveGVzX2V4aXN0IG1haW5fY2hlY2tfa2V5c19yb3V0ZUAxMCByZWFkX2JveGVzIGluZGlyZWN0X2V4dHJhY3RfYW5kX3JlcGxhY2UgZGVsZXRlX2JveGVzIHNsaWNlX2JveCBtYWluX2FyYzRfYm94X3JvdXRlQDE1IG1haW5fY3JlYXRlX21hbnlfaW50c19yb3V0ZUAxNiBzZXRfbWFueV9pbnRzIHN1bV9tYW55X2ludHMgdGVzdF9ib3hfcmVmIHNldF9uZXN0ZWRfc3RydWN0IG5lc3RlZF93cml0ZSBuZXN0ZWRfcmVhZCBtYWluX2NyZWF0ZV9ib29sc19yb3V0ZUAyMyBzZXRfYm9vbCBzdW1fYm9vbHMgYm94X21hcF90ZXN0IGJveF9tYXBfc2V0IGJveF9tYXBfZ2V0IGJveF9tYXBfZGVsIGJveF9tYXBfZXhpc3RzCiAgICBlcnIKCm1haW5fY3JlYXRlX2Jvb2xzX3JvdXRlQDIzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI4MQogICAgLy8gc2VsZi50b29fbWFueV9ib29scy5jcmVhdGUoKQogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICBwdXNoaW50IDQxMjUKICAgIGJveF9jcmVhdGUKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NyZWF0ZV9tYW55X2ludHNfcm91dGVAMTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTgxCiAgICAvLyBzZWxmLm1hbnlfaW50cy5jcmVhdGUoKQogICAgYnl0ZWMgOSAvLyAibWFueV9pbnRzIgogICAgcHVzaGludCA0MTA0CiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzRfYm94X3JvdXRlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE3MS0xNzIKICAgIC8vIGJveF9kID0gQm94KFN0YXRpY0ludHMsIGtleT1CeXRlcyhiImQiKSkKICAgIC8vIGJveF9kLnZhbHVlID0gU3RhdGljSW50cyhhcmM0LlVJbnQ4KDApLCBhcmM0LlVJbnQ4KDEpLCBhcmM0LlVJbnQ4KDIpLCBhcmM0LlVJbnQ4KDMpKQogICAgcHVzaGJ5dGVzcyAweDY0IDB4MDAwMTAyMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNzIKICAgIC8vIGJveF9kLnZhbHVlID0gU3RhdGljSW50cyhhcmM0LlVJbnQ4KDApLCBhcmM0LlVJbnQ4KDEpLCBhcmM0LlVJbnQ4KDIpLCBhcmM0LlVJbnQ4KDMpKQogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoZWNrX2tleXNfcm91dGVAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMzQ6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdG9yZV9lbnVtc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnN0b3JlX2VudW1zOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBzZWxmLm9jYS52YWx1ZSA9IE9uQ29tcGxldGVBY3Rpb24uT3B0SW4KICAgIGludGNfMCAvLyBPcHRJbgogICAgaXRvYgogICAgYnl0ZWMgMTMgLy8gIm9jYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3NgogICAgLy8gc2VsZi50eG4udmFsdWUgPSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXRvYgogICAgYnl0ZWMgMTQgLy8gInR4biIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QucmVhZF9lbnVtc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlYWRfZW51bXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODAKICAgIC8vIGFzc2VydCBvcC5Cb3guZ2V0KGIib2NhIilbMF0gPT0gb3AuaXRvYihzZWxmLm9jYS52YWx1ZSkKICAgIGJ5dGVjIDEzIC8vIDB4NmY2MzYxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vY2EgZXhpc3RzCiAgICBkdXAKICAgIGJ0b2kKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODEKICAgIC8vIGFzc2VydCBvcC5Cb3guZ2V0KGIidHhuIilbMF0gPT0gb3AuaXRvYihzZWxmLnR4bi52YWx1ZSkKICAgIGJ5dGVjIDE0IC8vIDB4NzQ3ODZlCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50eG4gZXhpc3RzCiAgICBkdXAKICAgIGJ0b2kKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODMKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKChhcmM0LlVJbnQ2NChzZWxmLm9jYS52YWx1ZSksIGFyYzQuVUludDY0KHNlbGYudHhuLnZhbHVlKSkpCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3Quc2V0X2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2JveGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4NwogICAgLy8gc2VsZi5ib3hfYS52YWx1ZSA9IGEKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgYnl0ZWMgNSAvLyAiYm94X2EiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODgKICAgIC8vIHNlbGYuYm94X2IudmFsdWUgPSBiLmNvcHkoKQogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODkKICAgIC8vIHNlbGYuYm94X2MudmFsdWUgPSBjCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5MAogICAgLy8gc2VsZi5ib3hfZC52YWx1ZSA9IGIubmF0aXZlCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyA2IC8vICJib3hfZCIKICAgIGRpZyAxCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6OTEKICAgIC8vIHNlbGYuYm94X2xhcmdlLmNyZWF0ZSgpCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBwdXNoaW50IDYxNjAKICAgIGJveF9jcmVhdGUKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjkyCiAgICAvLyBzZWxmLmJveF9sYXJnZS52YWx1ZS5lID0gVUludDY0KDQyKQogICAgcHVzaGludCA0MgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgaW50YyA0IC8vIDQwOTYKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5MwogICAgLy8gc2VsZi5ib3hfbGFyZ2UucmVwbGFjZShzaXplX29mKEJ5dGVzMTAyNCkgKiA0LCBhcmM0LlVJbnQ2NCg0MikuYnl0ZXMpCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBpbnRjIDQgLy8gNDA5NgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAyYQogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5OAogICAgLy8gc2VsZi5ib3hfYS52YWx1ZSArPSAzCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9hIGV4aXN0cwogICAgYnRvaQogICAgcHVzaGludCAzCiAgICArCiAgICBpdG9iCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMDAtMTAxCiAgICAvLyAjIHRlc3QgLmxlbmd0aAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2EubGVuZ3RoID09IDgKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2IubGVuZ3RoID09IGIuYnl0ZXMubGVuZ3RoCiAgICBieXRlYyA3IC8vICJiIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkaWcgMwogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTAzCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy5sZW5ndGggPT0gYy5ieXRlcy5sZW5ndGgKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYyBleGlzdHMKICAgIGRpZyAyCiAgICBsZW4KICAgIGR1cDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMDQKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLmxlbmd0aCA9PSBiLm5hdGl2ZS5sZW5ndGgKICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkaWcgMwogICAgbGVuCiAgICBkdXAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTA2LTEwNwogICAgLy8gIyB0ZXN0IC52YWx1ZS5ieXRlcwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbMF0gPT0gYy5ieXRlc1swXQogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGludGNfMiAvLyAwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyA2CiAgICBleHRyYWN0IDAgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwOAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbLTFdID09IGMuYnl0ZXNbLTFdCiAgICBkaWcgMwogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZGlnIDcKICAgIHN3YXAKICAgIGludGNfMCAvLyAxCiAgICBleHRyYWN0MwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbOi0xXSA9PSBjLmJ5dGVzWzotMV0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgNAogICAgPAogICAgZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDEKICAgIGRpZyA0CiAgICA+PQogICAgaW50Y18wIC8vIDEKICAgIGRpZyA1CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHN3YXAKICAgIC0KICAgIGRpZyA3CiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTEwCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy52YWx1ZS5ieXRlc1s6Ml0gPT0gYy5ieXRlc1s6Ml0KICAgIGludGNfMSAvLyAyCiAgICBkaWcgNAogICAgPAogICAgdW5jb3ZlciA0CiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18xIC8vIDIKICAgIGRpZyA0CiAgICA+PQogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgNQogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExMi0xMTMKICAgIC8vICMgdGVzdCAudmFsdWUgd2l0aCBCeXRlcyB0eXBlCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVswXSA9PSBiLm5hdGl2ZVswXQogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICB1bmNvdmVyIDQKICAgIGV4dHJhY3QgMiAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTE0CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVstMV0gPT0gYi5uYXRpdmVbLTFdCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgc3dhcAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGRpZyA0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgZXh0cmFjdDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMTUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWzotMV0gPT0gYi5uYXRpdmVbOi0xXQogICAgaW50Y18wIC8vIDEKICAgIGRpZyAyCiAgICA8CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMgogICAgc3dhcAogICAgLQogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDEKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18wIC8vIDEKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDIKICAgIHN3YXAKICAgIC0KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVs6NV0gPT0gYi5uYXRpdmVbOjVdCiAgICBwdXNoaW50IDUKICAgIGRpZyAyCiAgICA8CiAgICBkaWcgMgogICAgcHVzaGludCA1CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgcHVzaGludCA1CiAgICBkaWcgMgogICAgPj0KICAgIHB1c2hpbnQgNQogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgNAogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExNwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2QudmFsdWVbOiBVSW50NjQoMildID09IGIubmF0aXZlWzogVUludDY0KDIpXQogICAgaW50Y18xIC8vIDIKICAgIGRpZyAyCiAgICA8CiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18xIC8vIDIKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExOQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2xhcmdlLmxlbmd0aCA9PSBzaXplX29mKExhcmdlU3RydWN0KQogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgYm94X2xlbgogICAgcG9wCiAgICBwdXNoaW50IDYxNjAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmJveGVzX2V4aXN0W3JvdXRpbmddKCkgLT4gdm9pZDoKYm94ZXNfZXhpc3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTIzCiAgICAvLyByZXR1cm4gYm9vbChzZWxmLmJveF9hKSwgYm9vbChzZWxmLmJveF9iKSwgYm9vbChzZWxmLmJveF9jKSwgYm9vbChzZWxmLmJveF9sYXJnZSkKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieXRlYyA3IC8vICJiIgogICAgYm94X2xlbgogICAgY292ZXIgMgogICAgcG9wCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2xlbgogICAgY292ZXIgMwogICAgcG9wCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBib3hfbGVuCiAgICBjb3ZlciA0CiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMwogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QucmVhZF9ib3hlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlYWRfYm94ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM1CiAgICAvLyBnZXRfYm94X3ZhbHVlX3BsdXNfMShzZWxmLmJveF9hKSAtIDEsCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozNDUKICAgIC8vIHJldHVybiBib3gudmFsdWUgKyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMzUKICAgIC8vIGdldF9ib3hfdmFsdWVfcGx1c18xKHNlbGYuYm94X2EpIC0gMSwKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM2CiAgICAvLyBzZWxmLmJveF9iLnZhbHVlLm5hdGl2ZSwKICAgIGJ5dGVjIDcgLy8gImIiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYiBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM3CiAgICAvLyBzZWxmLmJveF9jLnZhbHVlLAogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9jIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEzOAogICAgLy8gc2VsZi5ib3hfbGFyZ2UudmFsdWUuZSwKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIGludGMgNCAvLyA0MDk2CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMTQKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCAyMAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmluZGlyZWN0X2V4dHJhY3RfYW5kX3JlcGxhY2Vbcm91dGluZ10oKSAtPiB2b2lkOgppbmRpcmVjdF9leHRyYWN0X2FuZF9yZXBsYWNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0MwogICAgLy8gbGFyZ2UgPSBzZWxmLmJveF9sYXJnZS52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyBsYXJnZSA9IHNlbGYuYm94X2xhcmdlLnZhbHVlLmNvcHkoKQogICAgLy8gbGFyZ2UuZSArPSAxCiAgICBpbnRjIDQgLy8gNDA5NgogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTQ0CiAgICAvLyBsYXJnZS5lICs9IDEKICAgIGJ0b2kKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTQ1CiAgICAvLyBzZWxmLmJveF9sYXJnZS52YWx1ZSA9IGxhcmdlLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0My0xNDUKICAgIC8vIGxhcmdlID0gc2VsZi5ib3hfbGFyZ2UudmFsdWUuY29weSgpCiAgICAvLyBsYXJnZS5lICs9IDEKICAgIC8vIHNlbGYuYm94X2xhcmdlLnZhbHVlID0gbGFyZ2UuY29weSgpCiAgICBpbnRjIDQgLy8gNDA5NgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuZGVsZXRlX2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZGVsZXRlX2JveGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0OQogICAgLy8gZGVsIHNlbGYuYm94X2EudmFsdWUKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTUwCiAgICAvLyBkZWwgc2VsZi5ib3hfYi52YWx1ZQogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE1MQogICAgLy8gZGVsIHNlbGYuYm94X2MudmFsdWUKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTIKICAgIC8vIGFzc2VydCBzZWxmLmJveF9hLmdldChkZWZhdWx0PVVJbnQ2NCg0MikpID09IDQyCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIHB1c2hpbnQgNDIKICAgIGRpZyAxCiAgICBkaWcgMwogICAgc2VsZWN0CiAgICBwdXNoaW50IDQyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTUzCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYi5nZXQoZGVmYXVsdD1hcmM0LkR5bmFtaWNCeXRlcyhiIjQyIikpLm5hdGl2ZSA9PSBiIjQyIgogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9nZXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMjM0MzIKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAweDM0MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTQKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLmdldChkZWZhdWx0PWFyYzQuU3RyaW5nKCI0MiIpKSA9PSAiNDIiCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2dldAogICAgYnl0ZWMgMTEgLy8gMHgwMDAyMzQzMgogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlYyAxMSAvLyAweDAwMDIzNDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTU2CiAgICAvLyBhc3NlcnQgbm90IGFfZXhpc3RzCiAgICBzd2FwCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTcKICAgIC8vIGFzc2VydCBhID09IDAKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE1OAogICAgLy8gZGVsIHNlbGYuYm94X2xhcmdlLnZhbHVlCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zbGljZV9ib3hbcm91dGluZ10oKSAtPiB2b2lkOgpzbGljZV9ib3g6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYyCiAgICAvLyBib3hfMCA9IEJveChCeXRlcywga2V5PVN0cmluZygiMCIpKQogICAgYnl0ZWMgMTAgLy8gIjAiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYzCiAgICAvLyBib3hfMC52YWx1ZSA9IEJ5dGVzKGIiVGVzdGluZyB0ZXN0aW5nIDEyMyIpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjIKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyAxMCAvLyAiMCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjMKICAgIC8vIGJveF8wLnZhbHVlID0gQnl0ZXMoYiJUZXN0aW5nIHRlc3RpbmcgMTIzIikKICAgIHB1c2hieXRlcyAweDU0NjU3Mzc0Njk2ZTY3MjA3NDY1NzM3NDY5NmU2NzIwMzEzMjMzCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYyCiAgICAvLyBib3hfMCA9IEJveChCeXRlcywga2V5PVN0cmluZygiMCIpKQogICAgYnl0ZWMgMTAgLy8gIjAiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTY0CiAgICAvLyBhc3NlcnQgYm94XzAudmFsdWVbMDo3XSA9PSBiIlRlc3RpbmciCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGR1cAogICAgaW50Y18yIC8vIDAKICAgIGRpZyAyCiAgICBzZWxlY3QKICAgIHB1c2hpbnQgNwogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDEKICAgIC0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjIKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyAxMCAvLyAiMCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjQKICAgIC8vIGFzc2VydCBib3hfMC52YWx1ZVswOjddID09IGIiVGVzdGluZyIKICAgIGNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBwdXNoYnl0ZXMgMHg1NDY1NzM3NDY5NmU2NwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2NgogICAgLy8gc2VsZi5ib3hfYy52YWx1ZSA9IGFyYzQuU3RyaW5nKCJIZWxsbyIpCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgcHVzaGJ5dGVzIDB4MDAwNTQ4NjU2YzZjNmYKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjcKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLnZhbHVlLmJ5dGVzWzI6MTBdID09IGIiSGVsbG8iCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzEgLy8gMgogICAgZGlnIDEKICAgIDwKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHB1c2hpbnQgMTAKICAgIGRpZyAyCiAgICA8CiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgMTAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMQogICAgLQogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBwdXNoYnl0ZXMgMHg0ODY1NmM2YzZmCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3Quc2V0X21hbnlfaW50c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9tYW55X2ludHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE4NQogICAgLy8gc2VsZi5tYW55X2ludHMudmFsdWVbaW5kZXhdID0gdmFsdWUKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBieXRlYyA5IC8vICJtYW55X2ludHMiCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdW1fbWFueV9pbnRzW3JvdXRpbmddKCkgLT4gdm9pZDoKc3VtX21hbnlfaW50czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCgpzdW1fbWFueV9pbnRzX3doaWxlX3RvcEA3OgogICAgcHVzaGludCAxMDUxMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogc3VtX21hbnlfaW50c19hZnRlcl93aGlsZUAxMgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDE1IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMTUgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGludGNfMiAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgc3VtX21hbnlfaW50c193aGlsZV90b3BANwoKc3VtX21hbnlfaW50c19hZnRlcl93aGlsZUAxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTAKICAgIC8vIHRvdGFsID0gVUludDY0KDApCiAgICBpbnRjXzIgLy8gMAogICAgYnVyeSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTkxCiAgICAvLyBmb3IgdmFsIGluIHNlbGYubWFueV9pbnRzLnZhbHVlOgogICAgYnl0ZWMgOSAvLyAibWFueV9pbnRzIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYW55X2ludHMgZXhpc3RzCiAgICBpbnRjXzIgLy8gMAogICAgYnVyeSAyCgpzdW1fbWFueV9pbnRzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTEKICAgIC8vIGZvciB2YWwgaW4gc2VsZi5tYW55X2ludHMudmFsdWU6CiAgICBkaWcgMQogICAgcHVzaGludCA1MTMKICAgIDwKICAgIGJ6IHN1bV9tYW55X2ludHNfYWZ0ZXJfZm9yQDUKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBieXRlYyA5IC8vICJtYW55X2ludHMiCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTIKICAgIC8vIHRvdGFsID0gdG90YWwgKyB2YWwKICAgIGRpZyAyCiAgICArCiAgICBidXJ5IDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDIKICAgIGIgc3VtX21hbnlfaW50c19mb3JfaGVhZGVyQDIKCnN1bV9tYW55X2ludHNfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnRlc3RfYm94X3JlZltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYm94X3JlZjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTctMTk4CiAgICAvLyAjIGluaXQgcmVmLCB3aXRoIHZhbGlkIGtleSB0eXBlcwogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PSJibG9iIikKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTk5CiAgICAvLyBhc3NlcnQgbm90IGJveF9yZWYsICJubyBkYXRhIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gbm8gZGF0YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDctMjA4CiAgICAvLyAjIGNyZWF0ZQogICAgLy8gYXNzZXJ0IGJveF9yZWYuY3JlYXRlKHNpemU9VUludDY0KDMyKSkKICAgIHB1c2hpbnQgMzIKICAgIGJveF9jcmVhdGUKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxMS0yMTIKICAgIC8vICMgbWFuaXB1bGF0ZSBkYXRhCiAgICAvLyBzZW5kZXJfYnl0ZXMgPSBUeG4uc2VuZGVyLmJ5dGVzCiAgICB0eG4gU2VuZGVyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjEzCiAgICAvLyBhcHBfYWRkcmVzcyA9IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MuYnl0ZXMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxNQogICAgLy8gYm94X3JlZi5yZXBsYWNlKDAsIHNlbmRlcl9ieXRlcykKICAgIGludGNfMiAvLyAwCiAgICBkaWcgMwogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE2CiAgICAvLyBib3hfcmVmLnJlc2l6ZSg4MDAwKQogICAgcHVzaGludCA4MDAwCiAgICBib3hfcmVzaXplCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxNwogICAgLy8gYm94X3JlZi5zcGxpY2UoMCwgMCwgYXBwX2FkZHJlc3MpCiAgICBpbnRjXzIgLy8gMAogICAgZHVwCiAgICBkaWcgMwogICAgYm94X3NwbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTgKICAgIC8vIGJveF9yZWYucmVwbGFjZSg2NCwgdmFsdWVfMykKICAgIHB1c2hpbnQgNjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTQKICAgIC8vIHZhbHVlXzMgPSBCeXRlcyhiImhlbGxvIikKICAgIGJ5dGVjIDEyIC8vIDB4Njg2NTZjNmM2ZgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxOAogICAgLy8gYm94X3JlZi5yZXBsYWNlKDY0LCB2YWx1ZV8zKQogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE5CiAgICAvLyBwcmVmaXggPSBib3hfcmVmLmV4dHJhY3QoMCwgMzIgKiAyICsgdmFsdWVfMy5sZW5ndGgpCiAgICBpbnRjXzIgLy8gMAogICAgcHVzaGludCA2OQogICAgYm94X2V4dHJhY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMjAKICAgIC8vIGFzc2VydCBwcmVmaXggPT0gYXBwX2FkZHJlc3MgKyBzZW5kZXJfYnl0ZXMgKyB2YWx1ZV8zCiAgICBkaWcgMQogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxNAogICAgLy8gdmFsdWVfMyA9IEJ5dGVzKGIiaGVsbG8iKQogICAgYnl0ZWMgMTIgLy8gMHg2ODY1NmM2YzZmCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjIwCiAgICAvLyBhc3NlcnQgcHJlZml4ID09IGFwcF9hZGRyZXNzICsgc2VuZGVyX2J5dGVzICsgdmFsdWVfMwogICAgY29uY2F0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyMi0yMjMKICAgIC8vICMgZGVsZXRlCiAgICAvLyBkZWwgYm94X3JlZi52YWx1ZQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyNi0yMjcKICAgIC8vICMgcXVlcnkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBib3hfcmVmLm1heWJlKCkKICAgIGJveF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMjgKICAgIC8vIGFzc2VydCBub3QgZXhpc3RzCiAgICBkdXAKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyOQogICAgLy8gYXNzZXJ0IHZhbHVlID09IGIiIgogICAgZGlnIDEKICAgIHB1c2hieXRlcyAweAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzMAogICAgLy8gYXNzZXJ0IGJveF9yZWYuZ2V0KGRlZmF1bHQ9c2VuZGVyX2J5dGVzKSA9PSBzZW5kZXJfYnl0ZXMKICAgIGRpZyAzCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjMyLTIzMwogICAgLy8gIyB1cGRhdGUKICAgIC8vIGJveF9yZWYudmFsdWUgPSBzZW5kZXJfYnl0ZXMgKyBhcHBfYWRkcmVzcwogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzMi0yMzMKICAgIC8vICMgdXBkYXRlCiAgICAvLyBib3hfcmVmLnZhbHVlID0gc2VuZGVyX2J5dGVzICsgYXBwX2FkZHJlc3MKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMzItMjMzCiAgICAvLyAjIHVwZGF0ZQogICAgLy8gYm94X3JlZi52YWx1ZSA9IHNlbmRlcl9ieXRlcyArIGFwcF9hZGRyZXNzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzNAogICAgLy8gYXNzZXJ0IGJveF9yZWYsICJCbG9iIGV4aXN0cyIKICAgIGJveF9sZW4KICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzNQogICAgLy8gYXNzZXJ0IGJveF9yZWYubGVuZ3RoID09IDY0CiAgICBwdXNoaW50IDY0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjM4LTIzOQogICAgLy8gIyBpbnN0YW5jZSBib3ggcmVmCiAgICAvLyBzZWxmLmJveF9yZWYuY3JlYXRlKHNpemU9VUludDY0KDMyKSkKICAgIGJ5dGVjIDE2IC8vICJib3hfcmVmIgogICAgcHVzaGludCAzMgogICAgYm94X2NyZWF0ZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQxCiAgICAvLyBkZWwgc2VsZi5ib3hfcmVmLnZhbHVlCiAgICBieXRlYyAxNiAvLyAiYm94X3JlZiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnNldF9uZXN0ZWRfc3RydWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X25lc3RlZF9zdHJ1Y3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0NgogICAgLy8gYXNzZXJ0IHN0cnVjdC5hLCAic3RydWN0LmEgaXMgdHJ1dGh5IgogICAgaW50Y18yIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBhc3NlcnQgLy8gc3RydWN0LmEgaXMgdHJ1dGh5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ3CiAgICAvLyBzdHJ1Y3RfYnl0ZXMgPSBUeG4uYXBwbGljYXRpb25fYXJncygxKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0OAogICAgLy8gc3RydWN0X3NpemUgPSBzdHJ1Y3RfYnl0ZXMubGVuZ3RoCiAgICBkdXAKICAgIGxlbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0OQogICAgLy8gdGFpbF9vZmZzZXQgPSBVSW50NjQoNDA5NiArIDIpCiAgICBpbnRjIDUgLy8gNDA5OAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1MC0yNTEKICAgIC8vICMgaW5pdGlhbGl6ZSBib3ggdG8gemVybwogICAgLy8gYm94LmNyZWF0ZShzaXplPXRhaWxfb2Zmc2V0ICsgc3RydWN0X3NpemUpCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ1CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTAtMjUxCiAgICAvLyAjIGluaXRpYWxpemUgYm94IHRvIHplcm8KICAgIC8vIGJveC5jcmVhdGUoc2l6ZT10YWlsX29mZnNldCArIHN0cnVjdF9zaXplKQogICAgc3dhcAogICAgYm94X2NyZWF0ZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ1CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTItMjUzCiAgICAvLyAjIHNldCBjb3JyZWN0IG9mZnNldCBmb3IgZHluYW1pYyBwb3J0aW9uCiAgICAvLyBib3gucmVwbGFjZSh0YWlsX29mZnNldCAtIDIsIGFyYzQuVUludDE2KHRhaWxfb2Zmc2V0KS5ieXRlcykKICAgIGludGMgNCAvLyA0MDk2CiAgICBwdXNoYnl0ZXMgMHgxMDAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0NQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ5CiAgICAvLyB0YWlsX29mZnNldCA9IFVJbnQ2NCg0MDk2ICsgMikKICAgIGludGMgNSAvLyA0MDk4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU0LTI1NQogICAgLy8gIyBzZXQgZHluYW1pYyBkYXRhCiAgICAvLyBib3gucmVwbGFjZSh0YWlsX29mZnNldCwgc3RydWN0X2J5dGVzKQogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QubmVzdGVkX3dyaXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKbmVzdGVkX3dyaXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYwCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmEgPSB2YWx1ZQogICAgaW50YyA1IC8vIDQwOTgKICAgIHVuY292ZXIgMwogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjEKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuYiA9IHZhbHVlICsgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYxCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmIgPSB2YWx1ZSArIDEKICAgIHB1c2hpbnQgNDExMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MgogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MgogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDIKICAgIHB1c2hpbnQgNDEzNgogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMwogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICBkaWcgMwogICAgKgogICAgaW50YyA2IC8vIDQxMzgKICAgIGRpZyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGMgNiAvLyA0MTM4CiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNQogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkaWcgNAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYzCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmlubmVyLmMgPSB2YWx1ZSArIDMKICAgIGRpZyAyCiAgICBwdXNoaW50IDMKICAgICsKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MwogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5jID0gdmFsdWUgKyAzCiAgICBwdXNoaW50IDQxMTgKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjQKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuZCA9IHZhbHVlICsgNAogICAgZGlnIDIKICAgIHB1c2hpbnQgNAogICAgKwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY0CiAgICAvLyBib3gudmFsdWUubmVzdGVkLmlubmVyLmQgPSB2YWx1ZSArIDQKICAgIHB1c2hpbnQgNDEyOAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA1CiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjUKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQud29haFtpbmRleF0uYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyA1CiAgICBwdXNoaW50IDQxMDgKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA1IC8vIDQwOTgKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyA1CiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGR1cAogICAgZGlnIDQKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgKwogICAgcHVzaGludCAxOAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDUKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZHVwCiAgICB1bmNvdmVyIDQKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgdW5jb3ZlciA0CiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgICsKICAgIHVuY292ZXIgMgogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QubmVzdGVkX3JlYWRbcm91dGluZ10oKSAtPiB2b2lkOgpuZXN0ZWRfcmVhZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzAKICAgIC8vIGEgPSBib3gudmFsdWUubmVzdGVkLmEKICAgIGludGMgNSAvLyA0MDk4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MQogICAgLy8gYiA9IGJveC52YWx1ZS5uZXN0ZWQuYgogICAgcHVzaGludCA0MTEwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBwdXNoaW50IDQxMzYKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDUKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgZGlnIDUKICAgICoKICAgIGludGMgNiAvLyA0MTM4CiAgICBkaWcgMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjcyCiAgICAvLyBhcnJfYXJyID0gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2kxXVtpMl0KICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA2IC8vIDQxMzgKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNgogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkaWcgNQogICAgaW50Y18zIC8vIDgKICAgICoKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MwogICAgLy8gYyA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYwogICAgcHVzaGludCA0MTE4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3NAogICAgLy8gZCA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuZAogICAgcHVzaGludCA0MTI4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3NQogICAgLy8gd29haF9hcnJfYXJyID0gYm94LnZhbHVlLm5lc3RlZC53b2FoW2kxXS5hcnJfYXJyW2kyXVtpM10KICAgIHB1c2hpbnQgNDEwOAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjIDUgLy8gNDA5OAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgdW5jb3ZlciAxMAogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkdXAKICAgIHVuY292ZXIgNQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICArCiAgICBwdXNoaW50IDE4CiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgOAogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciA4CiAgICAqCiAgICBkaWcgMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNwogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICB1bmNvdmVyIDYKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzcKICAgIC8vIHJldHVybiBhICsgYiArIGFycl9hcnIgKyBjICsgZCArIHdvYWhfYXJyX2FycgogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDUKICAgICsKICAgIHVuY292ZXIgNAogICAgKwogICAgdW5jb3ZlciAzCiAgICArCiAgICB1bmNvdmVyIDIKICAgICsKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnNldF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGludGNfMiAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyODUKICAgIC8vIHNlbGYudG9vX21hbnlfYm9vbHMudmFsdWVbaW5kZXhdID0gdmFsdWUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgJQogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICBkaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGJ5dGVjIDggLy8gInRvb19tYW55X2Jvb2xzIgogICAgY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdW1fYm9vbHNbcm91dGluZ10oKSAtPiB2b2lkOgpzdW1fYm9vbHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI4OQogICAgLy8gdG90YWwgPSBVSW50NjQoKQogICAgaW50Y18yIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyOTAKICAgIC8vIGZvciB2YWx1ZSBpbiBzZWxmLnRvb19tYW55X2Jvb2xzLnZhbHVlOgogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvb19tYW55X2Jvb2xzIGV4aXN0cwogICAgaW50Y18yIC8vIDAKCnN1bV9ib29sc19mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjkwCiAgICAvLyBmb3IgdmFsdWUgaW4gc2VsZi50b29fbWFueV9ib29scy52YWx1ZToKICAgIGR1cAogICAgcHVzaGludCAzMzAwMAogICAgPAogICAgYnogc3VtX2Jvb2xzX2FmdGVyX2ZvckA5CiAgICBkdXBuIDIKICAgIGludGNfMyAvLyA4CiAgICAvCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgJQogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgc3dhcAogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjkxCiAgICAvLyBpZiB2YWx1ZToKICAgIGJ6IHN1bV9ib29sc19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyOTIKICAgIC8vIHRvdGFsICs9IDEKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSAyCgpzdW1fYm9vbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI5MwogICAgLy8gaWYgdG90YWwgPT0gc3RvcF9hdF90b3RhbDoKICAgIGRpZyAxCiAgICBkaWcgMwogICAgPT0KICAgIGJueiBzdW1fYm9vbHNfYWZ0ZXJfZm9yQDkKICAgIGR1cAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBzdW1fYm9vbHNfZm9yX2hlYWRlckAyCgpzdW1fYm9vbHNfYWZ0ZXJfZm9yQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGl0b2IKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF90ZXN0W3JvdXRpbmddKCkgLT4gdm9pZDoKYm94X21hcF90ZXN0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI5OQogICAgLy8ga2V5XzAgPSBVSW50NjQoMCkKICAgIGludGNfMiAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAyCiAgICAvLyBzZWxmLmJveF9tYXBba2V5XzBdID0gdmFsdWUKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDEKICAgIC8vIHZhbHVlID0gU3RyaW5nKCJIbW1tbW0iKQogICAgcHVzaGJ5dGVzICJIbW1tbW0iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAyCiAgICAvLyBzZWxmLmJveF9tYXBba2V5XzBdID0gdmFsdWUKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9tYXBba2V5XzBdLmJ5dGVzLmxlbmd0aCA9PSB2YWx1ZS5ieXRlcy5sZW5ndGgKICAgIGJveF9sZW4KICAgIHBvcAogICAgcHVzaGludCA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAwCiAgICAvLyBrZXlfMSA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDkKICAgIC8vIGFzc2VydCBzZWxmLmJveF9tYXAuZ2V0KGtleV8xLCBkZWZhdWx0PVN0cmluZygiZGVmYXVsdCIpKSA9PSBTdHJpbmcoImRlZmF1bHQiKQogICAgaXRvYgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBieXRlYyAxNyAvLyAiZGVmYXVsdCIKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgMTcgLy8gImRlZmF1bHQiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzEwCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gc2VsZi5ib3hfbWFwLm1heWJlKGtleV8xKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMTEKICAgIC8vIGFzc2VydCBub3QgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMTcKICAgIC8vIHRtcF9ib3hfbWFwW2tleV8xXSA9IFN0cmluZygiaGVsbG8iKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGR1cAogICAgYnl0ZWMgMTIgLy8gImhlbGxvIgogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMxOQogICAgLy8gZGVsIHRtcF9ib3hfbWFwW2tleV8xXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9zZXRbcm91dGluZ10oKSAtPiB2b2lkOgpib3hfbWFwX3NldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjMKICAgIC8vIHNlbGYuYm94X21hcFtrZXldID0gdmFsdWUKICAgIHN3YXAKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9nZXRbcm91dGluZ10oKSAtPiB2b2lkOgpib3hfbWFwX2dldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyNwogICAgLy8gcmV0dXJuIHNlbGYuYm94X21hcFtrZXldCiAgICBpdG9iCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfbWFwIGVudHJ5IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX2RlbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJveF9tYXBfZGVsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzMxCiAgICAvLyBkZWwgc2VsZi5ib3hfbWFwW2tleV0KICAgIGl0b2IKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmJveF9tYXBfZXhpc3RzW3JvdXRpbmddKCkgLT4gdm9pZDoKYm94X21hcF9leGlzdHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMzUKICAgIC8vIHJldHVybiBrZXkgaW4gc2VsZi5ib3hfbWFwCiAgICBpdG9iCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAHAQIACIAggiCqICYSA2JveAVCT1hfQwRibG9iCWJveF9sYXJnZQQVH3x1BWJveF9hBWJveF9kAWIOdG9vX21hbnlfYm9vbHMJbWFueV9pbnRzATAEAAI0MgVoZWxsbwNvY2EDdHhuAwaBAQdib3hfcmVmB2RlZmF1bHQxG0EA3jEZFEQxGESCGQTybG1CBO8YbPcEfTcpbgTxPdk3BDMyXT0EphdIEgT6vLiFBNVmxjIEBO9JcQQj7LMsBAGZQI0EdyBZygQBJj32BO73WBYEmWSXrgRs7HL/BG+dEHUEWe83YASqZmuWBN+91jYEtTKROgTCnxZpBJyIjAkE5vaFBgSO4sNkNhoAjhkAKQA4AFgB2AAfAggCTgJfAqAAEwAKAx0DLwOIA+0EDwTRAAEFkwW6BgEGNAZHBl0GZgAnCIGdILlIIkMnCYGIILlIIkOCAgFkBAABAgO/IkMiQzEZFDEYFBBDIhYnDUy/gQYWJw5MvyJDJw2+REkXFkxLARJEJw6+REkXFkxLARJEUCcETFCwIkM2GgEXNhoCNhoDTwIWJwVMvycHvEgnB0sCvym8SClLAb9LAVcCACcGvEgnBksBvyuBkDC5SIEqFishBE8CuyshBIAIAAAAAAAAACq7JwW+RBeBAwgWJwVMvycFvUglEkQnB71ISwMVEkQpvURLAhVKEkQnBr1ISwMVShJEKSQiuksGVwABEkRLAyIJKUwiuksDIglLB0wiWBJEIksEDEsEIk8CTUsETAkpJE8CuiJLBA8iSwVPAk1LBEwJSwckTwJSEkQjSwQMTwQjTwJNKSRPArojSwQPI08FTwJNTwUkTwJSEkQnBiQiuk8EVwIBEkRLASIJJwZMIrpLASIJSwRMIlgSRCJLAgxLAiJPAk1LAkwJJwYkTwK6IksCDyJLA08CTUsCTAlLBCRPAlISRIEFSwIMSwKBBU8CTScGJE8CuoEFSwIPgQVLA08CTUsEJE8CUhJEI0sCDE8CI08CTScGJE8CuiNLAg8jTwNPAk1PAiRPAlISRCu9SIGQMBJEIkMnBb1FAScHvU4CSCm9TgNIK71OBEiAAQAkTwJUIk8CVCNPAlSBA08CVCcETFCwIkMnBb5EFyIIIgknB75EVwIAKb5EKyEEJboXTwMWSwMVFlcGAk8EUEyAAgAUUEsBFYEUCBZXBgJQTwIWUExQTFAnBExQsCJDKyEEJboXIggWKyEETwK7IkMnBbxIJwe8SCm8SCcFvkwXgSpLAUsDTYEqEkQnB74nC04CTVcCAIACNDISRCm+JwtOAk0nCxJETBREFEQrvEgiQycKvEgnCoATVGVzdGluZyB0ZXN0aW5nIDEyM78nCr1ISSRLAk2BB0sCDE8CgQdPAk1LAQknCk4CuoAHVGVzdGluZxJEKbxIKYAHAAVIZWxsb78pvUgjSwEMSwEjTwJNgQpLAgxPAoEKTwJNSwEJKU4CuoAFSGVsbG8SRCJDNhoBFzYaAkwlCycJTE8CuyJDgABJgY5SMgwNQQAYsYEGshCBBbIZJw+yHicPsh8ksgGzQv/fJEUBJwm9RQFEJEUCSwGBgQQMQQAXSwFJJQsnCUwluhdLAghFAiIIRQJC/+BJFicETFCwIkMqvUUBFEQqgSC5RDEAMgoqJEsDuyqBwD7TKiRJSwPSKoFAJwy7KiSBRbpLAUsDUCcMUBJEKrxIKr5JFERLAYAAEkRLA04CTUsCEkRQKrxIKky/Kr1IgUASRCcQgSC5SCcQvEgiQzYaASRbRDYaAUkVIQUIKEy5SCghBIACEAK7KCEFTwK7IkM2GgEXNhoCSRcoIQVPA7tJIggWKIGOIE8Cu0kjCBYogaggI7oXSwMNRCNLAwshBksBCChMI7oXIQYIKEsBI7oXSwUNRCMISwQlC0xLAQgoTE8Eu0sCgQMIFiiBliBPArtLAoEECBYogaAgTwK7TwKBBQgWKIGMICO6FyEFCChLASO6F0sFDUQjCElLBAgoTCO6FwiBEggoSwEjuhdLBQ1EIwhJTwQIKEwjuhcIKEsBI7oXTwQNRCMITwIIKExPArsiQzYaARc2GgIXNhoDFyghBSW6FyiBjiAluhcogaggI7oXSwUNRCNLBQshBksBCChMI7oXIQYIKEsBI7oXSwYNRCMISwUlCwgoTCW6FyiBliAluhcogaAgJboXKIGMICO6FyEFCChLASO6F08KDUQjCElPBQgoTCO6FwiBEggoSwEjuhdLCA1EIwgjTwgLSwEIKEwjuhcIKEsBI7oXSwcNRCMITwYlCwgoTCW6F08FTwUITwQITwMITwIICBYnBExQsCJDNhoBFzYaAiRTSwElCk8CJRgnCEsCIrpLASUMRExPA1QnCE4CuyJDNhoBFyQnCL1FAUQkSYHogQIMQQAoRwIlCkwlGCcITwIiukxTQQAGSwEiCEUCSwFLAxJAAAhJIghFAUL/z0sBFicETFCwIkMkFkm8SEmABkhtbW1tbb+9SIEGEkQiFkm+JxFOAk0nERJESb1FARRESbxISScMv7xIIkM2GgEXNhoCVwIATBZJvEhMvyJDNhoBFxa+REkVFlcGAkxQJwRMULAiQzYaARcWvEgiQzYaARcWvUUBgAEAJE8CVCcETFCwIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +// Type definitions for ARC-56 structs + +export type InnerStruct = { + c: bigint, + arrArr: bigint[][], + d: bigint +} + + +/** + * Converts the ABI tuple representation of a InnerStruct to the struct representation + */ +export function InnerStructFromTuple(abiTuple: [bigint, bigint[][], bigint]) { + const abiStructType = ABIStructType.fromStruct('InnerStruct', APP_SPEC.structs) + return getStructValueFromTupleValue(abiStructType, abiTuple) as InnerStruct +} + +export type LargeStruct = { + a: Uint8Array, + b: Uint8Array, + c: Uint8Array, + d: Uint8Array, + e: bigint, + f: Uint8Array, + g: Uint8Array, + h: bigint +} + + +/** + * Converts the ABI tuple representation of a LargeStruct to the struct representation + */ +export function LargeStructFromTuple(abiTuple: [Uint8Array, Uint8Array, Uint8Array, Uint8Array, bigint, Uint8Array, Uint8Array, bigint]) { + const abiStructType = ABIStructType.fromStruct('LargeStruct', APP_SPEC.structs) + return getStructValueFromTupleValue(abiStructType, abiTuple) as LargeStruct +} + +export type NestedStruct = { + a: bigint, + inner: InnerStruct, + woah: [bigint, bigint[][], bigint][], + b: bigint +} + + +/** + * Converts the ABI tuple representation of a NestedStruct to the struct representation + */ +export function NestedStructFromTuple(abiTuple: [bigint, InnerStruct, [bigint, bigint[][], bigint][], bigint]) { + const abiStructType = ABIStructType.fromStruct('NestedStruct', APP_SPEC.structs) + return getStructValueFromTupleValue(abiStructType, abiTuple) as NestedStruct +} + +/** + * The argument types for the BoxContract contract + */ +export type BoxContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'store_enums()void': Record + 'read_enums()(uint64,uint64)': Record + 'set_boxes(uint64,byte[],string)void': { + a: bigint | number + b: Uint8Array + c: string + } + 'boxes_exist()(bool,bool,bool,bool)': Record + 'check_keys()void': Record + 'read_boxes()(uint64,byte[],string,uint64)': Record + 'indirect_extract_and_replace()void': Record + 'delete_boxes()void': Record + 'slice_box()void': Record + 'arc4_box()void': Record + 'create_many_ints()void': Record + 'set_many_ints(uint64,uint64)void': { + index: bigint | number + value: bigint | number + } + 'sum_many_ints()uint64': Record + 'test_box_ref()void': Record + 'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void': { + struct: NestedStruct + } + 'nested_write(uint64,uint64)void': { + index: bigint | number + value: bigint | number + } + 'nested_read(uint64,uint64,uint64)uint64': { + i1: bigint | number + i2: bigint | number + i3: bigint | number + } + 'create_bools()void': Record + 'set_bool(uint64,bool)void': { + index: bigint | number + value: boolean + } + 'sum_bools(uint64)uint64': { + stopAtTotal: bigint | number + } + 'box_map_test()void': Record + 'box_map_set(uint64,string)void': { + key: bigint | number + value: string + } + 'box_map_get(uint64)string': { + key: bigint | number + } + 'box_map_del(uint64)void': { + key: bigint | number + } + 'box_map_exists(uint64)bool': { + key: bigint | number + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'store_enums()void': [] + 'read_enums()(uint64,uint64)': [] + 'set_boxes(uint64,byte[],string)void': [a: bigint | number, b: Uint8Array, c: string] + 'boxes_exist()(bool,bool,bool,bool)': [] + 'check_keys()void': [] + 'read_boxes()(uint64,byte[],string,uint64)': [] + 'indirect_extract_and_replace()void': [] + 'delete_boxes()void': [] + 'slice_box()void': [] + 'arc4_box()void': [] + 'create_many_ints()void': [] + 'set_many_ints(uint64,uint64)void': [index: bigint | number, value: bigint | number] + 'sum_many_ints()uint64': [] + 'test_box_ref()void': [] + 'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void': [struct: NestedStruct] + 'nested_write(uint64,uint64)void': [index: bigint | number, value: bigint | number] + 'nested_read(uint64,uint64,uint64)uint64': [i1: bigint | number, i2: bigint | number, i3: bigint | number] + 'create_bools()void': [] + 'set_bool(uint64,bool)void': [index: bigint | number, value: boolean] + 'sum_bools(uint64)uint64': [stopAtTotal: bigint | number] + 'box_map_test()void': [] + 'box_map_set(uint64,string)void': [key: bigint | number, value: string] + 'box_map_get(uint64)string': [key: bigint | number] + 'box_map_del(uint64)void': [key: bigint | number] + 'box_map_exists(uint64)bool': [key: bigint | number] + } +} + +/** + * The return type for each method + */ +export type BoxContractReturns = { + 'store_enums()void': void + 'read_enums()(uint64,uint64)': [bigint, bigint] + 'set_boxes(uint64,byte[],string)void': void + 'boxes_exist()(bool,bool,bool,bool)': [boolean, boolean, boolean, boolean] + 'check_keys()void': void + 'read_boxes()(uint64,byte[],string,uint64)': [bigint, Uint8Array, string, bigint] + 'indirect_extract_and_replace()void': void + 'delete_boxes()void': void + 'slice_box()void': void + 'arc4_box()void': void + 'create_many_ints()void': void + 'set_many_ints(uint64,uint64)void': void + 'sum_many_ints()uint64': bigint + 'test_box_ref()void': void + 'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void': void + 'nested_write(uint64,uint64)void': void + 'nested_read(uint64,uint64,uint64)uint64': bigint + 'create_bools()void': void + 'set_bool(uint64,bool)void': void + 'sum_bools(uint64)uint64': bigint + 'box_map_test()void': void + 'box_map_set(uint64,string)void': void + 'box_map_get(uint64)string': string + 'box_map_del(uint64)void': void + 'box_map_exists(uint64)bool': boolean +} + +/** + * Defines the types of available calls and state of the BoxContract smart contract. + */ +export type BoxContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'store_enums()void' | 'store_enums', { + argsObj: BoxContractArgs['obj']['store_enums()void'] + argsTuple: BoxContractArgs['tuple']['store_enums()void'] + returns: BoxContractReturns['store_enums()void'] + }> + & Record<'read_enums()(uint64,uint64)' | 'read_enums', { + argsObj: BoxContractArgs['obj']['read_enums()(uint64,uint64)'] + argsTuple: BoxContractArgs['tuple']['read_enums()(uint64,uint64)'] + returns: BoxContractReturns['read_enums()(uint64,uint64)'] + }> + & Record<'set_boxes(uint64,byte[],string)void' | 'set_boxes', { + argsObj: BoxContractArgs['obj']['set_boxes(uint64,byte[],string)void'] + argsTuple: BoxContractArgs['tuple']['set_boxes(uint64,byte[],string)void'] + returns: BoxContractReturns['set_boxes(uint64,byte[],string)void'] + }> + & Record<'boxes_exist()(bool,bool,bool,bool)' | 'boxes_exist', { + argsObj: BoxContractArgs['obj']['boxes_exist()(bool,bool,bool,bool)'] + argsTuple: BoxContractArgs['tuple']['boxes_exist()(bool,bool,bool,bool)'] + returns: BoxContractReturns['boxes_exist()(bool,bool,bool,bool)'] + }> + & Record<'check_keys()void' | 'check_keys', { + argsObj: BoxContractArgs['obj']['check_keys()void'] + argsTuple: BoxContractArgs['tuple']['check_keys()void'] + returns: BoxContractReturns['check_keys()void'] + }> + & Record<'read_boxes()(uint64,byte[],string,uint64)' | 'read_boxes', { + argsObj: BoxContractArgs['obj']['read_boxes()(uint64,byte[],string,uint64)'] + argsTuple: BoxContractArgs['tuple']['read_boxes()(uint64,byte[],string,uint64)'] + returns: BoxContractReturns['read_boxes()(uint64,byte[],string,uint64)'] + }> + & Record<'indirect_extract_and_replace()void' | 'indirect_extract_and_replace', { + argsObj: BoxContractArgs['obj']['indirect_extract_and_replace()void'] + argsTuple: BoxContractArgs['tuple']['indirect_extract_and_replace()void'] + returns: BoxContractReturns['indirect_extract_and_replace()void'] + }> + & Record<'delete_boxes()void' | 'delete_boxes', { + argsObj: BoxContractArgs['obj']['delete_boxes()void'] + argsTuple: BoxContractArgs['tuple']['delete_boxes()void'] + returns: BoxContractReturns['delete_boxes()void'] + }> + & Record<'slice_box()void' | 'slice_box', { + argsObj: BoxContractArgs['obj']['slice_box()void'] + argsTuple: BoxContractArgs['tuple']['slice_box()void'] + returns: BoxContractReturns['slice_box()void'] + }> + & Record<'arc4_box()void' | 'arc4_box', { + argsObj: BoxContractArgs['obj']['arc4_box()void'] + argsTuple: BoxContractArgs['tuple']['arc4_box()void'] + returns: BoxContractReturns['arc4_box()void'] + }> + & Record<'create_many_ints()void' | 'create_many_ints', { + argsObj: BoxContractArgs['obj']['create_many_ints()void'] + argsTuple: BoxContractArgs['tuple']['create_many_ints()void'] + returns: BoxContractReturns['create_many_ints()void'] + }> + & Record<'set_many_ints(uint64,uint64)void' | 'set_many_ints', { + argsObj: BoxContractArgs['obj']['set_many_ints(uint64,uint64)void'] + argsTuple: BoxContractArgs['tuple']['set_many_ints(uint64,uint64)void'] + returns: BoxContractReturns['set_many_ints(uint64,uint64)void'] + }> + & Record<'sum_many_ints()uint64' | 'sum_many_ints', { + argsObj: BoxContractArgs['obj']['sum_many_ints()uint64'] + argsTuple: BoxContractArgs['tuple']['sum_many_ints()uint64'] + returns: BoxContractReturns['sum_many_ints()uint64'] + }> + & Record<'test_box_ref()void' | 'test_box_ref', { + argsObj: BoxContractArgs['obj']['test_box_ref()void'] + argsTuple: BoxContractArgs['tuple']['test_box_ref()void'] + returns: BoxContractReturns['test_box_ref()void'] + }> + & Record<'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void' | 'set_nested_struct', { + argsObj: BoxContractArgs['obj']['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'] + argsTuple: BoxContractArgs['tuple']['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'] + returns: BoxContractReturns['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'] + }> + & Record<'nested_write(uint64,uint64)void' | 'nested_write', { + argsObj: BoxContractArgs['obj']['nested_write(uint64,uint64)void'] + argsTuple: BoxContractArgs['tuple']['nested_write(uint64,uint64)void'] + returns: BoxContractReturns['nested_write(uint64,uint64)void'] + }> + & Record<'nested_read(uint64,uint64,uint64)uint64' | 'nested_read', { + argsObj: BoxContractArgs['obj']['nested_read(uint64,uint64,uint64)uint64'] + argsTuple: BoxContractArgs['tuple']['nested_read(uint64,uint64,uint64)uint64'] + returns: BoxContractReturns['nested_read(uint64,uint64,uint64)uint64'] + }> + & Record<'create_bools()void' | 'create_bools', { + argsObj: BoxContractArgs['obj']['create_bools()void'] + argsTuple: BoxContractArgs['tuple']['create_bools()void'] + returns: BoxContractReturns['create_bools()void'] + }> + & Record<'set_bool(uint64,bool)void' | 'set_bool', { + argsObj: BoxContractArgs['obj']['set_bool(uint64,bool)void'] + argsTuple: BoxContractArgs['tuple']['set_bool(uint64,bool)void'] + returns: BoxContractReturns['set_bool(uint64,bool)void'] + }> + & Record<'sum_bools(uint64)uint64' | 'sum_bools', { + argsObj: BoxContractArgs['obj']['sum_bools(uint64)uint64'] + argsTuple: BoxContractArgs['tuple']['sum_bools(uint64)uint64'] + returns: BoxContractReturns['sum_bools(uint64)uint64'] + }> + & Record<'box_map_test()void' | 'box_map_test', { + argsObj: BoxContractArgs['obj']['box_map_test()void'] + argsTuple: BoxContractArgs['tuple']['box_map_test()void'] + returns: BoxContractReturns['box_map_test()void'] + }> + & Record<'box_map_set(uint64,string)void' | 'box_map_set', { + argsObj: BoxContractArgs['obj']['box_map_set(uint64,string)void'] + argsTuple: BoxContractArgs['tuple']['box_map_set(uint64,string)void'] + returns: BoxContractReturns['box_map_set(uint64,string)void'] + }> + & Record<'box_map_get(uint64)string' | 'box_map_get', { + argsObj: BoxContractArgs['obj']['box_map_get(uint64)string'] + argsTuple: BoxContractArgs['tuple']['box_map_get(uint64)string'] + returns: BoxContractReturns['box_map_get(uint64)string'] + }> + & Record<'box_map_del(uint64)void' | 'box_map_del', { + argsObj: BoxContractArgs['obj']['box_map_del(uint64)void'] + argsTuple: BoxContractArgs['tuple']['box_map_del(uint64)void'] + returns: BoxContractReturns['box_map_del(uint64)void'] + }> + & Record<'box_map_exists(uint64)bool' | 'box_map_exists', { + argsObj: BoxContractArgs['obj']['box_map_exists(uint64)bool'] + argsTuple: BoxContractArgs['tuple']['box_map_exists(uint64)bool'] + returns: BoxContractReturns['box_map_exists(uint64)bool'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + box: { + keys: { + oca: bigint + txn: bigint + boxA: bigint + boxB: Uint8Array + boxC: string + boxD: BinaryState + manyInts: [bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint] + boxRef: BinaryState + boxLarge: LargeStruct + tooManyBools: [boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean] + } + maps: { + boxMap: Map + } + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type BoxContractSignatures = keyof BoxContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type BoxContractNonVoidMethodSignatures = keyof BoxContractTypes['methods'] extends infer T ? T extends keyof BoxContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the BoxContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = BoxContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the BoxContract smart contract to the method's return type + */ +export type MethodReturn = BoxContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed box state of the application. + */ +export type BoxKeysState = BoxContractTypes['state']['box']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type BoxContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type BoxContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: BoxContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the BoxContract smart contract + */ +export abstract class BoxContractParamsFactory { + /** + * Constructs a no op call for the store_enums()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static storeEnums(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'store_enums()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the read_enums()(uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static readEnums(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'read_enums()(uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the set_boxes(uint64,byte[],string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_boxes(uint64,byte[],string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the boxes_exist()(bool,bool,bool,bool) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static boxesExist(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'boxes_exist()(bool,bool,bool,bool)' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the check_keys()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static checkKeys(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'check_keys()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the read_boxes()(uint64,byte[],string,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static readBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'read_boxes()(uint64,byte[],string,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the indirect_extract_and_replace()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static indirectExtractAndReplace(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'indirect_extract_and_replace()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the delete_boxes()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static deleteBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'delete_boxes()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the slice_box()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static sliceBox(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'slice_box()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the arc4_box()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static arc4Box(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'arc4_box()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the create_many_ints()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static createManyInts(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'create_many_ints()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the set_many_ints(uint64,uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setManyInts(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_many_ints(uint64,uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.index, params.args.value], + } + } + /** + * Constructs a no op call for the sum_many_ints()uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static sumManyInts(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'sum_many_ints()uint64' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_box_ref()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testBoxRef(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_box_ref()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setNestedStruct(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.struct], + } + } + /** + * Constructs a no op call for the nested_write(uint64,uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static nestedWrite(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'nested_write(uint64,uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.index, params.args.value], + } + } + /** + * Constructs a no op call for the nested_read(uint64,uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static nestedRead(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'nested_read(uint64,uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.i1, params.args.i2, params.args.i3], + } + } + /** + * Constructs a no op call for the create_bools()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static createBools(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'create_bools()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the set_bool(uint64,bool)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setBool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_bool(uint64,bool)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.index, params.args.value], + } + } + /** + * Constructs a no op call for the sum_bools(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static sumBools(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'sum_bools(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.stopAtTotal], + } + } + /** + * Constructs a no op call for the box_map_test()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static boxMapTest(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'box_map_test()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the box_map_set(uint64,string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static boxMapSet(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'box_map_set(uint64,string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.key, params.args.value], + } + } + /** + * Constructs a no op call for the box_map_get(uint64)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static boxMapGet(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'box_map_get(uint64)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.key], + } + } + /** + * Constructs a no op call for the box_map_del(uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static boxMapDel(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'box_map_del(uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.key], + } + } + /** + * Constructs a no op call for the box_map_exists(uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static boxMapExists(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'box_map_exists(uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.key], + } + } +} + +/** + * A factory to create and deploy one or more instance of the BoxContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class BoxContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `BoxContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new BoxContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new BoxContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the BoxContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: BoxContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new BoxContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the BoxContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the BoxContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the BoxContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new BoxContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the BoxContract smart contract + */ +export class BoxContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `BoxContractClient` + * + * @param appClient An `AppClient` instance which has been created with the BoxContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `BoxContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `BoxContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new BoxContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `BoxContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new BoxContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the BoxContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the BoxContract smart contract using the `store_enums()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + storeEnums: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.storeEnums(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `read_enums()(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + readEnums: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.readEnums(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_boxes(uint64,byte[],string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.setBoxes(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `boxes_exist()(bool,bool,bool,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + boxesExist: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.boxesExist(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `check_keys()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + checkKeys: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.checkKeys(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `read_boxes()(uint64,byte[],string,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + readBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.readBoxes(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `indirect_extract_and_replace()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + indirectExtractAndReplace: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.indirectExtractAndReplace(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `delete_boxes()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + deleteBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.deleteBoxes(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `slice_box()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + sliceBox: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.sliceBox(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `arc4_box()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + arc4Box: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.arc4Box(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `create_many_ints()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + createManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.createManyInts(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_many_ints(uint64,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.setManyInts(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `sum_many_ints()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + sumManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.sumManyInts(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `test_box_ref()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testBoxRef: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.testBoxRef(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setNestedStruct: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.setNestedStruct(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `nested_write(uint64,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + nestedWrite: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.nestedWrite(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `nested_read(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + nestedRead: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.nestedRead(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `create_bools()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + createBools: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.createBools(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_bool(uint64,bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setBool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.setBool(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `sum_bools(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + sumBools: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.sumBools(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_test()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + boxMapTest: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.boxMapTest(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_set(uint64,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + boxMapSet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.boxMapSet(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_get(uint64)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + boxMapGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.boxMapGet(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_del(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + boxMapDel: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.boxMapDel(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_exists(uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + boxMapExists: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.boxMapExists(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the BoxContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the BoxContract smart contract using the `store_enums()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + storeEnums: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.storeEnums(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `read_enums()(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + readEnums: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.readEnums(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_boxes(uint64,byte[],string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.setBoxes(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `boxes_exist()(bool,bool,bool,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + boxesExist: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.boxesExist(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `check_keys()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + checkKeys: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.checkKeys(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `read_boxes()(uint64,byte[],string,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + readBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.readBoxes(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `indirect_extract_and_replace()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + indirectExtractAndReplace: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.indirectExtractAndReplace(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `delete_boxes()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + deleteBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.deleteBoxes(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `slice_box()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + sliceBox: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.sliceBox(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `arc4_box()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + arc4Box: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.arc4Box(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `create_many_ints()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + createManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.createManyInts(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_many_ints(uint64,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.setManyInts(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `sum_many_ints()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + sumManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.sumManyInts(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `test_box_ref()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testBoxRef: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.testBoxRef(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setNestedStruct: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.setNestedStruct(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `nested_write(uint64,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + nestedWrite: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.nestedWrite(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `nested_read(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + nestedRead: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.nestedRead(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `create_bools()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + createBools: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.createBools(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_bool(uint64,bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setBool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.setBool(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `sum_bools(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + sumBools: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.sumBools(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_test()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + boxMapTest: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapTest(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_set(uint64,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + boxMapSet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapSet(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_get(uint64)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + boxMapGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapGet(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_del(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + boxMapDel: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapDel(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_exists(uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + boxMapExists: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapExists(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the BoxContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the BoxContract smart contract using the `store_enums()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + storeEnums: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.storeEnums(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['store_enums()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `read_enums()(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + readEnums: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.readEnums(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['read_enums()(uint64,uint64)'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_boxes(uint64,byte[],string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.setBoxes(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['set_boxes(uint64,byte[],string)void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `boxes_exist()(bool,bool,bool,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + boxesExist: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.boxesExist(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['boxes_exist()(bool,bool,bool,bool)'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `check_keys()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + checkKeys: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.checkKeys(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['check_keys()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `read_boxes()(uint64,byte[],string,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + readBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.readBoxes(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['read_boxes()(uint64,byte[],string,uint64)'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `indirect_extract_and_replace()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + indirectExtractAndReplace: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.indirectExtractAndReplace(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['indirect_extract_and_replace()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `delete_boxes()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + deleteBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.deleteBoxes(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['delete_boxes()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `slice_box()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + sliceBox: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.sliceBox(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['slice_box()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `arc4_box()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + arc4Box: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.arc4Box(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['arc4_box()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `create_many_ints()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + createManyInts: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.createManyInts(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['create_many_ints()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_many_ints(uint64,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setManyInts: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.setManyInts(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['set_many_ints(uint64,uint64)void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `sum_many_ints()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + sumManyInts: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.sumManyInts(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['sum_many_ints()uint64'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `test_box_ref()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testBoxRef: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.testBoxRef(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['test_box_ref()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setNestedStruct: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.setNestedStruct(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `nested_write(uint64,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + nestedWrite: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.nestedWrite(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['nested_write(uint64,uint64)void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `nested_read(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + nestedRead: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.nestedRead(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['nested_read(uint64,uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `create_bools()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + createBools: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.createBools(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['create_bools()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_bool(uint64,bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setBool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.setBool(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['set_bool(uint64,bool)void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `sum_bools(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + sumBools: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.sumBools(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['sum_bools(uint64)uint64'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_test()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + boxMapTest: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapTest(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_test()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_set(uint64,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + boxMapSet: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapSet(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_set(uint64,string)void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_get(uint64)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + boxMapGet: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapGet(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_get(uint64)string'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_del(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + boxMapDel: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapDel(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_del(uint64)void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_exists(uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + boxMapExists: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapExists(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_exists(uint64)bool'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new BoxContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current BoxContract app + */ + state = { + /** + * Methods to access box state for the current BoxContract app + */ + box: { + /** + * Get all current keyed values from box state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.box.getAll() + return { + oca: result.oca, + txn: result.txn, + boxA: result.box_a, + boxB: result.box_b, + boxC: result.box_c, + boxD: new BinaryStateValue(result.box_d), + manyInts: result.many_ints, + boxRef: new BinaryStateValue(result.box_ref), + boxLarge: result.box_large, + tooManyBools: result.too_many_bools, + } + }, + /** + * Get the current value of the oca key in box state + */ + oca: async (): Promise => { return (await this.appClient.state.box.getValue("oca")) as bigint | undefined }, + /** + * Get the current value of the txn key in box state + */ + txn: async (): Promise => { return (await this.appClient.state.box.getValue("txn")) as bigint | undefined }, + /** + * Get the current value of the box_a key in box state + */ + boxA: async (): Promise => { return (await this.appClient.state.box.getValue("box_a")) as bigint | undefined }, + /** + * Get the current value of the box_b key in box state + */ + boxB: async (): Promise => { return (await this.appClient.state.box.getValue("box_b")) as Uint8Array | undefined }, + /** + * Get the current value of the box_c key in box state + */ + boxC: async (): Promise => { return (await this.appClient.state.box.getValue("box_c")) as string | undefined }, + /** + * Get the current value of the box_d key in box state + */ + boxD: async (): Promise => { return new BinaryStateValue((await this.appClient.state.box.getValue("box_d")) as Uint8Array | undefined) }, + /** + * Get the current value of the many_ints key in box state + */ + manyInts: async (): Promise<[bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint] | undefined> => { return (await this.appClient.state.box.getValue("many_ints")) as [bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint] | undefined }, + /** + * Get the current value of the box_ref key in box state + */ + boxRef: async (): Promise => { return new BinaryStateValue((await this.appClient.state.box.getValue("box_ref")) as Uint8Array | undefined) }, + /** + * Get the current value of the box_large key in box state + */ + boxLarge: async (): Promise => { return (await this.appClient.state.box.getValue("box_large")) as LargeStruct | undefined }, + /** + * Get the current value of the too_many_bools key in box state + */ + tooManyBools: async (): Promise<[boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean] | undefined> => { return (await this.appClient.state.box.getValue("too_many_bools")) as [boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean] | undefined }, + /** + * Get values from the box_map map in box state + */ + boxMap: { + /** + * Get all current values of the box_map map in box state + */ + getMap: async (): Promise> => { return (await this.appClient.state.box.getMap("box_map")) as Map }, + /** + * Get a current value of the box_map map by key from box state + */ + value: async (key: bigint | number): Promise => { return await this.appClient.state.box.getMapValue("box_map", key) as string | undefined }, + }, + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): BoxContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a store_enums()void method call against the BoxContract contract + */ + storeEnums(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.storeEnums(params))) + return this + }, + /** + * Add a read_enums()(uint64,uint64) method call against the BoxContract contract + */ + readEnums(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.readEnums(params))) + return this + }, + /** + * Add a set_boxes(uint64,byte[],string)void method call against the BoxContract contract + */ + setBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setBoxes(params))) + return this + }, + /** + * Add a boxes_exist()(bool,bool,bool,bool) method call against the BoxContract contract + */ + boxesExist(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxesExist(params))) + return this + }, + /** + * Add a check_keys()void method call against the BoxContract contract + */ + checkKeys(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.checkKeys(params))) + return this + }, + /** + * Add a read_boxes()(uint64,byte[],string,uint64) method call against the BoxContract contract + */ + readBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.readBoxes(params))) + return this + }, + /** + * Add a indirect_extract_and_replace()void method call against the BoxContract contract + */ + indirectExtractAndReplace(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.indirectExtractAndReplace(params))) + return this + }, + /** + * Add a delete_boxes()void method call against the BoxContract contract + */ + deleteBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deleteBoxes(params))) + return this + }, + /** + * Add a slice_box()void method call against the BoxContract contract + */ + sliceBox(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sliceBox(params))) + return this + }, + /** + * Add a arc4_box()void method call against the BoxContract contract + */ + arc4Box(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.arc4Box(params))) + return this + }, + /** + * Add a create_many_ints()void method call against the BoxContract contract + */ + createManyInts(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createManyInts(params))) + return this + }, + /** + * Add a set_many_ints(uint64,uint64)void method call against the BoxContract contract + */ + setManyInts(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setManyInts(params))) + return this + }, + /** + * Add a sum_many_ints()uint64 method call against the BoxContract contract + */ + sumManyInts(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sumManyInts(params))) + return this + }, + /** + * Add a test_box_ref()void method call against the BoxContract contract + */ + testBoxRef(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBoxRef(params))) + return this + }, + /** + * Add a set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void method call against the BoxContract contract + */ + setNestedStruct(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setNestedStruct(params))) + return this + }, + /** + * Add a nested_write(uint64,uint64)void method call against the BoxContract contract + */ + nestedWrite(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.nestedWrite(params))) + return this + }, + /** + * Add a nested_read(uint64,uint64,uint64)uint64 method call against the BoxContract contract + */ + nestedRead(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.nestedRead(params))) + return this + }, + /** + * Add a create_bools()void method call against the BoxContract contract + */ + createBools(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createBools(params))) + return this + }, + /** + * Add a set_bool(uint64,bool)void method call against the BoxContract contract + */ + setBool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setBool(params))) + return this + }, + /** + * Add a sum_bools(uint64)uint64 method call against the BoxContract contract + */ + sumBools(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sumBools(params))) + return this + }, + /** + * Add a box_map_test()void method call against the BoxContract contract + */ + boxMapTest(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapTest(params))) + return this + }, + /** + * Add a box_map_set(uint64,string)void method call against the BoxContract contract + */ + boxMapSet(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapSet(params))) + return this + }, + /** + * Add a box_map_get(uint64)string method call against the BoxContract contract + */ + boxMapGet(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapGet(params))) + return this + }, + /** + * Add a box_map_del(uint64)void method call against the BoxContract contract + */ + boxMapDel(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapDel(params))) + return this + }, + /** + * Add a box_map_exists(uint64)bool method call against the BoxContract contract + */ + boxMapExists(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapExists(params))) + return this + }, + /** + * Add a clear state call to the BoxContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as BoxContractComposer + } +} +export type BoxContractComposer = { + /** + * Calls the store_enums()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + storeEnums(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['store_enums()void'] | undefined]> + + /** + * Calls the read_enums()(uint64,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + readEnums(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['read_enums()(uint64,uint64)'] | undefined]> + + /** + * Calls the set_boxes(uint64,byte[],string)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setBoxes(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['set_boxes(uint64,byte[],string)void'] | undefined]> + + /** + * Calls the boxes_exist()(bool,bool,bool,bool) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + boxesExist(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['boxes_exist()(bool,bool,bool,bool)'] | undefined]> + + /** + * Calls the check_keys()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + checkKeys(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['check_keys()void'] | undefined]> + + /** + * Calls the read_boxes()(uint64,byte[],string,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + readBoxes(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['read_boxes()(uint64,byte[],string,uint64)'] | undefined]> + + /** + * Calls the indirect_extract_and_replace()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + indirectExtractAndReplace(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['indirect_extract_and_replace()void'] | undefined]> + + /** + * Calls the delete_boxes()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + deleteBoxes(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['delete_boxes()void'] | undefined]> + + /** + * Calls the slice_box()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + sliceBox(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['slice_box()void'] | undefined]> + + /** + * Calls the arc4_box()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + arc4Box(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['arc4_box()void'] | undefined]> + + /** + * Calls the create_many_ints()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + createManyInts(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['create_many_ints()void'] | undefined]> + + /** + * Calls the set_many_ints(uint64,uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setManyInts(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['set_many_ints(uint64,uint64)void'] | undefined]> + + /** + * Calls the sum_many_ints()uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + sumManyInts(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['sum_many_ints()uint64'] | undefined]> + + /** + * Calls the test_box_ref()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testBoxRef(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['test_box_ref()void'] | undefined]> + + /** + * Calls the set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setNestedStruct(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'] | undefined]> + + /** + * Calls the nested_write(uint64,uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + nestedWrite(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['nested_write(uint64,uint64)void'] | undefined]> + + /** + * Calls the nested_read(uint64,uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + nestedRead(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['nested_read(uint64,uint64,uint64)uint64'] | undefined]> + + /** + * Calls the create_bools()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + createBools(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['create_bools()void'] | undefined]> + + /** + * Calls the set_bool(uint64,bool)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setBool(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['set_bool(uint64,bool)void'] | undefined]> + + /** + * Calls the sum_bools(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + sumBools(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['sum_bools(uint64)uint64'] | undefined]> + + /** + * Calls the box_map_test()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + boxMapTest(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_test()void'] | undefined]> + + /** + * Calls the box_map_set(uint64,string)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + boxMapSet(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_set(uint64,string)void'] | undefined]> + + /** + * Calls the box_map_get(uint64)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + boxMapGet(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_get(uint64)string'] | undefined]> + + /** + * Calls the box_map_del(uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + boxMapDel(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_del(uint64)void'] | undefined]> + + /** + * Calls the box_map_exists(uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + boxMapExists(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_exists(uint64)bool'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the BoxContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): BoxContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): BoxContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type BoxContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/Contract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/Contract.ts new file mode 100644 index 0000000..aa62d61 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/Contract.ts @@ -0,0 +1,621 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"Contract","structs":{},"methods":[{"name":"test_falcon_verify","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reject_version","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[138,226],"errorMessage":"application exists"},{"pc":[140],"errorMessage":"should be version 0"},{"pc":[229],"errorMessage":"should be version 1"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYgMAogICAgYnl0ZWNibG9jayBiYXNlNjQoRElFQlF3PT0pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQ29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMik6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhiZTU2NDk5YyAweGFjOGFhYjQyIC8vIG1ldGhvZCAidGVzdF9mYWxjb25fdmVyaWZ5KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X3JlamVjdF92ZXJzaW9uKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF9mYWxjb25fdmVyaWZ5IHRlc3RfcmVqZWN0X3ZlcnNpb24KICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQVZNMTIuY29udHJhY3QuQ29udHJhY3QudGVzdF9mYWxjb25fdmVyaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9mYWxjb25fdmVyaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjcKICAgIC8vIGFzc2VydCBub3Qgb3AuZmFsY29uX3ZlcmlmeShiIiIsIGIiIiwgb3AuYnplcm8oMTc5MykpCiAgICBwdXNoaW50IDE3OTMKICAgIGJ6ZXJvCiAgICBwdXNoYnl0ZXMgMHgKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBmYWxjb25fdmVyaWZ5CiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQVZNMTIuY29udHJhY3QuQ29udHJhY3QudGVzdF9yZWplY3RfdmVyc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfcmVqZWN0X3ZlcnNpb246CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTEKICAgIC8vIGFwcF92MF90eG4gPSBhcmM0LmFyYzRfY3JlYXRlKENvbnRyYWN0VjApCiAgICBpdHhuX2JlZ2luCiAgICBieXRlY18wIC8vIGJhc2U2NChESUVCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgcHVzaGJ5dGVzIGJhc2U2NChEREViUVFBYWdBU2c2Qmh5TmhvQWpnRUFBUUF4R1lFRUVqRVlFRVJDQUFneEdSUXhHQlFRUXpGRWdRRVNSSUVCUXc9PSkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTMKICAgIC8vIGFzc2VydCBhcHAudmVyc2lvbiA9PSAwLCAic2hvdWxkIGJlIHZlcnNpb24gMCIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwVmVyc2lvbgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIHNob3VsZCBiZSB2ZXJzaW9uIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToxNS0xNwogICAgLy8gYXJjNC5hcmM0X3VwZGF0ZSgKICAgIC8vICAgICBDb250cmFjdFYwLnVwZGF0ZSwgYXBwX2lkPWFwcCwgcmVqZWN0X3ZlcnNpb249MSwgY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdChDb250cmFjdFYxKQogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBDb250cmFjdFYwLnVwZGF0ZSwgYXBwX2lkPWFwcCwgcmVqZWN0X3ZlcnNpb249MSwgY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdChDb250cmFjdFYxKQogICAgYnl0ZWNfMCAvLyBiYXNlNjQoRElFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIHB1c2hieXRlcyBiYXNlNjQoRERFYlFRQWFnQVFrTjQwOE5ob0FqZ0VBQVFBeEdZRUZFakVZRUVSQ0FBZ3hHUlF4R0JRUVF6RkVnUUlTUklFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTUtMTcKICAgIC8vIGFyYzQuYXJjNF91cGRhdGUoCiAgICAvLyAgICAgQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIC8vICkKICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToxNgogICAgLy8gQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIGludGNfMCAvLyAxCiAgICBpdHhuX2ZpZWxkIFJlamVjdFZlcnNpb24KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTUtMTcKICAgIC8vIGFyYzQuYXJjNF91cGRhdGUoCiAgICAvLyAgICAgQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweGEwZTgxODcyIC8vIG1ldGhvZCAidXBkYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTgKICAgIC8vIGFzc2VydCBhcHAudmVyc2lvbiA9PSAxLCAic2hvdWxkIGJlIHZlcnNpb24gMSIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwVmVyc2lvbgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gc2hvdWxkIGJlIHZlcnNpb24gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjIwLTI5CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oCiAgICAvLyAgICAgICAgIGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgICAgICAgICBDb250cmFjdFYxLmRlbGV0ZSwKICAgIC8vICAgICAgICAgKSwKICAgIC8vICAgICApLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gICAgIHJlamVjdF92ZXJzaW9uPTIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjgKICAgIC8vIHJlamVjdF92ZXJzaW9uPTIsCiAgICBwdXNoaW50IDIKICAgIGl0eG5fZmllbGQgUmVqZWN0VmVyc2lvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjYKICAgIC8vIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToyMi0yNAogICAgLy8gYXJjNC5hcmM0X3NpZ25hdHVyZSgKICAgIC8vICAgICBDb250cmFjdFYxLmRlbGV0ZSwKICAgIC8vICksCiAgICBwdXNoYnl0ZXMgMHgyNDM3OGQzYyAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMiAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjIwLTI5CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oCiAgICAvLyAgICAgICAgIGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgICAgICAgICBDb250cmFjdFYxLmRlbGV0ZSwKICAgIC8vICAgICAgICAgKSwKICAgIC8vICAgICApLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gICAgIHJlamVjdF92ZXJzaW9uPTIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"DCADAQYAJgEEDIEBQzEbQQAdMRkURDEYRIICBL5WSZwErIqrQjYaAI4CAAkAFwAxGRQxGBQQQ4GBDq+AAElPAoUURCJDsSiyQoAxDDEbQQAagASg6BhyNhoAjgEAAQAxGYEEEjEYEERCAAgxGRQxGBQQQzFEgQESRIEBQ7JAI7IQJLIBs7Q9SXIJRBREsSiyQoAxDDEbQQAagAQkN408NhoAjgEAAQAxGYEFEjEYEERCAAgxGRQxGBQQQzFEgQISRIEBQ7JAgQSyGSKyREmyGIAEoOgYcrIaI7IQJLIBs0lyCUQiEkSxgQKyRLIYgQWyGYAEJDeNPLIaI7IQJLIBsyJD","clear":"DIEBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the Contract contract + */ +export type ContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'test_falcon_verify()void': Record + 'test_reject_version()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'test_falcon_verify()void': [] + 'test_reject_version()void': [] + } +} + +/** + * The return type for each method + */ +export type ContractReturns = { + 'test_falcon_verify()void': void + 'test_reject_version()void': void +} + +/** + * Defines the types of available calls and state of the Contract smart contract. + */ +export type ContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'test_falcon_verify()void' | 'test_falcon_verify', { + argsObj: ContractArgs['obj']['test_falcon_verify()void'] + argsTuple: ContractArgs['tuple']['test_falcon_verify()void'] + returns: ContractReturns['test_falcon_verify()void'] + }> + & Record<'test_reject_version()void' | 'test_reject_version', { + argsObj: ContractArgs['obj']['test_reject_version()void'] + argsTuple: ContractArgs['tuple']['test_reject_version()void'] + returns: ContractReturns['test_reject_version()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type ContractSignatures = keyof ContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the Contract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = ContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the Contract smart contract to the method's return type + */ +export type MethodReturn = ContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type ContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type ContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: ContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the Contract smart contract + */ +export abstract class ContractParamsFactory { + /** + * Constructs a no op call for the test_falcon_verify()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testFalconVerify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_falcon_verify()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_reject_version()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testRejectVersion(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_reject_version()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the Contract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class ContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `ContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new ContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new ContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the Contract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: ContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new ContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Contract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Contract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Contract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new ContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the Contract smart contract + */ +export class ContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `ContractClient` + * + * @param appClient An `AppClient` instance which has been created with the Contract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `ContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `ContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new ContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `ContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new ContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the Contract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the Contract smart contract using the `test_falcon_verify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testFalconVerify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ContractParamsFactory.testFalconVerify(params)) + }, + + /** + * Makes a call to the Contract smart contract using the `test_reject_version()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testRejectVersion: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ContractParamsFactory.testRejectVersion(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the Contract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the Contract smart contract using the `test_falcon_verify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testFalconVerify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ContractParamsFactory.testFalconVerify(params)) + }, + + /** + * Makes a call to the Contract smart contract using the `test_reject_version()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testRejectVersion: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ContractParamsFactory.testRejectVersion(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the Contract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the Contract smart contract using the `test_falcon_verify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testFalconVerify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ContractParamsFactory.testFalconVerify(params)) + return {...result, return: result.return as unknown as (undefined | ContractReturns['test_falcon_verify()void'])} + }, + + /** + * Makes a call to the Contract smart contract using the `test_reject_version()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testRejectVersion: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ContractParamsFactory.testRejectVersion(params)) + return {...result, return: result.return as unknown as (undefined | ContractReturns['test_reject_version()void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new ContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current Contract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): ContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a test_falcon_verify()void method call against the Contract contract + */ + testFalconVerify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testFalconVerify(params))) + return this + }, + /** + * Add a test_reject_version()void method call against the Contract contract + */ + testRejectVersion(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testRejectVersion(params))) + return this + }, + /** + * Add a clear state call to the Contract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as ContractComposer + } +} +export type ContractComposer = { + /** + * Calls the test_falcon_verify()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testFalconVerify(params?: CallParams): ContractComposer<[...TReturns, ContractReturns['test_falcon_verify()void'] | undefined]> + + /** + * Calls the test_reject_version()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testRejectVersion(params?: CallParams): ContractComposer<[...TReturns, ContractReturns['test_reject_version()void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the Contract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): ContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): ContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type ContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ContractV0.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ContractV0.ts new file mode 100644 index 0000000..4c42a4d --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/ContractV0.ts @@ -0,0 +1,621 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"ContractV0","structs":{},"methods":[{"name":"update","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["UpdateApplication"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[45],"errorMessage":"can only update if caller expects this to be currently be v0"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTozMgogICAgLy8gY2xhc3MgQ29udHJhY3RWMChBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTEyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweGEwZTgxODcyIC8vIG1ldGhvZCAidXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl91cGRhdGVfcm91dGVAMwogICAgZXJyCgptYWluX3VwZGF0ZV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz0oIlVwZGF0ZUFwcGxpY2F0aW9uIiwpKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgdXBkYXRlCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BVk0xMi5jb250cmFjdC5Db250cmFjdFYwLnVwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTozNgogICAgLy8gVHhuLnJlamVjdF92ZXJzaW9uID09IDEKICAgIHR4biBSZWplY3RWZXJzaW9uCiAgICBwdXNoaW50IDEKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MzUtMzcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnJlamVjdF92ZXJzaW9uID09IDEKICAgIC8vICksICJjYW4gb25seSB1cGRhdGUgaWYgY2FsbGVyIGV4cGVjdHMgdGhpcyB0byBiZSBjdXJyZW50bHkgYmUgdjAiCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgdXBkYXRlIGlmIGNhbGxlciBleHBlY3RzIHRoaXMgdG8gYmUgY3VycmVudGx5IGJlIHYwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPSgiVXBkYXRlQXBwbGljYXRpb24iLCkpCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"DDEbQQAagASg6BhyNhoAjgEAAQAxGYEEEjEYEERCAAgxGRQxGBQQQzFEgQESRIEBQw==","clear":"DIEBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the ContractV0 contract + */ +export type ContractV0Args = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'update()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'update()void': [] + } +} + +/** + * The return type for each method + */ +export type ContractV0Returns = { + 'update()void': void +} + +/** + * Defines the types of available calls and state of the ContractV0 smart contract. + */ +export type ContractV0Types = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'update()void' | 'update', { + argsObj: ContractV0Args['obj']['update()void'] + argsTuple: ContractV0Args['tuple']['update()void'] + returns: ContractV0Returns['update()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type ContractV0Signatures = keyof ContractV0Types['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the ContractV0 smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = ContractV0Types['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the ContractV0 smart contract to the method's return type + */ +export type MethodReturn = ContractV0Types['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type ContractV0CreateCallParams = + | Expand +/** + * Defines supported update method params for this smart contract + */ +export type ContractV0UpdateCallParams = + | Expand & {method: 'update'}> + | Expand & {method: 'update()void'}> +/** + * Defines arguments required for the deploy method. + */ +export type ContractV0DeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: ContractV0CreateCallParams + /** + * Update transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + updateParams?: ContractV0UpdateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the ContractV0 smart contract + */ +export abstract class ContractV0ParamsFactory { + /** + * Gets available update ABI call param factories + */ + static get update() { + return { + _resolveByMethod(params: TParams) { + switch(params.method) { + case 'update': + case 'update()void': + return ContractV0ParamsFactory.update.update(params) + } + throw new Error(`Unknown ' + verb + ' method`) + }, + + /** + * Constructs update ABI call params for the ContractV0 smart contract using the update()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + update(params: CallParams & AppClientCompilationParams): AppClientMethodCallParams & AppClientCompilationParams { + return { + ...params, + method: 'update()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + +} + +/** + * A factory to create and deploy one or more instance of the ContractV0 smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class ContractV0Factory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `ContractV0Factory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new ContractV0Client(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new ContractV0Client(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the ContractV0 smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: ContractV0DeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + updateParams: params.updateParams?.method ? ContractV0ParamsFactory.update._resolveByMethod(params.updateParams) : params.updateParams ? params.updateParams as (ContractV0UpdateCallParams & { args: Uint8Array[] }) : undefined, + }) + return { result: result.result, appClient: new ContractV0Client(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ContractV0 smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + /** + * Gets available deployUpdate methods + */ + deployUpdate: { + /** + * Updates an existing instance of the ContractV0 smart contract using the update()void ABI method. + * + * @param params The params for the smart contract call + * @returns The deployUpdate params + */ + update: (params: CallParams & AppClientCompilationParams = {args: []}) => { + return this.appFactory.params.deployUpdate(ContractV0ParamsFactory.update.update(params)) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ContractV0 smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ContractV0 smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new ContractV0Client(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the ContractV0 smart contract + */ +export class ContractV0Client { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `ContractV0Client` + * + * @param appClient An `AppClient` instance which has been created with the ContractV0 app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `ContractV0Client` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `ContractV0Client` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new ContractV0Client(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `ContractV0Client` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new ContractV0Client(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available update methods + */ + update: { + /** + * Updates an existing instance of the ContractV0 smart contract using the `update()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The update params + */ + update: (params: CallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.UpdateApplication } = {args: []}) => { + return this.appClient.params.update(ContractV0ParamsFactory.update.update(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the ContractV0 smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available update methods + */ + update: { + /** + * Updates an existing instance of the ContractV0 smart contract using the `update()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The update transaction + */ + update: (params: CallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.UpdateApplication } = {args: []}) => { + return this.appClient.createTransaction.update(ContractV0ParamsFactory.update.update(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the ContractV0 smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available update methods + */ + update: { + /** + * Updates an existing instance of the ContractV0 smart contract using the `update()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The update result + */ + update: async (params: CallParams & AppClientCompilationParams & SendParams & { onComplete?: OnApplicationComplete.UpdateApplication } = {args: []}) => { + const result = await this.appClient.send.update(ContractV0ParamsFactory.update.update(params)) + return {...result, return: result.return as unknown as (undefined | ContractV0Returns['update()void'])} + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the ContractV0 smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new ContractV0Client(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current ContractV0 app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): ContractV0Composer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + get update() { + return { + update: (params: CallParams & AppClientCompilationParams) => { + promiseChain = promiseChain.then(async () => composer.addAppUpdateMethodCall(await client.params.update.update(params))) + return this + }, + } + }, + /** + * Add a clear state call to the ContractV0 contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as ContractV0Composer + } +} +export type ContractV0Composer = { + /** + * Gets available update methods + */ + readonly update: { + /** + * Updates an existing instance of the ContractV0 smart contract using the update()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + update(params?: CallParams): ContractV0Composer<[...TReturns, ContractV0Returns['update()void'] | undefined]> + } + + /** + * Makes a clear_state call to an existing instance of the ContractV0 smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): ContractV0Composer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): ContractV0Composer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type ContractV0ComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ContractV1.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ContractV1.ts new file mode 100644 index 0000000..7f5e963 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/ContractV1.ts @@ -0,0 +1,621 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"ContractV1","structs":{},"methods":[{"name":"delete","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["DeleteApplication"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[45],"errorMessage":"can only update if caller expects this to be currently be v1"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo0MAogICAgLy8gY2xhc3MgQ29udHJhY3RWMShBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTEyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweDI0Mzc4ZDNjIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9kZWxldGVfcm91dGVAMwogICAgZXJyCgptYWluX2RlbGV0ZV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz0oIkRlbGV0ZUFwcGxpY2F0aW9uIiwpKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgZGVsZXRlCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BVk0xMi5jb250cmFjdC5Db250cmFjdFYxLmRlbGV0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlbGV0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo0NAogICAgLy8gVHhuLnJlamVjdF92ZXJzaW9uID09IDIKICAgIHR4biBSZWplY3RWZXJzaW9uCiAgICBwdXNoaW50IDIKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NDMtNDUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnJlamVjdF92ZXJzaW9uID09IDIKICAgIC8vICksICJjYW4gb25seSB1cGRhdGUgaWYgY2FsbGVyIGV4cGVjdHMgdGhpcyB0byBiZSBjdXJyZW50bHkgYmUgdjEiCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgdXBkYXRlIGlmIGNhbGxlciBleHBlY3RzIHRoaXMgdG8gYmUgY3VycmVudGx5IGJlIHYxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPSgiRGVsZXRlQXBwbGljYXRpb24iLCkpCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"DDEbQQAagAQkN408NhoAjgEAAQAxGYEFEjEYEERCAAgxGRQxGBQQQzFEgQISRIEBQw==","clear":"DIEBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the ContractV1 contract + */ +export type ContractV1Args = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'delete()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'delete()void': [] + } +} + +/** + * The return type for each method + */ +export type ContractV1Returns = { + 'delete()void': void +} + +/** + * Defines the types of available calls and state of the ContractV1 smart contract. + */ +export type ContractV1Types = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'delete()void' | 'delete', { + argsObj: ContractV1Args['obj']['delete()void'] + argsTuple: ContractV1Args['tuple']['delete()void'] + returns: ContractV1Returns['delete()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type ContractV1Signatures = keyof ContractV1Types['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the ContractV1 smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = ContractV1Types['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the ContractV1 smart contract to the method's return type + */ +export type MethodReturn = ContractV1Types['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type ContractV1CreateCallParams = + | Expand +/** + * Defines supported delete method params for this smart contract + */ +export type ContractV1DeleteCallParams = + | Expand & {method: 'delete'}> + | Expand & {method: 'delete()void'}> +/** + * Defines arguments required for the deploy method. + */ +export type ContractV1DeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: ContractV1CreateCallParams + /** + * Delete transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + deleteParams?: ContractV1DeleteCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the ContractV1 smart contract + */ +export abstract class ContractV1ParamsFactory { + /** + * Gets available delete ABI call param factories + */ + static get delete() { + return { + _resolveByMethod(params: TParams) { + switch(params.method) { + case 'delete': + case 'delete()void': + return ContractV1ParamsFactory.delete.delete(params) + } + throw new Error(`Unknown ' + verb + ' method`) + }, + + /** + * Constructs delete ABI call params for the ContractV1 smart contract using the delete()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + delete(params: CallParams): AppClientMethodCallParams { + return { + ...params, + method: 'delete()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + +} + +/** + * A factory to create and deploy one or more instance of the ContractV1 smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class ContractV1Factory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `ContractV1Factory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new ContractV1Client(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new ContractV1Client(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the ContractV1 smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: ContractV1DeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + deleteParams: params.deleteParams?.method ? ContractV1ParamsFactory.delete._resolveByMethod(params.deleteParams) : params.deleteParams ? params.deleteParams as (ContractV1DeleteCallParams & { args: Uint8Array[] }) : undefined, + }) + return { result: result.result, appClient: new ContractV1Client(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ContractV1 smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + /** + * Gets available deployDelete methods + */ + deployDelete: { + /** + * Deletes an existing instance of the ContractV1 smart contract using the delete()void ABI method. + * + * @param params The params for the smart contract call + * @returns The deployDelete params + */ + delete: (params: CallParams = {args: []}) => { + return this.appFactory.params.deployDelete(ContractV1ParamsFactory.delete.delete(params)) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ContractV1 smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ContractV1 smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new ContractV1Client(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the ContractV1 smart contract + */ +export class ContractV1Client { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `ContractV1Client` + * + * @param appClient An `AppClient` instance which has been created with the ContractV1 app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `ContractV1Client` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `ContractV1Client` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new ContractV1Client(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `ContractV1Client` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new ContractV1Client(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available delete methods + */ + delete: { + /** + * Deletes an existing instance of the ContractV1 smart contract using the `delete()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The delete params + */ + delete: (params: CallParams & { onComplete?: OnApplicationComplete.DeleteApplication } = {args: []}) => { + return this.appClient.params.delete(ContractV1ParamsFactory.delete.delete(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the ContractV1 smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available delete methods + */ + delete: { + /** + * Deletes an existing instance of the ContractV1 smart contract using the `delete()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The delete transaction + */ + delete: (params: CallParams & { onComplete?: OnApplicationComplete.DeleteApplication } = {args: []}) => { + return this.appClient.createTransaction.delete(ContractV1ParamsFactory.delete.delete(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the ContractV1 smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available delete methods + */ + delete: { + /** + * Deletes an existing instance of the ContractV1 smart contract using the `delete()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The delete result + */ + delete: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.DeleteApplication } = {args: []}) => { + const result = await this.appClient.send.delete(ContractV1ParamsFactory.delete.delete(params)) + return {...result, return: result.return as unknown as (undefined | ContractV1Returns['delete()void'])} + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the ContractV1 smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new ContractV1Client(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current ContractV1 app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): ContractV1Composer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + get delete() { + return { + delete: (params: CallParams) => { + promiseChain = promiseChain.then(async () => composer.addAppDeleteMethodCall(await client.params.delete.delete(params))) + return this + }, + } + }, + /** + * Add a clear state call to the ContractV1 contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as ContractV1Composer + } +} +export type ContractV1Composer = { + /** + * Gets available delete methods + */ + readonly delete: { + /** + * Deletes an existing instance of the ContractV1 smart contract using the delete()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + delete(params?: CallParams): ContractV1Composer<[...TReturns, ContractV1Returns['delete()void'] | undefined]> + } + + /** + * Makes a clear_state call to an existing instance of the ContractV1 smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): ContractV1Composer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): ContractV1Composer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type ContractV1ComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/CryptoOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/CryptoOpsContract.ts new file mode 100644 index 0000000..d63f44a --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/CryptoOpsContract.ts @@ -0,0 +1,1422 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"CryptoOpsContract","structs":{},"methods":[{"name":"verify_sha256","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_sha3_256","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_keccak_256","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_sha512_256","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ed25519verify","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ed25519verify_bare","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_verify_k1","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"},{"type":"byte[]","name":"e"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_verify_r1","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"},{"type":"byte[]","name":"e"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_recover_k1","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"}],"returns":{"type":"(byte[],byte[])"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_recover_r1","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"}],"returns":{"type":"(byte[],byte[])"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"desc":"Must fail, AVM does not support Secp256r1 for recover","events":[],"recommendations":{}},{"name":"verify_ecdsa_decompress_k1","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"(byte[],byte[])"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_decompress_r1","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"(byte[],byte[])"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_vrf_verify","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"(byte[],bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMzAwMCA0CiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHgwMCAweDE1MWY3Yzc1MDAyMCAweDAwMDQgMHgwNjgxMDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQ3J5cHRvT3BzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDIwCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHgzNDU2YzRjMyAweGU4NDQyYjg0IDB4NjVmNTY3YWEgMHgyNTg0NTViMSAweDM1YWYwZjM4IDB4NjU4MmM5OTcgMHg2Mjk4ZmZiYiAweDM4ODViNTRmIDB4MjE2NGUwYmYgMHg3NTViNzlhNSAweGYwNmJiMDc3IDB4MTMzZjhjY2MgMHgyZjdjNjhhOSAvLyBtZXRob2QgInZlcmlmeV9zaGEyNTYoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9zaGEzXzI1NihieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2tlY2Nha18yNTYoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9zaGE1MTJfMjU2KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZWQyNTUxOXZlcmlmeShieXRlW10sYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfZWQyNTUxOXZlcmlmeV9iYXJlKGJ5dGVbXSxieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9lY2RzYV92ZXJpZnlfazEoYnl0ZVtdLGJ5dGVbXSxieXRlW10sYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfZWNkc2FfdmVyaWZ5X3IxKGJ5dGVbXSxieXRlW10sYnl0ZVtdLGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX3JlY292ZXJfazEoYnl0ZVtdLHVpbnQ2NCxieXRlW10sYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX3JlY292ZXJfcjEoYnl0ZVtdLHVpbnQ2NCxieXRlW10sYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX2RlY29tcHJlc3NfazEoYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX2RlY29tcHJlc3NfcjEoYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X3ZyZl92ZXJpZnkoYnl0ZVtdLGJ5dGVbXSxieXRlW10pKGJ5dGVbXSxib29sKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9zaGEyNTYgdmVyaWZ5X3NoYTNfMjU2IHZlcmlmeV9rZWNjYWtfMjU2IHZlcmlmeV9zaGE1MTJfMjU2IHZlcmlmeV9lZDI1NTE5dmVyaWZ5IHZlcmlmeV9lZDI1NTE5dmVyaWZ5X2JhcmUgdmVyaWZ5X2VjZHNhX3ZlcmlmeV9rMSB2ZXJpZnlfZWNkc2FfdmVyaWZ5X3IxIHZlcmlmeV9lY2RzYV9yZWNvdmVyX2sxIHZlcmlmeV9lY2RzYV9yZWNvdmVyX3IxIHZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX2sxIHZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX3IxIHZlcmlmeV92cmZfdmVyaWZ5CiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMjA6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyA0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3aXRjaCBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMyBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANAoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICBpdHhuX3N1Ym1pdAogICAgYiBlbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxCgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANDoKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMzoKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2OgogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfc2hhMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NoYTI1NjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjcKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjgKICAgIC8vIHJlc3VsdCA9IG9wLnNoYTI1NihhKQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUwMDIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcnlwdG9PcHMuY29udHJhY3QuQ3J5cHRvT3BzQ29udHJhY3QudmVyaWZ5X3NoYTNfMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NoYTNfMjU2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBhID0gb3AuYnplcm8ocGFkX3NpemUpICsgYQogICAgYnplcm8KICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxNAogICAgLy8gcmVzdWx0ID0gb3Auc2hhM18yNTYoYSkKICAgIHNoYTNfMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3J5cHRvT3BzLmNvbnRyYWN0LkNyeXB0b09wc0NvbnRyYWN0LnZlcmlmeV9rZWNjYWtfMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2tlY2Nha18yNTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MTkKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyByZXN1bHQgPSBvcC5rZWNjYWsyNTYoYSkKICAgIGtlY2NhazI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfc2hhNTEyXzI1Nltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zaGE1MTJfMjU2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhID0gb3AuYnplcm8ocGFkX3NpemUpICsgYQogICAgYnplcm8KICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyNgogICAgLy8gcmVzdWx0ID0gb3Auc2hhNTEyXzI1NihhKQogICAgc2hhNTEyXzI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWQyNTUxOXZlcmlmeVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lZDI1NTE5dmVyaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzEKICAgIC8vIGVuc3VyZV9idWRnZXQoMTkwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgMTkwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozMgogICAgLy8gcmVzdWx0ID0gb3AuZWQyNTUxOXZlcmlmeShhLCBiLCBjKQogICAgZWQyNTUxOXZlcmlmeQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozMwogICAgLy8gcmV0dXJuIGFyYzQuQm9vbChyZXN1bHQpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3J5cHRvT3BzLmNvbnRyYWN0LkNyeXB0b09wc0NvbnRyYWN0LnZlcmlmeV9lZDI1NTE5dmVyaWZ5X2JhcmVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZWQyNTUxOXZlcmlmeV9iYXJlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzcKICAgIC8vIGVuc3VyZV9idWRnZXQoMTkwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgMTkwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozOAogICAgLy8gcmVzdWx0ID0gb3AuZWQyNTUxOXZlcmlmeV9iYXJlKGEsIGIsIGMpCiAgICBlZDI1NTE5dmVyaWZ5X2JhcmUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzkKICAgIC8vIHJldHVybiBhcmM0LkJvb2wocmVzdWx0KQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfdmVyaWZ5X2sxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2VjZHNhX3ZlcmlmeV9rMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDMKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyByZXN1bHRfazEgPSBvcC5lY2RzYV92ZXJpZnkob3AuRUNEU0EuU2VjcDI1NmsxLCBhLCBiLCBjLCBkLCBlKQogICAgZWNkc2FfdmVyaWZ5IFNlY3AyNTZrMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfdmVyaWZ5X3IxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2VjZHNhX3ZlcmlmeV9yMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDkKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjUwCiAgICAvLyByZXN1bHRfcjEgPSBvcC5lY2RzYV92ZXJpZnkob3AuRUNEU0EuU2VjcDI1NnIxLCBhLCBiLCBjLCBkLCBlKQogICAgZWNkc2FfdmVyaWZ5IFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfcmVjb3Zlcl9rMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9yZWNvdmVyX2sxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NTcKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjU4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfcmVjb3ZlcihvcC5FQ0RTQS5TZWNwMjU2azEsIGEsIGIsIGMsIGQpCiAgICBlY2RzYV9wa19yZWNvdmVyIFNlY3AyNTZrMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfcmVjb3Zlcl9yMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9yZWNvdmVyX3IxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NjcKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjY4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfcmVjb3ZlcihvcC5FQ0RTQS5TZWNwMjU2cjEsIGEsIGIsIGMsIGQpCiAgICBlY2RzYV9wa19yZWNvdmVyIFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19rMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX2sxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmVfYnVkZ2V0KDcwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNzAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjczCiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfZGVjb21wcmVzcyhvcC5FQ0RTQS5TZWNwMjU2azEsIGEpCiAgICBlY2RzYV9wa19kZWNvbXByZXNzIFNlY3AyNTZrMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19yMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX3IxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBlbnN1cmVfYnVkZ2V0KDcwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNzAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfZGVjb21wcmVzcyhvcC5FQ0RTQS5TZWNwMjU2cjEsIGEpCiAgICBlY2RzYV9wa19kZWNvbXByZXNzIFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfdnJmX3ZlcmlmeVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV92cmZfdmVyaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6ODIKICAgIC8vIGVuc3VyZV9idWRnZXQoNTcwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNTcwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo4MwogICAgLy8gcmVzdWx0ID0gb3AudnJmX3ZlcmlmeShvcC5WcmZWZXJpZnkuVnJmQWxnb3JhbmQsIGEsIGIsIGMpCiAgICB2cmZfdmVyaWZ5IFZyZkFsZ29yYW5kCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAAG4FwQmBQQVH3x1AQAGFR98dQAgAgAEAwaBATEbQQBqMRkURDEYRIINBDRWxMME6EQrhARl9WeqBCWEVbEENa8POARlgsmXBGKY/7sEOIW1TwQhZOC/BHVbeaUE8GuwdwQTP4zMBC98aKk2GgCODQBEAFgAbACAAJQAuQDeAQ4BPgGGAc4CCAJCADEZFDEYFBBDigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScEsh4nBLIfi/+NAgALAASzQv/bMgCyAUL/9SKyAUL/74k2GgFXAgA2GgIXr0xQASpMULAjQzYaAVcCADYaAhevTFCYKkxQsCNDNhoBVwIANhoCF69MUAIqTFCwI0M2GgFXAgA2GgIXr0xQAypMULAjQzYaAVcCADYaAlcCADYaA1cCAIHsDiKI/1wEKSJPAlQoTFCwI0M2GgFXAgA2GgJXAgA2GgNXAgCB7A4iiP83hCkiTwJUKExQsCNDNhoBVwIANhoCVwIANhoDVwIANhoEVwIANhoFVwIAJCKI/wgFACkiTwJUKExQsCNDNhoBVwIANhoCVwIANhoDVwIANhoEVwIANhoFVwIAJCKI/tgFASkiTwJUKExQsCNDNhoBVwIANhoCFzYaA1cCADYaBFcCACQiiP6wBwBLARUWVwYCTwJQSRUlCEsCFRZXBgJPA1BMFlcGAitMUE8CUExQKExQsCNDNhoBVwIANhoCFzYaA1cCADYaBFcCACQiiP5oBwFLARUWVwYCTwJQSRUlCEsCFRZXBgJPA1BMFlcGAitMUE8CUExQKExQsCNDNhoBVwIAgbwFIoj+LgYASwEVFlcGAk8CUEkVJQhLAhUWVwYCTwNQTBZXBgIrTFBPAlBMUChMULAjQzYaAVcCAIG8BSKI/fQGAUsBFRZXBgJPAlBJFSUISwIVFlcGAk8DUEwWVwYCK0xQTwJQTFAoTFCwI0M2GgFXAgA2GgJXAgA2GgNXAgCBxCwiiP2u0ABLARUWVwYCTwJQKSJPA1SAAgADTFBMUChMULAjQw==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the CryptoOpsContract contract + */ +export type CryptoOpsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_sha256(byte[],uint64)byte[]': { + a: Uint8Array + padSize: bigint | number + } + 'verify_sha3_256(byte[],uint64)byte[]': { + a: Uint8Array + padSize: bigint | number + } + 'verify_keccak_256(byte[],uint64)byte[]': { + a: Uint8Array + padSize: bigint | number + } + 'verify_sha512_256(byte[],uint64)byte[]': { + a: Uint8Array + padSize: bigint | number + } + 'verify_ed25519verify(byte[],byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + c: Uint8Array + } + 'verify_ed25519verify_bare(byte[],byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + c: Uint8Array + } + 'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + c: Uint8Array + d: Uint8Array + e: Uint8Array + } + 'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + c: Uint8Array + d: Uint8Array + e: Uint8Array + } + 'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])': { + a: Uint8Array + b: bigint | number + c: Uint8Array + d: Uint8Array + } + 'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])': { + a: Uint8Array + b: bigint | number + c: Uint8Array + d: Uint8Array + } + 'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])': { + a: Uint8Array + } + 'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])': { + a: Uint8Array + } + 'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)': { + a: Uint8Array + b: Uint8Array + c: Uint8Array + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_sha256(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] + 'verify_sha3_256(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] + 'verify_keccak_256(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] + 'verify_sha512_256(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] + 'verify_ed25519verify(byte[],byte[],byte[])bool': [a: Uint8Array, b: Uint8Array, c: Uint8Array] + 'verify_ed25519verify_bare(byte[],byte[],byte[])bool': [a: Uint8Array, b: Uint8Array, c: Uint8Array] + 'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool': [a: Uint8Array, b: Uint8Array, c: Uint8Array, d: Uint8Array, e: Uint8Array] + 'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool': [a: Uint8Array, b: Uint8Array, c: Uint8Array, d: Uint8Array, e: Uint8Array] + 'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])': [a: Uint8Array, b: bigint | number, c: Uint8Array, d: Uint8Array] + 'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])': [a: Uint8Array, b: bigint | number, c: Uint8Array, d: Uint8Array] + 'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])': [a: Uint8Array] + 'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])': [a: Uint8Array] + 'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)': [a: Uint8Array, b: Uint8Array, c: Uint8Array] + } +} + +/** + * The return type for each method + */ +export type CryptoOpsContractReturns = { + 'verify_sha256(byte[],uint64)byte[]': Uint8Array + 'verify_sha3_256(byte[],uint64)byte[]': Uint8Array + 'verify_keccak_256(byte[],uint64)byte[]': Uint8Array + 'verify_sha512_256(byte[],uint64)byte[]': Uint8Array + 'verify_ed25519verify(byte[],byte[],byte[])bool': boolean + 'verify_ed25519verify_bare(byte[],byte[],byte[])bool': boolean + 'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool': boolean + 'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool': boolean + 'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])': [Uint8Array, Uint8Array] + 'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])': [Uint8Array, Uint8Array] + 'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])': [Uint8Array, Uint8Array] + 'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])': [Uint8Array, Uint8Array] + 'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)': [Uint8Array, boolean] +} + +/** + * Defines the types of available calls and state of the CryptoOpsContract smart contract. + */ +export type CryptoOpsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_sha256(byte[],uint64)byte[]' | 'verify_sha256', { + argsObj: CryptoOpsContractArgs['obj']['verify_sha256(byte[],uint64)byte[]'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_sha256(byte[],uint64)byte[]'] + returns: CryptoOpsContractReturns['verify_sha256(byte[],uint64)byte[]'] + }> + & Record<'verify_sha3_256(byte[],uint64)byte[]' | 'verify_sha3_256', { + argsObj: CryptoOpsContractArgs['obj']['verify_sha3_256(byte[],uint64)byte[]'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_sha3_256(byte[],uint64)byte[]'] + returns: CryptoOpsContractReturns['verify_sha3_256(byte[],uint64)byte[]'] + }> + & Record<'verify_keccak_256(byte[],uint64)byte[]' | 'verify_keccak_256', { + argsObj: CryptoOpsContractArgs['obj']['verify_keccak_256(byte[],uint64)byte[]'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_keccak_256(byte[],uint64)byte[]'] + returns: CryptoOpsContractReturns['verify_keccak_256(byte[],uint64)byte[]'] + }> + & Record<'verify_sha512_256(byte[],uint64)byte[]' | 'verify_sha512_256', { + argsObj: CryptoOpsContractArgs['obj']['verify_sha512_256(byte[],uint64)byte[]'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_sha512_256(byte[],uint64)byte[]'] + returns: CryptoOpsContractReturns['verify_sha512_256(byte[],uint64)byte[]'] + }> + & Record<'verify_ed25519verify(byte[],byte[],byte[])bool' | 'verify_ed25519verify', { + argsObj: CryptoOpsContractArgs['obj']['verify_ed25519verify(byte[],byte[],byte[])bool'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ed25519verify(byte[],byte[],byte[])bool'] + returns: CryptoOpsContractReturns['verify_ed25519verify(byte[],byte[],byte[])bool'] + }> + & Record<'verify_ed25519verify_bare(byte[],byte[],byte[])bool' | 'verify_ed25519verify_bare', { + argsObj: CryptoOpsContractArgs['obj']['verify_ed25519verify_bare(byte[],byte[],byte[])bool'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ed25519verify_bare(byte[],byte[],byte[])bool'] + returns: CryptoOpsContractReturns['verify_ed25519verify_bare(byte[],byte[],byte[])bool'] + }> + & Record<'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool' | 'verify_ecdsa_verify_k1', { + argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'] + returns: CryptoOpsContractReturns['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'] + }> + & Record<'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool' | 'verify_ecdsa_verify_r1', { + argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'] + returns: CryptoOpsContractReturns['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'] + }> + & Record<'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])' | 'verify_ecdsa_recover_k1', { + argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'] + returns: CryptoOpsContractReturns['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'] + }> + & Record<'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])' | 'verify_ecdsa_recover_r1', { + argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'] + returns: CryptoOpsContractReturns['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'] + }> + & Record<'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])' | 'verify_ecdsa_decompress_k1', { + argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'] + returns: CryptoOpsContractReturns['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'] + }> + & Record<'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])' | 'verify_ecdsa_decompress_r1', { + argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'] + returns: CryptoOpsContractReturns['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'] + }> + & Record<'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)' | 'verify_vrf_verify', { + argsObj: CryptoOpsContractArgs['obj']['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'] + returns: CryptoOpsContractReturns['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type CryptoOpsContractSignatures = keyof CryptoOpsContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type CryptoOpsContractNonVoidMethodSignatures = keyof CryptoOpsContractTypes['methods'] extends infer T ? T extends keyof CryptoOpsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the CryptoOpsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = CryptoOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the CryptoOpsContract smart contract to the method's return type + */ +export type MethodReturn = CryptoOpsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type CryptoOpsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type CryptoOpsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: CryptoOpsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the CryptoOpsContract smart contract + */ +export abstract class CryptoOpsContractParamsFactory { + /** + * Constructs a no op call for the verify_sha256(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySha256(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_sha256(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], + } + } + /** + * Constructs a no op call for the verify_sha3_256(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySha3_256(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_sha3_256(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], + } + } + /** + * Constructs a no op call for the verify_keccak_256(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyKeccak_256(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_keccak_256(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], + } + } + /** + * Constructs a no op call for the verify_sha512_256(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySha512_256(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_sha512_256(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], + } + } + /** + * Constructs a no op call for the verify_ed25519verify(byte[],byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEd25519verify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ed25519verify(byte[],byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_ed25519verify_bare(byte[],byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEd25519verifyBare(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ed25519verify_bare(byte[],byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEcdsaVerifyK1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d, params.args.e], + } + } + /** + * Constructs a no op call for the verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEcdsaVerifyR1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d, params.args.e], + } + } + /** + * Constructs a no op call for the verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[]) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEcdsaRecoverK1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d], + } + } + /** + * Constructs a no op call for the verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[]) ABI method + * + * Must fail, AVM does not support Secp256r1 for recover + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEcdsaRecoverR1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d], + } + } + /** + * Constructs a no op call for the verify_ecdsa_decompress_k1(byte[])(byte[],byte[]) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEcdsaDecompressK1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_ecdsa_decompress_r1(byte[])(byte[],byte[]) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEcdsaDecompressR1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_vrf_verify(byte[],byte[],byte[])(byte[],bool) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyVrfVerify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } +} + +/** + * A factory to create and deploy one or more instance of the CryptoOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class CryptoOpsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `CryptoOpsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new CryptoOpsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new CryptoOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the CryptoOpsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: CryptoOpsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new CryptoOpsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the CryptoOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the CryptoOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the CryptoOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new CryptoOpsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the CryptoOpsContract smart contract + */ +export class CryptoOpsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `CryptoOpsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the CryptoOpsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `CryptoOpsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `CryptoOpsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new CryptoOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `CryptoOpsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new CryptoOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the CryptoOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySha256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifySha256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha3_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySha3_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifySha3_256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_keccak_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyKeccak_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyKeccak_256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha512_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySha512_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifySha512_256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify(byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEd25519verify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEd25519verify(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify_bare(byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEd25519verifyBare: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEd25519verifyBare(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEcdsaVerifyK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyK1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEcdsaVerifyR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyR1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEcdsaRecoverK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverK1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. + * + * Must fail, AVM does not support Secp256r1 for recover + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEcdsaRecoverR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverR1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_k1(byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEcdsaDecompressK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressK1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_r1(byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEcdsaDecompressR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressR1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyVrfVerify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyVrfVerify(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the CryptoOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySha256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifySha256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha3_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySha3_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifySha3_256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_keccak_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyKeccak_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyKeccak_256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha512_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySha512_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifySha512_256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify(byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEd25519verify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEd25519verify(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify_bare(byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEd25519verifyBare: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEd25519verifyBare(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEcdsaVerifyK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyK1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEcdsaVerifyR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyR1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEcdsaRecoverK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverK1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. + * + * Must fail, AVM does not support Secp256r1 for recover + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEcdsaRecoverR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverR1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_k1(byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEcdsaDecompressK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressK1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_r1(byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEcdsaDecompressR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressR1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyVrfVerify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyVrfVerify(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the CryptoOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySha256: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifySha256(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_sha256(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha3_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySha3_256: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifySha3_256(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_sha3_256(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_keccak_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyKeccak_256: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyKeccak_256(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_keccak_256(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha512_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySha512_256: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifySha512_256(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_sha512_256(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify(byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEd25519verify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEd25519verify(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ed25519verify(byte[],byte[],byte[])bool'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify_bare(byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEd25519verifyBare: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEd25519verifyBare(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ed25519verify_bare(byte[],byte[],byte[])bool'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEcdsaVerifyK1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyK1(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEcdsaVerifyR1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyR1(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEcdsaRecoverK1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverK1(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. + * + * Must fail, AVM does not support Secp256r1 for recover + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEcdsaRecoverR1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverR1(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_k1(byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEcdsaDecompressK1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressK1(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_r1(byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEcdsaDecompressR1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressR1(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyVrfVerify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyVrfVerify(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new CryptoOpsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current CryptoOpsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): CryptoOpsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_sha256(byte[],uint64)byte[] method call against the CryptoOpsContract contract + */ + verifySha256(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySha256(params))) + return this + }, + /** + * Add a verify_sha3_256(byte[],uint64)byte[] method call against the CryptoOpsContract contract + */ + verifySha3_256(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySha3_256(params))) + return this + }, + /** + * Add a verify_keccak_256(byte[],uint64)byte[] method call against the CryptoOpsContract contract + */ + verifyKeccak_256(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyKeccak_256(params))) + return this + }, + /** + * Add a verify_sha512_256(byte[],uint64)byte[] method call against the CryptoOpsContract contract + */ + verifySha512_256(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySha512_256(params))) + return this + }, + /** + * Add a verify_ed25519verify(byte[],byte[],byte[])bool method call against the CryptoOpsContract contract + */ + verifyEd25519verify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEd25519verify(params))) + return this + }, + /** + * Add a verify_ed25519verify_bare(byte[],byte[],byte[])bool method call against the CryptoOpsContract contract + */ + verifyEd25519verifyBare(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEd25519verifyBare(params))) + return this + }, + /** + * Add a verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool method call against the CryptoOpsContract contract + */ + verifyEcdsaVerifyK1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaVerifyK1(params))) + return this + }, + /** + * Add a verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool method call against the CryptoOpsContract contract + */ + verifyEcdsaVerifyR1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaVerifyR1(params))) + return this + }, + /** + * Add a verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[]) method call against the CryptoOpsContract contract + */ + verifyEcdsaRecoverK1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaRecoverK1(params))) + return this + }, + /** + * Add a verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[]) method call against the CryptoOpsContract contract + */ + verifyEcdsaRecoverR1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaRecoverR1(params))) + return this + }, + /** + * Add a verify_ecdsa_decompress_k1(byte[])(byte[],byte[]) method call against the CryptoOpsContract contract + */ + verifyEcdsaDecompressK1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaDecompressK1(params))) + return this + }, + /** + * Add a verify_ecdsa_decompress_r1(byte[])(byte[],byte[]) method call against the CryptoOpsContract contract + */ + verifyEcdsaDecompressR1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaDecompressR1(params))) + return this + }, + /** + * Add a verify_vrf_verify(byte[],byte[],byte[])(byte[],bool) method call against the CryptoOpsContract contract + */ + verifyVrfVerify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyVrfVerify(params))) + return this + }, + /** + * Add a clear state call to the CryptoOpsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as CryptoOpsContractComposer + } +} +export type CryptoOpsContractComposer = { + /** + * Calls the verify_sha256(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySha256(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_sha256(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_sha3_256(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySha3_256(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_sha3_256(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_keccak_256(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyKeccak_256(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_keccak_256(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_sha512_256(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySha512_256(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_sha512_256(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_ed25519verify(byte[],byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEd25519verify(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ed25519verify(byte[],byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_ed25519verify_bare(byte[],byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEd25519verifyBare(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ed25519verify_bare(byte[],byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEcdsaVerifyK1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEcdsaVerifyR1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[]) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEcdsaRecoverK1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'] | undefined]> + + /** + * Calls the verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[]) ABI method. + * + * Must fail, AVM does not support Secp256r1 for recover + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEcdsaRecoverR1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'] | undefined]> + + /** + * Calls the verify_ecdsa_decompress_k1(byte[])(byte[],byte[]) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEcdsaDecompressK1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'] | undefined]> + + /** + * Calls the verify_ecdsa_decompress_r1(byte[])(byte[],byte[]) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEcdsaDecompressR1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'] | undefined]> + + /** + * Calls the verify_vrf_verify(byte[],byte[],byte[])(byte[],bool) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyVrfVerify(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the CryptoOpsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): CryptoOpsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): CryptoOpsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type CryptoOpsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/DynamicArrayInitContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/DynamicArrayInitContract.ts new file mode 100644 index 0000000..3ed4087 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/DynamicArrayInitContract.ts @@ -0,0 +1,755 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"DynamicArrayInitContract","structs":{},"methods":[{"name":"test_immutable_array_init","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_immutable_array_init_without_type_generic","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reference_array_init","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reference_array_init_without_type_generic","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDggMyAwCiAgICBieXRlY2Jsb2NrIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0ODAKICAgIC8vIGNsYXNzIER5bmFtaWNBcnJheUluaXRDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4ODQzNGJhMmEgMHg2M2FhYmJhMCAweGRiYWYwMzRlIDB4YTlkMTQ1NTQgLy8gbWV0aG9kICJ0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdCB0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljIHRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXQgdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDExOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5EeW5hbWljQXJyYXlJbml0Q29udHJhY3QudGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0ODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuRHluYW1pY0FycmF5SW5pdENvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkR5bmFtaWNBcnJheUluaXRDb250cmFjdC50ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNwogICAgLy8gYTEgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzMAogICAgLy8gYXNzZXJ0IGExLmxlbmd0aCA9PSBhMi5sZW5ndGgKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgLwogICAgaW50Y18yIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzMQogICAgLy8gYXNzZXJ0IGExWzBdID09IGEyWzBdCiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzMgogICAgLy8gYXNzZXJ0IGExWzFdID09IGEyWzFdCiAgICBkdXAKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzMKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhMlsyXQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzNwogICAgLy8gYXNzZXJ0IGExWzBdID09IGEzWzBdCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzgKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhM1sxXQogICAgZHVwCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTM5CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTNbMl0KICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQyCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGE0Lmxlbmd0aAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQzCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTRbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ0CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTRbMV0KICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0NQogICAgLy8gYXNzZXJ0IGExWzJdID09IGE0WzJdCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5EeW5hbWljQXJyYXlJbml0Q29udHJhY3QudGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpY1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NDkKICAgIC8vIGExID0gUmVmZXJlbmNlQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUyCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGEyLmxlbmd0aAogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUzCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTJbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU0CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTJbMV0KICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1NQogICAgLy8gYXNzZXJ0IGExWzJdID09IGEyWzJdCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU5CiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTNbMF0KICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU2MAogICAgLy8gYXNzZXJ0IGExWzFdID09IGEzWzFdCiAgICBkdXAKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjEKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhM1syXQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjQKICAgIC8vIGFzc2VydCBhMS5sZW5ndGggPT0gYTQubGVuZ3RoCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIGludGNfMiAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjUKICAgIC8vIGFzc2VydCBhMVswXSA9PSBhNFswXQogICAgZHVwCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjYKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhNFsxXQogICAgZHVwCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY3CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTRbMl0KICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAQgDACYBGAAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAzEbQQArMRkURDEYRIIEBIQ0uioEY6q7oATbrwNOBKnRRVQ2GgCOBAAJAAsADQBZADEZFDEYFBBDIkMiQyhHAhUjCiQSREklWyISREkjW4ECEkSBEFskEkRHAiVbIhJESSNbgQISRIEQWyQSREkVIwokEkRJJVsiEkRJI1uBAhJEgRBbJBJEIkMoRwIVIwokEkRJJVsiEkRJI1uBAhJEgRBbJBJERwIlWyISREkjW4ECEkSBEFskEkRJFSMKJBJESSVbIhJESSNbgQISRIEQWyQSRCJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the DynamicArrayInitContract contract + */ +export type DynamicArrayInitContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'test_immutable_array_init()void': Record + 'test_immutable_array_init_without_type_generic()void': Record + 'test_reference_array_init()void': Record + 'test_reference_array_init_without_type_generic()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'test_immutable_array_init()void': [] + 'test_immutable_array_init_without_type_generic()void': [] + 'test_reference_array_init()void': [] + 'test_reference_array_init_without_type_generic()void': [] + } +} + +/** + * The return type for each method + */ +export type DynamicArrayInitContractReturns = { + 'test_immutable_array_init()void': void + 'test_immutable_array_init_without_type_generic()void': void + 'test_reference_array_init()void': void + 'test_reference_array_init_without_type_generic()void': void +} + +/** + * Defines the types of available calls and state of the DynamicArrayInitContract smart contract. + */ +export type DynamicArrayInitContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'test_immutable_array_init()void' | 'test_immutable_array_init', { + argsObj: DynamicArrayInitContractArgs['obj']['test_immutable_array_init()void'] + argsTuple: DynamicArrayInitContractArgs['tuple']['test_immutable_array_init()void'] + returns: DynamicArrayInitContractReturns['test_immutable_array_init()void'] + }> + & Record<'test_immutable_array_init_without_type_generic()void' | 'test_immutable_array_init_without_type_generic', { + argsObj: DynamicArrayInitContractArgs['obj']['test_immutable_array_init_without_type_generic()void'] + argsTuple: DynamicArrayInitContractArgs['tuple']['test_immutable_array_init_without_type_generic()void'] + returns: DynamicArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'] + }> + & Record<'test_reference_array_init()void' | 'test_reference_array_init', { + argsObj: DynamicArrayInitContractArgs['obj']['test_reference_array_init()void'] + argsTuple: DynamicArrayInitContractArgs['tuple']['test_reference_array_init()void'] + returns: DynamicArrayInitContractReturns['test_reference_array_init()void'] + }> + & Record<'test_reference_array_init_without_type_generic()void' | 'test_reference_array_init_without_type_generic', { + argsObj: DynamicArrayInitContractArgs['obj']['test_reference_array_init_without_type_generic()void'] + argsTuple: DynamicArrayInitContractArgs['tuple']['test_reference_array_init_without_type_generic()void'] + returns: DynamicArrayInitContractReturns['test_reference_array_init_without_type_generic()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type DynamicArrayInitContractSignatures = keyof DynamicArrayInitContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the DynamicArrayInitContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = DynamicArrayInitContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the DynamicArrayInitContract smart contract to the method's return type + */ +export type MethodReturn = DynamicArrayInitContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type DynamicArrayInitContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type DynamicArrayInitContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: DynamicArrayInitContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the DynamicArrayInitContract smart contract + */ +export abstract class DynamicArrayInitContractParamsFactory { + /** + * Constructs a no op call for the test_immutable_array_init()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImmutableArrayInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_immutable_array_init()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_immutable_array_init_without_type_generic()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImmutableArrayInitWithoutTypeGeneric(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_immutable_array_init_without_type_generic()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_reference_array_init()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testReferenceArrayInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_reference_array_init()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_reference_array_init_without_type_generic()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testReferenceArrayInitWithoutTypeGeneric(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_reference_array_init_without_type_generic()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the DynamicArrayInitContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class DynamicArrayInitContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `DynamicArrayInitContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new DynamicArrayInitContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new DynamicArrayInitContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the DynamicArrayInitContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: DynamicArrayInitContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new DynamicArrayInitContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the DynamicArrayInitContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the DynamicArrayInitContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the DynamicArrayInitContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new DynamicArrayInitContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the DynamicArrayInitContract smart contract + */ +export class DynamicArrayInitContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `DynamicArrayInitContractClient` + * + * @param appClient An `AppClient` instance which has been created with the DynamicArrayInitContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `DynamicArrayInitContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `DynamicArrayInitContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new DynamicArrayInitContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `DynamicArrayInitContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new DynamicArrayInitContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the DynamicArrayInitContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImmutableArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInit(params)) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImmutableArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testReferenceArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInit(params)) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testReferenceArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the DynamicArrayInitContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImmutableArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInit(params)) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImmutableArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testReferenceArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInit(params)) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testReferenceArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the DynamicArrayInitContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImmutableArrayInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInit(params)) + return {...result, return: result.return as unknown as (undefined | DynamicArrayInitContractReturns['test_immutable_array_init()void'])} + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImmutableArrayInitWithoutTypeGeneric: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) + return {...result, return: result.return as unknown as (undefined | DynamicArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'])} + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testReferenceArrayInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInit(params)) + return {...result, return: result.return as unknown as (undefined | DynamicArrayInitContractReturns['test_reference_array_init()void'])} + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testReferenceArrayInitWithoutTypeGeneric: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) + return {...result, return: result.return as unknown as (undefined | DynamicArrayInitContractReturns['test_reference_array_init_without_type_generic()void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new DynamicArrayInitContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current DynamicArrayInitContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): DynamicArrayInitContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a test_immutable_array_init()void method call against the DynamicArrayInitContract contract + */ + testImmutableArrayInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArrayInit(params))) + return this + }, + /** + * Add a test_immutable_array_init_without_type_generic()void method call against the DynamicArrayInitContract contract + */ + testImmutableArrayInitWithoutTypeGeneric(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArrayInitWithoutTypeGeneric(params))) + return this + }, + /** + * Add a test_reference_array_init()void method call against the DynamicArrayInitContract contract + */ + testReferenceArrayInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testReferenceArrayInit(params))) + return this + }, + /** + * Add a test_reference_array_init_without_type_generic()void method call against the DynamicArrayInitContract contract + */ + testReferenceArrayInitWithoutTypeGeneric(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testReferenceArrayInitWithoutTypeGeneric(params))) + return this + }, + /** + * Add a clear state call to the DynamicArrayInitContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as DynamicArrayInitContractComposer + } +} +export type DynamicArrayInitContractComposer = { + /** + * Calls the test_immutable_array_init()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImmutableArrayInit(params?: CallParams): DynamicArrayInitContractComposer<[...TReturns, DynamicArrayInitContractReturns['test_immutable_array_init()void'] | undefined]> + + /** + * Calls the test_immutable_array_init_without_type_generic()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImmutableArrayInitWithoutTypeGeneric(params?: CallParams): DynamicArrayInitContractComposer<[...TReturns, DynamicArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'] | undefined]> + + /** + * Calls the test_reference_array_init()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testReferenceArrayInit(params?: CallParams): DynamicArrayInitContractComposer<[...TReturns, DynamicArrayInitContractReturns['test_reference_array_init()void'] | undefined]> + + /** + * Calls the test_reference_array_init_without_type_generic()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testReferenceArrayInitWithoutTypeGeneric(params?: CallParams): DynamicArrayInitContractComposer<[...TReturns, DynamicArrayInitContractReturns['test_reference_array_init_without_type_generic()void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the DynamicArrayInitContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): DynamicArrayInitContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): DynamicArrayInitContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type DynamicArrayInitContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/DynamicItxnGroup.ts b/examples/p-py/projects/p-py-frontend/src/contracts/DynamicItxnGroup.ts new file mode 100644 index 0000000..8c63c52 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/DynamicItxnGroup.ts @@ -0,0 +1,629 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"DynamicItxnGroup","structs":{},"methods":[{"name":"test_firstly","args":[{"type":"address[]","name":"addresses"},{"type":"pay","name":"funds"},{"type":"uint64","name":"verifier"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_looply","args":[{"type":"address[]","name":"addresses"},{"type":"pay","name":"funds"},{"type":"uint64","name":"verifier"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[85,217],"errorMessage":"Funds must be sent to app"},{"pc":[141,250],"errorMessage":"index access is out of bounds"},{"pc":[89,220],"errorMessage":"invalid array length header"},{"pc":[94,225],"errorMessage":"must provide some accounts"},{"pc":[72,204],"errorMessage":"transaction type is pay"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgNgogICAgYnl0ZWNibG9jayAweDY1YTlhZWNjICJhYmMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBjbGFzcyBEeW5hbWljSXR4bkdyb3VwKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHgxNzM5MTc4NCAweDNmMTBhZWE3IC8vIG1ldGhvZCAidGVzdF9maXJzdGx5KGFkZHJlc3NbXSxwYXksdWludDY0KXZvaWQiLCBtZXRob2QgInRlc3RfbG9vcGx5KGFkZHJlc3NbXSxwYXksdWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB0ZXN0X2ZpcnN0bHkgdGVzdF9sb29wbHkKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuZHluYW1pY19pdHhuX2dyb3VwLmNvbnRyYWN0LkR5bmFtaWNJdHhuR3JvdXAudGVzdF9maXJzdGx5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9maXJzdGx5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MTgKICAgIC8vIGFzc2VydCBmdW5kcy5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLCAiRnVuZHMgbXVzdCBiZSBzZW50IHRvIGFwcCIKICAgIGR1cAogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEZ1bmRzIG11c3QgYmUgc2VudCB0byBhcHAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MjAKICAgIC8vIGFzc2VydCBhZGRyZXNzZXMubGVuZ3RoLCAibXVzdCBwcm92aWRlIHNvbWUgYWNjb3VudHMiCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBhc3NlcnQgLy8gbXVzdCBwcm92aWRlIHNvbWUgYWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MjIKICAgIC8vIHNoYXJlID0gZnVuZHMuYW1vdW50IC8vIGFkZHJlc3Nlcy5sZW5ndGgKICAgIHN3YXAKICAgIGd0eG5zIEFtb3VudAogICAgc3dhcAogICAgLwogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBpdHhuLlBheW1lbnQoYW1vdW50PXNoYXJlLCByZWNlaXZlcj1hZGRyZXNzZXNbMF0ubmF0aXZlKS5zdGFnZShiZWdpbl9ncm91cD1UcnVlKQogICAgaXR4bl9iZWdpbgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBleHRyYWN0IDIgMzIKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpbnRjXzAgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MjYKICAgIC8vIGZvciBpIGluIHVyYW5nZSgxLCBhZGRyZXNzZXMubGVuZ3RoKToKICAgIGludGNfMCAvLyAxCgp0ZXN0X2ZpcnN0bHlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weToyNgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGFkZHJlc3Nlcy5sZW5ndGgpOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogdGVzdF9maXJzdGx5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBhZGRyID0gYWRkcmVzc2VzW2ldCiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAzMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBpdHhuLlBheW1lbnQoYW1vdW50PXNoYXJlLCByZWNlaXZlcj1hZGRyLm5hdGl2ZSkuc3RhZ2UoKQogICAgaXR4bl9uZXh0CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBkaWcgMwogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGludGNfMCAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weToyNgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGFkZHJlc3Nlcy5sZW5ndGgpOgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2ZpcnN0bHlfZm9yX2hlYWRlckAyCgp0ZXN0X2ZpcnN0bHlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjMwLTMyCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9dmVyaWZpZXIuaWQsIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJ2ZXJpZnkoKXZvaWQiKSwpCiAgICAvLyApLnN0YWdlKCkKICAgIGl0eG5fbmV4dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTozMQogICAgLy8gYXBwX2lkPXZlcmlmaWVyLmlkLCBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgidmVyaWZ5KCl2b2lkIiksKQogICAgYnl0ZWNfMCAvLyBtZXRob2QgInZlcmlmeSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MzQKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoYXNzZXRfbmFtZT0iYWJjIikuc3RhZ2UoKQogICAgaXR4bl9uZXh0CiAgICBieXRlY18xIC8vICJhYmMiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TmFtZQogICAgcHVzaGludCAzIC8vIGFjZmcKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTozNgogICAgLy8gaXR4bi5zdWJtaXRfc3RhZ2VkKCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuZHluYW1pY19pdHhuX2dyb3VwLmNvbnRyYWN0LkR5bmFtaWNJdHhuR3JvdXAudGVzdF9sb29wbHlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2xvb3BseToKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBhc3NlcnQgZnVuZHMucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywgIkZ1bmRzIG11c3QgYmUgc2VudCB0byBhcHAiCiAgICBkdXAKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBGdW5kcyBtdXN0IGJlIHNlbnQgdG8gYXBwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBhc3NlcnQgYWRkcmVzc2VzLmxlbmd0aCwgIm11c3QgcHJvdmlkZSBzb21lIGFjY291bnRzIgogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBhc3NlcnQgLy8gbXVzdCBwcm92aWRlIHNvbWUgYWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NDkKICAgIC8vIHNoYXJlID0gZnVuZHMuYW1vdW50IC8vIGFkZHJlc3Nlcy5sZW5ndGgKICAgIHN3YXAKICAgIGd0eG5zIEFtb3VudAogICAgc3dhcAogICAgLwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTo1MQogICAgLy8gaXNfZmlyc3QgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgaW50Y18xIC8vIDAKCnRlc3RfbG9vcGx5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NTIKICAgIC8vIGZvciBhZGRyIGluIGFkZHJlc3NlczoKICAgIGR1cAogICAgZGlnIDQKICAgIDwKICAgIGJ6IHRlc3RfbG9vcGx5X2FmdGVyX2ZvckA4CiAgICBkaWcgNQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMzIKICAgICoKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidXJ5IDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NTQKICAgIC8vIG15X3R4bi5zdGFnZShiZWdpbl9ncm91cD1pc19maXJzdCkKICAgIGRpZyAxCiAgICBieiB0ZXN0X2xvb3BseV9pdHhuX25leHRANQogICAgaXR4bl9iZWdpbgoKdGVzdF9sb29wbHlfYWZ0ZXJfaXR4bl9iZWdpbl9uZXh0QDY6CiAgICBkaWcgNgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZGlnIDIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBteV90eG4gPSBpdHhuLlBheW1lbnQoYW1vdW50PXNoYXJlLCByZWNlaXZlcj1hZGRyLm5hdGl2ZSkKICAgIGludGNfMCAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTo1NQogICAgLy8gaXNfZmlyc3QgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGJ1cnkgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfbG9vcGx5X2Zvcl9oZWFkZXJAMgoKdGVzdF9sb29wbHlfaXR4bl9uZXh0QDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBteV90eG4uc3RhZ2UoYmVnaW5fZ3JvdXA9aXNfZmlyc3QpCiAgICBpdHhuX25leHQKICAgIGIgdGVzdF9sb29wbHlfYWZ0ZXJfaXR4bl9iZWdpbl9uZXh0QDYKCnRlc3RfbG9vcGx5X2FmdGVyX2ZvckA4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTo1Ny01OQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPXZlcmlmaWVyLmlkLCBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgidmVyaWZ5KCl2b2lkIiksKQogICAgLy8gKS5zdGFnZSgpCiAgICBpdHhuX25leHQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NTgKICAgIC8vIGFwcF9pZD12ZXJpZmllci5pZCwgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoInZlcmlmeSgpdm9pZCIpLCkKICAgIGJ5dGVjXzAgLy8gbWV0aG9kICJ2ZXJpZnkoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTo1NwogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKGFzc2V0X25hbWU9ImFiYyIpLnN0YWdlKCkKICAgIGl0eG5fbmV4dAogICAgYnl0ZWNfMSAvLyAiYWJjIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIHB1c2hpbnQgMyAvLyBhY2ZnCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NjMKICAgIC8vIGl0eG4uc3VibWl0X3N0YWdlZCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTozOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAQAgBiYCBGWprswDYWJjMRtBAB0xGRREMRhEggIEFzkXhAQ/EK6nNhoAjgIACQCLADEZFDEYFBBDNhoBMRYiCUk4ECISRDYaAhdOAkk4BzIKEkRLASNZSU4DSURMOAhMCklOArFLAVcCAE4CTFcCILIHsggishAjsgEiSUsEDEEAHUcCJAtLA0wkWLayB0sDsggishAjsgEiCEUBQv/ctiiyGksEshglshAjsgG2KbImgQOyECOyAbMiQyM2GgFJMRYiCUk4ECISRDYaAhdOAkk4BzIKEkRMI1lJTgJJREw4CEwKIiNJSwQMQQAwSwVXAgBLASQLJFhFB0sBQQAasUsGsgdLArIIIrIQI7IBI0UCSSIIRQFC/822Qv/jtiiyGksEshglshAjsgG2KbImgQOyECOyAbMiQw==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the DynamicItxnGroup contract + */ +export type DynamicItxnGroupArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'test_firstly(address[],pay,uint64)void': { + addresses: string[] + funds: AppMethodCallTransactionArgument + verifier: bigint | number + } + 'test_looply(address[],pay,uint64)void': { + addresses: string[] + funds: AppMethodCallTransactionArgument + verifier: bigint | number + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'test_firstly(address[],pay,uint64)void': [addresses: string[], funds: AppMethodCallTransactionArgument, verifier: bigint | number] + 'test_looply(address[],pay,uint64)void': [addresses: string[], funds: AppMethodCallTransactionArgument, verifier: bigint | number] + } +} + +/** + * The return type for each method + */ +export type DynamicItxnGroupReturns = { + 'test_firstly(address[],pay,uint64)void': void + 'test_looply(address[],pay,uint64)void': void +} + +/** + * Defines the types of available calls and state of the DynamicItxnGroup smart contract. + */ +export type DynamicItxnGroupTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'test_firstly(address[],pay,uint64)void' | 'test_firstly', { + argsObj: DynamicItxnGroupArgs['obj']['test_firstly(address[],pay,uint64)void'] + argsTuple: DynamicItxnGroupArgs['tuple']['test_firstly(address[],pay,uint64)void'] + returns: DynamicItxnGroupReturns['test_firstly(address[],pay,uint64)void'] + }> + & Record<'test_looply(address[],pay,uint64)void' | 'test_looply', { + argsObj: DynamicItxnGroupArgs['obj']['test_looply(address[],pay,uint64)void'] + argsTuple: DynamicItxnGroupArgs['tuple']['test_looply(address[],pay,uint64)void'] + returns: DynamicItxnGroupReturns['test_looply(address[],pay,uint64)void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type DynamicItxnGroupSignatures = keyof DynamicItxnGroupTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the DynamicItxnGroup smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = DynamicItxnGroupTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the DynamicItxnGroup smart contract to the method's return type + */ +export type MethodReturn = DynamicItxnGroupTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type DynamicItxnGroupCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type DynamicItxnGroupDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: DynamicItxnGroupCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the DynamicItxnGroup smart contract + */ +export abstract class DynamicItxnGroupParamsFactory { + /** + * Constructs a no op call for the test_firstly(address[],pay,uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testFirstly(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_firstly(address[],pay,uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.addresses, params.args.funds, params.args.verifier], + } + } + /** + * Constructs a no op call for the test_looply(address[],pay,uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testLooply(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_looply(address[],pay,uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.addresses, params.args.funds, params.args.verifier], + } + } +} + +/** + * A factory to create and deploy one or more instance of the DynamicItxnGroup smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class DynamicItxnGroupFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `DynamicItxnGroupFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new DynamicItxnGroupClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new DynamicItxnGroupClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the DynamicItxnGroup smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: DynamicItxnGroupDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new DynamicItxnGroupClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the DynamicItxnGroup smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the DynamicItxnGroup smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the DynamicItxnGroup smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new DynamicItxnGroupClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the DynamicItxnGroup smart contract + */ +export class DynamicItxnGroupClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `DynamicItxnGroupClient` + * + * @param appClient An `AppClient` instance which has been created with the DynamicItxnGroup app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `DynamicItxnGroupClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `DynamicItxnGroupClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new DynamicItxnGroupClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `DynamicItxnGroupClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new DynamicItxnGroupClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the DynamicItxnGroup smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the DynamicItxnGroup smart contract using the `test_firstly(address[],pay,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testFirstly: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(DynamicItxnGroupParamsFactory.testFirstly(params)) + }, + + /** + * Makes a call to the DynamicItxnGroup smart contract using the `test_looply(address[],pay,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testLooply: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(DynamicItxnGroupParamsFactory.testLooply(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the DynamicItxnGroup smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the DynamicItxnGroup smart contract using the `test_firstly(address[],pay,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testFirstly: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(DynamicItxnGroupParamsFactory.testFirstly(params)) + }, + + /** + * Makes a call to the DynamicItxnGroup smart contract using the `test_looply(address[],pay,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testLooply: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(DynamicItxnGroupParamsFactory.testLooply(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the DynamicItxnGroup smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the DynamicItxnGroup smart contract using the `test_firstly(address[],pay,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testFirstly: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(DynamicItxnGroupParamsFactory.testFirstly(params)) + return {...result, return: result.return as unknown as (undefined | DynamicItxnGroupReturns['test_firstly(address[],pay,uint64)void'])} + }, + + /** + * Makes a call to the DynamicItxnGroup smart contract using the `test_looply(address[],pay,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testLooply: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(DynamicItxnGroupParamsFactory.testLooply(params)) + return {...result, return: result.return as unknown as (undefined | DynamicItxnGroupReturns['test_looply(address[],pay,uint64)void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new DynamicItxnGroupClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current DynamicItxnGroup app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): DynamicItxnGroupComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a test_firstly(address[],pay,uint64)void method call against the DynamicItxnGroup contract + */ + testFirstly(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testFirstly(params))) + return this + }, + /** + * Add a test_looply(address[],pay,uint64)void method call against the DynamicItxnGroup contract + */ + testLooply(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testLooply(params))) + return this + }, + /** + * Add a clear state call to the DynamicItxnGroup contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as DynamicItxnGroupComposer + } +} +export type DynamicItxnGroupComposer = { + /** + * Calls the test_firstly(address[],pay,uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testFirstly(params?: CallParams): DynamicItxnGroupComposer<[...TReturns, DynamicItxnGroupReturns['test_firstly(address[],pay,uint64)void'] | undefined]> + + /** + * Calls the test_looply(address[],pay,uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testLooply(params?: CallParams): DynamicItxnGroupComposer<[...TReturns, DynamicItxnGroupReturns['test_looply(address[],pay,uint64)void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the DynamicItxnGroup smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): DynamicItxnGroupComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): DynamicItxnGroupComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type DynamicItxnGroupComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateContract.ts new file mode 100644 index 0000000..0d69d22 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateContract.ts @@ -0,0 +1,2649 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"GlobalStateContract","structs":{},"methods":[{"name":"get_implicit_key_arc4_uint","args":[],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_string","args":[],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_byte","args":[],"returns":{"type":"byte"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_bool","args":[],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_address","args":[],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_uint128","args":[],"returns":{"type":"uint128"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_dynamic_bytes","args":[],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_tuple","args":[],"returns":{"type":"(uint64,byte[],bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_uint","args":[],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_string","args":[],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_byte","args":[],"returns":{"type":"byte"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_bool","args":[],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_address","args":[],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_uint128","args":[],"returns":{"type":"uint128"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_dynamic_bytes","args":[],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_uint","args":[{"type":"uint64","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_string","args":[{"type":"string","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_byte","args":[{"type":"byte","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_bool","args":[{"type":"bool","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_address","args":[{"type":"address","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_uint128","args":[{"type":"uint128","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_dynamic_bytes","args":[{"type":"byte[]","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_tuple","args":[{"type":"(uint64,byte[],bool)","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_uint","args":[{"type":"uint64","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_string","args":[{"type":"string","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_byte","args":[{"type":"byte","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_bool","args":[{"type":"bool","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_address","args":[{"type":"address","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_uint128","args":[{"type":"uint128","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_dynamic_bytes","args":[{"type":"byte[]","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":15},"local":{"ints":0,"bytes":0}},"keys":{"global":{"implicit_key_arc4_uint":{"keyType":"AVMString","valueType":"uint64","key":"aW1wbGljaXRfa2V5X2FyYzRfdWludA=="},"implicit_key_arc4_string":{"keyType":"AVMString","valueType":"string","key":"aW1wbGljaXRfa2V5X2FyYzRfc3RyaW5n"},"implicit_key_arc4_byte":{"keyType":"AVMString","valueType":"byte","key":"aW1wbGljaXRfa2V5X2FyYzRfYnl0ZQ=="},"implicit_key_arc4_bool":{"keyType":"AVMString","valueType":"bool","key":"aW1wbGljaXRfa2V5X2FyYzRfYm9vbA=="},"implicit_key_arc4_address":{"keyType":"AVMString","valueType":"address","key":"aW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcw=="},"implicit_key_arc4_uint128":{"keyType":"AVMString","valueType":"uint128","key":"aW1wbGljaXRfa2V5X2FyYzRfdWludDEyOA=="},"implicit_key_arc4_dynamic_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"aW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcw=="},"implicit_key_tuple":{"keyType":"AVMString","valueType":"(uint64,byte[],bool)","key":"aW1wbGljaXRfa2V5X3R1cGxl"},"arc4_uint":{"keyType":"AVMString","valueType":"uint64","key":"ZXhwbGljaXRfa2V5X2FyYzRfdWludA=="},"arc4_string":{"keyType":"AVMString","valueType":"string","key":"ZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5n"},"arc4_byte":{"keyType":"AVMString","valueType":"byte","key":"ZXhwbGljaXRfa2V5X2FyYzRfYnl0ZQ=="},"arc4_bool":{"keyType":"AVMString","valueType":"bool","key":"ZXhwbGljaXRfa2V5X2FyYzRfYm9vbA=="},"arc4_address":{"keyType":"AVMString","valueType":"address","key":"ZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcw=="},"arc4_uint128":{"keyType":"AVMString","valueType":"uint128","key":"ZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOA=="},"arc4_dynamic_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"ZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcw=="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[906],"errorMessage":"check self.arc4_address exists"},{"pc":[895],"errorMessage":"check self.arc4_bool exists"},{"pc":[884],"errorMessage":"check self.arc4_byte exists"},{"pc":[928],"errorMessage":"check self.arc4_dynamic_bytes exists"},{"pc":[873],"errorMessage":"check self.arc4_string exists"},{"pc":[862],"errorMessage":"check self.arc4_uint exists"},{"pc":[917],"errorMessage":"check self.arc4_uint128 exists"},{"pc":[818],"errorMessage":"check self.implicit_key_arc4_address exists"},{"pc":[807],"errorMessage":"check self.implicit_key_arc4_bool exists"},{"pc":[796],"errorMessage":"check self.implicit_key_arc4_byte exists"},{"pc":[840],"errorMessage":"check self.implicit_key_arc4_dynamic_bytes exists"},{"pc":[786],"errorMessage":"check self.implicit_key_arc4_string exists"},{"pc":[776],"errorMessage":"check self.implicit_key_arc4_uint exists"},{"pc":[829],"errorMessage":"check self.implicit_key_arc4_uint128 exists"},{"pc":[851],"errorMessage":"check self.implicit_key_tuple exists"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIgImltcGxpY2l0X2tleV9hcmM0X3N0cmluZyIgImltcGxpY2l0X2tleV9hcmM0X2J5dGUiICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIiAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAiaW1wbGljaXRfa2V5X3R1cGxlIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIgImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIgImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIiAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAweDAwMDAwMDAwMDAwMDA1MzkgMHgwMDA1NDg2NTZjNmM2ZiAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE1LTUxNgogICAgLy8gIyBJbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQgPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQ2NCgxMzM3KSkKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlYyAxNiAvLyAweDAwMDAwMDAwMDAwMDA1MzkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE3CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyA9IEdsb2JhbFN0YXRlKGFyYzQuU3RyaW5nKCJIZWxsbyIpKQogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYnl0ZWMgMTcgLy8gMHgwMDA1NDg2NTZjNmM2ZgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSA9IEdsb2JhbFN0YXRlKGFyYzQuQnl0ZSgwKSkKICAgIGJ5dGVjXzMgLy8gImltcGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTkKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbCA9IEdsb2JhbFN0YXRlKGFyYzQuQm9vbChUcnVlKSkKICAgIGJ5dGVjIDQgLy8gImltcGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjAKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyA9IEdsb2JhbFN0YXRlKGFyYzQuQWRkcmVzcyhHbG9iYWwuY3JlYXRvcl9hZGRyZXNzKSkKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTIxCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQxMjgoMioqMTAwKSkKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBieXRlYyAxOCAvLyAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyMgogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzID0gR2xvYmFsU3RhdGUoYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikpCiAgICBieXRlYyA3IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYnl0ZWMgMTkgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV90dXBsZSA9IEdsb2JhbFN0YXRlKChVSW50NjQoMTApLCBCeXRlcyhiInRlc3QiKSwgRmFsc2UpKQogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwYTAwMGIwMDAwMDQ3NDY1NzM3NAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjUtNTI2CiAgICAvLyAjIEV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIHNlbGYuYXJjNF91aW50ID0gR2xvYmFsU3RhdGUoYXJjNC5VSW50NjQoMTMzNyksIGtleT0iZXhwbGljaXRfa2V5X2FyYzRfdWludCIpCiAgICBieXRlYyA5IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYnl0ZWMgMTYgLy8gMHgwMDAwMDAwMDAwMDAwNTM5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyNwogICAgLy8gc2VsZi5hcmM0X3N0cmluZyA9IEdsb2JhbFN0YXRlKGFyYzQuU3RyaW5nKCJIZWxsbyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIpCiAgICBieXRlYyAxMCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUxNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcgPSBHbG9iYWxTdGF0ZShhcmM0LlN0cmluZygiSGVsbG8iKSkKICAgIGJ5dGVjIDE3IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjcKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmcgPSBHbG9iYWxTdGF0ZShhcmM0LlN0cmluZygiSGVsbG8iKSwga2V5PSJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjgKICAgIC8vIHNlbGYuYXJjNF9ieXRlID0gR2xvYmFsU3RhdGUoYXJjNC5CeXRlKDApLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiKQogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjkKICAgIC8vIHNlbGYuYXJjNF9ib29sID0gR2xvYmFsU3RhdGUoYXJjNC5Cb29sKFRydWUpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiKQogICAgYnl0ZWMgMTIgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2wgPSBHbG9iYWxTdGF0ZShhcmM0LkJvb2woVHJ1ZSkpCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyOQogICAgLy8gc2VsZi5hcmM0X2Jvb2wgPSBHbG9iYWxTdGF0ZShhcmM0LkJvb2woVHJ1ZSksIGtleT0iZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIpCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMQogICAgLy8gYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMC01MzIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMwogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjggPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQxMjgoMioqMTAwKSwga2V5PSJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IikKICAgIGJ5dGVjIDE0IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYnl0ZWMgMTggLy8gMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzUKICAgIC8vIGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICBieXRlYyAxNSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjIKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyA9IEdsb2JhbFN0YXRlKGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpKQogICAgYnl0ZWMgMTkgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzQtNTM2CiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyA9IEdsb2JhbFN0YXRlKAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTEzCiAgICAvLyBjbGFzcyBHbG9iYWxTdGF0ZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzOQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4MWNjOTY2ZWUgMHgyMzY3Y2Q0YiAweDY5MTI4ZTkwIDB4NjhkNTkwZTIgMHg0NGVmMDY4MSAweDFjZDI5NGVjIDB4YWFjOGVjYjEgMHgxNjZjNmFmZCAweDNjYzNiYjdiIDB4OWE2OTQ2YWQgMHhkZWQ3NTAzMyAweDY2Mjc5ZTkzIDB4MDk2ZTkyN2IgMHg5NzUzMWZiYyAweDZlYTNmOTk2IDB4YTdmNGY0MDIgMHhhYWRkY2M0YyAweDVlYzMxMTZkIDB4MjBmNTZlZWUgMHgxYzE0OWE0MyAweGE1NzVhYzdkIDB4ODdmMDg2OWIgMHg0NjFhZmM2ZCAweDA0ODExNmVhIDB4MzBlMzRhOTMgMHhkMmU2NDZlZiAweGU2NzRhMjcwIDB4YTg3ZTU0MGQgMHg3MjBhM2NhMCAweDI1NzcwOGY3IC8vIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQoKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZygpc3RyaW5nIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSgpYnl0ZSIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woKWJvb2wiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKClhZGRyZXNzIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCgpdWludDEyOCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMoKWJ5dGVbXSIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV90dXBsZSgpKHVpbnQ2NCxieXRlW10sYm9vbCkiLCBtZXRob2QgImdldF9hcmM0X3VpbnQoKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2FyYzRfc3RyaW5nKClzdHJpbmciLCBtZXRob2QgImdldF9hcmM0X2J5dGUoKWJ5dGUiLCBtZXRob2QgImdldF9hcmM0X2Jvb2woKWJvb2wiLCBtZXRob2QgImdldF9hcmM0X2FkZHJlc3MoKWFkZHJlc3MiLCBtZXRob2QgImdldF9hcmM0X3VpbnQxMjgoKXVpbnQxMjgiLCBtZXRob2QgImdldF9hcmM0X2R5bmFtaWNfYnl0ZXMoKWJ5dGVbXSIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQodWludDY0KXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcoc3RyaW5nKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKGJ5dGUpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woYm9vbCl2b2lkIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyhhZGRyZXNzKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4KHVpbnQxMjgpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMoYnl0ZVtdKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfdHVwbGUoKHVpbnQ2NCxieXRlW10sYm9vbCkpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfdWludCh1aW50NjQpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfc3RyaW5nKHN0cmluZyl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9ieXRlKGJ5dGUpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfYm9vbChib29sKXZvaWQiLCBtZXRob2QgInNldF9hcmM0X2FkZHJlc3MoYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF91aW50MTI4KHVpbnQxMjgpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfZHluYW1pY19ieXRlcyhieXRlW10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50IGdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGUgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2wgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMgZ2V0X2ltcGxpY2l0X2tleV90dXBsZSBnZXRfYXJjNF91aW50IGdldF9hcmM0X3N0cmluZyBnZXRfYXJjNF9ieXRlIGdldF9hcmM0X2Jvb2wgZ2V0X2FyYzRfYWRkcmVzcyBnZXRfYXJjNF91aW50MTI4IGdldF9hcmM0X2R5bmFtaWNfYnl0ZXMgc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQgc2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBzZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSBzZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCBzZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCBzZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBzZXRfaW1wbGljaXRfa2V5X3R1cGxlIHNldF9hcmM0X3VpbnQgc2V0X2FyYzRfc3RyaW5nIHNldF9hcmM0X2J5dGUgc2V0X2FyYzRfYm9vbCBzZXRfYXJjNF9hZGRyZXNzIHNldF9hcmM0X3VpbnQxMjggc2V0X2FyYzRfZHluYW1pY19ieXRlcwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDM5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0MQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludCBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzgtNTM5CiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0NQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NDkKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTUzCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1NwogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NjEKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTY1CiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NjkKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV90dXBsZS52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDggLy8gImltcGxpY2l0X2tleV90dXBsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGUgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU3NAogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50LnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X3VpbnQgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTcxLTU3MgogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgZXhwbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTc4CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3N0cmluZy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9zdHJpbmcgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4MgogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9ieXRlLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ieXRlIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1ODYKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYm9vbC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfYm9vbCBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTkwCiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2FkZHJlc3MudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X2FkZHJlc3MgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5NAogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50MTI4LnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF91aW50MTI4IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OTgKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfZHluYW1pY19ieXRlcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDMKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludC52YWx1ZSA9IHZhbHVlCiAgICBieXRlY18xIC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwMC02MDEKICAgIC8vICMgU2V0dGVyIG1ldGhvZHMgZm9yIGltcGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjAzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDAtNjAxCiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDcKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjExCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWNfMyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjExCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTUKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyA0IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTUKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxOQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxOQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4W3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgNiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjcKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcy52YWx1ZSA9IHZhbHVlLmNvcHkoKQogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI3CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMudmFsdWUgPSB2YWx1ZS5jb3B5KCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfdHVwbGVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzMQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzEKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gc2VsZi5hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzMtNjM0CiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gc2VsZi5hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzMtNjM0CiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X3N0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDAKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmcudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTAgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQwCiAgICAvLyBzZWxmLmFyYzRfc3RyaW5nLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NAogICAgLy8gc2VsZi5hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NAogICAgLy8gc2VsZi5hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfYm9vbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ4CiAgICAvLyBzZWxmLmFyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyAxMiAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ4CiAgICAvLyBzZWxmLmFyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2FyYzRfYWRkcmVzczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjIDEzIC8vICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfZHluYW1pY19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjYwCiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlcy52YWx1ZSA9IHZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMTUgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY2MAogICAgLy8gc2VsZi5hcmM0X2R5bmFtaWNfYnl0ZXMudmFsdWUgPSB2YWx1ZS5jb3B5KCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmFAQVH3x1FmltcGxpY2l0X2tleV9hcmM0X3VpbnQYaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nFmltcGxpY2l0X2tleV9hcmM0X2J5dGUWaW1wbGljaXRfa2V5X2FyYzRfYm9vbBlpbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzGWltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcxJpbXBsaWNpdF9rZXlfdHVwbGUWZXhwbGljaXRfa2V5X2FyYzRfdWludBhleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmcWZXhwbGljaXRfa2V5X2FyYzRfYnl0ZRZleHBsaWNpdF9rZXlfYXJjNF9ib29sGWV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MZZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOB9leHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzCAAAAAAAAAU5BwAFSGVsbG8QAAAAEAAAAAAAAAAAAAAAAA8ADWR5bmFtaWMgYnl0ZXMxGEAAXSknEGcqJxFnK4ABAGcnBIABgGcnBTIJZycGJxJnJwcnE2cnCIARAAAAAAAAAAoACwAABHRlc3RnJwknEGcnCicRZycLgAEAZycMgAGAZycNMglnJw4nEmcnDycTZzEbQQDhMRkURDEYRIIeBBzJZu4EI2fNSwRpEo6QBGjVkOIERO8GgQQc0pTsBKrI7LEEFmxq/QQ8w7t7BJppRq0E3tdQMwRmJ56TBAluknsEl1MfvARuo/mWBKf09AIEqt3MTARewxFtBCD1bu4EHBSaQwSldax9BIfwhpsERhr8bQQEgRbqBDDjSpME0uZG7wTmdKJwBKh+VA0Ecgo8oAQldwj3NhoAjh4ACQATAB0AJwAyAD0ASABTAF4AaQB0AH8AigCVAKAAqwCyALkAwADIANAA2ADgAOgA8AD4AQABCAEQARgAMRkUMRgUEEMjKWVEKExQsCJDIyplRChMULAiQyMrZUQoTFCwIkMjJwRlRChMULAiQyMnBWVEKExQsCJDIycGZUQoTFCwIkMjJwdlRChMULAiQyMnCGVEKExQsCJDIycJZUQoTFCwIkMjJwplRChMULAiQyMnC2VEKExQsCJDIycMZUQoTFCwIkMjJw1lRChMULAiQyMnDmVEKExQsCJDIycPZUQoTFCwIkMpNhoBZyJDKjYaAWciQys2GgFnIkMnBDYaAWciQycFNhoBZyJDJwY2GgFnIkMnBzYaAWciQycINhoBZyJDJwk2GgFnIkMnCjYaAWciQycLNhoBZyJDJww2GgFnIkMnDTYaAWciQycONhoBZyJDJw82GgFnIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the GlobalStateContract contract + */ +export type GlobalStateContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'get_implicit_key_arc4_uint()uint64': Record + 'get_implicit_key_arc4_string()string': Record + 'get_implicit_key_arc4_byte()byte': Record + 'get_implicit_key_arc4_bool()bool': Record + 'get_implicit_key_arc4_address()address': Record + 'get_implicit_key_arc4_uint128()uint128': Record + 'get_implicit_key_arc4_dynamic_bytes()byte[]': Record + 'get_implicit_key_tuple()(uint64,byte[],bool)': Record + 'get_arc4_uint()uint64': Record + 'get_arc4_string()string': Record + 'get_arc4_byte()byte': Record + 'get_arc4_bool()bool': Record + 'get_arc4_address()address': Record + 'get_arc4_uint128()uint128': Record + 'get_arc4_dynamic_bytes()byte[]': Record + 'set_implicit_key_arc4_uint(uint64)void': { + value: bigint | number + } + 'set_implicit_key_arc4_string(string)void': { + value: string + } + 'set_implicit_key_arc4_byte(byte)void': { + value: number + } + 'set_implicit_key_arc4_bool(bool)void': { + value: boolean + } + 'set_implicit_key_arc4_address(address)void': { + value: string + } + 'set_implicit_key_arc4_uint128(uint128)void': { + value: bigint | number + } + 'set_implicit_key_arc4_dynamic_bytes(byte[])void': { + value: Uint8Array + } + 'set_implicit_key_tuple((uint64,byte[],bool))void': { + value: [bigint | number, Uint8Array, boolean] + } + 'set_arc4_uint(uint64)void': { + value: bigint | number + } + 'set_arc4_string(string)void': { + value: string + } + 'set_arc4_byte(byte)void': { + value: number + } + 'set_arc4_bool(bool)void': { + value: boolean + } + 'set_arc4_address(address)void': { + value: string + } + 'set_arc4_uint128(uint128)void': { + value: bigint | number + } + 'set_arc4_dynamic_bytes(byte[])void': { + value: Uint8Array + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'get_implicit_key_arc4_uint()uint64': [] + 'get_implicit_key_arc4_string()string': [] + 'get_implicit_key_arc4_byte()byte': [] + 'get_implicit_key_arc4_bool()bool': [] + 'get_implicit_key_arc4_address()address': [] + 'get_implicit_key_arc4_uint128()uint128': [] + 'get_implicit_key_arc4_dynamic_bytes()byte[]': [] + 'get_implicit_key_tuple()(uint64,byte[],bool)': [] + 'get_arc4_uint()uint64': [] + 'get_arc4_string()string': [] + 'get_arc4_byte()byte': [] + 'get_arc4_bool()bool': [] + 'get_arc4_address()address': [] + 'get_arc4_uint128()uint128': [] + 'get_arc4_dynamic_bytes()byte[]': [] + 'set_implicit_key_arc4_uint(uint64)void': [value: bigint | number] + 'set_implicit_key_arc4_string(string)void': [value: string] + 'set_implicit_key_arc4_byte(byte)void': [value: number] + 'set_implicit_key_arc4_bool(bool)void': [value: boolean] + 'set_implicit_key_arc4_address(address)void': [value: string] + 'set_implicit_key_arc4_uint128(uint128)void': [value: bigint | number] + 'set_implicit_key_arc4_dynamic_bytes(byte[])void': [value: Uint8Array] + 'set_implicit_key_tuple((uint64,byte[],bool))void': [value: [bigint | number, Uint8Array, boolean]] + 'set_arc4_uint(uint64)void': [value: bigint | number] + 'set_arc4_string(string)void': [value: string] + 'set_arc4_byte(byte)void': [value: number] + 'set_arc4_bool(bool)void': [value: boolean] + 'set_arc4_address(address)void': [value: string] + 'set_arc4_uint128(uint128)void': [value: bigint | number] + 'set_arc4_dynamic_bytes(byte[])void': [value: Uint8Array] + } +} + +/** + * The return type for each method + */ +export type GlobalStateContractReturns = { + 'get_implicit_key_arc4_uint()uint64': bigint + 'get_implicit_key_arc4_string()string': string + 'get_implicit_key_arc4_byte()byte': number + 'get_implicit_key_arc4_bool()bool': boolean + 'get_implicit_key_arc4_address()address': string + 'get_implicit_key_arc4_uint128()uint128': bigint + 'get_implicit_key_arc4_dynamic_bytes()byte[]': Uint8Array + 'get_implicit_key_tuple()(uint64,byte[],bool)': [bigint, Uint8Array, boolean] + 'get_arc4_uint()uint64': bigint + 'get_arc4_string()string': string + 'get_arc4_byte()byte': number + 'get_arc4_bool()bool': boolean + 'get_arc4_address()address': string + 'get_arc4_uint128()uint128': bigint + 'get_arc4_dynamic_bytes()byte[]': Uint8Array + 'set_implicit_key_arc4_uint(uint64)void': void + 'set_implicit_key_arc4_string(string)void': void + 'set_implicit_key_arc4_byte(byte)void': void + 'set_implicit_key_arc4_bool(bool)void': void + 'set_implicit_key_arc4_address(address)void': void + 'set_implicit_key_arc4_uint128(uint128)void': void + 'set_implicit_key_arc4_dynamic_bytes(byte[])void': void + 'set_implicit_key_tuple((uint64,byte[],bool))void': void + 'set_arc4_uint(uint64)void': void + 'set_arc4_string(string)void': void + 'set_arc4_byte(byte)void': void + 'set_arc4_bool(bool)void': void + 'set_arc4_address(address)void': void + 'set_arc4_uint128(uint128)void': void + 'set_arc4_dynamic_bytes(byte[])void': void +} + +/** + * Defines the types of available calls and state of the GlobalStateContract smart contract. + */ +export type GlobalStateContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'get_implicit_key_arc4_uint()uint64' | 'get_implicit_key_arc4_uint', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_uint()uint64'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_uint()uint64'] + returns: GlobalStateContractReturns['get_implicit_key_arc4_uint()uint64'] + }> + & Record<'get_implicit_key_arc4_string()string' | 'get_implicit_key_arc4_string', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_string()string'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_string()string'] + returns: GlobalStateContractReturns['get_implicit_key_arc4_string()string'] + }> + & Record<'get_implicit_key_arc4_byte()byte' | 'get_implicit_key_arc4_byte', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_byte()byte'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_byte()byte'] + returns: GlobalStateContractReturns['get_implicit_key_arc4_byte()byte'] + }> + & Record<'get_implicit_key_arc4_bool()bool' | 'get_implicit_key_arc4_bool', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_bool()bool'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_bool()bool'] + returns: GlobalStateContractReturns['get_implicit_key_arc4_bool()bool'] + }> + & Record<'get_implicit_key_arc4_address()address' | 'get_implicit_key_arc4_address', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_address()address'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_address()address'] + returns: GlobalStateContractReturns['get_implicit_key_arc4_address()address'] + }> + & Record<'get_implicit_key_arc4_uint128()uint128' | 'get_implicit_key_arc4_uint128', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_uint128()uint128'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_uint128()uint128'] + returns: GlobalStateContractReturns['get_implicit_key_arc4_uint128()uint128'] + }> + & Record<'get_implicit_key_arc4_dynamic_bytes()byte[]' | 'get_implicit_key_arc4_dynamic_bytes', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_dynamic_bytes()byte[]'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_dynamic_bytes()byte[]'] + returns: GlobalStateContractReturns['get_implicit_key_arc4_dynamic_bytes()byte[]'] + }> + & Record<'get_implicit_key_tuple()(uint64,byte[],bool)' | 'get_implicit_key_tuple', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_tuple()(uint64,byte[],bool)'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_tuple()(uint64,byte[],bool)'] + returns: GlobalStateContractReturns['get_implicit_key_tuple()(uint64,byte[],bool)'] + }> + & Record<'get_arc4_uint()uint64' | 'get_arc4_uint', { + argsObj: GlobalStateContractArgs['obj']['get_arc4_uint()uint64'] + argsTuple: GlobalStateContractArgs['tuple']['get_arc4_uint()uint64'] + returns: GlobalStateContractReturns['get_arc4_uint()uint64'] + }> + & Record<'get_arc4_string()string' | 'get_arc4_string', { + argsObj: GlobalStateContractArgs['obj']['get_arc4_string()string'] + argsTuple: GlobalStateContractArgs['tuple']['get_arc4_string()string'] + returns: GlobalStateContractReturns['get_arc4_string()string'] + }> + & Record<'get_arc4_byte()byte' | 'get_arc4_byte', { + argsObj: GlobalStateContractArgs['obj']['get_arc4_byte()byte'] + argsTuple: GlobalStateContractArgs['tuple']['get_arc4_byte()byte'] + returns: GlobalStateContractReturns['get_arc4_byte()byte'] + }> + & Record<'get_arc4_bool()bool' | 'get_arc4_bool', { + argsObj: GlobalStateContractArgs['obj']['get_arc4_bool()bool'] + argsTuple: GlobalStateContractArgs['tuple']['get_arc4_bool()bool'] + returns: GlobalStateContractReturns['get_arc4_bool()bool'] + }> + & Record<'get_arc4_address()address' | 'get_arc4_address', { + argsObj: GlobalStateContractArgs['obj']['get_arc4_address()address'] + argsTuple: GlobalStateContractArgs['tuple']['get_arc4_address()address'] + returns: GlobalStateContractReturns['get_arc4_address()address'] + }> + & Record<'get_arc4_uint128()uint128' | 'get_arc4_uint128', { + argsObj: GlobalStateContractArgs['obj']['get_arc4_uint128()uint128'] + argsTuple: GlobalStateContractArgs['tuple']['get_arc4_uint128()uint128'] + returns: GlobalStateContractReturns['get_arc4_uint128()uint128'] + }> + & Record<'get_arc4_dynamic_bytes()byte[]' | 'get_arc4_dynamic_bytes', { + argsObj: GlobalStateContractArgs['obj']['get_arc4_dynamic_bytes()byte[]'] + argsTuple: GlobalStateContractArgs['tuple']['get_arc4_dynamic_bytes()byte[]'] + returns: GlobalStateContractReturns['get_arc4_dynamic_bytes()byte[]'] + }> + & Record<'set_implicit_key_arc4_uint(uint64)void' | 'set_implicit_key_arc4_uint', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_uint(uint64)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_uint(uint64)void'] + returns: GlobalStateContractReturns['set_implicit_key_arc4_uint(uint64)void'] + }> + & Record<'set_implicit_key_arc4_string(string)void' | 'set_implicit_key_arc4_string', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_string(string)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_string(string)void'] + returns: GlobalStateContractReturns['set_implicit_key_arc4_string(string)void'] + }> + & Record<'set_implicit_key_arc4_byte(byte)void' | 'set_implicit_key_arc4_byte', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_byte(byte)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_byte(byte)void'] + returns: GlobalStateContractReturns['set_implicit_key_arc4_byte(byte)void'] + }> + & Record<'set_implicit_key_arc4_bool(bool)void' | 'set_implicit_key_arc4_bool', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_bool(bool)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_bool(bool)void'] + returns: GlobalStateContractReturns['set_implicit_key_arc4_bool(bool)void'] + }> + & Record<'set_implicit_key_arc4_address(address)void' | 'set_implicit_key_arc4_address', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_address(address)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_address(address)void'] + returns: GlobalStateContractReturns['set_implicit_key_arc4_address(address)void'] + }> + & Record<'set_implicit_key_arc4_uint128(uint128)void' | 'set_implicit_key_arc4_uint128', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_uint128(uint128)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_uint128(uint128)void'] + returns: GlobalStateContractReturns['set_implicit_key_arc4_uint128(uint128)void'] + }> + & Record<'set_implicit_key_arc4_dynamic_bytes(byte[])void' | 'set_implicit_key_arc4_dynamic_bytes', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_dynamic_bytes(byte[])void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_dynamic_bytes(byte[])void'] + returns: GlobalStateContractReturns['set_implicit_key_arc4_dynamic_bytes(byte[])void'] + }> + & Record<'set_implicit_key_tuple((uint64,byte[],bool))void' | 'set_implicit_key_tuple', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_tuple((uint64,byte[],bool))void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_tuple((uint64,byte[],bool))void'] + returns: GlobalStateContractReturns['set_implicit_key_tuple((uint64,byte[],bool))void'] + }> + & Record<'set_arc4_uint(uint64)void' | 'set_arc4_uint', { + argsObj: GlobalStateContractArgs['obj']['set_arc4_uint(uint64)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_arc4_uint(uint64)void'] + returns: GlobalStateContractReturns['set_arc4_uint(uint64)void'] + }> + & Record<'set_arc4_string(string)void' | 'set_arc4_string', { + argsObj: GlobalStateContractArgs['obj']['set_arc4_string(string)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_arc4_string(string)void'] + returns: GlobalStateContractReturns['set_arc4_string(string)void'] + }> + & Record<'set_arc4_byte(byte)void' | 'set_arc4_byte', { + argsObj: GlobalStateContractArgs['obj']['set_arc4_byte(byte)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_arc4_byte(byte)void'] + returns: GlobalStateContractReturns['set_arc4_byte(byte)void'] + }> + & Record<'set_arc4_bool(bool)void' | 'set_arc4_bool', { + argsObj: GlobalStateContractArgs['obj']['set_arc4_bool(bool)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_arc4_bool(bool)void'] + returns: GlobalStateContractReturns['set_arc4_bool(bool)void'] + }> + & Record<'set_arc4_address(address)void' | 'set_arc4_address', { + argsObj: GlobalStateContractArgs['obj']['set_arc4_address(address)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_arc4_address(address)void'] + returns: GlobalStateContractReturns['set_arc4_address(address)void'] + }> + & Record<'set_arc4_uint128(uint128)void' | 'set_arc4_uint128', { + argsObj: GlobalStateContractArgs['obj']['set_arc4_uint128(uint128)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_arc4_uint128(uint128)void'] + returns: GlobalStateContractReturns['set_arc4_uint128(uint128)void'] + }> + & Record<'set_arc4_dynamic_bytes(byte[])void' | 'set_arc4_dynamic_bytes', { + argsObj: GlobalStateContractArgs['obj']['set_arc4_dynamic_bytes(byte[])void'] + argsTuple: GlobalStateContractArgs['tuple']['set_arc4_dynamic_bytes(byte[])void'] + returns: GlobalStateContractReturns['set_arc4_dynamic_bytes(byte[])void'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + global: { + keys: { + implicitKeyArc4Uint: bigint + implicitKeyArc4String: string + implicitKeyArc4Byte: number + implicitKeyArc4Bool: boolean + implicitKeyArc4Address: string + implicitKeyArc4Uint128: bigint + implicitKeyArc4DynamicBytes: Uint8Array + implicitKeyTuple: [bigint, Uint8Array, boolean] + arc4Uint: bigint + arc4String: string + arc4Byte: number + arc4Bool: boolean + arc4Address: string + arc4Uint128: bigint + arc4DynamicBytes: Uint8Array + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type GlobalStateContractSignatures = keyof GlobalStateContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type GlobalStateContractNonVoidMethodSignatures = keyof GlobalStateContractTypes['methods'] extends infer T ? T extends keyof GlobalStateContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the GlobalStateContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = GlobalStateContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the GlobalStateContract smart contract to the method's return type + */ +export type MethodReturn = GlobalStateContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed global state of the application. + */ +export type GlobalKeysState = GlobalStateContractTypes['state']['global']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type GlobalStateContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type GlobalStateContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: GlobalStateContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the GlobalStateContract smart contract + */ +export abstract class GlobalStateContractParamsFactory { + /** + * Constructs a no op call for the get_implicit_key_arc4_uint()uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_uint()uint64' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_string()string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_string()string' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_byte()byte ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_byte()byte' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_bool()bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_bool()bool' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_address()address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_address()address' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_uint128()uint128 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_uint128()uint128' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_dynamic_bytes()byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_dynamic_bytes()byte[]' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_implicit_key_tuple()(uint64,byte[],bool) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_tuple()(uint64,byte[],bool)' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_arc4_uint()uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_uint()uint64' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_arc4_string()string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_string()string' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_arc4_byte()byte ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_byte()byte' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_arc4_bool()bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_bool()bool' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_arc4_address()address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_address()address' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_arc4_uint128()uint128 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_uint128()uint128' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_arc4_dynamic_bytes()byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_dynamic_bytes()byte[]' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the set_implicit_key_arc4_uint(uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_arc4_uint(uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_implicit_key_arc4_string(string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_arc4_string(string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_implicit_key_arc4_byte(byte)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_arc4_byte(byte)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_implicit_key_arc4_bool(bool)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_arc4_bool(bool)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_implicit_key_arc4_address(address)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_arc4_address(address)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_implicit_key_arc4_uint128(uint128)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_arc4_uint128(uint128)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_implicit_key_arc4_dynamic_bytes(byte[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_arc4_dynamic_bytes(byte[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_implicit_key_tuple((uint64,byte[],bool))void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_tuple((uint64,byte[],bool))void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_arc4_uint(uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_arc4_uint(uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_arc4_string(string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_arc4_string(string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_arc4_byte(byte)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_arc4_byte(byte)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_arc4_bool(bool)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_arc4_bool(bool)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_arc4_address(address)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_arc4_address(address)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_arc4_uint128(uint128)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_arc4_uint128(uint128)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_arc4_dynamic_bytes(byte[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_arc4_dynamic_bytes(byte[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } +} + +/** + * A factory to create and deploy one or more instance of the GlobalStateContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class GlobalStateContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `GlobalStateContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new GlobalStateContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new GlobalStateContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the GlobalStateContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: GlobalStateContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new GlobalStateContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the GlobalStateContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the GlobalStateContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the GlobalStateContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new GlobalStateContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the GlobalStateContract smart contract + */ +export class GlobalStateContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `GlobalStateContractClient` + * + * @param appClient An `AppClient` instance which has been created with the GlobalStateContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `GlobalStateContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `GlobalStateContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new GlobalStateContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `GlobalStateContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new GlobalStateContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the GlobalStateContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_string()string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_byte()byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_bool()bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_address()address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint128()uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes()byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_tuple()(uint64,byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyTuple(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_string()string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_byte()byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_bool()bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_address()address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint128()uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_dynamic_bytes()byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_string(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_byte(byte)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_bool(bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_address(address)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint128(uint128)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_dynamic_bytes(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_tuple((uint64,byte[],bool))void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyTuple(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_string(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_byte(byte)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_bool(bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_address(address)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint128(uint128)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_dynamic_bytes(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4DynamicBytes(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the GlobalStateContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_string()string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_byte()byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_bool()bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_address()address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint128()uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes()byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_tuple()(uint64,byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyTuple(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_string()string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_byte()byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_bool()bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_address()address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint128()uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_dynamic_bytes()byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_string(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_byte(byte)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_bool(bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_address(address)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint128(uint128)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_dynamic_bytes(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_tuple((uint64,byte[],bool))void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyTuple(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_string(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_byte(byte)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_bool(bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_address(address)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint128(uint128)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_dynamic_bytes(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4DynamicBytes(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the GlobalStateContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_uint()uint64'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_string()string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4String(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_string()string'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_byte()byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_byte()byte'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_bool()bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_bool()bool'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_address()address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Address(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_address()address'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint128()uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_uint128()uint128'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes()byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_dynamic_bytes()byte[]'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_tuple()(uint64,byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyTuple(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_tuple()(uint64,byte[],bool)'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Uint(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_uint()uint64'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_string()string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4String(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_string()string'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_byte()byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Byte(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_byte()byte'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_bool()bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Bool(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_bool()bool'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_address()address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Address(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_address()address'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint128()uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Uint128(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_uint128()uint128'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_dynamic_bytes()byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4DynamicBytes(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_dynamic_bytes()byte[]'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_uint(uint64)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_string(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4String(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_string(string)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_byte(byte)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Byte(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_byte(byte)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_bool(bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Bool(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_bool(bool)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_address(address)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Address(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_address(address)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint128(uint128)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint128(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_uint128(uint128)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_dynamic_bytes(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4DynamicBytes(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_dynamic_bytes(byte[])void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_tuple((uint64,byte[],bool))void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyTuple(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_tuple((uint64,byte[],bool))void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Uint(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_uint(uint64)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_string(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4String(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_string(string)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_byte(byte)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Byte(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_byte(byte)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_bool(bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Bool(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_bool(bool)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_address(address)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Address(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_address(address)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint128(uint128)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Uint128(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_uint128(uint128)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_dynamic_bytes(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4DynamicBytes(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_dynamic_bytes(byte[])void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new GlobalStateContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current GlobalStateContract app + */ + state = { + /** + * Methods to access global state for the current GlobalStateContract app + */ + global: { + /** + * Get all current keyed values from global state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.global.getAll() + return { + implicitKeyArc4Uint: result.implicit_key_arc4_uint, + implicitKeyArc4String: result.implicit_key_arc4_string, + implicitKeyArc4Byte: result.implicit_key_arc4_byte, + implicitKeyArc4Bool: result.implicit_key_arc4_bool, + implicitKeyArc4Address: result.implicit_key_arc4_address, + implicitKeyArc4Uint128: result.implicit_key_arc4_uint128, + implicitKeyArc4DynamicBytes: result.implicit_key_arc4_dynamic_bytes, + implicitKeyTuple: result.implicit_key_tuple, + arc4Uint: result.arc4_uint, + arc4String: result.arc4_string, + arc4Byte: result.arc4_byte, + arc4Bool: result.arc4_bool, + arc4Address: result.arc4_address, + arc4Uint128: result.arc4_uint128, + arc4DynamicBytes: result.arc4_dynamic_bytes, + } + }, + /** + * Get the current value of the implicit_key_arc4_uint key in global state + */ + implicitKeyArc4Uint: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_uint")) as bigint | undefined }, + /** + * Get the current value of the implicit_key_arc4_string key in global state + */ + implicitKeyArc4String: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_string")) as string | undefined }, + /** + * Get the current value of the implicit_key_arc4_byte key in global state + */ + implicitKeyArc4Byte: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_byte")) as number | undefined }, + /** + * Get the current value of the implicit_key_arc4_bool key in global state + */ + implicitKeyArc4Bool: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_bool")) as boolean | undefined }, + /** + * Get the current value of the implicit_key_arc4_address key in global state + */ + implicitKeyArc4Address: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_address")) as string | undefined }, + /** + * Get the current value of the implicit_key_arc4_uint128 key in global state + */ + implicitKeyArc4Uint128: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_uint128")) as bigint | undefined }, + /** + * Get the current value of the implicit_key_arc4_dynamic_bytes key in global state + */ + implicitKeyArc4DynamicBytes: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_dynamic_bytes")) as Uint8Array | undefined }, + /** + * Get the current value of the implicit_key_tuple key in global state + */ + implicitKeyTuple: async (): Promise<[bigint, Uint8Array, boolean] | undefined> => { return (await this.appClient.state.global.getValue("implicit_key_tuple")) as [bigint, Uint8Array, boolean] | undefined }, + /** + * Get the current value of the arc4_uint key in global state + */ + arc4Uint: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_uint")) as bigint | undefined }, + /** + * Get the current value of the arc4_string key in global state + */ + arc4String: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_string")) as string | undefined }, + /** + * Get the current value of the arc4_byte key in global state + */ + arc4Byte: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_byte")) as number | undefined }, + /** + * Get the current value of the arc4_bool key in global state + */ + arc4Bool: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_bool")) as boolean | undefined }, + /** + * Get the current value of the arc4_address key in global state + */ + arc4Address: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_address")) as string | undefined }, + /** + * Get the current value of the arc4_uint128 key in global state + */ + arc4Uint128: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_uint128")) as bigint | undefined }, + /** + * Get the current value of the arc4_dynamic_bytes key in global state + */ + arc4DynamicBytes: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_dynamic_bytes")) as Uint8Array | undefined }, + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): GlobalStateContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a get_implicit_key_arc4_uint()uint64 method call against the GlobalStateContract contract + */ + getImplicitKeyArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Uint(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_string()string method call against the GlobalStateContract contract + */ + getImplicitKeyArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4String(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_byte()byte method call against the GlobalStateContract contract + */ + getImplicitKeyArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Byte(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_bool()bool method call against the GlobalStateContract contract + */ + getImplicitKeyArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Bool(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_address()address method call against the GlobalStateContract contract + */ + getImplicitKeyArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Address(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_uint128()uint128 method call against the GlobalStateContract contract + */ + getImplicitKeyArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Uint128(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_dynamic_bytes()byte[] method call against the GlobalStateContract contract + */ + getImplicitKeyArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4DynamicBytes(params))) + return this + }, + /** + * Add a get_implicit_key_tuple()(uint64,byte[],bool) method call against the GlobalStateContract contract + */ + getImplicitKeyTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyTuple(params))) + return this + }, + /** + * Add a get_arc4_uint()uint64 method call against the GlobalStateContract contract + */ + getArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Uint(params))) + return this + }, + /** + * Add a get_arc4_string()string method call against the GlobalStateContract contract + */ + getArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4String(params))) + return this + }, + /** + * Add a get_arc4_byte()byte method call against the GlobalStateContract contract + */ + getArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Byte(params))) + return this + }, + /** + * Add a get_arc4_bool()bool method call against the GlobalStateContract contract + */ + getArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Bool(params))) + return this + }, + /** + * Add a get_arc4_address()address method call against the GlobalStateContract contract + */ + getArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Address(params))) + return this + }, + /** + * Add a get_arc4_uint128()uint128 method call against the GlobalStateContract contract + */ + getArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Uint128(params))) + return this + }, + /** + * Add a get_arc4_dynamic_bytes()byte[] method call against the GlobalStateContract contract + */ + getArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4DynamicBytes(params))) + return this + }, + /** + * Add a set_implicit_key_arc4_uint(uint64)void method call against the GlobalStateContract contract + */ + setImplicitKeyArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Uint(params))) + return this + }, + /** + * Add a set_implicit_key_arc4_string(string)void method call against the GlobalStateContract contract + */ + setImplicitKeyArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4String(params))) + return this + }, + /** + * Add a set_implicit_key_arc4_byte(byte)void method call against the GlobalStateContract contract + */ + setImplicitKeyArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Byte(params))) + return this + }, + /** + * Add a set_implicit_key_arc4_bool(bool)void method call against the GlobalStateContract contract + */ + setImplicitKeyArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Bool(params))) + return this + }, + /** + * Add a set_implicit_key_arc4_address(address)void method call against the GlobalStateContract contract + */ + setImplicitKeyArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Address(params))) + return this + }, + /** + * Add a set_implicit_key_arc4_uint128(uint128)void method call against the GlobalStateContract contract + */ + setImplicitKeyArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Uint128(params))) + return this + }, + /** + * Add a set_implicit_key_arc4_dynamic_bytes(byte[])void method call against the GlobalStateContract contract + */ + setImplicitKeyArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4DynamicBytes(params))) + return this + }, + /** + * Add a set_implicit_key_tuple((uint64,byte[],bool))void method call against the GlobalStateContract contract + */ + setImplicitKeyTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyTuple(params))) + return this + }, + /** + * Add a set_arc4_uint(uint64)void method call against the GlobalStateContract contract + */ + setArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Uint(params))) + return this + }, + /** + * Add a set_arc4_string(string)void method call against the GlobalStateContract contract + */ + setArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4String(params))) + return this + }, + /** + * Add a set_arc4_byte(byte)void method call against the GlobalStateContract contract + */ + setArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Byte(params))) + return this + }, + /** + * Add a set_arc4_bool(bool)void method call against the GlobalStateContract contract + */ + setArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Bool(params))) + return this + }, + /** + * Add a set_arc4_address(address)void method call against the GlobalStateContract contract + */ + setArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Address(params))) + return this + }, + /** + * Add a set_arc4_uint128(uint128)void method call against the GlobalStateContract contract + */ + setArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Uint128(params))) + return this + }, + /** + * Add a set_arc4_dynamic_bytes(byte[])void method call against the GlobalStateContract contract + */ + setArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4DynamicBytes(params))) + return this + }, + /** + * Add a clear state call to the GlobalStateContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as GlobalStateContractComposer + } +} +export type GlobalStateContractComposer = { + /** + * Calls the get_implicit_key_arc4_uint()uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Uint(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_uint()uint64'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_string()string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4String(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_string()string'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_byte()byte ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Byte(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_byte()byte'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_bool()bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Bool(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_bool()bool'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_address()address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Address(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_address()address'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_uint128()uint128 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Uint128(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_uint128()uint128'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_dynamic_bytes()byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4DynamicBytes(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_dynamic_bytes()byte[]'] | undefined]> + + /** + * Calls the get_implicit_key_tuple()(uint64,byte[],bool) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyTuple(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_tuple()(uint64,byte[],bool)'] | undefined]> + + /** + * Calls the get_arc4_uint()uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Uint(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_uint()uint64'] | undefined]> + + /** + * Calls the get_arc4_string()string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4String(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_string()string'] | undefined]> + + /** + * Calls the get_arc4_byte()byte ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Byte(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_byte()byte'] | undefined]> + + /** + * Calls the get_arc4_bool()bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Bool(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_bool()bool'] | undefined]> + + /** + * Calls the get_arc4_address()address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Address(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_address()address'] | undefined]> + + /** + * Calls the get_arc4_uint128()uint128 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Uint128(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_uint128()uint128'] | undefined]> + + /** + * Calls the get_arc4_dynamic_bytes()byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4DynamicBytes(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_dynamic_bytes()byte[]'] | undefined]> + + /** + * Calls the set_implicit_key_arc4_uint(uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyArc4Uint(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_uint(uint64)void'] | undefined]> + + /** + * Calls the set_implicit_key_arc4_string(string)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyArc4String(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_string(string)void'] | undefined]> + + /** + * Calls the set_implicit_key_arc4_byte(byte)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyArc4Byte(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_byte(byte)void'] | undefined]> + + /** + * Calls the set_implicit_key_arc4_bool(bool)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyArc4Bool(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_bool(bool)void'] | undefined]> + + /** + * Calls the set_implicit_key_arc4_address(address)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyArc4Address(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_address(address)void'] | undefined]> + + /** + * Calls the set_implicit_key_arc4_uint128(uint128)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyArc4Uint128(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_uint128(uint128)void'] | undefined]> + + /** + * Calls the set_implicit_key_arc4_dynamic_bytes(byte[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyArc4DynamicBytes(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_dynamic_bytes(byte[])void'] | undefined]> + + /** + * Calls the set_implicit_key_tuple((uint64,byte[],bool))void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyTuple(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_tuple((uint64,byte[],bool))void'] | undefined]> + + /** + * Calls the set_arc4_uint(uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setArc4Uint(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_uint(uint64)void'] | undefined]> + + /** + * Calls the set_arc4_string(string)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setArc4String(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_string(string)void'] | undefined]> + + /** + * Calls the set_arc4_byte(byte)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setArc4Byte(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_byte(byte)void'] | undefined]> + + /** + * Calls the set_arc4_bool(bool)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setArc4Bool(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_bool(bool)void'] | undefined]> + + /** + * Calls the set_arc4_address(address)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setArc4Address(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_address(address)void'] | undefined]> + + /** + * Calls the set_arc4_uint128(uint128)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setArc4Uint128(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_uint128(uint128)void'] | undefined]> + + /** + * Calls the set_arc4_dynamic_bytes(byte[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setArc4DynamicBytes(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_dynamic_bytes(byte[])void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the GlobalStateContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): GlobalStateContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): GlobalStateContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type GlobalStateContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateValidator.ts b/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateValidator.ts new file mode 100644 index 0000000..483c414 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateValidator.ts @@ -0,0 +1,557 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"GlobalStateValidator","structs":{},"methods":[{"name":"validate_g_args","args":[{"type":"uint64","name":"arg1"},{"type":"string","name":"arg2"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[72],"errorMessage":"transaction type is appl"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHhjMGViNWM2NwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIEdsb2JhbFN0YXRlVmFsaWRhdG9yKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBieXRlY18wIC8vIG1ldGhvZCAidmFsaWRhdGVfZ19hcmdzKHVpbnQ2NCxzdHJpbmcpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdmFsaWRhdGVfZ19hcmdzX3JvdXRlQDMKICAgIGVycgoKbWFpbl92YWxpZGF0ZV9nX2FyZ3Nfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIHZhbGlkYXRlX2dfYXJncwoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuR2xvYmFsU3RhdGVWYWxpZGF0b3IuY29udHJhY3QuR2xvYmFsU3RhdGVWYWxpZGF0b3IudmFsaWRhdGVfZ19hcmdzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmFsaWRhdGVfZ19hcmdzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjcKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygwKSA9PSBhcmM0LmFyYzRfc2lnbmF0dXJlKCJ2YWxpZGF0ZV9nX2FyZ3ModWludDY0LHN0cmluZyl2b2lkIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIGJ5dGVjXzAgLy8gbWV0aG9kICJ2YWxpZGF0ZV9nX2FyZ3ModWludDY0LHN0cmluZyl2b2lkIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjgKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygxKSA9PSBhcmcxLmJ5dGVzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjkKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygyKSA9PSBhcmcyLmJ5dGVzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6MTAKICAgIC8vIGFzc2VydCBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKFR4bi5ncm91cF9pbmRleCkuYXBwX2FyZ3MoMSkgPT0gYXJnMS5ieXRlcwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgcHVzaGludCAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weToxMQogICAgLy8gYXNzZXJ0IGd0eG4uVHJhbnNhY3Rpb24oVHhuLmdyb3VwX2luZGV4KS5hcHBfYXJncygxKSA9PSBhcmcxLmJ5dGVzCiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weToxMgogICAgLy8gYXNzZXJ0IG9wLkdUeG4uYXBwbGljYXRpb25fYXJncyhUeG4uZ3JvdXBfaW5kZXgsIDEpID09IGFyZzEuYnl0ZXMKICAgIHR4biBHcm91cEluZGV4CiAgICBndHhuc2EgQXBwbGljYXRpb25BcmdzIDEKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6MTMKICAgIC8vIGFzc2VydCBvcC5UeG4uYXBwbGljYXRpb25fYXJncygxKSA9PSBhcmcxLmJ5dGVzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyYBBMDrXGcxG0EAEyg2GgCOAQABADEZFDEYEERCAAgxGRQxGBQQQzYaATYaAjYaACgSRDYaAUsCEkQ2GgISRDEWSTgQgQYSRIEBwhpLARJEMRaBAcIaSwESRDEWORoBSwESRDYaARJEgQFD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the GlobalStateValidator contract + */ +export type GlobalStateValidatorArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'validate_g_args(uint64,string)void': { + arg1: bigint | number + arg2: string + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'validate_g_args(uint64,string)void': [arg1: bigint | number, arg2: string] + } +} + +/** + * The return type for each method + */ +export type GlobalStateValidatorReturns = { + 'validate_g_args(uint64,string)void': void +} + +/** + * Defines the types of available calls and state of the GlobalStateValidator smart contract. + */ +export type GlobalStateValidatorTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'validate_g_args(uint64,string)void' | 'validate_g_args', { + argsObj: GlobalStateValidatorArgs['obj']['validate_g_args(uint64,string)void'] + argsTuple: GlobalStateValidatorArgs['tuple']['validate_g_args(uint64,string)void'] + returns: GlobalStateValidatorReturns['validate_g_args(uint64,string)void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type GlobalStateValidatorSignatures = keyof GlobalStateValidatorTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the GlobalStateValidator smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = GlobalStateValidatorTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the GlobalStateValidator smart contract to the method's return type + */ +export type MethodReturn = GlobalStateValidatorTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type GlobalStateValidatorCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type GlobalStateValidatorDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: GlobalStateValidatorCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the GlobalStateValidator smart contract + */ +export abstract class GlobalStateValidatorParamsFactory { + /** + * Constructs a no op call for the validate_g_args(uint64,string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static validateGArgs(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'validate_g_args(uint64,string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arg1, params.args.arg2], + } + } +} + +/** + * A factory to create and deploy one or more instance of the GlobalStateValidator smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class GlobalStateValidatorFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `GlobalStateValidatorFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new GlobalStateValidatorClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new GlobalStateValidatorClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the GlobalStateValidator smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: GlobalStateValidatorDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new GlobalStateValidatorClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the GlobalStateValidator smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the GlobalStateValidator smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the GlobalStateValidator smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new GlobalStateValidatorClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the GlobalStateValidator smart contract + */ +export class GlobalStateValidatorClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `GlobalStateValidatorClient` + * + * @param appClient An `AppClient` instance which has been created with the GlobalStateValidator app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `GlobalStateValidatorClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `GlobalStateValidatorClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new GlobalStateValidatorClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `GlobalStateValidatorClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new GlobalStateValidatorClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the GlobalStateValidator smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the GlobalStateValidator smart contract using the `validate_g_args(uint64,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + validateGArgs: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateValidatorParamsFactory.validateGArgs(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the GlobalStateValidator smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the GlobalStateValidator smart contract using the `validate_g_args(uint64,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + validateGArgs: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateValidatorParamsFactory.validateGArgs(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the GlobalStateValidator smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the GlobalStateValidator smart contract using the `validate_g_args(uint64,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + validateGArgs: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateValidatorParamsFactory.validateGArgs(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateValidatorReturns['validate_g_args(uint64,string)void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new GlobalStateValidatorClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current GlobalStateValidator app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): GlobalStateValidatorComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a validate_g_args(uint64,string)void method call against the GlobalStateValidator contract + */ + validateGArgs(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.validateGArgs(params))) + return this + }, + /** + * Add a clear state call to the GlobalStateValidator contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as GlobalStateValidatorComposer + } +} +export type GlobalStateValidatorComposer = { + /** + * Calls the validate_g_args(uint64,string)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + validateGArgs(params?: CallParams): GlobalStateValidatorComposer<[...TReturns, GlobalStateValidatorReturns['validate_g_args(uint64,string)void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the GlobalStateValidator smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): GlobalStateValidatorComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): GlobalStateValidatorComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type GlobalStateValidatorComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/HelloWorld.ts b/examples/p-py/projects/p-py-frontend/src/contracts/HelloWorld.ts index 1fc6caf..e60b7c5 100644 --- a/examples/p-py/projects/p-py-frontend/src/contracts/HelloWorld.ts +++ b/examples/p-py/projects/p-py-frontend/src/contracts/HelloWorld.ts @@ -2,29 +2,19 @@ /** * This file was automatically generated by @algorandfoundation/algokit-client-generator. * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^7 + * requires: @algorandfoundation/algokit-utils: ^10 */ import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app' -import { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56' -import { - AppClient as _AppClient, - AppClientMethodCallParams, - AppClientParams, - AppClientBareCallParams, - CallOnComplete, - AppClientCompilationParams, - ResolveAppClientByCreatorAndName, - ResolveAppClientByNetwork, - CloneAppClientParams, -} from '@algorandfoundation/algokit-utils/types/app-client' -import { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer' -import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' -import SimulateResponse = modelsv2.SimulateResponse - -export const APP_SPEC: Arc56Contract = {"name":"HelloWorld","structs":{},"methods":[{"name":"hello","args":[{"type":"string","name":"name"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[37],"errorMessage":"OnCompletion must be NoOp && can only call when creating"},{"pc":[26],"errorMessage":"OnCompletion must be NoOp && can only call when not creating"},{"pc":[47],"errorMessage":"invalid array length header"},{"pc":[55],"errorMessage":"invalid number of bytes for arc4.dynamic_array"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5weTo1CiAgICAvLyBjbGFzcyBIZWxsb1dvcmxkKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2hlbGxvX3JvdXRlQDMKICAgIGVycgoKbWFpbl9oZWxsb19yb3V0ZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LnB5OjYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBiIGhlbGxvCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5oZWxsb193b3JsZC5jb250cmFjdC5IZWxsb1dvcmxkLmhlbGxvW3JvdXRpbmddKCkgLT4gdm9pZDoKaGVsbG86CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QucHk6NgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIHB1c2hpbnQgMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LnB5OjgKICAgIC8vIHJldHVybiAiSGVsbG8sICIgKyBuYW1lCiAgICBwdXNoYnl0ZXMgIkhlbGxvLCAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5weTo2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"byteCode":{"approval":"CzEbQQAYgAQCvs4RNhoAjgEAAQAxGRQxGBBEQgALMRkUMRgUEESBAUM2GgFJgQBZgQIISwEVEkRXAgCAB0hlbGxvLCBMUEkVFlcGAkxQgAQVH3x1TFCwgQFD","clear":"C4EBQw=="},"compilerInfo":{"compiler":"puya","compilerVersion":{"major":5,"minor":4,"patch":0}},"events":[],"templateVariables":{}} as unknown as Arc56Contract +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"HelloWorld","structs":{},"methods":[{"name":"hello","args":[{"type":"string","name":"name"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[44],"errorMessage":"invalid array length header"},{"pc":[52],"errorMessage":"invalid number of bytes for arc4.dynamic_array"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5weTo1CiAgICAvLyBjbGFzcyBIZWxsb1dvcmxkKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2hlbGxvX3JvdXRlQDMKICAgIGVycgoKbWFpbl9oZWxsb19yb3V0ZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LnB5OjYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgaGVsbG8KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLmhlbGxvX3dvcmxkLmNvbnRyYWN0LkhlbGxvV29ybGQuaGVsbG9bcm91dGluZ10oKSAtPiB2b2lkOgpoZWxsbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5weTo2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgcHVzaGludCAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5weTo4CiAgICAvLyByZXR1cm4gIkhlbGxvLCAiICsgbmFtZQogICAgcHVzaGJ5dGVzICJIZWxsbywgIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QucHk6NgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgAQCvs4RNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEM2GgFJgQBZgQIISwEVEkRXAgCAB0hlbGxvLCBMUEkVFlcGAkxQgAQVH3x1TFCwgQFD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract /** * A state record containing binary data @@ -137,7 +127,7 @@ export type MethodReturn = HelloWorldTy * Defines supported create method params for this smart contract */ export type HelloWorldCreateCallParams = - | Expand + | Expand /** * Defines arguments required for the deploy method. */ @@ -258,7 +248,7 @@ export class HelloWorldFactory { * @param params The params for the bare (raw) call * @returns The params for a create call */ - bare: (params?: Expand) => { + bare: (params?: Expand) => { return this.appFactory.params.bare.create(params) }, }, @@ -279,7 +269,7 @@ export class HelloWorldFactory { * @param params The params for the bare (raw) call * @returns The transaction for a create call */ - bare: (params?: Expand) => { + bare: (params?: Expand) => { return this.appFactory.createTransaction.bare.create(params) }, }, @@ -300,7 +290,7 @@ export class HelloWorldFactory { * @param params The params for the bare (raw) call * @returns The create result */ - bare: async (params?: Expand) => { + bare: async (params?: Expand) => { const result = await this.appFactory.send.bare.create(params) return { result: result.result, appClient: new HelloWorldClient(result.appClient) } }, @@ -336,15 +326,7 @@ export class HelloWorldClient { appSpec: APP_SPEC, }) } - - /** - * Checks for decode errors on the given return value and maps the return value to the return type for the given method - * @returns The typed return value or undefined if there was no value - */ - decodeReturnValue(method: TSignature, returnValue: ABIReturn | undefined) { - return returnValue !== undefined ? getArc56ReturnValue>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined - } - + /** * Returns a new `HelloWorldClient` client, resolving the app by creator address and name * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). @@ -412,7 +394,7 @@ export class HelloWorldClient { * @param params The params for the smart contract call * @returns The call params */ - hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + hello: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { return this.appClient.params.call(HelloWorldParamsFactory.hello(params)) }, @@ -438,7 +420,7 @@ export class HelloWorldClient { * @param params The params for the smart contract call * @returns The call transaction */ - hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + hello: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { return this.appClient.createTransaction.call(HelloWorldParamsFactory.hello(params)) }, @@ -464,7 +446,7 @@ export class HelloWorldClient { * @param params The params for the smart contract call * @returns The call result */ - hello: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + hello: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { const result = await this.appClient.send.call(HelloWorldParamsFactory.hello(params)) return {...result, return: result.return as unknown as (undefined | HelloWorldReturns['hello(string)string'])} }, @@ -474,7 +456,7 @@ export class HelloWorldClient { /** * Clone this app client with different params * - * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. * @returns A new app client with the altered params */ public clone(params: CloneAppClientParams) { @@ -487,18 +469,16 @@ export class HelloWorldClient { state = { } - public newGroup(): HelloWorldComposer { + public newGroup(composerConfig?: TransactionComposerConfig): HelloWorldComposer { const client = this - const composer = this.algorand.newGroup() + const composer = this.algorand.newGroup(composerConfig) let promiseChain:Promise = Promise.resolve() - const resultMappers: Array any)> = [] return { /** * Add a hello(string)string method call against the HelloWorld contract */ - hello(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + hello(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hello(params))) - resultMappers.push((v) => client.decodeReturnValue('hello(string)string', v)) return this }, /** @@ -521,7 +501,7 @@ export class HelloWorldClient { const result = await (!options ? composer.simulate() : composer.simulate(options)) return { ...result, - returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + returns: result.returns?.map(val => val.returnValue) } }, async send(params?: SendParams) { @@ -529,7 +509,7 @@ export class HelloWorldClient { const result = await composer.send(params) return { ...result, - returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + returns: result.returns?.map(val => val.returnValue) } } } as unknown as HelloWorldComposer @@ -539,7 +519,6 @@ export type HelloWorldComposer = { /** * Calls the hello(string)string ABI method. * - * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ @@ -548,7 +527,7 @@ export type HelloWorldComposer = { /** * Makes a clear_state call to an existing instance of the HelloWorld smart contract. * - * @param args The arguments for the bare call + * @param params Any additional parameters for the bare call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ clearState(params?: AppClientBareCallParams): HelloWorldComposer<[...TReturns, undefined]> @@ -575,7 +554,7 @@ export type HelloWorldComposer = { */ send(params?: SendParams): Promise> } -export type HelloWorldComposerResults = Expand = Expand diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ITxnOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ITxnOpsContract.ts new file mode 100644 index 0000000..a3d8854 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/ITxnOpsContract.ts @@ -0,0 +1,554 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"ITxnOpsContract","structs":{},"methods":[{"name":"verify_itxn_ops","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYgMTAwMAogICAgYnl0ZWNibG9jayAweDA2ODEwMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ4OAogICAgLy8gY2xhc3MgSVR4bk9wc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHg0ZTdjZDljYiAvLyBtZXRob2QgInZlcmlmeV9pdHhuX29wcygpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdmVyaWZ5X2l0eG5fb3BzX3JvdXRlQDMKICAgIGVycgoKbWFpbl92ZXJpZnlfaXR4bl9vcHNfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiB2ZXJpZnlfaXR4bl9vcHMKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LklUeG5PcHNDb250cmFjdC52ZXJpZnlfaXR4bl9vcHNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfaXR4bl9vcHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDkxCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5iZWdpbigpCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDkyCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfdHlwZV9lbnVtKGFsZ29weS5UcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTMKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9vbl9jb21wbGV0aW9uKGFsZ29weS5PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uKQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ5NAogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc2V0X2FwcHJvdmFsX3Byb2dyYW0oQnl0ZXMuZnJvbV9oZXgoIjA2ODEwMSIpKQogICAgYnl0ZWNfMCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTUtNDk2CiAgICAvLyAjIHBhZ2VzIGVzc2VudGlhbGx5IGFwcGVuZHMKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9hcHByb3ZhbF9wcm9ncmFtX3BhZ2VzKEJ5dGVzLmZyb21faGV4KCIwNjgxMDEiKSkKICAgIGJ5dGVjXzAgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTcKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9jbGVhcl9zdGF0ZV9wcm9ncmFtKEJ5dGVzLmZyb21faGV4KCIwNjgxMDEiKSkKICAgIGJ5dGVjXzAgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTgKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9mZWUoYWxnb3B5Lm9wLkdsb2JhbC5taW5fdHhuX2ZlZSkKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDk5CiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5uZXh0KCkKICAgIGl0eG5fbmV4dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwMAogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc2V0X3R5cGVfZW51bShhbGdvcHkuVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpCiAgICBpbnRjXzAgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTAxCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfcmVjZWl2ZXIoYWxnb3B5Lm9wLkdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MDIKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9hbW91bnQoYWxnb3B5LlVJbnQ2NCgxMDAwKSkKICAgIGludGNfMiAvLyAxMDAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwMwogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA1CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLklUeG4ucmVjZWl2ZXIoKSA9PSBhbGdvcHkub3AuR2xvYmFsLmNyZWF0b3JfYWRkcmVzcwogICAgaXR4biBSZWNlaXZlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA2CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLklUeG4uYW1vdW50KCkgPT0gYWxnb3B5LlVJbnQ2NCgxMDAwKQogICAgaXR4biBBbW91bnQKICAgIGludGNfMiAvLyAxMDAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA3CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLklUeG4udHlwZV9lbnVtKCkgPT0gYWxnb3B5LlRyYW5zYWN0aW9uVHlwZS5QYXltZW50CiAgICBpdHhuIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA5CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLkdJVHhuLnR5cGVfZW51bSgwKSA9PSBhbGdvcHkuVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgZ2l0eG4gMCBUeXBlRW51bQogICAgaW50Y18xIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTAKICAgIC8vIGFzc2VydCBhbGdvcHkub3AuR0lUeG4udHlwZV9lbnVtKDEpID09IGFsZ29weS5UcmFuc2FjdGlvblR5cGUuUGF5bWVudAogICAgZ2l0eG4gMSBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyADAQboByYBAwaBATEbQQAYgAROfNnLNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEOxI7IQgQWyGSiyHiiyQCiyHzIAsgG2IrIQMgmyBySyCLO0BzIJEkS0CCQSRLQQIhJEtwAQIxJEtwEQIhJEIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the ITxnOpsContract contract + */ +export type ITxnOpsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_itxn_ops()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_itxn_ops()void': [] + } +} + +/** + * The return type for each method + */ +export type ITxnOpsContractReturns = { + 'verify_itxn_ops()void': void +} + +/** + * Defines the types of available calls and state of the ITxnOpsContract smart contract. + */ +export type ITxnOpsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_itxn_ops()void' | 'verify_itxn_ops', { + argsObj: ITxnOpsContractArgs['obj']['verify_itxn_ops()void'] + argsTuple: ITxnOpsContractArgs['tuple']['verify_itxn_ops()void'] + returns: ITxnOpsContractReturns['verify_itxn_ops()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type ITxnOpsContractSignatures = keyof ITxnOpsContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the ITxnOpsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = ITxnOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the ITxnOpsContract smart contract to the method's return type + */ +export type MethodReturn = ITxnOpsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type ITxnOpsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type ITxnOpsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: ITxnOpsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the ITxnOpsContract smart contract + */ +export abstract class ITxnOpsContractParamsFactory { + /** + * Constructs a no op call for the verify_itxn_ops()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyItxnOps(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_itxn_ops()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the ITxnOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class ITxnOpsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `ITxnOpsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new ITxnOpsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new ITxnOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the ITxnOpsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: ITxnOpsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new ITxnOpsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ITxnOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ITxnOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ITxnOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new ITxnOpsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the ITxnOpsContract smart contract + */ +export class ITxnOpsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `ITxnOpsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the ITxnOpsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `ITxnOpsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `ITxnOpsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new ITxnOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `ITxnOpsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new ITxnOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the ITxnOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the ITxnOpsContract smart contract using the `verify_itxn_ops()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyItxnOps: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ITxnOpsContractParamsFactory.verifyItxnOps(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the ITxnOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the ITxnOpsContract smart contract using the `verify_itxn_ops()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyItxnOps: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ITxnOpsContractParamsFactory.verifyItxnOps(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the ITxnOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the ITxnOpsContract smart contract using the `verify_itxn_ops()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyItxnOps: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ITxnOpsContractParamsFactory.verifyItxnOps(params)) + return {...result, return: result.return as unknown as (undefined | ITxnOpsContractReturns['verify_itxn_ops()void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new ITxnOpsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current ITxnOpsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): ITxnOpsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_itxn_ops()void method call against the ITxnOpsContract contract + */ + verifyItxnOps(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyItxnOps(params))) + return this + }, + /** + * Add a clear state call to the ITxnOpsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as ITxnOpsContractComposer + } +} +export type ITxnOpsContractComposer = { + /** + * Calls the verify_itxn_ops()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyItxnOps(params?: CallParams): ITxnOpsContractComposer<[...TReturns, ITxnOpsContractReturns['verify_itxn_ops()void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the ITxnOpsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): ITxnOpsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): ITxnOpsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type ITxnOpsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayContract.ts new file mode 100644 index 0000000..ff91ca4 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayContract.ts @@ -0,0 +1,2231 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"ImmutableArrayContract","structs":{},"methods":[{"name":"test_uint64_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_biguint_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_bool_array","args":[{"type":"uint64","name":"length"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_fixed_size_tuple_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_fixed_size_named_tuple_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_sized_tuple_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_sized_named_tuple_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_implicit_conversion_log","args":[{"type":"uint64[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_implicit_conversion_emit","args":[{"type":"uint64[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[{"name":"emit_test","args":[{"type":"uint64[]","name":"field1"}]}],"recommendations":{}},{"name":"test_nested_array","args":[{"type":"uint64","name":"arr_to_add"},{"type":"uint64[][]","name":"arr"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_bit_packed_tuples","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"sum_uints_and_lengths_and_trues","args":[{"type":"uint64[]","name":"arr1"},{"type":"bool[]","name":"arr2"},{"type":"(uint64,bool,bool)[]","name":"arr3"},{"type":"(uint64,string)[]","name":"arr4"}],"returns":{"type":"(uint64,uint64,uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_uint64_return","args":[{"type":"uint64","name":"append"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_bool_return","args":[{"type":"uint64","name":"append"}],"returns":{"type":"bool[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_tuple_return","args":[{"type":"uint64","name":"append"}],"returns":{"type":"(uint64,bool,bool)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_tuple_return","args":[{"type":"uint64","name":"append"}],"returns":{"type":"(uint64,string)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_convert_to_array_and_back","args":[{"type":"(uint64,bool,bool)[]","name":"arr"},{"type":"uint64","name":"append"}],"returns":{"type":"(uint64,bool,bool)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_concat_with_arc4_tuple","args":[{"type":"(uint64,uint64)","name":"arg"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_concat_with_native_tuple","args":[{"type":"(uint64,uint64)","name":"arg"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_concat_with_arc4_tuple","args":[{"type":"(string,string)","name":"arg"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_concat_with_native_tuple","args":[{"type":"(string,string)","name":"arg"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_concat_immutable_dynamic","args":[{"type":"(uint64,string)[]","name":"imm1"},{"type":"(uint64,string)[]","name":"imm2"}],"returns":{"type":"(uint64,string)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_immutable_arc4","args":[{"type":"(uint64,uint64)[]","name":"imm"}],"returns":{"type":"(uint64,uint64)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_imm_fixed_arr","args":[],"returns":{"type":"(uint64,uint64)[3]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":11},"local":{"ints":0,"bytes":0}},"keys":{"global":{"a":{"keyType":"AVMString","valueType":"uint64[]","key":"YQ=="},"g":{"keyType":"AVMString","valueType":"bool[]","key":"Zw=="},"c":{"keyType":"AVMString","valueType":"(uint64,uint64)[]","key":"Yw=="},"d":{"keyType":"AVMString","valueType":"(uint64,bool,bool)[]","key":"ZA=="},"e":{"keyType":"AVMString","valueType":"(uint64,byte[])[]","key":"ZQ=="},"f":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"Zg=="},"bool2":{"keyType":"AVMString","valueType":"(bool,bool)[]","key":"Ym9vbDI="},"bool7":{"keyType":"AVMString","valueType":"(uint64,bool,bool,bool,bool,bool,bool,bool,uint64)[]","key":"Ym9vbDc="},"bool8":{"keyType":"AVMString","valueType":"(uint64,bool,bool,bool,bool,bool,bool,bool,bool,uint64)[]","key":"Ym9vbDg="},"bool9":{"keyType":"AVMString","valueType":"(uint64,bool,bool,bool,bool,bool,bool,bool,bool,bool,uint64)[]","key":"Ym9vbDk="},"imm_fixed_arr":{"keyType":"AVMString","valueType":"(uint64,uint64)[3]","key":"aW1tX2ZpeGVkX2Fycg=="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[4104],"errorMessage":"check self.imm_fixed_arr exists"},{"pc":[2179,2487],"errorMessage":"expected 1, 0"},{"pc":[2094,2402],"errorMessage":"expected 1st element to be correct"},{"pc":[2099,2409],"errorMessage":"expected 2nd element to be correct"},{"pc":[2240,2549],"errorMessage":"expected 4, 3"},{"pc":[3988],"errorMessage":"expected arrays to be different"},{"pc":[4022],"errorMessage":"expected arrays to be the same"},{"pc":[1548],"errorMessage":"expected element 0 to be False"},{"pc":[1567],"errorMessage":"expected element 1 to be False"},{"pc":[1585],"errorMessage":"expected element 2 to be True"},{"pc":[4049],"errorMessage":"expected items on iteration to be the same"},{"pc":[1611],"errorMessage":"expected last element to be False"},{"pc":[3935],"errorMessage":"expected non empty array"},{"pc":[3363],"errorMessage":"expected string length to match index"},{"pc":[4099],"errorMessage":"expected sum to be 10"},{"pc":[4072],"errorMessage":"expected sum to be 15"},{"pc":[852,1156,1221,1289,1346,1456,1541,1560,1579,1602,1753,1817,2050,2131,2196,2358,2441,2504,3214,3307,3950,4007,4045,4091],"errorMessage":"index access is out of bounds"},{"pc":[968,1009,1065,1092,1132,1160,1204,1269,1326,1438,1525,1656,1715,1779,1906,2008,2114,2316,2424,2681,2722,3012,3021,3030,3039,3107,3144,3188,3269,3910,3933],"errorMessage":"invalid array length header"},{"pc":[923,996,1120,1194,1244,1314,1426,1692,1881,2622,2769,2833,2919,2958,2989,3438,3571,3745,3779,3814],"errorMessage":"max array length exceeded"},{"pc":[1307],"errorMessage":"overflow"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA4CiAgICBieXRlY2Jsb2NrIDB4IDB4MTUxZjdjNzUgMHgwMDAwIDB4MDAgMHgwMDAyIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYgMHgwMDBhIDB4NjI2OTY3NzU2OTZlNzQgMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIgMHgwMDAyMDAwNDAwMDcwMDAxNjEwMDAxNjIgImltbV9maXhlZF9hcnIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo5MwogICAgLy8gY2xhc3MgSW1tdXRhYmxlQXJyYXlDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NDRkNDJmOTkgMHhiN2VhYTYwYiAweDc0M2Q3MGVkIDB4MWM3ZTA0OTQgMHhhMmQ1ODYwYiAweGUwNWZjNTY0IDB4MWUwOTJiODMgMHgwMTMxMDI2MiAweGM4NjU0YTk4IDB4ODlkMTk2ZjggMHg2Y2I3Yzk5MSAweDk4OThiZjAyIDB4ZjZiNjFlZTggMHg2MGI4NmE3YiAweDczYWQyODNmIDB4NTI5ZGZhZTkgMHgyMDZkNTE0ZiAweGUwNjQ2NWUyIDB4ZWMwMzAwYTIgMHhlY2RmMTRhZiAweDUxMWFjYTY0IDB4Mjk4NTJlNGYgMHg2ZDRhYTM1OCAweGI3Y2I5NmJkIC8vIG1ldGhvZCAidGVzdF91aW50NjRfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfYmlndWludF9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9ib29sX2FycmF5KHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2ZpeGVkX3NpemVfdHVwbGVfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfZml4ZWRfc2l6ZV9uYW1lZF90dXBsZV9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9sb2codWludDY0W10pdm9pZCIsIG1ldGhvZCAidGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2VtaXQodWludDY0W10pdm9pZCIsIG1ldGhvZCAidGVzdF9uZXN0ZWRfYXJyYXkodWludDY0LHVpbnQ2NFtdW10pdWludDY0W10iLCBtZXRob2QgInRlc3RfYml0X3BhY2tlZF90dXBsZXMoKXZvaWQiLCBtZXRob2QgInN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXModWludDY0W10sYm9vbFtdLCh1aW50NjQsYm9vbCxib29sKVtdLCh1aW50NjQsc3RyaW5nKVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ0ZXN0X3VpbnQ2NF9yZXR1cm4odWludDY0KXVpbnQ2NFtdIiwgbWV0aG9kICJ0ZXN0X2Jvb2xfcmV0dXJuKHVpbnQ2NClib29sW10iLCBtZXRob2QgInRlc3RfdHVwbGVfcmV0dXJuKHVpbnQ2NCkodWludDY0LGJvb2wsYm9vbClbXSIsIG1ldGhvZCAidGVzdF9keW5hbWljX3R1cGxlX3JldHVybih1aW50NjQpKHVpbnQ2NCxzdHJpbmcpW10iLCBtZXRob2QgInRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFjaygodWludDY0LGJvb2wsYm9vbClbXSx1aW50NjQpKHVpbnQ2NCxib29sLGJvb2wpW10iLCBtZXRob2QgInRlc3RfY29uY2F0X3dpdGhfYXJjNF90dXBsZSgodWludDY0LHVpbnQ2NCkpdWludDY0W10iLCBtZXRob2QgInRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlKCh1aW50NjQsdWludDY0KSl1aW50NjRbXSIsIG1ldGhvZCAidGVzdF9keW5hbWljX2NvbmNhdF93aXRoX2FyYzRfdHVwbGUoKHN0cmluZyxzdHJpbmcpKXN0cmluZ1tdIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlKChzdHJpbmcsc3RyaW5nKSlzdHJpbmdbXSIsIG1ldGhvZCAidGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWMoKHVpbnQ2NCxzdHJpbmcpW10sKHVpbnQ2NCxzdHJpbmcpW10pKHVpbnQ2NCxzdHJpbmcpW10iLCBtZXRob2QgInRlc3RfaW1tdXRhYmxlX2FyYzQoKHVpbnQ2NCx1aW50NjQpW10pKHVpbnQ2NCx1aW50NjQpW10iLCBtZXRob2QgInRlc3RfaW1tX2ZpeGVkX2FycigpKHVpbnQ2NCx1aW50NjQpWzNdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF91aW50NjRfYXJyYXkgdGVzdF9iaWd1aW50X2FycmF5IHRlc3RfYm9vbF9hcnJheSB0ZXN0X2ZpeGVkX3NpemVfdHVwbGVfYXJyYXkgdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5IHRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheSB0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXkgdGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2xvZyB0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fZW1pdCB0ZXN0X25lc3RlZF9hcnJheSB0ZXN0X2JpdF9wYWNrZWRfdHVwbGVzIHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXMgdGVzdF91aW50NjRfcmV0dXJuIHRlc3RfYm9vbF9yZXR1cm4gdGVzdF90dXBsZV9yZXR1cm4gdGVzdF9keW5hbWljX3R1cGxlX3JldHVybiB0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2sgdGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlIHRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlIHRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9hcmM0X3R1cGxlIHRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9uYXRpdmVfdHVwbGUgdGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWMgdGVzdF9pbW11dGFibGVfYXJjNCB0ZXN0X2ltbV9maXhlZF9hcnIKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzMToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZShhcnJheTogYnl0ZXMsIGZpeGVkX2J5dGVfc2l6ZTogdWludDY0KSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemU6CiAgICBwcm90byAyIDIKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZHVwCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgZHVwMgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0MwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQoYXJyYXk6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDEgMgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgMwogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9idXJ5IDEKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMoYXJyYXk6IGJ5dGVzLCBuZXdfaXRlbXNfYnl0ZXM6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgcmVhZF9zdGVwOiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzOgogICAgcHJvdG8gNCAxCiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDIKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXBuIDIKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICByZXBsYWNlMiAwCiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBwdXNoaW50IDcKICAgICsKICAgIGludGNfMyAvLyA4CiAgICAvCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3CiAgICArCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX2lmX2Vsc2VAMgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyA1CiAgICAtCiAgICBiemVybwogICAgZnJhbWVfZGlnIDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIGZyYW1lX2RpZyAzCiAgICBwdXNoaW50IDE2CiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBmcmFtZV9idXJ5IDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfd2hpbGVfdG9wQDM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfYWZ0ZXJfd2hpbGVANQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBnZXRiaXQKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX3doaWxlX3RvcEAzCgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX3doaWxlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18wIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuc3VtX2ltbV9maXhlZChhcnI6IGJ5dGVzKSAtPiB1aW50NjQ6CnN1bV9pbW1fZml4ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzAtNTcxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHN1bV9pbW1fZml4ZWQoYXJyOiBOYXRpdmVTdHJ1Y3QzKSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3MgogICAgLy8gdG90YWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBkdXAKCnN1bV9pbW1fZml4ZWRfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTczCiAgICAvLyBmb3IgaXRlbSBpbiBhcnI6CiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGludCAzCiAgICA8CiAgICBieiBzdW1faW1tX2ZpeGVkX2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzMtNTc0CiAgICAvLyBmb3IgaXRlbSBpbiBhcnI6CiAgICAvLyAgICAgdG90YWwgKz0gaXRlbS5mb28KICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgcHVzaGludCAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzQKICAgIC8vIHRvdGFsICs9IGl0ZW0uZm9vCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3My01NzQKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIC8vICAgICB0b3RhbCArPSBpdGVtLmZvbwogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3NAogICAgLy8gdG90YWwgKz0gaXRlbS5mb28KICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTc1CiAgICAvLyB0b3RhbCArPSBpdGVtLmJhcgogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgc3VtX2ltbV9maXhlZF9mb3JfaGVhZGVyQDEKCnN1bV9pbW1fZml4ZWRfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzYKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUudGltZXMobjogdWludDY0KSAtPiBieXRlczoKdGltZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzktNTgwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHRpbWVzKG46IFVJbnQ2NCkgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODEKICAgIC8vIHJlc3VsdCA9IFN0cmluZygpCiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODIKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2Uobik6CiAgICBpbnRjXzAgLy8gMAoKdGltZXNfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTgyCiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKG4pOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMQogICAgPAogICAgYnogdGltZXNfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU4MwogICAgLy8gcmVzdWx0ICs9IFN0cmluZygiICIpCiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGJ5dGVzICIgIgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU4MgogICAgLy8gZm9yIF9pIGluIHVyYW5nZShuKToKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHRpbWVzX2Zvcl9oZWFkZXJAMQoKdGltZXNfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODQKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLmFkZF94KGFycjogYnl0ZXMsIHg6IHVpbnQ2NCkgLT4gYnl0ZXM6CmFkZF94OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg3LTU4OAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZGRfeChhcnI6IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0sIHg6IFVJbnQ2NCkgLT4gSW1tdXRhYmxlQXJyYXlbVUludDY0XToKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzAgLy8gMAoKYWRkX3hfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBieiBhZGRfeF9hZnRlcl9mb3JANAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTkwCiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKGkpCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIGFkZF94X2Zvcl9oZWFkZXJAMQoKYWRkX3hfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1OTEKICAgIC8vIHJldHVybiBhcnIKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X3VpbnQ2NF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfdWludDY0X2FycmF5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6OTkKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoVUludDY0KDQyKSkKICAgIHB1c2hieXRlcyAweDAwMDEwMDAwMDAwMDAwMDAwMDJhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDMKICAgIC8vIGFyciA9IGFkZF94KGFyciwgVUludDY0KDUpKQogICAgcHVzaGludCA1CiAgICBjYWxsc3ViIGFkZF94CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDQKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDUKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEwNwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChVSW50NjQoNDMpKQogICAgcHVzaGludCA0MwogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDgKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDcKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgNwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTA5CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSA0MwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQzCiAgICA9PQogICAgYXNzZXJ0CiAgICBpbnRjXzIgLy8gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEwCiAgICAvLyBhc3NlcnQgYXJyWzBdID09IDQyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0MgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTk2CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKHgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfdWludDY0X2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NgogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEyCiAgICAvLyBhcnIgPSBwb3BfeChhcnIsIFVJbnQ2NCgzKSkKICAgIHB1c2hpbnQgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTk2CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKHgpOgogICAgPAogICAgYnogdGVzdF91aW50NjRfYXJyYXlfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NwogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZQogICAgYnVyeSAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NgogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X3VpbnQ2NF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfdWludDY0X2FycmF5X2FmdGVyX2ZvckA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEzCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExNAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTE2CiAgICAvLyBhcnIgPSBhZGRfeChhcnIsIFVJbnQ2NCgxMCkpCiAgICBwdXNoaW50IDEwCiAgICBjYWxsc3ViIGFkZF94CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMTcKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExOAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gOQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgOQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTIwCiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKFVJbnQ2NCg0NCkpCiAgICBwdXNoaW50IDQ0CiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjEKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEyMgogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gNDQKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0NAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTI0CiAgICAvLyBhcnIgPSBhcnIucmVwbGFjZSgyLCBVSW50NjQoMjMpKQogICAgcHVzaGludCAyMwogICAgaXRvYgogICAgcmVwbGFjZTIgMTggLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjUKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDE1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjYKICAgIC8vIGFzc2VydCBhcnJbMl0gPT0gMjMKICAgIGR1cAogICAgcHVzaGludCAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMjMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEyOAogICAgLy8gc2VsZi5hID0gYXJyCiAgICBwdXNoYnl0ZXMgImEiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6OTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2JpZ3VpbnRfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2JpZ3VpbnRfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzUKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludChUeG4ubnVtX2FwcF9hcmdzIC0gMSkpCiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGl0b2IKICAgIHB1c2hpbnQgNjQKICAgIGJ6ZXJvCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzIKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W0JpZ1VJbnRdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzUKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludChUeG4ubnVtX2FwcF9hcmdzIC0gMSkpCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHB1c2hieXRlcyAweDAwMDEKICAgIHJlcGxhY2UyIDAKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM2CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM3CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSAwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNjQKICAgICoKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWNfMCAvLyAweAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKHgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYmlndWludF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MDMKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM5CiAgICAvLyBhcnIgPSBhZGRfeGIoYXJyLCBVSW50NjQoNSkpCiAgICBwdXNoaW50IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKHgpOgogICAgPAogICAgYnogdGVzdF9iaWd1aW50X2FycmF5X2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MDQKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludChpKSkKICAgIGR1cG4gMgogICAgaXRvYgogICAgZGlnIDQKICAgIGJ8CiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfYmlndWludF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfYmlndWludF9hcnJheV9hZnRlcl9mb3JANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0MAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNgogICAgZGlnIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDEKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA2NAogICAgKgogICAgcHVzaGludCA2NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwNAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0MwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChCaWdVSW50KDIqKjUxMiAtIDEpIC0gVHhuLm51bV9hcHBfYXJncykKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpdG9iCiAgICBieXRlYyA1IC8vIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIHN3YXAKICAgIGItCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZGlnIDUKICAgIGJ8CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDQKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA3CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDUKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDIqKjUxMiAtIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA2NAogICAgKgogICAgcHVzaGludCA2NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0NgogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAwCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDY0CiAgICBieXRlY18wIC8vIDB4CiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTQ4CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKEJpZ1VJbnQoMioqNTEyIC0gMSkpCiAgICBzd2FwCiAgICBieXRlYyA1IC8vIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDkKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE1MAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMioqNTEyIC0gMQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA2NAogICAgKgogICAgcHVzaGludCA2NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA1IC8vIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTEKICAgIC8vIGFzc2VydCBhcnJbMF0gPT0gMAogICAgZHVwCiAgICBleHRyYWN0IDIgNjQKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTMKICAgIC8vIEJveChJbW11dGFibGVBcnJheVtCaWdVSW50XSwga2V5PWIiYmlndWludCIpLnZhbHVlID0gYXJyCiAgICBieXRlYyA3IC8vIDB4NjI2OTY3NzU2OTZlNzQKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgNyAvLyAweDYyNjk2Nzc1Njk2ZTc0CiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2Jvb2xfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2Jvb2xfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTcKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W2Jvb2xdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjEKICAgIC8vIGZvciBpIGluIHVyYW5nZShsZW5ndGgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYm9vbF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjEKICAgIC8vIGZvciBpIGluIHVyYW5nZShsZW5ndGgpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjIKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoaSA9PSBUeG4ubnVtX2FwcF9hcmdzKQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGRpZyAxCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGludGNfMyAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTYxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UobGVuZ3RoKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9ib29sX2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTY0CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGgKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBidXJ5IDUKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE2NgogICAgLy8gaWYgbGVuZ3RoID4gMDoKICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE2NwogICAgLy8gYXNzZXJ0IG5vdCBhcnJbMF0sICJleHBlY3RlZCBlbGVtZW50IDAgdG8gYmUgRmFsc2UiCiAgICBkaWcgMwogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZWxlbWVudCAwIHRvIGJlIEZhbHNlCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTY4CiAgICAvLyBpZiBsZW5ndGggPiAxOgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjkKICAgIC8vIGFzc2VydCBub3QgYXJyWzFdLCAiZXhwZWN0ZWQgZWxlbWVudCAxIHRvIGJlIEZhbHNlIgogICAgaW50Y18xIC8vIDEKICAgIGRpZyA0CiAgICA8CiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBwdXNoaW50IDE3CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBleHBlY3RlZCBlbGVtZW50IDEgdG8gYmUgRmFsc2UKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzAKICAgIC8vIGlmIGxlbmd0aCA+IDI6CiAgICBkaWcgMgogICAgaW50Y18yIC8vIDIKICAgID4KICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzEKICAgIC8vIGFzc2VydCBhcnJbMl0sICJleHBlY3RlZCBlbGVtZW50IDIgdG8gYmUgVHJ1ZSIKICAgIGludGNfMiAvLyAyCiAgICBkaWcgNAogICAgPAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcHVzaGludCAxOAogICAgZ2V0Yml0CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZWxlbWVudCAyIHRvIGJlIFRydWUKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTcyCiAgICAvLyBpZiBsZW5ndGggPiAzOgogICAgZGlnIDIKICAgIHB1c2hpbnQgMwogICAgPgogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE3MwogICAgLy8gYXNzZXJ0IG5vdCBhcnJbbGVuZ3RoIC0gMV0sICJleHBlY3RlZCBsYXN0IGVsZW1lbnQgdG8gYmUgRmFsc2UiCiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGludCAxNgogICAgKwogICAgZGlnIDIKICAgIHN3YXAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxhc3QgZWxlbWVudCB0byBiZSBGYWxzZQoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzUKICAgIC8vIHNlbGYuZyA9IGFycgogICAgcHVzaGJ5dGVzICJnIgogICAgZGlnIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzYKICAgIC8vIGlmIGxlbmd0aDoKICAgIGRpZyAyCiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICBkaWcgMwogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBzZXRiaXQKICAgIHN3YXAKICAgIHB1c2hpbnQgNwogICAgKwogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGludGNfMiAvLyAyCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTc4CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGggLSAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICA9PQogICAgYXNzZXJ0Cgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4MgogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXlbdHVwbGVbVUludDY0LCBVSW50NjRdXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg1CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4NQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgIDwKICAgIGJ6IHRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg2CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKChpICsgMSwgaSArIDIpKQogICAgZHVwbiAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAzCiAgICBidXJ5IDEKICAgIGIgdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg4CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA1CiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4OQogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAoVUludDY0KDEpLCBVSW50NjQoMikpCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMTYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxOTAKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IChVSW50NjQoNSksIFVJbnQ2NCg2KSkKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIHN3YXAKICAgIHB1c2hpbnQgNgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5MgogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBwdXNoaW50IDE2CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemUKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTkzCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTk0CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IChVSW50NjQoMSksIFVJbnQ2NCgyKSkKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAxNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5NQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg0KSwgVUludDY0KDUpKQogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgcHVzaGludCA0CiAgICA9PQogICAgc3dhcAogICAgcHVzaGludCA1CiAgICA9PQogICAgJiYKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTk2CiAgICAvLyBzZWxmLmMgPSBhcnIKICAgIHB1c2hieXRlcyAiYyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDAKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W015VHVwbGVdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDMKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNQogICAgPAogICAgYnogdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDQKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlUdXBsZShmb289aSwgYmFyPWkgJSAyID09IDAsIGJhej1pICogMyAlIDIgPT0gMCkpCiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAyCiAgICAlCiAgICAhCiAgICBkaWcgMQogICAgcHVzaGludCAzCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDIKICAgIGl0b2IKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDYKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwNwogICAgLy8gZm9vLCBiYXIsIGJheiA9IGFyclswXQogICAgZHVwCiAgICBleHRyYWN0IDIgOQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBwdXNoaW50IDY0CiAgICBnZXRiaXQKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA2NQogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDgKICAgIC8vIGFzc2VydCBmb28gPT0gMAogICAgdW5jb3ZlciAyCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwOQogICAgLy8gYXNzZXJ0IGJhcgogICAgc3dhcAogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTAKICAgIC8vIGFzc2VydCBiYXoKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjExCiAgICAvLyBzZWxmLmQgPSBhcnIKICAgIHB1c2hieXRlcyAiZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxOTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTUKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W3R1cGxlW1VJbnQ2NCwgQnl0ZXNdXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjE4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIxOAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgIDwKICAgIGJ6IHRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjE5CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKChpICsgMSwgb3AuYnplcm8oaSkpKQogICAgZHVwbiAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgc3dhcAogICAgYnplcm8KICAgIGRpZyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGJ5dGVjIDYgLy8gMHgwMDBhCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMwogICAgYnVyeSAxCiAgICBiIHRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyMQogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGJ1cnkgNAogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjIKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEKCnRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjIKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA8CiAgICBieiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyMwogICAgLy8gYXNzZXJ0IGFycltpXVswXSA9PSBpICsgMSwgImV4cGVjdGVkIDFzdCBlbGVtZW50IHRvIGJlIGNvcnJlY3QiCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZGlnIDYKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMXN0IGVsZW1lbnQgdG8gYmUgY29ycmVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjI0CiAgICAvLyBhc3NlcnQgYXJyW2ldWzFdLmxlbmd0aCA9PSBpLCAiZXhwZWN0ZWQgMm5kIGVsZW1lbnQgdG8gYmUgY29ycmVjdCIKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDJuZCBlbGVtZW50IHRvIGJlIGNvcnJlY3QKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2Cgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjYKICAgIC8vIGFyciA9IGFyci5wb3AoKQogICAgZGlnIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyNwogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyOAogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAoVUludDY0KDEpLCBvcC5iemVybygwKSksICJleHBlY3RlZCAxLCAwIgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgaW50Y18wIC8vIDAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDEsIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyOQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg0KSwgb3AuYnplcm8oMykpLCAiZXhwZWN0ZWQgNCwgMyIKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDQKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIHB1c2hpbnQgMwogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgNCwgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjMwCiAgICAvLyBzZWxmLmUgPSBhcnIKICAgIHB1c2hieXRlcyAiZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzQKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W015RHluYW1pY1NpemVkVHVwbGVdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzcKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjM3CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNQogICAgPAogICAgYnogdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzgKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlEeW5hbWljU2l6ZWRUdXBsZShmb289aSArIDEsIGJhcj10aW1lcyhpKSkpCiAgICBkdXBuIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBjYWxsc3ViIHRpbWVzCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyA2IC8vIDB4MDAwYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDMKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDAKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBidXJ5IDQKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNQogICAgPAogICAgYnogdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDIKICAgIC8vIGFzc2VydCBhcnJbaV1bMF0gPT0gaSArIDEsICJleHBlY3RlZCAxc3QgZWxlbWVudCB0byBiZSBjb3JyZWN0IgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGRpZyA2CiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDUKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDFzdCBlbGVtZW50IHRvIGJlIGNvcnJlY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI0MwogICAgLy8gYXNzZXJ0IGFycltpXVsxXSA9PSB0aW1lcyhpKSwgImV4cGVjdGVkIDJuZCBlbGVtZW50IHRvIGJlIGNvcnJlY3QiCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgdGltZXMKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMm5kIGVsZW1lbnQgdG8gYmUgY29ycmVjdAogICAgYnVyeSAxCiAgICBiIHRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDYKCnRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheV9hZnRlcl9mb3JAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI0NQogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBkaWcgMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ2CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ3CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IE15RHluYW1pY1NpemVkVHVwbGUoVUludDY0KDEpLCBTdHJpbmcoKSksICJleHBlY3RlZCAxLCAwIgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAiIgogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMSwgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ4CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSBNeUR5bmFtaWNTaXplZFR1cGxlKFVJbnQ2NCg0KSwgU3RyaW5nKCIgICAiKSksICJleHBlY3RlZCA0LCAzIgogICAgZGlnIDEKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgNAogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA0CiAgICA9PQogICAgc3dhcAogICAgcHVzaGJ5dGVzICIgICAiCiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBleHBlY3RlZCA0LCAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDkKICAgIC8vIHNlbGYuZiA9IGFycgogICAgcHVzaGJ5dGVzICJmIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9sb2dbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fbG9nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjUzCiAgICAvLyBsb2coYXJyKQogICAgbG9nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fZW1pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9lbWl0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU3CiAgICAvLyBhcmM0LmVtaXQoImVtaXRfdGVzdCIsIGFycikKICAgIHB1c2hieXRlcyAweGZhNDBjMDUzMDAwMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU3CiAgICAvLyBhcmM0LmVtaXQoImVtaXRfdGVzdCIsIGFycikKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X25lc3RlZF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfbmVzdGVkX2FycmF5OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMgogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjMtMjY0CiAgICAvLyAjIGFkZCBuIG5ldyBhcnJheXMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcnJfdG9fYWRkKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjMtMjY0CiAgICAvLyAjIGFkZCBuIG5ldyBhcnJheXMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcnJfdG9fYWRkKToKICAgIGR1cAogICAgZGlnIDMKICAgIDwKICAgIGJ6IHRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjUKICAgIC8vIGV4dHJhX2FyciA9IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGJ1cnkgMTIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2NgogICAgLy8gZm9yIGogaW4gdXJhbmdlKGkpOgogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjY2CiAgICAvLyBmb3IgaiBpbiB1cmFuZ2UoaSk6CiAgICBkaWcgNAogICAgZGlnIDEKICAgIDwKICAgIGJ6IHRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckA3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjcKICAgIC8vIGV4dHJhX2FyciA9IGV4dHJhX2Fyci5hcHBlbmQoaikKICAgIGRpZyA0CiAgICBkdXAKICAgIGl0b2IKICAgIGRpZyAxMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2NgogICAgLy8gZm9yIGogaW4gdXJhbmdlKGkpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiB0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDQKCnRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjY4CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKGV4dHJhX2FycikKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBkaWcgMTQKICAgIGNvbmNhdAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjYzLTI2NAogICAgLy8gIyBhZGQgbiBuZXcgYXJyYXlzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXJyX3RvX2FkZCk6CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3MC0yNzEKICAgIC8vICMgc3VtIGlubmVyIGFycmF5cyBhbmQgcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgc3VtcwogICAgLy8gdG90YWxzID0gSW1tdXRhYmxlQXJyYXlbVUludDY0XSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYnVyeSAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjcyCiAgICAvLyBmb3IgaW5uZXJfYXJyIGluIGFycjoKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgYnVyeSA5CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA3Cgp0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDEwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjcyCiAgICAvLyBmb3IgaW5uZXJfYXJyIGluIGFycjoKICAgIGRpZyA2CiAgICBkaWcgOQogICAgPAogICAgYnogdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDEzCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA3CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBidXJ5IDEyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MTAKICAgIC8vIHRvdGFsID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYxMQogICAgLy8gZm9yIGkgaW4gYXJyOgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGJ1cnkgOAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgoKdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAxNToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYxMQogICAgLy8gZm9yIGkgaW4gYXJyOgogICAgZGlnIDUKICAgIGRpZyA4CiAgICA8CiAgICBieiB0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAMTcKICAgIGRpZyAxMAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjEyCiAgICAvLyB0b3RhbCArPSBpCiAgICBkaWcgNQogICAgKwogICAgYnVyeSA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA2CiAgICBiIHRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJAMTUKCnRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckAxNzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3MwogICAgLy8gdG90YWxzID0gdG90YWxzLmFwcGVuZChzdW1fYXJyKGlubmVyX2FycikpCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDEwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAxMAogICAgZGlnIDYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDcKICAgIGIgdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAxMAoKdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2JpdF9wYWNrZWRfdHVwbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9iaXRfcGFja2VkX3R1cGxlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3OQogICAgLy8gYXJyMiA9IEltbXV0YWJsZUFycmF5W1R3b0Jvb2xUdXBsZV0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4MC0yODIKICAgIC8vIGFycjcgPSBJbW11dGFibGVBcnJheVtTZXZlbkJvb2xUdXBsZV0oKQogICAgLy8gYXJyOCA9IEltbXV0YWJsZUFycmF5W0VpZ2h0Qm9vbFR1cGxlXSgpCiAgICAvLyBhcnI5ID0gSW1tdXRhYmxlQXJyYXlbTmluZUJvb2xUdXBsZV0oKQogICAgZHVwbiAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyODgKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2JpdF9wYWNrZWRfdHVwbGVzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4OAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgIDwKICAgIGJ6IHRlc3RfYml0X3BhY2tlZF90dXBsZXNfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4OQogICAgLy8gYXJyMiA9IGFycjIuYXBwZW5kKFR3b0Jvb2xUdXBsZShhPWkgPT0gMCwgYj1pID09IDEpKQogICAgZHVwbiAyCiAgICAhCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI5MwogICAgLy8gYmFyPWkgKyAxLAogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTYKICAgIC8vIGM9aSA9PSAyLAogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjk3CiAgICAvLyBkPWkgPT0gMywKICAgIGRpZyAzCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTgKICAgIC8vIGU9aSA9PSA0LAogICAgZGlnIDQKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI5OQogICAgLy8gZj1pID09IDUsCiAgICBkaWcgNQogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzAwCiAgICAvLyBnPWkgPT0gNiwKICAgIGRpZyA2CiAgICBwdXNoaW50IDYKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTAtMzAyCiAgICAvLyBhcnI3ID0gYXJyNy5hcHBlbmQoCiAgICAvLyAgICAgU2V2ZW5Cb29sVHVwbGUoCiAgICAvLyAgICAgICAgIGZvbz1pLAogICAgLy8gICAgICAgICBiYXI9aSArIDEsCiAgICAvLyAgICAgICAgIGE9aSA9PSAwLAogICAgLy8gICAgICAgICBiPWkgPT0gMSwKICAgIC8vICAgICAgICAgYz1pID09IDIsCiAgICAvLyAgICAgICAgIGQ9aSA9PSAzLAogICAgLy8gICAgICAgICBlPWkgPT0gNCwKICAgIC8vICAgICAgICAgZj1pID09IDUsCiAgICAvLyAgICAgICAgIGc9aSA9PSA2LAogICAgLy8gICAgICkKICAgIC8vICkKICAgIGRpZyA3CiAgICBpdG9iCiAgICB1bmNvdmVyIDcKICAgIGludGNfMiAvLyAyCiAgICB1bmNvdmVyIDcKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCA1CiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCA2CiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgZHVwMgogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDkKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMxNAogICAgLy8gaD1pID09IDcsCiAgICBkaWcgNAogICAgcHVzaGludCA3CiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzAzLTMxNgogICAgLy8gYXJyOCA9IGFycjguYXBwZW5kKAogICAgLy8gICAgIEVpZ2h0Qm9vbFR1cGxlKAogICAgLy8gICAgICAgICBmb289aSwKICAgIC8vICAgICAgICAgYmFyPWkgKyAxLAogICAgLy8gICAgICAgICBhPWkgPT0gMCwKICAgIC8vICAgICAgICAgYj1pID09IDEsCiAgICAvLyAgICAgICAgIGM9aSA9PSAyLAogICAgLy8gICAgICAgICBkPWkgPT0gMywKICAgIC8vICAgICAgICAgZT1pID09IDQsCiAgICAvLyAgICAgICAgIGY9aSA9PSA1LAogICAgLy8gICAgICAgICBnPWkgPT0gNiwKICAgIC8vICAgICAgICAgaD1pID09IDcsCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDcKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkaWcgNwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgNwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzI5CiAgICAvLyBpPWkgPT0gOCwKICAgIHVuY292ZXIgMwogICAgaW50Y18zIC8vIDgKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMTctMzMxCiAgICAvLyBhcnI5ID0gYXJyOS5hcHBlbmQoCiAgICAvLyAgICAgTmluZUJvb2xUdXBsZSgKICAgIC8vICAgICAgICAgZm9vPWksCiAgICAvLyAgICAgICAgIGJhcj1pICsgMSwKICAgIC8vICAgICAgICAgYT1pID09IDAsCiAgICAvLyAgICAgICAgIGI9aSA9PSAxLAogICAgLy8gICAgICAgICBjPWkgPT0gMiwKICAgIC8vICAgICAgICAgZD1pID09IDMsCiAgICAvLyAgICAgICAgIGU9aSA9PSA0LAogICAgLy8gICAgICAgICBmPWkgPT0gNSwKICAgIC8vICAgICAgICAgZz1pID09IDYsCiAgICAvLyAgICAgICAgIGg9aSA9PSA3LAogICAgLy8gICAgICAgICBpPWkgPT0gOCwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAzCiAgICBidXJ5IDEKICAgIGIgdGVzdF9iaXRfcGFja2VkX3R1cGxlc19mb3JfaGVhZGVyQDIKCnRlc3RfYml0X3BhY2tlZF90dXBsZXNfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzMKICAgIC8vIGFzc2VydCBhcnIyLmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzQKICAgIC8vIGFzc2VydCBhcnI3Lmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzUKICAgIC8vIGFzc2VydCBhcnI4Lmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzYKICAgIC8vIGFzc2VydCBhcnI5Lmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzcKICAgIC8vIHNlbGYuYm9vbDIgPSBhcnIyCiAgICBwdXNoYnl0ZXMgImJvb2wyIgogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzM4CiAgICAvLyBzZWxmLmJvb2w3ID0gYXJyNwogICAgcHVzaGJ5dGVzICJib29sNyIKICAgIHVuY292ZXIgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMzOQogICAgLy8gc2VsZi5ib29sOCA9IGFycjgKICAgIHB1c2hieXRlcyAiYm9vbDgiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNDAKICAgIC8vIHNlbGYuYm9vbDkgPSBhcnI5CiAgICBwdXNoYnl0ZXMgImJvb2w5IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzOgogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTAKICAgIC8vIHN1bTEgPSBzdW0yID0gc3VtMyA9IHN1bTQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUxCiAgICAvLyBmb3IgaSBpbiBhcnIxOgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMCAvLyAwCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MQogICAgLy8gZm9yIGkgaW4gYXJyMToKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDUKICAgIGRpZyA5CiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTIKICAgIC8vIHN1bTEgKz0gaQogICAgZGlnIDQKICAgICsKICAgIGJ1cnkgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMgoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MwogICAgLy8gZm9yIGIgaW4gYXJyMjoKICAgIGRpZyA4CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgYnVyeSAxNwogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUzCiAgICAvLyBmb3IgYiBpbiBhcnIyOgogICAgZGlnIDEyCiAgICBkaWcgMTcKICAgIDwKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDExCiAgICBkaWcgMTIKICAgIHB1c2hpbnQgMTYKICAgICsKICAgIGRpZyA5CiAgICBzd2FwCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1NAogICAgLy8gaWYgYjoKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTUKICAgIC8vIHN1bTIgKz0gMQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDQKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUA5OgogICAgZGlnIDEyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxMwogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJANgoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTYKICAgIC8vIGZvciB0dXAgaW4gYXJyMzoKICAgIGRpZyA3CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgYnVyeSAxNgogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTIKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckAxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1NgogICAgLy8gZm9yIHR1cCBpbiBhcnIzOgogICAgZGlnIDExCiAgICBkaWcgMTYKICAgIDwKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDE5CiAgICBkaWcgNwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxMgogICAgcHVzaGludCA5CiAgICAqCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBwdXNoaW50IDY0CiAgICBnZXRiaXQKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA2NQogICAgZ2V0Yml0CiAgICBidXJ5IDEzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTcKICAgIC8vIHN1bTMgKz0gdHVwLmZvbwogICAgZGlnIDYKICAgIHVuY292ZXIgMgogICAgKwogICAgYnVyeSA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTgKICAgIC8vIGlmIHR1cC5iYXI6CiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1OQogICAgLy8gc3VtMyArPSAxCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYwCiAgICAvLyBpZiB0dXAuYmF6OgogICAgZGlnIDEwCiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM2MQogICAgLy8gc3VtMyArPSAxCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9pZl9lbHNlQDE3OgogICAgZGlnIDExCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxMgogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMTIKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDE5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYyCiAgICAvLyBmb3IgaWR4LCBkeW5fdHVwIGluIHVlbnVtZXJhdGUoYXJyNCk6CiAgICBkaWcgNgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGJ1cnkgMTUKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMjA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjIKICAgIC8vIGZvciBpZHgsIGR5bl90dXAgaW4gdWVudW1lcmF0ZShhcnI0KToKICAgIGRpZyAxMwogICAgZGlnIDE1CiAgICA8CiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAyMwogICAgZGlnIDYKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMTQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkaWcgMTgKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYzCiAgICAvLyBzdW00ICs9IGR5bl90dXAuZm9vCiAgICBkaWcgOQogICAgdW5jb3ZlciAyCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjQKICAgIC8vIHN1bTQgKz0gZHluX3R1cC5iYXIuYnl0ZXMubGVuZ3RoCiAgICBzd2FwCiAgICBsZW4KICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICBidXJ5IDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM2NQogICAgLy8gYXNzZXJ0IGR5bl90dXAuYmFyLmJ5dGVzLmxlbmd0aCA9PSBpZHgsICJleHBlY3RlZCBzdHJpbmcgbGVuZ3RoIHRvIG1hdGNoIGluZGV4IgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHN0cmluZyBsZW5ndGggdG8gbWF0Y2ggaW5kZXgKICAgIGJ1cnkgMTQKICAgIGIgc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19mb3JfaGVhZGVyQDIwCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAyMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAyCiAgICBpdG9iCiAgICBkaWcgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNgogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X3VpbnQ2NF9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3VpbnQ2NF9yZXR1cm46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzEKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIHB1c2hieXRlcyAweDAwMDMwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF91aW50NjRfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X3VpbnQ2NF9yZXR1cm5fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChpKQogICAgZHVwbiAyCiAgICBpdG9iCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzcyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF91aW50NjRfcmV0dXJuX2Zvcl9oZWFkZXJAMgoKdGVzdF91aW50NjRfcmV0dXJuX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfYm9vbF9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2Jvb2xfcmV0dXJuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc4CiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheSgoVHJ1ZSwgRmFsc2UsIFRydWUsIEZhbHNlLCBUcnVlKSkKICAgIHB1c2hieXRlcyAweDAwMDVhOAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2Jvb2xfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3OQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2Jvb2xfcmV0dXJuX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODAKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoaSAlIDIgPT0gMCkKICAgIGR1cG4gMgogICAgaW50Y18yIC8vIDIKICAgICUKICAgICEKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGludGNfMyAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9ib29sX3JldHVybl9mb3JfaGVhZGVyQDIKCnRlc3RfYm9vbF9yZXR1cm5fYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF90dXBsZV9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3R1cGxlX3JldHVybjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NQogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXkoKE15VHVwbGUoVUludDY0KCksIFRydWUsIEZhbHNlKSwpKQogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDAwMDAwMDAwMDAwMDA4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzg2CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X3R1cGxlX3JldHVybl9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODYKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF90dXBsZV9yZXR1cm5fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChNeVR1cGxlKGZvbz1pLCBiYXI9aSAlIDIgPT0gMCwgYmF6PWkgJSAzID09IDApKQogICAgZHVwbiAyCiAgICBpbnRjXzIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDEKICAgIHB1c2hpbnQgMwogICAgJQogICAgIQogICAgZGlnIDIKICAgIGl0b2IKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfdHVwbGVfcmV0dXJuX2Zvcl9oZWFkZXJAMgoKdGVzdF90dXBsZV9yZXR1cm5fYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9keW5hbWljX3R1cGxlX3JldHVybltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZHluYW1pY190dXBsZV9yZXR1cm46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTIKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5KChNeUR5bmFtaWNTaXplZFR1cGxlKFVJbnQ2NCgpLCBTdHJpbmcoIkhlbGxvIikpLCkpCiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDBhMDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9keW5hbWljX3R1cGxlX3JldHVybl9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF9keW5hbWljX3R1cGxlX3JldHVybl9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzk0CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKE15RHluYW1pY1NpemVkVHVwbGUoaSwgdGltZXMoaSkpKQogICAgZHVwbiAyCiAgICBjYWxsc3ViIHRpbWVzCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyA2IC8vIDB4MDAwYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfZHluYW1pY190dXBsZV9yZXR1cm5fZm9yX2hlYWRlckAyCgp0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFja1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFjazoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwMgogICAgLy8gbXV0YWJsZS5leHRlbmQoYXJyKQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwNAogICAgLy8gbXV0YWJsZS5hcHBlbmQoTXlUdXBsZShmb289aSwgYmFyPWkgJSAyID09IDAsIGJhej1pICUgMyA9PSAwKSkKICAgIGR1cG4gMgogICAgaW50Y18yIC8vIDIKICAgICUKICAgICEKICAgIGRpZyAxCiAgICBwdXNoaW50IDMKICAgICUKICAgICEKICAgIGRpZyA0CiAgICBjb3ZlciAzCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgYnVyeSAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MDMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfZm9yX2hlYWRlckAyCgp0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDA1CiAgICAvLyByZXR1cm4gbXV0YWJsZS5mcmVlemUoKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOQogICAgLwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDExCiAgICAvLyBwcmVmaXggPSBJbW11dGFibGVBcnJheSgoYXJjNC5VSW50NjQoMSksIGFyYzQuVUludDY0KDIpKSkKICAgIGJ5dGVjIDggLy8gMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxMgogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZXh0cmFjdCA4IDgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQyMAogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxOQogICAgLy8gcHJlZml4ID0gSW1tdXRhYmxlQXJyYXkoKGFyYzQuVUludDY0KDEpLCBhcmM0LlVJbnQ2NCgyKSkpCiAgICBieXRlYyA4IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjAKICAgIC8vIHJlc3VsdCA9IHByZWZpeCArIGFyZwogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBwdXNoYnl0ZXMgMHgwMDA0CiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfYXJjNF90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9hcmM0X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDI4CiAgICAvLyByZXN1bHQgPSBwcmVmaXggKyBhcmcKICAgIGV4dHJhY3QgNCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjcKICAgIC8vIHByZWZpeCA9IEltbXV0YWJsZUFycmF5KChhcmM0LlN0cmluZygiYSIpLCBhcmM0LlN0cmluZygiYiIpKSkKICAgIGJ5dGVjIDkgLy8gMHgwMDAyMDAwNDAwMDcwMDAxNjEwMDAxNjIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQyOAogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDM2CiAgICAvLyByZXN1bHQgPSBwcmVmaXggKyBhcmcKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDM1CiAgICAvLyBwcmVmaXggPSBJbW11dGFibGVBcnJheSgoYXJjNC5TdHJpbmcoImEiKSwgYXJjNC5TdHJpbmcoImIiKSkpCiAgICBieXRlYyA5IC8vIDB4MDAwMjAwMDQwMDA3MDAwMTYxMDAwMTYyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MzYKICAgIC8vIHJlc3VsdCA9IHByZWZpeCArIGFyZwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2NvbmNhdF9pbW11dGFibGVfZHluYW1pYzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ0MwogICAgLy8gcmV0dXJuIGltbTEgKyBpbW0yCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgZXh0cmFjdCAyIDAKICAgIHVuY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FyYzRbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcmM0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ3CiAgICAvLyBhc3NlcnQgaW1tLCAiZXhwZWN0ZWQgbm9uIGVtcHR5IGFycmF5IgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgbm9uIGVtcHR5IGFycmF5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NDgKICAgIC8vIGltbSA9IGltbS5yZXBsYWNlKGltbS5sZW5ndGggLSAxLCBpbW1bMF0pCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAxNgogICAgc3dhcAogICAgcHVzaGludCAxNgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIHN3YXAKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9pbW1fZml4ZWRfYXJyW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9pbW1fZml4ZWRfYXJyOgogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDUzCiAgICAvLyBhcnIxID0gemVyb19ieXRlcyhOYXRpdmVTdHJ1Y3QzKQogICAgcHVzaGludCA0OAogICAgYnplcm8KICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU0CiAgICAvLyBzdHJ1Y3QxMiA9IE5hdGl2ZVN0cnVjdChUeG4ubnVtX2FwcF9hcmdzICsgMSwgVHhuLm51bV9hcHBfYXJncyArIDIpCiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ1NQogICAgLy8gYXJyMiA9IE5hdGl2ZVN0cnVjdDMoKHN0cnVjdDEyLCBzdHJ1Y3QxMiwgc3RydWN0MTIpKQogICAgZHVwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU3CiAgICAvLyBhc3NlcnQgYXJyMSAhPSBhcnIyLCAiZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIGRpZmZlcmVudCIKICAgICE9CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIGRpZmZlcmVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDYwCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2MAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDMpOgogICAgZHVwCiAgICBwdXNoaW50IDMKICAgIDwKICAgIGJ6IHRlc3RfaW1tX2ZpeGVkX2Fycl9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDYxCiAgICAvLyBhcnIxID0gYXJyMS5yZXBsYWNlKGksIHN0cnVjdDEyKQogICAgZHVwbiAyCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZGlnIDUKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnVyeSA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NjAKICAgIC8vIGZvciBpIGluIHVyYW5nZSgzKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJAMgoKdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDYzCiAgICAvLyBhc3NlcnQgYXJyMSA9PSBhcnIyLCAiZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIHRoZSBzYW1lIgogICAgZGlnIDMKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFycmF5cyB0byBiZSB0aGUgc2FtZQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2NQogICAgLy8gZm9yIHN0cnVjdF9pdCBpbiBhcnIxOgogICAgZGlnIDQKICAgIHB1c2hpbnQgMwogICAgPAogICAgYnogdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA5CiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgcHVzaGludCAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NjYKICAgIC8vIGFzc2VydCBzdHJ1Y3RfaXQgPT0gc3RydWN0MTIsICJleHBlY3RlZCBpdGVtcyBvbiBpdGVyYXRpb24gdG8gYmUgdGhlIHNhbWUiCiAgICBkaWcgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBpdGVtcyBvbiBpdGVyYXRpb24gdG8gYmUgdGhlIHNhbWUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDUKICAgIGIgdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJANgoKdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDY4CiAgICAvLyBzZWxmLmltbV9maXhlZF9hcnIgPSBhcnIxCiAgICBieXRlYyAxMCAvLyAiaW1tX2ZpeGVkX2FyciIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzIKICAgIC8vIGFzc2VydCBzdW1faW1tX2ZpeGVkKG11dF9hcnIuZnJlZXplKCkpID09IDE1LCAiZXhwZWN0ZWQgc3VtIHRvIGJlIDE1IgogICAgZHVwCiAgICBjYWxsc3ViIHN1bV9pbW1fZml4ZWQKICAgIHB1c2hpbnQgMTUKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgc3VtIHRvIGJlIDE1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzQKICAgIC8vIG11dF9hcnJbMF0gPSBOYXRpdmVTdHJ1Y3QoVUludDY0KCksIFVJbnQ2NCgpKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDAgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzUKICAgIC8vIGFzc2VydCBzdW1faW1tX2ZpeGVkKG11dF9hcnIuZnJlZXplKCkpID09IDEwLCAiZXhwZWN0ZWQgc3VtIHRvIGJlIDEwIgogICAgY2FsbHN1YiBzdW1faW1tX2ZpeGVkCiAgICBwdXNoaW50IDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHN1bSB0byBiZSAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDc3CiAgICAvLyByZXR1cm4gc2VsZi5pbW1fZml4ZWRfYXJyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImltbV9maXhlZF9hcnIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1tX2ZpeGVkX2FyciBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAAECCCYLAAQVH3x1AgAAAQACAAJA/////////////////////////////////////////////////////////////////////////////////////wIACgdiaWd1aW50EgACAAAAAAAAAAEAAAAAAAAAAgwAAgAEAAcAAWEAAWINaW1tX2ZpeGVkX2FycjEbQQC3MRkURDEYRIIYBETUL5kEt+qmCwR0PXDtBBx+BJQEotWGCwTgX8VkBB4JK4MEATECYgTIZUqYBInRlvgEbLfJkQSYmL8CBPa2HugEYLhqewRzrSg/BFKd+ukEIG1RTwTgZGXiBOwDAKIE7N8UrwRRGspkBCmFLk8EbUqjWAS3y5a9NhoAjhgCaQNQBHoFNQXlBkoHfAixCLcIxgmjCsEL8gw+DHEMww0jDXINiw2nDboN4w4MDikAMRkUMRgUEEOKAgKL/iJZIwkWVwYAi/5MXABJFYv/CUqL/1hPAiJPA1KJigECi/8iWSMJSSQLSYv/VwIASU4CSU8CWUlPAkkVTE4CUigiiwaLAQxBABuLAosGSU4CWSQJFlcGAosFTFCMBSQIjAZC/92LABZXBgKLBVCLASQIiwJMiwNSUIsEjACMAYmKBAEoRwKL/CJZRwKL/ghJFlcGAIv8TFwATgJMgQcIJQpJTwKBBwglCklOAgxBAAyLBosFCa+LBExQjAQijACLA4EQCEmMAov+CIwBiwKLAQxBACCL/YsASU4CU4sEiwJJTgNPAlSMBCMIjAKL/wiMAEL/2IsEjACJigMBi/0iWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJIosEiwIMQQAjiwNJFlcGAosBiwRJTgRPAl1JjAFLAVkkCAiMAyQIjARC/9WLAIsBUIwAiYoEAShJi/4kC4v8JAsiiwSLAwxBAByL/YsESU4CWYsCCBZXBgKLAUxQjAEkCIwEQv/ci/0VjAAijASLBIsCDEEAHIv/iwRJTgJZiwAIFlcGAosBTFCMASQIjARC/9yL/Iv+CBZXBgKLAVCL/YsDiwBSUIv/FYv/iwJPAlJQjACJigEBIkmLAYEDDEEAH4sBSYEQC4v/TIEQWEkiW4sACEwlWwiMACMIjAFC/9mJigEBKCKLAYv/DEEAEYsAgAEgUIwAiwEjCIwBQv/niYoCASKLAIv/DEEAHYsASRaL/kxQi/4iWSMIFlcGAlwAjP4jCIwAQv/bi/5MiYAKAAEAAAAAAAAAKoEFiP/CSSJZSYEGEkRJIwlLAlcCAEwlC1uBBBJEgSsWTwJMUEwjCBZXBgJcAEcCIllJgQcSRCMJSwFXAgBMJQtbgSsSRCRbgSoSRCJJgQMMQQARSwEliP07RQNISSMIRQFC/+hLAUkiWUmBBBJEIwlLAVcCAEwlC1skEkSBCoj/RkkiWUmBDhJESSMJSwJXAgBMJQtbgQkSRIEsFk8CTFBMIwgWVwYCXABJIllJgQ8SRCMJSwFXAgBMJQtbgSwSRIEXFlwSSSJZgQ8SREmBEluBFxJEgAFhTGcjQzEbIwkWgUCvSU4CqypMUIACAAFcAEcCIllJIxJEIwlMVwIATIFAC4FAWCioRCJJgQUMQQAgRwIWSwSrSwNJTwJQTCJZIwgWVwYCXABFAyMIRQFC/9lLAUkiWUmBBhJESSMJSwJXAgBMgUALgUBYgAEEqEQxGxYnBUyhSRWBQA5ESwWrTwJMUEwjCBZXBgJcAEkiWUmBBxJESSMJSwJXAgBMgUALgUBYgED////////////////////////////////////////////////////////////////////////////////////+qERLAVcCQCioREwnBVBMIwgWVwYCXABJIllJJRJEIwlLAVcCAEyBQAuBQFgnBahESVcCQCioRCcHvEgnB0y/I0MoNhoBFyoiSUsDDEEAHjEbSwFJTwISKyJPAlRLA0wjJYj78EUDIwhFAUL/20sBIllJRQVLA0lOAhJEQQAKSwNESwGBEFMUREsCIw1BAAwjSwQMREsBgRFTFERLAiQNQQALJEsEDERLAYESU0RLAoEDDUEAEksCIwlJSwUMRIEQCEsCTFMURIABZ0sCZ0sCQQAoSwMjCUkWVwYASwNMXABLAYEQCCJUTIEHCCUKJAgiTFIiWUsDIwkSRCNDKiJJgQUMQQAlRwIjCEwkCEsBFkwWUEsDSU8CUEwiWSMIFlcGAlwARQNFAUL/1EsBSSJZSYEFEkRLAVcCAEsCVwIQSSJbTCVbTCMSTCQSEERMIwmBEAuBEFhJIltMJVtMgQUSTIEGEhBEgRCI+mZFAUkiWUmBBBJESwFXAgBLAlcCEEkiW0wlW0wjEkwkEhBETCMJgRALgRBYSSJbTCVbTIEEEkyBBRIQRIABY0xnI0MqIkmBBQxBADRHAiQYFEsBgQMLJBgUSwIWKyJPBFQjTwNUUEsDSU8CUEwiWSMIFlcGAlwARQMjCEUBQv/FSwFJIlmBBRJESVcCCUkiW0sBgUBTTwKBQVNPAhRETEREgAFkTGcjQygqIkmBBQxBADVHAiMITK9LA0kiWUxXAgBLAxZLAxUWVwYCTwRQTCcGUExQJwRMUE4CI08DiPruRQNFAUL/xEsBIllJRQSBBRJEIkUBSYEFDEEAT0sBVwIASwFJTgIkC0sBTFlLAiMISwZLAQlLAxVLAiQLSwVMWU8CTU8DTwNPAlJJIltLASVZSwIVTwNOAlJXAgBMSwISRBVPAhJERQFC/6pLAYj5OUUBSSJZSYEEEkRLAVcCAEkiWUsCIwlLAhVLAyRZSwFMSwNNSwRPBE8CUkkiW0sBJVlLAhVPA04CUlcCAEwjEiKvTwISEERLASQLSwNMWU8CIwhPBEsBCUwkC0sETFlPA0xPAk1SSSJbSwElWUsCFU8DTgJSVwIATIEEEoEDr08CEhBEgAFlTGcjQygqIkmBBQxBADdHAiMITIj6j0sDSSJZTFcCAEsDFksDFRZXBgJPBFBMJwZQTFAnBExQTgIjTwOI+bpFA0UBQv/CSwEiWUlFBIEFEkQiRQFJgQUMQQBRSwFXAgBLAUlOAiQLSwFMWUsCIwhLBksBCUsDFUsCJAtLBUxZTwJNTwNPA08CUkkiW0sBJVlLAhVPA04CUlcCAExLAhJETwKI+gESREUBQv+oSwGI+ANFAUkiWUmBBBJESwFXAgBJIllLAiMJSwIVSwMkWUsBTEsDTUsETwRPAlJJIltLASVZSwIVTwNOAlJXAgBMIxJMKBIQREsBJAtLA0xZTwIjCE8ESwEJTCQLSwRMWU8DTE8CTVJJIltLASVZSwIVTwNOAlJXAgBMgQQSTIADICAgEhBEgAFmTGcjQzYaAbAjQ4AG+kDAUwACNhoBULAjQyJHAihHBTYaARc2GgIiSUsDDEEATCpFDCJFBUsESwEMQQAeSwRJFksNSU8CUEwiWSMIFlcGAlwARQ0jCEUFQv/aSwFJIllMVwIAJwRLDlBOAiNPA4j4U0UCSSMIRQFC/60qRQpLASJZRQkiRQdLBksJDEEAYUsBVwIASwckC0sBTFlKWSULJAhYSUUMIkUFIllFCCJFBksFSwgMQQAZSwpXAgBLBklOAiULW0sFCEUFIwhFBkL/30sDFksKSU8CUEwiWSMIFlcGAlwARQpLBiMIRQdC/5cpSwpQsCNDKkcDIkmBBQxBAMZHAhRLASMSKyJPA1QjTwJUSwZJTgJLAVBPAiJZIwgWVwYCXABFB0sBIwhLAiQSSwOBAxJLBIEEEksFgQUSSwaBBhJLBxZPByRPB1SBA08GVIEETwVUgQVPBFSBBk8DVEpQSwMWTEsBUEsJSU8CUEwiWSMIFlcGAlwARQlLBIEHEk8CgQdPAlRPAkxQSUsCUEsHSU8CUEwiWSMIFlcGAlwARQdPAyUSKyJPAlRQTFBLA0lPAlBMIlkjCBZXBgJcAEUDRQFC/zNLBEkiWYEFEkRLBEkiWYEFEkRLBEkiWYEFEkRLBEkiWYEFEkSABWJvb2wyTwRngAVib29sN08DZ4AFYm9vbDhPAmeABWJvb2w5TGcjQyhHBjYaATYaAjYaAzYaBCJHAzYaASJZIklLAgxBABlLCVcCAEsBSU4CJQtbSwQIRQQjCEUBQv/gSwgiWUURIkUNSwxLEQxBABtLDIEQCEsJTFNBAAZLAyMIRQRLDCMIRQ1C/91LByJZRRAiRQxLC0sQDEEAQEsHVwIASwyBCQuBCVhJIltLAYFAU08CgUFTRQ1LBk8CCEUGQQAGSwQjCEUFSwpBAAZLBCMIRQVLCyMIRQxC/7hLBiJZRQ8iRQ5LDUsPDEEAVksGVwIASw5JTgIkC0sBTFlLAiMISxJLAQlLAxVLAiQLSwVMWU8CTU8DTwNPAlJJIltLASVZSwIVTwNOAlJXAgBLCU8CCEwVTEsBCEUJTwISREUOQv+iSwIWSwQWUEsFFlBLBhZQKUxQsCNDNhoBF4AaAAMAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAMiSUsDDEEAHUcCFksDSU8CUEwiWSMIFlcGAlwARQMjCEUBQv/cKUsCULAjQzYaAReAAwAFqCJJSwMMQQAbRwIkGBQrIk8CVEsDTCMliPQsRQMjCEUBQv/eKUsCULAjQzYaAReACwABAAAAAAAAAACAIklLAwxBADJHAiQYFEsBgQMYFEsCFisiTwRUI08DVFBLA0lPAlBMIlkjCBZXBgJcAEUDIwhFAUL/xylLAlCwI0M2GgEXgBUAAQACAAAAAAAAAAAACgAFSGVsbG8iSUsDDEEANkcCiPUySwNJIllMVwIASwMWSwMVFlcGAk8EUEwnBlBMUCcETFBOAiNPA4j0XUUDIwhFAUL/wylLAlCwI0M2GgE2GgIXTFcCACJJSwMMQQApRwIkGBRLAYEDGBRLBE4DSwIWKyJPBFQjTwNUUE8CTFBFAyMIRQFC/9BLAUkVgQkKFlcGAkxQKUxQsCNDJwg2GgFQSVcCABUlChZXBgJcAClMULAjQzYaAUlXAAhMVwgIUCcITFCAAgAEXAApTFCwI0M2GgFXBAAnCUwkiPNSKUxQsCNDNhoBSSJZSwEkWUsCTwJLAlJLAhVPA08DTwJSUCcJTCSI8ykpTFCwI0M2GgE2GgJLASJZTwJXAgBLAlcCAE8DIllPA08DTwJPA4jzailMULAjQzYaAUkiWUlEIwlLAVcCEEyBEAskCExdKUxQsCNDKIEwr0kxGyMIMRskCEwWTBZQSU4CSUsBUExQSU4CE0QiSYEDDEEAFEcCgRALSwVMSwVdRQUjCEUBQv/lSwNLAhJEIkUFSwSBAwxBABdLBEmBEAtLBUyBEFhLBBJEIwhFBUL/4ScKSwRJTgJnSYjzV4EPEkSAEAAAAAAAAAAAAAAAAAAAAABcAIjzPIEKEkQiJwplRClMULAjQw==","clear":"C4EBQw=="},"events":[{"name":"emit_test","args":[{"type":"uint64[]","name":"field1"}]}],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the ImmutableArrayContract contract + */ +export type ImmutableArrayContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'test_uint64_array()void': Record + 'test_biguint_array()void': Record + 'test_bool_array(uint64)void': { + length: bigint | number + } + 'test_fixed_size_tuple_array()void': Record + 'test_fixed_size_named_tuple_array()void': Record + 'test_dynamic_sized_tuple_array()void': Record + 'test_dynamic_sized_named_tuple_array()void': Record + 'test_implicit_conversion_log(uint64[])void': { + arr: bigint[] | number[] + } + 'test_implicit_conversion_emit(uint64[])void': { + arr: bigint[] | number[] + } + 'test_nested_array(uint64,uint64[][])uint64[]': { + arrToAdd: bigint | number + arr: bigint[] | number[][] + } + 'test_bit_packed_tuples()void': Record + 'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)': { + arr1: bigint[] | number[] + arr2: boolean[] + arr3: [bigint | number, boolean, boolean][] + arr4: [bigint | number, string][] + } + 'test_uint64_return(uint64)uint64[]': { + append: bigint | number + } + 'test_bool_return(uint64)bool[]': { + append: bigint | number + } + 'test_tuple_return(uint64)(uint64,bool,bool)[]': { + append: bigint | number + } + 'test_dynamic_tuple_return(uint64)(uint64,string)[]': { + append: bigint | number + } + 'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]': { + arr: [bigint | number, boolean, boolean][] + append: bigint | number + } + 'test_concat_with_arc4_tuple((uint64,uint64))uint64[]': { + arg: [bigint | number, bigint | number] + } + 'test_concat_with_native_tuple((uint64,uint64))uint64[]': { + arg: [bigint | number, bigint | number] + } + 'test_dynamic_concat_with_arc4_tuple((string,string))string[]': { + arg: [string, string] + } + 'test_dynamic_concat_with_native_tuple((string,string))string[]': { + arg: [string, string] + } + 'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]': { + imm1: [bigint | number, string][] + imm2: [bigint | number, string][] + } + 'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]': { + imm: [bigint | number, bigint | number][] + } + 'test_imm_fixed_arr()(uint64,uint64)[3]': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'test_uint64_array()void': [] + 'test_biguint_array()void': [] + 'test_bool_array(uint64)void': [length: bigint | number] + 'test_fixed_size_tuple_array()void': [] + 'test_fixed_size_named_tuple_array()void': [] + 'test_dynamic_sized_tuple_array()void': [] + 'test_dynamic_sized_named_tuple_array()void': [] + 'test_implicit_conversion_log(uint64[])void': [arr: bigint[] | number[]] + 'test_implicit_conversion_emit(uint64[])void': [arr: bigint[] | number[]] + 'test_nested_array(uint64,uint64[][])uint64[]': [arrToAdd: bigint | number, arr: bigint[] | number[][]] + 'test_bit_packed_tuples()void': [] + 'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)': [arr1: bigint[] | number[], arr2: boolean[], arr3: [bigint | number, boolean, boolean][], arr4: [bigint | number, string][]] + 'test_uint64_return(uint64)uint64[]': [append: bigint | number] + 'test_bool_return(uint64)bool[]': [append: bigint | number] + 'test_tuple_return(uint64)(uint64,bool,bool)[]': [append: bigint | number] + 'test_dynamic_tuple_return(uint64)(uint64,string)[]': [append: bigint | number] + 'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]': [arr: [bigint | number, boolean, boolean][], append: bigint | number] + 'test_concat_with_arc4_tuple((uint64,uint64))uint64[]': [arg: [bigint | number, bigint | number]] + 'test_concat_with_native_tuple((uint64,uint64))uint64[]': [arg: [bigint | number, bigint | number]] + 'test_dynamic_concat_with_arc4_tuple((string,string))string[]': [arg: [string, string]] + 'test_dynamic_concat_with_native_tuple((string,string))string[]': [arg: [string, string]] + 'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]': [imm1: [bigint | number, string][], imm2: [bigint | number, string][]] + 'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]': [imm: [bigint | number, bigint | number][]] + 'test_imm_fixed_arr()(uint64,uint64)[3]': [] + } +} + +/** + * The return type for each method + */ +export type ImmutableArrayContractReturns = { + 'test_uint64_array()void': void + 'test_biguint_array()void': void + 'test_bool_array(uint64)void': void + 'test_fixed_size_tuple_array()void': void + 'test_fixed_size_named_tuple_array()void': void + 'test_dynamic_sized_tuple_array()void': void + 'test_dynamic_sized_named_tuple_array()void': void + 'test_implicit_conversion_log(uint64[])void': void + 'test_implicit_conversion_emit(uint64[])void': void + 'test_nested_array(uint64,uint64[][])uint64[]': bigint[] + 'test_bit_packed_tuples()void': void + 'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)': [bigint, bigint, bigint, bigint] + 'test_uint64_return(uint64)uint64[]': bigint[] + 'test_bool_return(uint64)bool[]': boolean[] + 'test_tuple_return(uint64)(uint64,bool,bool)[]': [bigint, boolean, boolean][] + 'test_dynamic_tuple_return(uint64)(uint64,string)[]': [bigint, string][] + 'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]': [bigint, boolean, boolean][] + 'test_concat_with_arc4_tuple((uint64,uint64))uint64[]': bigint[] + 'test_concat_with_native_tuple((uint64,uint64))uint64[]': bigint[] + 'test_dynamic_concat_with_arc4_tuple((string,string))string[]': string[] + 'test_dynamic_concat_with_native_tuple((string,string))string[]': string[] + 'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]': [bigint, string][] + 'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]': [bigint, bigint][] + 'test_imm_fixed_arr()(uint64,uint64)[3]': [[bigint, bigint], [bigint, bigint], [bigint, bigint]] +} + +/** + * Defines the types of available calls and state of the ImmutableArrayContract smart contract. + */ +export type ImmutableArrayContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'test_uint64_array()void' | 'test_uint64_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_uint64_array()void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_uint64_array()void'] + returns: ImmutableArrayContractReturns['test_uint64_array()void'] + }> + & Record<'test_biguint_array()void' | 'test_biguint_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_biguint_array()void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_biguint_array()void'] + returns: ImmutableArrayContractReturns['test_biguint_array()void'] + }> + & Record<'test_bool_array(uint64)void' | 'test_bool_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_bool_array(uint64)void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_bool_array(uint64)void'] + returns: ImmutableArrayContractReturns['test_bool_array(uint64)void'] + }> + & Record<'test_fixed_size_tuple_array()void' | 'test_fixed_size_tuple_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_fixed_size_tuple_array()void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_fixed_size_tuple_array()void'] + returns: ImmutableArrayContractReturns['test_fixed_size_tuple_array()void'] + }> + & Record<'test_fixed_size_named_tuple_array()void' | 'test_fixed_size_named_tuple_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_fixed_size_named_tuple_array()void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_fixed_size_named_tuple_array()void'] + returns: ImmutableArrayContractReturns['test_fixed_size_named_tuple_array()void'] + }> + & Record<'test_dynamic_sized_tuple_array()void' | 'test_dynamic_sized_tuple_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_sized_tuple_array()void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_sized_tuple_array()void'] + returns: ImmutableArrayContractReturns['test_dynamic_sized_tuple_array()void'] + }> + & Record<'test_dynamic_sized_named_tuple_array()void' | 'test_dynamic_sized_named_tuple_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_sized_named_tuple_array()void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_sized_named_tuple_array()void'] + returns: ImmutableArrayContractReturns['test_dynamic_sized_named_tuple_array()void'] + }> + & Record<'test_implicit_conversion_log(uint64[])void' | 'test_implicit_conversion_log', { + argsObj: ImmutableArrayContractArgs['obj']['test_implicit_conversion_log(uint64[])void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_implicit_conversion_log(uint64[])void'] + returns: ImmutableArrayContractReturns['test_implicit_conversion_log(uint64[])void'] + }> + & Record<'test_implicit_conversion_emit(uint64[])void' | 'test_implicit_conversion_emit', { + argsObj: ImmutableArrayContractArgs['obj']['test_implicit_conversion_emit(uint64[])void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_implicit_conversion_emit(uint64[])void'] + returns: ImmutableArrayContractReturns['test_implicit_conversion_emit(uint64[])void'] + }> + & Record<'test_nested_array(uint64,uint64[][])uint64[]' | 'test_nested_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_nested_array(uint64,uint64[][])uint64[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_nested_array(uint64,uint64[][])uint64[]'] + returns: ImmutableArrayContractReturns['test_nested_array(uint64,uint64[][])uint64[]'] + }> + & Record<'test_bit_packed_tuples()void' | 'test_bit_packed_tuples', { + argsObj: ImmutableArrayContractArgs['obj']['test_bit_packed_tuples()void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_bit_packed_tuples()void'] + returns: ImmutableArrayContractReturns['test_bit_packed_tuples()void'] + }> + & Record<'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)' | 'sum_uints_and_lengths_and_trues', { + argsObj: ImmutableArrayContractArgs['obj']['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'] + argsTuple: ImmutableArrayContractArgs['tuple']['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'] + returns: ImmutableArrayContractReturns['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'] + }> + & Record<'test_uint64_return(uint64)uint64[]' | 'test_uint64_return', { + argsObj: ImmutableArrayContractArgs['obj']['test_uint64_return(uint64)uint64[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_uint64_return(uint64)uint64[]'] + returns: ImmutableArrayContractReturns['test_uint64_return(uint64)uint64[]'] + }> + & Record<'test_bool_return(uint64)bool[]' | 'test_bool_return', { + argsObj: ImmutableArrayContractArgs['obj']['test_bool_return(uint64)bool[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_bool_return(uint64)bool[]'] + returns: ImmutableArrayContractReturns['test_bool_return(uint64)bool[]'] + }> + & Record<'test_tuple_return(uint64)(uint64,bool,bool)[]' | 'test_tuple_return', { + argsObj: ImmutableArrayContractArgs['obj']['test_tuple_return(uint64)(uint64,bool,bool)[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_tuple_return(uint64)(uint64,bool,bool)[]'] + returns: ImmutableArrayContractReturns['test_tuple_return(uint64)(uint64,bool,bool)[]'] + }> + & Record<'test_dynamic_tuple_return(uint64)(uint64,string)[]' | 'test_dynamic_tuple_return', { + argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_tuple_return(uint64)(uint64,string)[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_tuple_return(uint64)(uint64,string)[]'] + returns: ImmutableArrayContractReturns['test_dynamic_tuple_return(uint64)(uint64,string)[]'] + }> + & Record<'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]' | 'test_convert_to_array_and_back', { + argsObj: ImmutableArrayContractArgs['obj']['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'] + returns: ImmutableArrayContractReturns['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'] + }> + & Record<'test_concat_with_arc4_tuple((uint64,uint64))uint64[]' | 'test_concat_with_arc4_tuple', { + argsObj: ImmutableArrayContractArgs['obj']['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'] + returns: ImmutableArrayContractReturns['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'] + }> + & Record<'test_concat_with_native_tuple((uint64,uint64))uint64[]' | 'test_concat_with_native_tuple', { + argsObj: ImmutableArrayContractArgs['obj']['test_concat_with_native_tuple((uint64,uint64))uint64[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_concat_with_native_tuple((uint64,uint64))uint64[]'] + returns: ImmutableArrayContractReturns['test_concat_with_native_tuple((uint64,uint64))uint64[]'] + }> + & Record<'test_dynamic_concat_with_arc4_tuple((string,string))string[]' | 'test_dynamic_concat_with_arc4_tuple', { + argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_concat_with_arc4_tuple((string,string))string[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_concat_with_arc4_tuple((string,string))string[]'] + returns: ImmutableArrayContractReturns['test_dynamic_concat_with_arc4_tuple((string,string))string[]'] + }> + & Record<'test_dynamic_concat_with_native_tuple((string,string))string[]' | 'test_dynamic_concat_with_native_tuple', { + argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_concat_with_native_tuple((string,string))string[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_concat_with_native_tuple((string,string))string[]'] + returns: ImmutableArrayContractReturns['test_dynamic_concat_with_native_tuple((string,string))string[]'] + }> + & Record<'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]' | 'test_concat_immutable_dynamic', { + argsObj: ImmutableArrayContractArgs['obj']['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'] + returns: ImmutableArrayContractReturns['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'] + }> + & Record<'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]' | 'test_immutable_arc4', { + argsObj: ImmutableArrayContractArgs['obj']['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'] + returns: ImmutableArrayContractReturns['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'] + }> + & Record<'test_imm_fixed_arr()(uint64,uint64)[3]' | 'test_imm_fixed_arr', { + argsObj: ImmutableArrayContractArgs['obj']['test_imm_fixed_arr()(uint64,uint64)[3]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_imm_fixed_arr()(uint64,uint64)[3]'] + returns: ImmutableArrayContractReturns['test_imm_fixed_arr()(uint64,uint64)[3]'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + global: { + keys: { + a: bigint[] + g: boolean[] + c: [bigint, bigint][] + d: [bigint, boolean, boolean][] + e: [bigint, Uint8Array][] + f: [bigint, string][] + bool2: [boolean, boolean][] + bool7: [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] + bool8: [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] + bool9: [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] + immFixedArr: [[bigint, bigint], [bigint, bigint], [bigint, bigint]] + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type ImmutableArrayContractSignatures = keyof ImmutableArrayContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type ImmutableArrayContractNonVoidMethodSignatures = keyof ImmutableArrayContractTypes['methods'] extends infer T ? T extends keyof ImmutableArrayContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the ImmutableArrayContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = ImmutableArrayContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the ImmutableArrayContract smart contract to the method's return type + */ +export type MethodReturn = ImmutableArrayContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed global state of the application. + */ +export type GlobalKeysState = ImmutableArrayContractTypes['state']['global']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type ImmutableArrayContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type ImmutableArrayContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: ImmutableArrayContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the ImmutableArrayContract smart contract + */ +export abstract class ImmutableArrayContractParamsFactory { + /** + * Constructs a no op call for the test_uint64_array()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testUint64Array(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_uint64_array()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_biguint_array()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testBiguintArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_biguint_array()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_bool_array(uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testBoolArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_bool_array(uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.length], + } + } + /** + * Constructs a no op call for the test_fixed_size_tuple_array()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testFixedSizeTupleArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_fixed_size_tuple_array()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_fixed_size_named_tuple_array()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testFixedSizeNamedTupleArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_fixed_size_named_tuple_array()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_dynamic_sized_tuple_array()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testDynamicSizedTupleArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_dynamic_sized_tuple_array()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_dynamic_sized_named_tuple_array()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testDynamicSizedNamedTupleArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_dynamic_sized_named_tuple_array()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_implicit_conversion_log(uint64[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImplicitConversionLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_implicit_conversion_log(uint64[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arr], + } + } + /** + * Constructs a no op call for the test_implicit_conversion_emit(uint64[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImplicitConversionEmit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_implicit_conversion_emit(uint64[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arr], + } + } + /** + * Constructs a no op call for the test_nested_array(uint64,uint64[][])uint64[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testNestedArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_nested_array(uint64,uint64[][])uint64[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arrToAdd, params.args.arr], + } + } + /** + * Constructs a no op call for the test_bit_packed_tuples()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testBitPackedTuples(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_bit_packed_tuples()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static sumUintsAndLengthsAndTrues(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arr1, params.args.arr2, params.args.arr3, params.args.arr4], + } + } + /** + * Constructs a no op call for the test_uint64_return(uint64)uint64[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testUint64Return(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_uint64_return(uint64)uint64[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.append], + } + } + /** + * Constructs a no op call for the test_bool_return(uint64)bool[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testBoolReturn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_bool_return(uint64)bool[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.append], + } + } + /** + * Constructs a no op call for the test_tuple_return(uint64)(uint64,bool,bool)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testTupleReturn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_tuple_return(uint64)(uint64,bool,bool)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.append], + } + } + /** + * Constructs a no op call for the test_dynamic_tuple_return(uint64)(uint64,string)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testDynamicTupleReturn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_dynamic_tuple_return(uint64)(uint64,string)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.append], + } + } + /** + * Constructs a no op call for the test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testConvertToArrayAndBack(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arr, params.args.append], + } + } + /** + * Constructs a no op call for the test_concat_with_arc4_tuple((uint64,uint64))uint64[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testConcatWithArc4Tuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_concat_with_arc4_tuple((uint64,uint64))uint64[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arg], + } + } + /** + * Constructs a no op call for the test_concat_with_native_tuple((uint64,uint64))uint64[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testConcatWithNativeTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_concat_with_native_tuple((uint64,uint64))uint64[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arg], + } + } + /** + * Constructs a no op call for the test_dynamic_concat_with_arc4_tuple((string,string))string[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testDynamicConcatWithArc4Tuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_dynamic_concat_with_arc4_tuple((string,string))string[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arg], + } + } + /** + * Constructs a no op call for the test_dynamic_concat_with_native_tuple((string,string))string[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testDynamicConcatWithNativeTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_dynamic_concat_with_native_tuple((string,string))string[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arg], + } + } + /** + * Constructs a no op call for the test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testConcatImmutableDynamic(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.imm1, params.args.imm2], + } + } + /** + * Constructs a no op call for the test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImmutableArc4(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.imm], + } + } + /** + * Constructs a no op call for the test_imm_fixed_arr()(uint64,uint64)[3] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImmFixedArr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_imm_fixed_arr()(uint64,uint64)[3]' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the ImmutableArrayContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class ImmutableArrayContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `ImmutableArrayContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new ImmutableArrayContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new ImmutableArrayContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the ImmutableArrayContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: ImmutableArrayContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new ImmutableArrayContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ImmutableArrayContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ImmutableArrayContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ImmutableArrayContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new ImmutableArrayContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the ImmutableArrayContract smart contract + */ +export class ImmutableArrayContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `ImmutableArrayContractClient` + * + * @param appClient An `AppClient` instance which has been created with the ImmutableArrayContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `ImmutableArrayContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `ImmutableArrayContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new ImmutableArrayContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `ImmutableArrayContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new ImmutableArrayContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testUint64Array: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testUint64Array(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_biguint_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testBiguintArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testBiguintArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_array(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testBoolArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testBoolArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testFixedSizeTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testFixedSizeTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_named_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testFixedSizeNamedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testFixedSizeNamedTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testDynamicSizedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicSizedTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_named_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testDynamicSizedNamedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicSizedNamedTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_log(uint64[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImplicitConversionLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testImplicitConversionLog(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_emit(uint64[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImplicitConversionEmit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testImplicitConversionEmit(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_nested_array(uint64,uint64[][])uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testNestedArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testNestedArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bit_packed_tuples()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testBitPackedTuples: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testBitPackedTuples(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + sumUintsAndLengthsAndTrues: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.sumUintsAndLengthsAndTrues(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_return(uint64)uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testUint64Return: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testUint64Return(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_return(uint64)bool[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testBoolReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testBoolReturn(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_tuple_return(uint64)(uint64,bool,bool)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testTupleReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testTupleReturn(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_tuple_return(uint64)(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testDynamicTupleReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicTupleReturn(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testConvertToArrayAndBack: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testConvertToArrayAndBack(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_arc4_tuple((uint64,uint64))uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testConcatWithArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testConcatWithArc4Tuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_native_tuple((uint64,uint64))uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testConcatWithNativeTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testConcatWithNativeTuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_arc4_tuple((string,string))string[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testDynamicConcatWithArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithArc4Tuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_native_tuple((string,string))string[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testDynamicConcatWithNativeTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithNativeTuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testConcatImmutableDynamic: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testConcatImmutableDynamic(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImmutableArc4: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testImmutableArc4(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_imm_fixed_arr()(uint64,uint64)[3]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImmFixedArr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testImmFixedArr(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testUint64Array: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testUint64Array(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_biguint_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testBiguintArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testBiguintArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_array(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testBoolArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testBoolArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testFixedSizeTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testFixedSizeTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_named_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testFixedSizeNamedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testFixedSizeNamedTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testDynamicSizedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicSizedTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_named_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testDynamicSizedNamedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicSizedNamedTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_log(uint64[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImplicitConversionLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testImplicitConversionLog(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_emit(uint64[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImplicitConversionEmit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testImplicitConversionEmit(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_nested_array(uint64,uint64[][])uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testNestedArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testNestedArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bit_packed_tuples()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testBitPackedTuples: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testBitPackedTuples(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + sumUintsAndLengthsAndTrues: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.sumUintsAndLengthsAndTrues(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_return(uint64)uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testUint64Return: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testUint64Return(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_return(uint64)bool[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testBoolReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testBoolReturn(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_tuple_return(uint64)(uint64,bool,bool)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testTupleReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testTupleReturn(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_tuple_return(uint64)(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testDynamicTupleReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicTupleReturn(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testConvertToArrayAndBack: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testConvertToArrayAndBack(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_arc4_tuple((uint64,uint64))uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testConcatWithArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testConcatWithArc4Tuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_native_tuple((uint64,uint64))uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testConcatWithNativeTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testConcatWithNativeTuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_arc4_tuple((string,string))string[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testDynamicConcatWithArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithArc4Tuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_native_tuple((string,string))string[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testDynamicConcatWithNativeTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithNativeTuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testConcatImmutableDynamic: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testConcatImmutableDynamic(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImmutableArc4: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testImmutableArc4(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_imm_fixed_arr()(uint64,uint64)[3]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImmFixedArr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testImmFixedArr(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testUint64Array: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testUint64Array(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_uint64_array()void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_biguint_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testBiguintArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testBiguintArray(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_biguint_array()void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_array(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testBoolArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testBoolArray(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_bool_array(uint64)void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testFixedSizeTupleArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testFixedSizeTupleArray(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_fixed_size_tuple_array()void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_named_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testFixedSizeNamedTupleArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testFixedSizeNamedTupleArray(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_fixed_size_named_tuple_array()void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testDynamicSizedTupleArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicSizedTupleArray(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_sized_tuple_array()void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_named_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testDynamicSizedNamedTupleArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicSizedNamedTupleArray(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_sized_named_tuple_array()void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_log(uint64[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImplicitConversionLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testImplicitConversionLog(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_implicit_conversion_log(uint64[])void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_emit(uint64[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImplicitConversionEmit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testImplicitConversionEmit(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_implicit_conversion_emit(uint64[])void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_nested_array(uint64,uint64[][])uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testNestedArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testNestedArray(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_nested_array(uint64,uint64[][])uint64[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bit_packed_tuples()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testBitPackedTuples: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testBitPackedTuples(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_bit_packed_tuples()void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + sumUintsAndLengthsAndTrues: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.sumUintsAndLengthsAndTrues(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_return(uint64)uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testUint64Return: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testUint64Return(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_uint64_return(uint64)uint64[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_return(uint64)bool[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testBoolReturn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testBoolReturn(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_bool_return(uint64)bool[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_tuple_return(uint64)(uint64,bool,bool)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testTupleReturn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testTupleReturn(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_tuple_return(uint64)(uint64,bool,bool)[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_tuple_return(uint64)(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testDynamicTupleReturn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicTupleReturn(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_tuple_return(uint64)(uint64,string)[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testConvertToArrayAndBack: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testConvertToArrayAndBack(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_arc4_tuple((uint64,uint64))uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testConcatWithArc4Tuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testConcatWithArc4Tuple(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_native_tuple((uint64,uint64))uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testConcatWithNativeTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testConcatWithNativeTuple(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_concat_with_native_tuple((uint64,uint64))uint64[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_arc4_tuple((string,string))string[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testDynamicConcatWithArc4Tuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithArc4Tuple(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_concat_with_arc4_tuple((string,string))string[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_native_tuple((string,string))string[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testDynamicConcatWithNativeTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithNativeTuple(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_concat_with_native_tuple((string,string))string[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testConcatImmutableDynamic: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testConcatImmutableDynamic(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImmutableArc4: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testImmutableArc4(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_imm_fixed_arr()(uint64,uint64)[3]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImmFixedArr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testImmFixedArr(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_imm_fixed_arr()(uint64,uint64)[3]'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new ImmutableArrayContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current ImmutableArrayContract app + */ + state = { + /** + * Methods to access global state for the current ImmutableArrayContract app + */ + global: { + /** + * Get all current keyed values from global state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.global.getAll() + return { + a: result.a, + g: result.g, + c: result.c, + d: result.d, + e: result.e, + f: result.f, + bool2: result.bool2, + bool7: result.bool7, + bool8: result.bool8, + bool9: result.bool9, + immFixedArr: result.imm_fixed_arr, + } + }, + /** + * Get the current value of the a key in global state + */ + a: async (): Promise => { return (await this.appClient.state.global.getValue("a")) as bigint[] | undefined }, + /** + * Get the current value of the g key in global state + */ + g: async (): Promise => { return (await this.appClient.state.global.getValue("g")) as boolean[] | undefined }, + /** + * Get the current value of the c key in global state + */ + c: async (): Promise<[bigint, bigint][] | undefined> => { return (await this.appClient.state.global.getValue("c")) as [bigint, bigint][] | undefined }, + /** + * Get the current value of the d key in global state + */ + d: async (): Promise<[bigint, boolean, boolean][] | undefined> => { return (await this.appClient.state.global.getValue("d")) as [bigint, boolean, boolean][] | undefined }, + /** + * Get the current value of the e key in global state + */ + e: async (): Promise<[bigint, Uint8Array][] | undefined> => { return (await this.appClient.state.global.getValue("e")) as [bigint, Uint8Array][] | undefined }, + /** + * Get the current value of the f key in global state + */ + f: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.global.getValue("f")) as [bigint, string][] | undefined }, + /** + * Get the current value of the bool2 key in global state + */ + bool2: async (): Promise<[boolean, boolean][] | undefined> => { return (await this.appClient.state.global.getValue("bool2")) as [boolean, boolean][] | undefined }, + /** + * Get the current value of the bool7 key in global state + */ + bool7: async (): Promise<[bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined> => { return (await this.appClient.state.global.getValue("bool7")) as [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined }, + /** + * Get the current value of the bool8 key in global state + */ + bool8: async (): Promise<[bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined> => { return (await this.appClient.state.global.getValue("bool8")) as [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined }, + /** + * Get the current value of the bool9 key in global state + */ + bool9: async (): Promise<[bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined> => { return (await this.appClient.state.global.getValue("bool9")) as [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined }, + /** + * Get the current value of the imm_fixed_arr key in global state + */ + immFixedArr: async (): Promise<[[bigint, bigint], [bigint, bigint], [bigint, bigint]] | undefined> => { return (await this.appClient.state.global.getValue("imm_fixed_arr")) as [[bigint, bigint], [bigint, bigint], [bigint, bigint]] | undefined }, + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): ImmutableArrayContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a test_uint64_array()void method call against the ImmutableArrayContract contract + */ + testUint64Array(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testUint64Array(params))) + return this + }, + /** + * Add a test_biguint_array()void method call against the ImmutableArrayContract contract + */ + testBiguintArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBiguintArray(params))) + return this + }, + /** + * Add a test_bool_array(uint64)void method call against the ImmutableArrayContract contract + */ + testBoolArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBoolArray(params))) + return this + }, + /** + * Add a test_fixed_size_tuple_array()void method call against the ImmutableArrayContract contract + */ + testFixedSizeTupleArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testFixedSizeTupleArray(params))) + return this + }, + /** + * Add a test_fixed_size_named_tuple_array()void method call against the ImmutableArrayContract contract + */ + testFixedSizeNamedTupleArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testFixedSizeNamedTupleArray(params))) + return this + }, + /** + * Add a test_dynamic_sized_tuple_array()void method call against the ImmutableArrayContract contract + */ + testDynamicSizedTupleArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicSizedTupleArray(params))) + return this + }, + /** + * Add a test_dynamic_sized_named_tuple_array()void method call against the ImmutableArrayContract contract + */ + testDynamicSizedNamedTupleArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicSizedNamedTupleArray(params))) + return this + }, + /** + * Add a test_implicit_conversion_log(uint64[])void method call against the ImmutableArrayContract contract + */ + testImplicitConversionLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImplicitConversionLog(params))) + return this + }, + /** + * Add a test_implicit_conversion_emit(uint64[])void method call against the ImmutableArrayContract contract + */ + testImplicitConversionEmit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImplicitConversionEmit(params))) + return this + }, + /** + * Add a test_nested_array(uint64,uint64[][])uint64[] method call against the ImmutableArrayContract contract + */ + testNestedArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testNestedArray(params))) + return this + }, + /** + * Add a test_bit_packed_tuples()void method call against the ImmutableArrayContract contract + */ + testBitPackedTuples(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBitPackedTuples(params))) + return this + }, + /** + * Add a sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64) method call against the ImmutableArrayContract contract + */ + sumUintsAndLengthsAndTrues(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sumUintsAndLengthsAndTrues(params))) + return this + }, + /** + * Add a test_uint64_return(uint64)uint64[] method call against the ImmutableArrayContract contract + */ + testUint64Return(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testUint64Return(params))) + return this + }, + /** + * Add a test_bool_return(uint64)bool[] method call against the ImmutableArrayContract contract + */ + testBoolReturn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBoolReturn(params))) + return this + }, + /** + * Add a test_tuple_return(uint64)(uint64,bool,bool)[] method call against the ImmutableArrayContract contract + */ + testTupleReturn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testTupleReturn(params))) + return this + }, + /** + * Add a test_dynamic_tuple_return(uint64)(uint64,string)[] method call against the ImmutableArrayContract contract + */ + testDynamicTupleReturn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicTupleReturn(params))) + return this + }, + /** + * Add a test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[] method call against the ImmutableArrayContract contract + */ + testConvertToArrayAndBack(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testConvertToArrayAndBack(params))) + return this + }, + /** + * Add a test_concat_with_arc4_tuple((uint64,uint64))uint64[] method call against the ImmutableArrayContract contract + */ + testConcatWithArc4Tuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testConcatWithArc4Tuple(params))) + return this + }, + /** + * Add a test_concat_with_native_tuple((uint64,uint64))uint64[] method call against the ImmutableArrayContract contract + */ + testConcatWithNativeTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testConcatWithNativeTuple(params))) + return this + }, + /** + * Add a test_dynamic_concat_with_arc4_tuple((string,string))string[] method call against the ImmutableArrayContract contract + */ + testDynamicConcatWithArc4Tuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicConcatWithArc4Tuple(params))) + return this + }, + /** + * Add a test_dynamic_concat_with_native_tuple((string,string))string[] method call against the ImmutableArrayContract contract + */ + testDynamicConcatWithNativeTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicConcatWithNativeTuple(params))) + return this + }, + /** + * Add a test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[] method call against the ImmutableArrayContract contract + */ + testConcatImmutableDynamic(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testConcatImmutableDynamic(params))) + return this + }, + /** + * Add a test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[] method call against the ImmutableArrayContract contract + */ + testImmutableArc4(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArc4(params))) + return this + }, + /** + * Add a test_imm_fixed_arr()(uint64,uint64)[3] method call against the ImmutableArrayContract contract + */ + testImmFixedArr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmFixedArr(params))) + return this + }, + /** + * Add a clear state call to the ImmutableArrayContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as ImmutableArrayContractComposer + } +} +export type ImmutableArrayContractComposer = { + /** + * Calls the test_uint64_array()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testUint64Array(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_uint64_array()void'] | undefined]> + + /** + * Calls the test_biguint_array()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testBiguintArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_biguint_array()void'] | undefined]> + + /** + * Calls the test_bool_array(uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testBoolArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_bool_array(uint64)void'] | undefined]> + + /** + * Calls the test_fixed_size_tuple_array()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testFixedSizeTupleArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_fixed_size_tuple_array()void'] | undefined]> + + /** + * Calls the test_fixed_size_named_tuple_array()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testFixedSizeNamedTupleArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_fixed_size_named_tuple_array()void'] | undefined]> + + /** + * Calls the test_dynamic_sized_tuple_array()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testDynamicSizedTupleArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_sized_tuple_array()void'] | undefined]> + + /** + * Calls the test_dynamic_sized_named_tuple_array()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testDynamicSizedNamedTupleArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_sized_named_tuple_array()void'] | undefined]> + + /** + * Calls the test_implicit_conversion_log(uint64[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImplicitConversionLog(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_implicit_conversion_log(uint64[])void'] | undefined]> + + /** + * Calls the test_implicit_conversion_emit(uint64[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImplicitConversionEmit(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_implicit_conversion_emit(uint64[])void'] | undefined]> + + /** + * Calls the test_nested_array(uint64,uint64[][])uint64[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testNestedArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_nested_array(uint64,uint64[][])uint64[]'] | undefined]> + + /** + * Calls the test_bit_packed_tuples()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testBitPackedTuples(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_bit_packed_tuples()void'] | undefined]> + + /** + * Calls the sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + sumUintsAndLengthsAndTrues(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'] | undefined]> + + /** + * Calls the test_uint64_return(uint64)uint64[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testUint64Return(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_uint64_return(uint64)uint64[]'] | undefined]> + + /** + * Calls the test_bool_return(uint64)bool[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testBoolReturn(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_bool_return(uint64)bool[]'] | undefined]> + + /** + * Calls the test_tuple_return(uint64)(uint64,bool,bool)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testTupleReturn(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_tuple_return(uint64)(uint64,bool,bool)[]'] | undefined]> + + /** + * Calls the test_dynamic_tuple_return(uint64)(uint64,string)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testDynamicTupleReturn(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_tuple_return(uint64)(uint64,string)[]'] | undefined]> + + /** + * Calls the test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testConvertToArrayAndBack(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'] | undefined]> + + /** + * Calls the test_concat_with_arc4_tuple((uint64,uint64))uint64[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testConcatWithArc4Tuple(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'] | undefined]> + + /** + * Calls the test_concat_with_native_tuple((uint64,uint64))uint64[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testConcatWithNativeTuple(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_concat_with_native_tuple((uint64,uint64))uint64[]'] | undefined]> + + /** + * Calls the test_dynamic_concat_with_arc4_tuple((string,string))string[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testDynamicConcatWithArc4Tuple(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_concat_with_arc4_tuple((string,string))string[]'] | undefined]> + + /** + * Calls the test_dynamic_concat_with_native_tuple((string,string))string[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testDynamicConcatWithNativeTuple(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_concat_with_native_tuple((string,string))string[]'] | undefined]> + + /** + * Calls the test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testConcatImmutableDynamic(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'] | undefined]> + + /** + * Calls the test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImmutableArc4(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'] | undefined]> + + /** + * Calls the test_imm_fixed_arr()(uint64,uint64)[3] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImmFixedArr(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_imm_fixed_arr()(uint64,uint64)[3]'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): ImmutableArrayContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): ImmutableArrayContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type ImmutableArrayContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayInitContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayInitContract.ts new file mode 100644 index 0000000..358fea4 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayInitContract.ts @@ -0,0 +1,755 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"ImmutableArrayInitContract","structs":{},"methods":[{"name":"test_immutable_array_init","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_immutable_array_init_without_type_generic","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reference_array_init","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reference_array_init_without_type_generic","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[42],"errorMessage":"OnCompletion must be NoOp"},{"pc":[89],"errorMessage":"OnCompletion must be NoOp && can only call when creating"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayA4IDMgMSAwCiAgICBieXRlY2Jsb2NrIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzkKICAgIC8vIGNsYXNzIEltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDExCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDg0MzRiYTJhIDB4NjNhYWJiYTAgMHhkYmFmMDM0ZSAweGE5ZDE0NTU0IC8vIG1ldGhvZCAidGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdCgpdm9pZCIsIG1ldGhvZCAidGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYygpdm9pZCIsIG1ldGhvZCAidGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdCgpdm9pZCIsIG1ldGhvZCAidGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYygpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXQgdGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYyB0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0IHRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWMKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDkwCiAgICAvLyBhMyA9IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0oUmVmZXJlbmNlQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTEyCiAgICAvLyBhMyA9IEltbXV0YWJsZUFycmF5KFJlZmVyZW5jZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUluaXRDb250cmFjdC50ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNgogICAgLy8gYTEgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyOAogICAgLy8gYTIgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKEZpeGVkQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKSkKICAgIGR1cAogICAgcG9wCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyOQogICAgLy8gYXNzZXJ0IGExLmxlbmd0aCA9PSBhMi5sZW5ndGgKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzAKICAgIC8vIGFzc2VydCBhMVswXSA9PSBhMlswXQogICAgZHVwCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzEKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhMlsxXQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzIKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhMlsyXQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzQKICAgIC8vIGEzID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XShJbW11dGFibGVBcnJheSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgcG9wCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzNgogICAgLy8gYXNzZXJ0IGExWzBdID09IGEzWzBdCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzcKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhM1sxXQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzgKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhM1syXQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MjYKICAgIC8vIGExID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQxCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGE0Lmxlbmd0aAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQyCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTRbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQzCiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTRbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ0CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTRbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0LnRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ4CiAgICAvLyBhMSA9IFJlZmVyZW5jZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1MAogICAgLy8gYTIgPSBSZWZlcmVuY2VBcnJheShGaXhlZEFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBkdXAKICAgIHBvcAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NTEKICAgIC8vIGFzc2VydCBhMS5sZW5ndGggPT0gYTIubGVuZ3RoCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUyCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTJbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUzCiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTJbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU0CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTJbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU2CiAgICAvLyBhMyA9IFJlZmVyZW5jZUFycmF5KEltbXV0YWJsZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU4CiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTNbMF0KICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1OQogICAgLy8gYXNzZXJ0IGExWzFdID09IGEzWzFdCiAgICBkdXAKICAgIGludGNfMCAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU2MAogICAgLy8gYXNzZXJ0IGExWzJdID09IGEzWzJdCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0OAogICAgLy8gYTEgPSBSZWZlcmVuY2VBcnJheSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTYzCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGE0Lmxlbmd0aAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY0CiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTRbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY1CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTRbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY2CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTRbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"byteCode":{"approval":"CiAECAMBACYBGAAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAzEbQQArMRkURDEYRIIEBIQ0uioEY6q7oATbrwNOBKnRRVQ2GgCOBAAJAA0AEQBjADEZFDEYFBBDKEgkQyhIJEMoSUhHAhUiCiMSREklWyQSREkiW4ECEkSBEFsjEkQoSEcCJVskEkRJIluBAhJEgRBbIxJEKEgoSEkVIgojEkRJJVskEkRJIluBAhJEgRBbIxJDKElIRwIVIgojEkRJJVskEkRJIluBAhJEgRBbIxJEKEhHAiVbJBJESSJbgQISRIEQWyMSRChIKEhJFSIKIxJESSVbJBJESSJbgQISRIEQWyMSQw==","clear":"CoEBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the ImmutableArrayInitContract contract + */ +export type ImmutableArrayInitContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'test_immutable_array_init()void': Record + 'test_immutable_array_init_without_type_generic()void': Record + 'test_reference_array_init()void': Record + 'test_reference_array_init_without_type_generic()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'test_immutable_array_init()void': [] + 'test_immutable_array_init_without_type_generic()void': [] + 'test_reference_array_init()void': [] + 'test_reference_array_init_without_type_generic()void': [] + } +} + +/** + * The return type for each method + */ +export type ImmutableArrayInitContractReturns = { + 'test_immutable_array_init()void': void + 'test_immutable_array_init_without_type_generic()void': void + 'test_reference_array_init()void': void + 'test_reference_array_init_without_type_generic()void': void +} + +/** + * Defines the types of available calls and state of the ImmutableArrayInitContract smart contract. + */ +export type ImmutableArrayInitContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'test_immutable_array_init()void' | 'test_immutable_array_init', { + argsObj: ImmutableArrayInitContractArgs['obj']['test_immutable_array_init()void'] + argsTuple: ImmutableArrayInitContractArgs['tuple']['test_immutable_array_init()void'] + returns: ImmutableArrayInitContractReturns['test_immutable_array_init()void'] + }> + & Record<'test_immutable_array_init_without_type_generic()void' | 'test_immutable_array_init_without_type_generic', { + argsObj: ImmutableArrayInitContractArgs['obj']['test_immutable_array_init_without_type_generic()void'] + argsTuple: ImmutableArrayInitContractArgs['tuple']['test_immutable_array_init_without_type_generic()void'] + returns: ImmutableArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'] + }> + & Record<'test_reference_array_init()void' | 'test_reference_array_init', { + argsObj: ImmutableArrayInitContractArgs['obj']['test_reference_array_init()void'] + argsTuple: ImmutableArrayInitContractArgs['tuple']['test_reference_array_init()void'] + returns: ImmutableArrayInitContractReturns['test_reference_array_init()void'] + }> + & Record<'test_reference_array_init_without_type_generic()void' | 'test_reference_array_init_without_type_generic', { + argsObj: ImmutableArrayInitContractArgs['obj']['test_reference_array_init_without_type_generic()void'] + argsTuple: ImmutableArrayInitContractArgs['tuple']['test_reference_array_init_without_type_generic()void'] + returns: ImmutableArrayInitContractReturns['test_reference_array_init_without_type_generic()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type ImmutableArrayInitContractSignatures = keyof ImmutableArrayInitContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the ImmutableArrayInitContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = ImmutableArrayInitContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the ImmutableArrayInitContract smart contract to the method's return type + */ +export type MethodReturn = ImmutableArrayInitContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type ImmutableArrayInitContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type ImmutableArrayInitContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: ImmutableArrayInitContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the ImmutableArrayInitContract smart contract + */ +export abstract class ImmutableArrayInitContractParamsFactory { + /** + * Constructs a no op call for the test_immutable_array_init()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImmutableArrayInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_immutable_array_init()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_immutable_array_init_without_type_generic()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImmutableArrayInitWithoutTypeGeneric(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_immutable_array_init_without_type_generic()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_reference_array_init()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testReferenceArrayInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_reference_array_init()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_reference_array_init_without_type_generic()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testReferenceArrayInitWithoutTypeGeneric(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_reference_array_init_without_type_generic()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the ImmutableArrayInitContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class ImmutableArrayInitContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `ImmutableArrayInitContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new ImmutableArrayInitContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new ImmutableArrayInitContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the ImmutableArrayInitContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: ImmutableArrayInitContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new ImmutableArrayInitContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ImmutableArrayInitContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ImmutableArrayInitContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ImmutableArrayInitContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new ImmutableArrayInitContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the ImmutableArrayInitContract smart contract + */ +export class ImmutableArrayInitContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `ImmutableArrayInitContractClient` + * + * @param appClient An `AppClient` instance which has been created with the ImmutableArrayInitContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `ImmutableArrayInitContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `ImmutableArrayInitContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new ImmutableArrayInitContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `ImmutableArrayInitContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new ImmutableArrayInitContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayInitContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImmutableArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInit(params)) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImmutableArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testReferenceArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInit(params)) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testReferenceArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayInitContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImmutableArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInit(params)) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImmutableArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testReferenceArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInit(params)) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testReferenceArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayInitContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImmutableArrayInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInit(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayInitContractReturns['test_immutable_array_init()void'])} + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImmutableArrayInitWithoutTypeGeneric: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'])} + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testReferenceArrayInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInit(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayInitContractReturns['test_reference_array_init()void'])} + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testReferenceArrayInitWithoutTypeGeneric: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayInitContractReturns['test_reference_array_init_without_type_generic()void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new ImmutableArrayInitContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current ImmutableArrayInitContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): ImmutableArrayInitContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a test_immutable_array_init()void method call against the ImmutableArrayInitContract contract + */ + testImmutableArrayInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArrayInit(params))) + return this + }, + /** + * Add a test_immutable_array_init_without_type_generic()void method call against the ImmutableArrayInitContract contract + */ + testImmutableArrayInitWithoutTypeGeneric(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArrayInitWithoutTypeGeneric(params))) + return this + }, + /** + * Add a test_reference_array_init()void method call against the ImmutableArrayInitContract contract + */ + testReferenceArrayInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testReferenceArrayInit(params))) + return this + }, + /** + * Add a test_reference_array_init_without_type_generic()void method call against the ImmutableArrayInitContract contract + */ + testReferenceArrayInitWithoutTypeGeneric(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testReferenceArrayInitWithoutTypeGeneric(params))) + return this + }, + /** + * Add a clear state call to the ImmutableArrayInitContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as ImmutableArrayInitContractComposer + } +} +export type ImmutableArrayInitContractComposer = { + /** + * Calls the test_immutable_array_init()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImmutableArrayInit(params?: CallParams): ImmutableArrayInitContractComposer<[...TReturns, ImmutableArrayInitContractReturns['test_immutable_array_init()void'] | undefined]> + + /** + * Calls the test_immutable_array_init_without_type_generic()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImmutableArrayInitWithoutTypeGeneric(params?: CallParams): ImmutableArrayInitContractComposer<[...TReturns, ImmutableArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'] | undefined]> + + /** + * Calls the test_reference_array_init()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testReferenceArrayInit(params?: CallParams): ImmutableArrayInitContractComposer<[...TReturns, ImmutableArrayInitContractReturns['test_reference_array_init()void'] | undefined]> + + /** + * Calls the test_reference_array_init_without_type_generic()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testReferenceArrayInitWithoutTypeGeneric(params?: CallParams): ImmutableArrayInitContractComposer<[...TReturns, ImmutableArrayInitContractReturns['test_reference_array_init_without_type_generic()void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayInitContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): ImmutableArrayInitContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): ImmutableArrayInitContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type ImmutableArrayInitContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/LocalStateContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/LocalStateContract.ts new file mode 100644 index 0000000..767e777 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/LocalStateContract.ts @@ -0,0 +1,1746 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"LocalStateContract","structs":{},"methods":[{"name":"opt_in","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["OptIn"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_uint","args":[{"type":"address","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_string","args":[{"type":"address","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_byte","args":[{"type":"address","name":"a"}],"returns":{"type":"byte"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_bool","args":[{"type":"address","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_address","args":[{"type":"address","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_uint128","args":[{"type":"address","name":"a"}],"returns":{"type":"uint128"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_dynamic_bytes","args":[{"type":"address","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_tuple","args":[{"type":"address","name":"a"}],"returns":{"type":"(uint64,byte[],bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_uint","args":[{"type":"address","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_string","args":[{"type":"address","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_byte","args":[{"type":"address","name":"a"}],"returns":{"type":"byte"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_bool","args":[{"type":"address","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_address","args":[{"type":"address","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_uint128","args":[{"type":"address","name":"a"}],"returns":{"type":"uint128"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_dynamic_bytes","args":[{"type":"address","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":15}},"keys":{"global":{},"local":{"implicit_key_arc4_uint":{"keyType":"AVMString","valueType":"uint64","key":"aW1wbGljaXRfa2V5X2FyYzRfdWludA=="},"implicit_key_arc4_string":{"keyType":"AVMString","valueType":"string","key":"aW1wbGljaXRfa2V5X2FyYzRfc3RyaW5n"},"implicit_key_arc4_byte":{"keyType":"AVMString","valueType":"byte","key":"aW1wbGljaXRfa2V5X2FyYzRfYnl0ZQ=="},"implicit_key_arc4_bool":{"keyType":"AVMString","valueType":"bool","key":"aW1wbGljaXRfa2V5X2FyYzRfYm9vbA=="},"implicit_key_arc4_address":{"keyType":"AVMString","valueType":"address","key":"aW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcw=="},"implicit_key_arc4_uint128":{"keyType":"AVMString","valueType":"uint128","key":"aW1wbGljaXRfa2V5X2FyYzRfdWludDEyOA=="},"implicit_key_arc4_dynamic_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"aW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcw=="},"implicit_key_tuple":{"keyType":"AVMString","valueType":"(uint64,byte[],bool)","key":"aW1wbGljaXRfa2V5X3R1cGxl"},"arc4_uint":{"keyType":"AVMString","valueType":"uint64","key":"ZXhwbGljaXRfa2V5X2FyYzRfdWludA=="},"arc4_string":{"keyType":"AVMString","valueType":"string","key":"ZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5n"},"arc4_byte":{"keyType":"AVMString","valueType":"byte","key":"ZXhwbGljaXRfa2V5X2FyYzRfYnl0ZQ=="},"arc4_bool":{"keyType":"AVMString","valueType":"bool","key":"ZXhwbGljaXRfa2V5X2FyYzRfYm9vbA=="},"arc4_address":{"keyType":"AVMString","valueType":"address","key":"ZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcw=="},"arc4_uint128":{"keyType":"AVMString","valueType":"uint128","key":"ZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOA=="},"arc4_dynamic_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"ZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcw=="}},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[891],"errorMessage":"check self.arc4_address exists for account"},{"pc":[877],"errorMessage":"check self.arc4_bool exists for account"},{"pc":[863],"errorMessage":"check self.arc4_byte exists for account"},{"pc":[919],"errorMessage":"check self.arc4_dynamic_bytes exists for account"},{"pc":[849],"errorMessage":"check self.arc4_string exists for account"},{"pc":[835],"errorMessage":"check self.arc4_uint exists for account"},{"pc":[905],"errorMessage":"check self.arc4_uint128 exists for account"},{"pc":[779],"errorMessage":"check self.implicit_key_arc4_address exists for account"},{"pc":[765],"errorMessage":"check self.implicit_key_arc4_bool exists for account"},{"pc":[751],"errorMessage":"check self.implicit_key_arc4_byte exists for account"},{"pc":[807],"errorMessage":"check self.implicit_key_arc4_dynamic_bytes exists for account"},{"pc":[737],"errorMessage":"check self.implicit_key_arc4_string exists for account"},{"pc":[724],"errorMessage":"check self.implicit_key_arc4_uint exists for account"},{"pc":[793],"errorMessage":"check self.implicit_key_arc4_uint128 exists for account"},{"pc":[821],"errorMessage":"check self.implicit_key_tuple exists for account"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIgMHgwMDAwMDAwMDAwMDAwNTM5ICJpbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmciIDB4MDAwNTQ4NjU2YzZjNmYgImltcGxpY2l0X2tleV9hcmM0X2J5dGUiICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIiAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiIDB4MDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgImltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczICJpbXBsaWNpdF9rZXlfdHVwbGUiICJleHBsaWNpdF9rZXlfYXJjNF91aW50IiAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIiAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIgImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOCIgImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjYzCiAgICAvLyBjbGFzcyBMb2NhbFN0YXRlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDI2CiAgICBwdXNoYnl0ZXMgMHgzMGM2ZDU4YSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2luX3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY2MwogICAgLy8gY2xhc3MgTG9jYWxTdGF0ZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhiM2NmYTM4OSAweGRiODU4MTc2IDB4NzgyNjc3NjIgMHg0MjYzNTFjOCAweDA3NWNhZTkxIDB4NTljMGI4MGIgMHgwZDZmYTY5MCAweDk3ZTEwZDljIDB4MmU0YThjNDkgMHhiMjJjZDIxZSAweGIzZjQ0NzAxIDB4ZWRkOTcyOTcgMHg2NzFkMzUzYyAweGEzZmQ2ZmRjIDB4Y2QyZTVkNjYgLy8gbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludChhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyhhZGRyZXNzKXN0cmluZyIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGUoYWRkcmVzcylieXRlIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbChhZGRyZXNzKWJvb2wiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKGFkZHJlc3MpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgoYWRkcmVzcyl1aW50MTI4IiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyhhZGRyZXNzKWJ5dGVbXSIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV90dXBsZShhZGRyZXNzKSh1aW50NjQsYnl0ZVtdLGJvb2wpIiwgbWV0aG9kICJnZXRfYXJjNF91aW50KGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJnZXRfYXJjNF9zdHJpbmcoYWRkcmVzcylzdHJpbmciLCBtZXRob2QgImdldF9hcmM0X2J5dGUoYWRkcmVzcylieXRlIiwgbWV0aG9kICJnZXRfYXJjNF9ib29sKGFkZHJlc3MpYm9vbCIsIG1ldGhvZCAiZ2V0X2FyYzRfYWRkcmVzcyhhZGRyZXNzKWFkZHJlc3MiLCBtZXRob2QgImdldF9hcmM0X3VpbnQxMjgoYWRkcmVzcyl1aW50MTI4IiwgbWV0aG9kICJnZXRfYXJjNF9keW5hbWljX2J5dGVzKGFkZHJlc3MpYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBnZXRfaW1wbGljaXRfa2V5X3R1cGxlIGdldF9hcmM0X3VpbnQgZ2V0X2FyYzRfc3RyaW5nIGdldF9hcmM0X2J5dGUgZ2V0X2FyYzRfYm9vbCBnZXRfYXJjNF9hZGRyZXNzIGdldF9hcmM0X3VpbnQxMjggZ2V0X2FyYzRfZHluYW1pY19ieXRlcwogICAgZXJyCgptYWluX29wdF9pbl9yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE9wdEluCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgb3B0X2luCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDI2OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0Lm9wdF9pbltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdF9pbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2ODgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuVUludDY0KDEzMzcpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDUzOQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY4OQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlY18zIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICBieXRlYyA0IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTAKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZVtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQnl0ZSgwKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyA1IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTEKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQm9vbChUcnVlKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgcHVzaGJ5dGVzIDB4ODAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTIKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQWRkcmVzcygKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTMKICAgIC8vIEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5Mi02OTQKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQWRkcmVzcygKICAgIC8vICAgICBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzCiAgICAvLyApCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk1CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjhbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlVJbnQxMjgoMioqMTAwKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyA4IC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk2CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkR5bmFtaWNCeXRlcygKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTAgLy8gImltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk2LTY5OAogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoCiAgICAvLyAgICAgYiJkeW5hbWljIGJ5dGVzIgogICAgLy8gKQogICAgYnl0ZWMgMTEgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTkKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gKFVJbnQ2NCgxMCksIEJ5dGVzKGIidGVzdCIpLCBGYWxzZSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTIgLy8gImltcGxpY2l0X2tleV90dXBsZSIKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMGEwMDBiMDAwMDA0NzQ2NTczNzQKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDEKICAgIC8vIHNlbGYuYXJjNF91aW50W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5VSW50NjQoMTMzNykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTMgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDUzOQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwMgogICAgLy8gc2VsZi5hcmM0X3N0cmluZ1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuU3RyaW5nKCJIZWxsbyIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDE0IC8vICJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njg5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZ1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuU3RyaW5nKCJIZWxsbyIpCiAgICBieXRlYyA0IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDIKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmdbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwMwogICAgLy8gc2VsZi5hcmM0X2J5dGVbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJ5dGUoMCkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTUgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwNAogICAgLy8gc2VsZi5hcmM0X2Jvb2xbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJvb2woVHJ1ZSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTYgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjkxCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2xbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJvb2woVHJ1ZSkKICAgIHB1c2hieXRlcyAweDgwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA0CiAgICAvLyBzZWxmLmFyYzRfYm9vbFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQm9vbChUcnVlKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwNQogICAgLy8gc2VsZi5hcmM0X2FkZHJlc3NbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkFkZHJlc3MoR2xvYmFsLmNyZWF0b3JfYWRkcmVzcykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTcgLy8gImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDYKICAgIC8vIHNlbGYuYXJjNF91aW50MTI4W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5VSW50MTI4KDIqKjEwMCkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTggLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDcKICAgIC8vIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTkgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk2LTY5OAogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoCiAgICAvLyAgICAgYiJkeW5hbWljIGJ5dGVzIgogICAgLy8gKQogICAgYnl0ZWMgMTEgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDcKICAgIC8vIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA5LTcxMAogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgaW1wbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MTIKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnRbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDktNzEwCiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxNgogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyMAogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZVthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ieXRlIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyNAogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyOAogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDcgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczMgogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDggLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczNgogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQwCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGVbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMiAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0Mi03NDMKICAgIC8vICMgR2V0dGVyIG1ldGhvZHMgZm9yIGV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQ1CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3VpbnRbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfdWludCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDItNzQzCiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfc3RyaW5nW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDkKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfc3RyaW5nW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfc3RyaW5nIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTMKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYnl0ZVthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJleHBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ieXRlIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ib29sOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTcKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYm9vbFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ib29sIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2FkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjEKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYWRkcmVzc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9hZGRyZXNzIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjUKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfdWludDEyOFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF91aW50MTI4IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2R5bmFtaWNfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9keW5hbWljX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjkKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfZHluYW1pY19ieXRlc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmFAQVH3x1FmltcGxpY2l0X2tleV9hcmM0X3VpbnQIAAAAAAAABTkYaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nBwAFSGVsbG8WaW1wbGljaXRfa2V5X2FyYzRfYnl0ZRZpbXBsaWNpdF9rZXlfYXJjNF9ib29sGWltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MZaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOBAAAAAQAAAAAAAAAAAAAAAAH2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMPAA1keW5hbWljIGJ5dGVzEmltcGxpY2l0X2tleV90dXBsZRZleHBsaWNpdF9rZXlfYXJjNF91aW50GGV4cGxpY2l0X2tleV9hcmM0X3N0cmluZxZleHBsaWNpdF9rZXlfYXJjNF9ieXRlFmV4cGxpY2l0X2tleV9hcmM0X2Jvb2wZZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcxlleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4H2V4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMxG0EAkIAEMMbVijYaAI4BAHgxGRREMRhEgg8Es8+jiQTbhYF2BHgmd2IEQmNRyAQHXK6RBFnAuAsEDW+mkASX4Q2cBC5KjEkEsizSHgSz9EcBBO3ZcpcEZx01PASj/W/cBM0uXWY2GgCODwCQAJ0AqgC4AMYA1ADiAPAA/gEMARoBKAE2AUQBUgAxGSISMRgQREIACDEZFDEYFBBDMgkpKmYyCSsnBGYyCScFgAEAZjIJJwaAAYBmMgknBzIJZjIJJwgnCWYyCScKJwtmMgknDIARAAAAAAAAAAoACwAABHRlc3RmMgknDSpmMgknDicEZjIJJw+AAQBmMgknEIABgGYyCScRMglmMgknEicJZjIJJxMnC2YiQzYaASMpY0QoTFCwIkM2GgEjK2NEKExQsCJDNhoBIycFY0QoTFCwIkM2GgEjJwZjRChMULAiQzYaASMnB2NEKExQsCJDNhoBIycIY0QoTFCwIkM2GgEjJwpjRChMULAiQzYaASMnDGNEKExQsCJDNhoBIycNY0QoTFCwIkM2GgEjJw5jRChMULAiQzYaASMnD2NEKExQsCJDNhoBIycQY0QoTFCwIkM2GgEjJxFjRChMULAiQzYaASMnEmNEKExQsCJDNhoBIycTY0QoTFCwIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the LocalStateContract contract + */ +export type LocalStateContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'opt_in()void': Record + 'get_implicit_key_arc4_uint(address)uint64': { + a: string + } + 'get_implicit_key_arc4_string(address)string': { + a: string + } + 'get_implicit_key_arc4_byte(address)byte': { + a: string + } + 'get_implicit_key_arc4_bool(address)bool': { + a: string + } + 'get_implicit_key_arc4_address(address)address': { + a: string + } + 'get_implicit_key_arc4_uint128(address)uint128': { + a: string + } + 'get_implicit_key_arc4_dynamic_bytes(address)byte[]': { + a: string + } + 'get_implicit_key_tuple(address)(uint64,byte[],bool)': { + a: string + } + 'get_arc4_uint(address)uint64': { + a: string + } + 'get_arc4_string(address)string': { + a: string + } + 'get_arc4_byte(address)byte': { + a: string + } + 'get_arc4_bool(address)bool': { + a: string + } + 'get_arc4_address(address)address': { + a: string + } + 'get_arc4_uint128(address)uint128': { + a: string + } + 'get_arc4_dynamic_bytes(address)byte[]': { + a: string + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'opt_in()void': [] + 'get_implicit_key_arc4_uint(address)uint64': [a: string] + 'get_implicit_key_arc4_string(address)string': [a: string] + 'get_implicit_key_arc4_byte(address)byte': [a: string] + 'get_implicit_key_arc4_bool(address)bool': [a: string] + 'get_implicit_key_arc4_address(address)address': [a: string] + 'get_implicit_key_arc4_uint128(address)uint128': [a: string] + 'get_implicit_key_arc4_dynamic_bytes(address)byte[]': [a: string] + 'get_implicit_key_tuple(address)(uint64,byte[],bool)': [a: string] + 'get_arc4_uint(address)uint64': [a: string] + 'get_arc4_string(address)string': [a: string] + 'get_arc4_byte(address)byte': [a: string] + 'get_arc4_bool(address)bool': [a: string] + 'get_arc4_address(address)address': [a: string] + 'get_arc4_uint128(address)uint128': [a: string] + 'get_arc4_dynamic_bytes(address)byte[]': [a: string] + } +} + +/** + * The return type for each method + */ +export type LocalStateContractReturns = { + 'opt_in()void': void + 'get_implicit_key_arc4_uint(address)uint64': bigint + 'get_implicit_key_arc4_string(address)string': string + 'get_implicit_key_arc4_byte(address)byte': number + 'get_implicit_key_arc4_bool(address)bool': boolean + 'get_implicit_key_arc4_address(address)address': string + 'get_implicit_key_arc4_uint128(address)uint128': bigint + 'get_implicit_key_arc4_dynamic_bytes(address)byte[]': Uint8Array + 'get_implicit_key_tuple(address)(uint64,byte[],bool)': [bigint, Uint8Array, boolean] + 'get_arc4_uint(address)uint64': bigint + 'get_arc4_string(address)string': string + 'get_arc4_byte(address)byte': number + 'get_arc4_bool(address)bool': boolean + 'get_arc4_address(address)address': string + 'get_arc4_uint128(address)uint128': bigint + 'get_arc4_dynamic_bytes(address)byte[]': Uint8Array +} + +/** + * Defines the types of available calls and state of the LocalStateContract smart contract. + */ +export type LocalStateContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'opt_in()void' | 'opt_in', { + argsObj: LocalStateContractArgs['obj']['opt_in()void'] + argsTuple: LocalStateContractArgs['tuple']['opt_in()void'] + returns: LocalStateContractReturns['opt_in()void'] + }> + & Record<'get_implicit_key_arc4_uint(address)uint64' | 'get_implicit_key_arc4_uint', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_uint(address)uint64'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_uint(address)uint64'] + returns: LocalStateContractReturns['get_implicit_key_arc4_uint(address)uint64'] + }> + & Record<'get_implicit_key_arc4_string(address)string' | 'get_implicit_key_arc4_string', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_string(address)string'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_string(address)string'] + returns: LocalStateContractReturns['get_implicit_key_arc4_string(address)string'] + }> + & Record<'get_implicit_key_arc4_byte(address)byte' | 'get_implicit_key_arc4_byte', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_byte(address)byte'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_byte(address)byte'] + returns: LocalStateContractReturns['get_implicit_key_arc4_byte(address)byte'] + }> + & Record<'get_implicit_key_arc4_bool(address)bool' | 'get_implicit_key_arc4_bool', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_bool(address)bool'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_bool(address)bool'] + returns: LocalStateContractReturns['get_implicit_key_arc4_bool(address)bool'] + }> + & Record<'get_implicit_key_arc4_address(address)address' | 'get_implicit_key_arc4_address', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_address(address)address'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_address(address)address'] + returns: LocalStateContractReturns['get_implicit_key_arc4_address(address)address'] + }> + & Record<'get_implicit_key_arc4_uint128(address)uint128' | 'get_implicit_key_arc4_uint128', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_uint128(address)uint128'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_uint128(address)uint128'] + returns: LocalStateContractReturns['get_implicit_key_arc4_uint128(address)uint128'] + }> + & Record<'get_implicit_key_arc4_dynamic_bytes(address)byte[]' | 'get_implicit_key_arc4_dynamic_bytes', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_dynamic_bytes(address)byte[]'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_dynamic_bytes(address)byte[]'] + returns: LocalStateContractReturns['get_implicit_key_arc4_dynamic_bytes(address)byte[]'] + }> + & Record<'get_implicit_key_tuple(address)(uint64,byte[],bool)' | 'get_implicit_key_tuple', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_tuple(address)(uint64,byte[],bool)'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_tuple(address)(uint64,byte[],bool)'] + returns: LocalStateContractReturns['get_implicit_key_tuple(address)(uint64,byte[],bool)'] + }> + & Record<'get_arc4_uint(address)uint64' | 'get_arc4_uint', { + argsObj: LocalStateContractArgs['obj']['get_arc4_uint(address)uint64'] + argsTuple: LocalStateContractArgs['tuple']['get_arc4_uint(address)uint64'] + returns: LocalStateContractReturns['get_arc4_uint(address)uint64'] + }> + & Record<'get_arc4_string(address)string' | 'get_arc4_string', { + argsObj: LocalStateContractArgs['obj']['get_arc4_string(address)string'] + argsTuple: LocalStateContractArgs['tuple']['get_arc4_string(address)string'] + returns: LocalStateContractReturns['get_arc4_string(address)string'] + }> + & Record<'get_arc4_byte(address)byte' | 'get_arc4_byte', { + argsObj: LocalStateContractArgs['obj']['get_arc4_byte(address)byte'] + argsTuple: LocalStateContractArgs['tuple']['get_arc4_byte(address)byte'] + returns: LocalStateContractReturns['get_arc4_byte(address)byte'] + }> + & Record<'get_arc4_bool(address)bool' | 'get_arc4_bool', { + argsObj: LocalStateContractArgs['obj']['get_arc4_bool(address)bool'] + argsTuple: LocalStateContractArgs['tuple']['get_arc4_bool(address)bool'] + returns: LocalStateContractReturns['get_arc4_bool(address)bool'] + }> + & Record<'get_arc4_address(address)address' | 'get_arc4_address', { + argsObj: LocalStateContractArgs['obj']['get_arc4_address(address)address'] + argsTuple: LocalStateContractArgs['tuple']['get_arc4_address(address)address'] + returns: LocalStateContractReturns['get_arc4_address(address)address'] + }> + & Record<'get_arc4_uint128(address)uint128' | 'get_arc4_uint128', { + argsObj: LocalStateContractArgs['obj']['get_arc4_uint128(address)uint128'] + argsTuple: LocalStateContractArgs['tuple']['get_arc4_uint128(address)uint128'] + returns: LocalStateContractReturns['get_arc4_uint128(address)uint128'] + }> + & Record<'get_arc4_dynamic_bytes(address)byte[]' | 'get_arc4_dynamic_bytes', { + argsObj: LocalStateContractArgs['obj']['get_arc4_dynamic_bytes(address)byte[]'] + argsTuple: LocalStateContractArgs['tuple']['get_arc4_dynamic_bytes(address)byte[]'] + returns: LocalStateContractReturns['get_arc4_dynamic_bytes(address)byte[]'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + local: { + keys: { + implicitKeyArc4Uint: bigint + implicitKeyArc4String: string + implicitKeyArc4Byte: number + implicitKeyArc4Bool: boolean + implicitKeyArc4Address: string + implicitKeyArc4Uint128: bigint + implicitKeyArc4DynamicBytes: Uint8Array + implicitKeyTuple: [bigint, Uint8Array, boolean] + arc4Uint: bigint + arc4String: string + arc4Byte: number + arc4Bool: boolean + arc4Address: string + arc4Uint128: bigint + arc4DynamicBytes: Uint8Array + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type LocalStateContractSignatures = keyof LocalStateContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type LocalStateContractNonVoidMethodSignatures = keyof LocalStateContractTypes['methods'] extends infer T ? T extends keyof LocalStateContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the LocalStateContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = LocalStateContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the LocalStateContract smart contract to the method's return type + */ +export type MethodReturn = LocalStateContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed local state of the application. + */ +export type LocalKeysState = LocalStateContractTypes['state']['local']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type LocalStateContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type LocalStateContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: LocalStateContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the LocalStateContract smart contract + */ +export abstract class LocalStateContractParamsFactory { + /** + * Gets available optIn ABI call param factories + */ + static get optIn() { + return { + /** + * Constructs opt-in ABI call params for the LocalStateContract smart contract using the opt_in()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + optIn(params: CallParams): AppClientMethodCallParams { + return { + ...params, + method: 'opt_in()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + + /** + * Constructs a no op call for the get_implicit_key_arc4_uint(address)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_uint(address)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_string(address)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_string(address)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_byte(address)byte ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_byte(address)byte' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_bool(address)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_bool(address)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_address(address)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_address(address)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_uint128(address)uint128 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_uint128(address)uint128' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_dynamic_bytes(address)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_dynamic_bytes(address)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_implicit_key_tuple(address)(uint64,byte[],bool) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_tuple(address)(uint64,byte[],bool)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_arc4_uint(address)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_uint(address)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_arc4_string(address)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_string(address)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_arc4_byte(address)byte ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_byte(address)byte' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_arc4_bool(address)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_bool(address)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_arc4_address(address)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_address(address)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_arc4_uint128(address)uint128 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_uint128(address)uint128' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_arc4_dynamic_bytes(address)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_dynamic_bytes(address)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } +} + +/** + * A factory to create and deploy one or more instance of the LocalStateContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class LocalStateContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `LocalStateContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new LocalStateContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new LocalStateContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the LocalStateContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: LocalStateContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new LocalStateContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the LocalStateContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the LocalStateContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the LocalStateContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new LocalStateContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the LocalStateContract smart contract + */ +export class LocalStateContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `LocalStateContractClient` + * + * @param appClient An `AppClient` instance which has been created with the LocalStateContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `LocalStateContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `LocalStateContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new LocalStateContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `LocalStateContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new LocalStateContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the LocalStateContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn params + */ + optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + return this.appClient.params.optIn(LocalStateContractParamsFactory.optIn.optIn(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the LocalStateContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint(address)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_string(address)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4String(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_byte(address)byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_bool(address)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_address(address)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Address(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint128(address)uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes(address)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_tuple(address)(uint64,byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyTuple(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint(address)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Uint(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_string(address)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getArc4String(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_byte(address)byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Byte(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_bool(address)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Bool(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_address(address)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Address(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint128(address)uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Uint128(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_dynamic_bytes(address)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getArc4DynamicBytes(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the LocalStateContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn transaction + */ + optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + return this.appClient.createTransaction.optIn(LocalStateContractParamsFactory.optIn.optIn(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the LocalStateContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint(address)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_string(address)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4String(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_byte(address)byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_bool(address)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_address(address)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Address(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint128(address)uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes(address)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_tuple(address)(uint64,byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyTuple(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint(address)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Uint(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_string(address)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4String(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_byte(address)byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Byte(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_bool(address)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Bool(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_address(address)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Address(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint128(address)uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Uint128(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_dynamic_bytes(address)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4DynamicBytes(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the LocalStateContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn result + */ + optIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + const result = await this.appClient.send.optIn(LocalStateContractParamsFactory.optIn.optIn(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['opt_in()void'])} + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the LocalStateContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint(address)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_uint(address)uint64'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_string(address)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4String(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_string(address)string'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_byte(address)byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_byte(address)byte'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_bool(address)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_bool(address)bool'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_address(address)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Address(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_address(address)address'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint128(address)uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_uint128(address)uint128'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes(address)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_dynamic_bytes(address)byte[]'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_tuple(address)(uint64,byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyTuple(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_tuple(address)(uint64,byte[],bool)'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint(address)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Uint(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_uint(address)uint64'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_string(address)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4String(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_string(address)string'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_byte(address)byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Byte(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_byte(address)byte'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_bool(address)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Bool(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_bool(address)bool'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_address(address)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Address(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_address(address)address'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint128(address)uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Uint128(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_uint128(address)uint128'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_dynamic_bytes(address)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4DynamicBytes(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_dynamic_bytes(address)byte[]'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new LocalStateContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current LocalStateContract app + */ + state = { + /** + * Methods to access local state for the current LocalStateContract app + */ + local: (address: string | Address) => { + const encodedAddress = typeof address === 'string' ? address : encodeAddress(address.publicKey) + return { + /** + * Get all current keyed values from local state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.local(encodedAddress).getAll() + return { + implicitKeyArc4Uint: result.implicit_key_arc4_uint, + implicitKeyArc4String: result.implicit_key_arc4_string, + implicitKeyArc4Byte: result.implicit_key_arc4_byte, + implicitKeyArc4Bool: result.implicit_key_arc4_bool, + implicitKeyArc4Address: result.implicit_key_arc4_address, + implicitKeyArc4Uint128: result.implicit_key_arc4_uint128, + implicitKeyArc4DynamicBytes: result.implicit_key_arc4_dynamic_bytes, + implicitKeyTuple: result.implicit_key_tuple, + arc4Uint: result.arc4_uint, + arc4String: result.arc4_string, + arc4Byte: result.arc4_byte, + arc4Bool: result.arc4_bool, + arc4Address: result.arc4_address, + arc4Uint128: result.arc4_uint128, + arc4DynamicBytes: result.arc4_dynamic_bytes, + } + }, + /** + * Get the current value of the implicit_key_arc4_uint key in local state + */ + implicitKeyArc4Uint: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_uint")) as bigint | undefined }, + /** + * Get the current value of the implicit_key_arc4_string key in local state + */ + implicitKeyArc4String: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_string")) as string | undefined }, + /** + * Get the current value of the implicit_key_arc4_byte key in local state + */ + implicitKeyArc4Byte: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_byte")) as number | undefined }, + /** + * Get the current value of the implicit_key_arc4_bool key in local state + */ + implicitKeyArc4Bool: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_bool")) as boolean | undefined }, + /** + * Get the current value of the implicit_key_arc4_address key in local state + */ + implicitKeyArc4Address: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_address")) as string | undefined }, + /** + * Get the current value of the implicit_key_arc4_uint128 key in local state + */ + implicitKeyArc4Uint128: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_uint128")) as bigint | undefined }, + /** + * Get the current value of the implicit_key_arc4_dynamic_bytes key in local state + */ + implicitKeyArc4DynamicBytes: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_dynamic_bytes")) as Uint8Array | undefined }, + /** + * Get the current value of the implicit_key_tuple key in local state + */ + implicitKeyTuple: async (): Promise<[bigint, Uint8Array, boolean] | undefined> => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_tuple")) as [bigint, Uint8Array, boolean] | undefined }, + /** + * Get the current value of the arc4_uint key in local state + */ + arc4Uint: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_uint")) as bigint | undefined }, + /** + * Get the current value of the arc4_string key in local state + */ + arc4String: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_string")) as string | undefined }, + /** + * Get the current value of the arc4_byte key in local state + */ + arc4Byte: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_byte")) as number | undefined }, + /** + * Get the current value of the arc4_bool key in local state + */ + arc4Bool: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_bool")) as boolean | undefined }, + /** + * Get the current value of the arc4_address key in local state + */ + arc4Address: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_address")) as string | undefined }, + /** + * Get the current value of the arc4_uint128 key in local state + */ + arc4Uint128: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_uint128")) as bigint | undefined }, + /** + * Get the current value of the arc4_dynamic_bytes key in local state + */ + arc4DynamicBytes: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_dynamic_bytes")) as Uint8Array | undefined }, + } + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): LocalStateContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a get_implicit_key_arc4_uint(address)uint64 method call against the LocalStateContract contract + */ + getImplicitKeyArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Uint(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_string(address)string method call against the LocalStateContract contract + */ + getImplicitKeyArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4String(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_byte(address)byte method call against the LocalStateContract contract + */ + getImplicitKeyArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Byte(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_bool(address)bool method call against the LocalStateContract contract + */ + getImplicitKeyArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Bool(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_address(address)address method call against the LocalStateContract contract + */ + getImplicitKeyArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Address(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_uint128(address)uint128 method call against the LocalStateContract contract + */ + getImplicitKeyArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Uint128(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_dynamic_bytes(address)byte[] method call against the LocalStateContract contract + */ + getImplicitKeyArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4DynamicBytes(params))) + return this + }, + /** + * Add a get_implicit_key_tuple(address)(uint64,byte[],bool) method call against the LocalStateContract contract + */ + getImplicitKeyTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyTuple(params))) + return this + }, + /** + * Add a get_arc4_uint(address)uint64 method call against the LocalStateContract contract + */ + getArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Uint(params))) + return this + }, + /** + * Add a get_arc4_string(address)string method call against the LocalStateContract contract + */ + getArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4String(params))) + return this + }, + /** + * Add a get_arc4_byte(address)byte method call against the LocalStateContract contract + */ + getArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Byte(params))) + return this + }, + /** + * Add a get_arc4_bool(address)bool method call against the LocalStateContract contract + */ + getArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Bool(params))) + return this + }, + /** + * Add a get_arc4_address(address)address method call against the LocalStateContract contract + */ + getArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Address(params))) + return this + }, + /** + * Add a get_arc4_uint128(address)uint128 method call against the LocalStateContract contract + */ + getArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Uint128(params))) + return this + }, + /** + * Add a get_arc4_dynamic_bytes(address)byte[] method call against the LocalStateContract contract + */ + getArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4DynamicBytes(params))) + return this + }, + get optIn() { + return { + optIn: (params: CallParams) => { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn.optIn(params))) + return this + }, + } + }, + /** + * Add a clear state call to the LocalStateContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as LocalStateContractComposer + } +} +export type LocalStateContractComposer = { + /** + * Calls the get_implicit_key_arc4_uint(address)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Uint(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_uint(address)uint64'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_string(address)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4String(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_string(address)string'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_byte(address)byte ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Byte(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_byte(address)byte'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_bool(address)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Bool(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_bool(address)bool'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_address(address)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Address(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_address(address)address'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_uint128(address)uint128 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Uint128(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_uint128(address)uint128'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_dynamic_bytes(address)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4DynamicBytes(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_dynamic_bytes(address)byte[]'] | undefined]> + + /** + * Calls the get_implicit_key_tuple(address)(uint64,byte[],bool) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyTuple(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_tuple(address)(uint64,byte[],bool)'] | undefined]> + + /** + * Calls the get_arc4_uint(address)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Uint(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_uint(address)uint64'] | undefined]> + + /** + * Calls the get_arc4_string(address)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4String(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_string(address)string'] | undefined]> + + /** + * Calls the get_arc4_byte(address)byte ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Byte(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_byte(address)byte'] | undefined]> + + /** + * Calls the get_arc4_bool(address)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Bool(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_bool(address)bool'] | undefined]> + + /** + * Calls the get_arc4_address(address)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Address(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_address(address)address'] | undefined]> + + /** + * Calls the get_arc4_uint128(address)uint128 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Uint128(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_uint128(address)uint128'] | undefined]> + + /** + * Calls the get_arc4_dynamic_bytes(address)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4DynamicBytes(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_dynamic_bytes(address)byte[]'] | undefined]> + + /** + * Gets available optIn methods + */ + readonly optIn: { + /** + * Opts the user into an existing instance of the LocalStateContract smart contract using the opt_in()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + optIn(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['opt_in()void'] | undefined]> + } + + /** + * Makes a clear_state call to an existing instance of the LocalStateContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): LocalStateContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): LocalStateContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type LocalStateContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/MiscellaneousOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/MiscellaneousOpsContract.ts new file mode 100644 index 0000000..afd9e82 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/MiscellaneousOpsContract.ts @@ -0,0 +1,3082 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"MiscellaneousOpsContract","structs":{},"methods":[{"name":"verify_addw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_base64_decode_standard","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_base64_decode_url","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_bitlen","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_a_size"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_bitlen","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bsqrt","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_btoi","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bzero","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_concat","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"uint64","name":"pad_a_size"},{"type":"uint64","name":"pad_b_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_divmodw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"},{"type":"uint64","name":"d"}],"returns":{"type":"(uint64,uint64,uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_divw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_err","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_exp","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_expw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract_from_2","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract_uint16","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract_uint32","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_getbit_bytes","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_getbit_uint64","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_getbyte","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_itob","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_mulw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_replace","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_select_bytes","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_select_uint64","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_setbit_bytes","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"bool","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_setbit_uint64","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"},{"type":"bool","name":"c"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_setbyte","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_shl","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_shr","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_sqrt","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_substring","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_json_ref_string","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_json_ref_uint64","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_json_ref_object","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDE1MWY3Yzc1MDAyMCAweDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDQ0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg0NTg0N2VlYSAweGY1N2FjZWI1IDB4N2Q2MzE3MzAgMHhhMWIyNDQ0MSAweGNkN2JlMWFjIDB4N2NmZGE2NGIgMHg1NGE5MTBkOSAweGM0NjU2OGRlIDB4N2E0NmE2YWUgMHgwNDM3MjIwOSAweDdlNWY2ZDcyIDB4MjRlYmNmODQgMHg5YzBiMzM5NyAweDBhZDQwZGE0IDB4OTUxNzg4NzAgMHhkZWVkYzk5YiAweGFiMjE1MGJiIDB4MDJhNTQwMTcgMHgzZGI2NmI0MSAweDZlM2ZmMzhjIDB4OGYzYjlmMTggMHgxNjE2NmY5YSAweDJmNDcyMDY1IDB4ZDVhNzM5YzMgMHg2MWYzYjNlMSAweDU2Y2YzNjhiIDB4OTE5ZmZiZDIgMHhhYWU4YjY5NyAweDg0NzQyMmIxIDB4ZDUyNjAzMjcgMHgxMTRjOGM2ZCAweDM5ZTllNjJhIDB4ZDZhNGMwNWUgMHgxZWY4MTUxYSAweDY2ZGQ3Zjk2IDB4NGQ5ZWNlYjIgMHgxOWJhNzBlZSAvLyBtZXRob2QgInZlcmlmeV9hZGR3KHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfYmFzZTY0X2RlY29kZV9zdGFuZGFyZChieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmFzZTY0X2RlY29kZV91cmwoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2JpdGxlbihieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9iaXRsZW4odWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2JzcXJ0KGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9idG9pKGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9iemVybyh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfY29uY2F0KGJ5dGVbXSxieXRlW10sdWludDY0LHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9kaXZtb2R3KHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidmVyaWZ5X2RpdncodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZXJyKCl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfZXhwKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZXhwdyh1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidmVyaWZ5X2V4dHJhY3QoYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdF9mcm9tXzIoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2V4dHJhY3RfdWludDE2KGJ5dGVbXSx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdF91aW50MzIoYnl0ZVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9leHRyYWN0X3VpbnQ2NChieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2dldGJpdF9ieXRlcyhieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9nZXRiaXRfdWludDY0KHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2dldGJ5dGUoYnl0ZVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9pdG9iKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9tdWx3KHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfcmVwbGFjZShieXRlW10sdWludDY0LGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9zZWxlY3RfYnl0ZXMoYnl0ZVtdLGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc2VsZWN0X3VpbnQ2NCh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9zZXRiaXRfYnl0ZXMoYnl0ZVtdLHVpbnQ2NCxib29sKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X3NldGJpdF91aW50NjQodWludDY0LHVpbnQ2NCxib29sKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3NldGJ5dGUoYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc2hsKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc2hyKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc3FydCh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc3Vic3RyaW5nKGJ5dGVbXSx1aW50NjQsdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2pzb25fcmVmX3N0cmluZyhieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2pzb25fcmVmX3VpbnQ2NChieXRlW10sYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2pzb25fcmVmX29iamVjdChieXRlW10sYnl0ZVtdKWJ5dGVbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9hZGR3IHZlcmlmeV9iYXNlNjRfZGVjb2RlX3N0YW5kYXJkIHZlcmlmeV9iYXNlNjRfZGVjb2RlX3VybCB2ZXJpZnlfYnl0ZXNfYml0bGVuIHZlcmlmeV91aW50NjRfYml0bGVuIHZlcmlmeV9ic3FydCB2ZXJpZnlfYnRvaSB2ZXJpZnlfYnplcm8gdmVyaWZ5X2NvbmNhdCB2ZXJpZnlfZGl2bW9kdyB2ZXJpZnlfZGl2dyBtYWluX3ZlcmlmeV9lcnJfcm91dGVAMTUgdmVyaWZ5X2V4cCB2ZXJpZnlfZXhwdyB2ZXJpZnlfZXh0cmFjdCB2ZXJpZnlfZXh0cmFjdF9mcm9tXzIgdmVyaWZ5X2V4dHJhY3RfdWludDE2IHZlcmlmeV9leHRyYWN0X3VpbnQzMiB2ZXJpZnlfZXh0cmFjdF91aW50NjQgdmVyaWZ5X2dldGJpdF9ieXRlcyB2ZXJpZnlfZ2V0Yml0X3VpbnQ2NCB2ZXJpZnlfZ2V0Ynl0ZSB2ZXJpZnlfaXRvYiB2ZXJpZnlfbXVsdyB2ZXJpZnlfcmVwbGFjZSB2ZXJpZnlfc2VsZWN0X2J5dGVzIHZlcmlmeV9zZWxlY3RfdWludDY0IHZlcmlmeV9zZXRiaXRfYnl0ZXMgdmVyaWZ5X3NldGJpdF91aW50NjQgdmVyaWZ5X3NldGJ5dGUgdmVyaWZ5X3NobCB2ZXJpZnlfc2hyIHZlcmlmeV9zcXJ0IHZlcmlmeV9zdWJzdHJpbmcgdmVyaWZ5X2pzb25fcmVmX3N0cmluZyB2ZXJpZnlfanNvbl9yZWZfdWludDY0IHZlcmlmeV9qc29uX3JlZl9vYmplY3QKICAgIGVycgoKbWFpbl92ZXJpZnlfZXJyX3JvdXRlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANDQ6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYWRkd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hZGR3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjcKICAgIC8vIHJlc3VsdCA9IG9wLmFkZHcoYSwgYikKICAgIGFkZHcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Jhc2U2NF9kZWNvZGVfc3RhbmRhcmRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmFzZTY0X2RlY29kZV9zdGFuZGFyZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyCiAgICAvLyByZXN1bHQgPSBvcC5iYXNlNjRfZGVjb2RlKG9wLkJhc2U2NC5TdGRFbmNvZGluZywgYSkKICAgIGJhc2U2NF9kZWNvZGUgU3RkRW5jb2RpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIHJlc3VsdCA9IG9wLmJhc2U2NF9kZWNvZGUob3AuQmFzZTY0LlVSTEVuY29kaW5nLCBhKQogICAgYmFzZTY0X2RlY29kZSBVUkxFbmNvZGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfYml0bGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX2JpdGxlbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBhID0gb3AuYnplcm8ocGFkX2Ffc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToyMwogICAgLy8gcmVzdWx0ID0gb3AuYml0bGVuKGEpCiAgICBiaXRsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2JpdGxlbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfYml0bGVuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToyOAogICAgLy8gcmVzdWx0ID0gb3AuYml0bGVuKGEpCiAgICBiaXRsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYnNxcnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnNxcnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTozMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTozNAogICAgLy8gcmVzdWx0ID0gb3AuYnNxcnQoYV9iaWd1aW50KQogICAgYnNxcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2J0b2lbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnRvaToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjM5CiAgICAvLyByZXN1bHQgPSBvcC5idG9pKGEpCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTozNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2J6ZXJvW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J6ZXJvOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NAogICAgLy8gcmVzdWx0ID0gb3AuYnplcm8oYSkKICAgIGJ6ZXJvCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NQogICAgLy8gcmV0dXJuIG9wLnNoYTI1NihyZXN1bHQpCiAgICBzaGEyNTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2NvbmNhdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9jb25jYXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NDkKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfYV9zaXplKSArIGEKICAgIHN3YXAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NTAKICAgIC8vIGIgPSBvcC5iemVybyhwYWRfYl9zaXplKSArIGIKICAgIHN3YXAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NTEKICAgIC8vIHJlc3VsdCA9IGEgKyBiCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjUyCiAgICAvLyByZXN1bHQgPSBvcC5zaGEyNTYocmVzdWx0KQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9kaXZtb2R3W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Rpdm1vZHc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjU5CiAgICAvLyByZXN1bHQgPSBvcC5kaXZtb2R3KGEsIGIsIGMsIGQpCiAgICBkaXZtb2R3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Rpdndbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGl2dzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NjQKICAgIC8vIHJlc3VsdCA9IG9wLmRpdncoYSwgYiwgYykKICAgIGRpdncKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXhwW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4cDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIHJlc3VsdCA9IG9wLmV4cChhLCBiKQogICAgZXhwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4cHdbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZXhwdzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NzgKICAgIC8vIHJlc3VsdCA9IG9wLmV4cHcoYSwgYikKICAgIGV4cHcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4MwogICAgLy8gcmVzdWx0ID0gb3AuZXh0cmFjdChhLCBiLCBjKQogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3RfZnJvbV8yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3RfZnJvbV8yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4OAogICAgLy8gcmVzdWx0ID0gb3AuZXh0cmFjdChhLCAyLCAwKQogICAgZXh0cmFjdCA0IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3RfdWludDE2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3RfdWludDE2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTMKICAgIC8vIHJlc3VsdCA9IG9wLmV4dHJhY3RfdWludDE2KGEsIGIpCiAgICBleHRyYWN0X3VpbnQxNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0X3VpbnQzMltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9leHRyYWN0X3VpbnQzMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyByZXN1bHQgPSBvcC5leHRyYWN0X3VpbnQzMihhLCBiKQogICAgZXh0cmFjdF91aW50MzIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXh0cmFjdF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZXh0cmFjdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgcHVzaGludCA4CiAgICBleHRyYWN0MwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZ2V0Yml0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldGJpdF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMDgKICAgIC8vIHJlc3VsdCA9IG9wLmdldGJpdChhLCBiKQogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18yIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZ2V0Yml0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRiaXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTEzCiAgICAvLyByZXN1bHQgPSBvcC5nZXRiaXQoYSwgYikKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMiAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2dldGJ5dGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0Ynl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjExNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMTgKICAgIC8vIHJlc3VsdCA9IG9wLmdldGJ5dGUoYSwgYikKICAgIGdldGJ5dGUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjExNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2l0b2Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfaXRvYjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gcmVzdWx0ID0gb3AuaXRvYihhKQogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUwMDA4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfbXVsd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9tdWx3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTI4CiAgICAvLyByZXN1bHQgPSBvcC5tdWx3KGEsIGIpCiAgICBtdWx3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3JlcGxhY2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfcmVwbGFjZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTMzCiAgICAvLyByZXN1bHQgPSBvcC5yZXBsYWNlKGEsIGIsIGMpCiAgICByZXBsYWNlMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NlbGVjdF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zZWxlY3RfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gcmVzdWx0ID0gb3Auc2VsZWN0X2J5dGVzKGEsIGIsIGMpCiAgICBzZWxlY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zZWxlY3RfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NlbGVjdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDMKICAgIC8vIHJlc3VsdCA9IG9wLnNlbGVjdF91aW50NjQoYSwgYiwgYykKICAgIHNlbGVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2V0Yml0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NldGJpdF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDgKICAgIC8vIHJlc3VsdCA9IG9wLnNldGJpdF9ieXRlcyhhLCBiLCBjKQogICAgc2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2V0Yml0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zZXRiaXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUzCiAgICAvLyByZXN1bHQgPSBvcC5zZXRiaXRfdWludDY0KGEsIGIsIGMpCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NldGJ5dGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2V0Ynl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNTgKICAgIC8vIHJlc3VsdCA9IG9wLnNldGJ5dGUoYSwgYiwgYykKICAgIHNldGJ5dGUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zaGxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2hsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTYzCiAgICAvLyByZXN1bHQgPSBvcC5zaGwoYSwgYikKICAgIHNobAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2hyW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NocjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2OAogICAgLy8gcmVzdWx0ID0gb3Auc2hyKGEsIGIpCiAgICBzaHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NxcnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3FydDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3MwogICAgLy8gcmVzdWx0ID0gb3Auc3FydChhKQogICAgc3FydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc3Vic3RyaW5nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N1YnN0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNzgKICAgIC8vIHJlc3VsdCA9IG9wLnN1YnN0cmluZyhhLCBiLCBjKQogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2pzb25fcmVmX3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9qc29uX3JlZl9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gcmVzdWx0ID0gb3AuSnNvblJlZi5qc29uX3N0cmluZyhhLCBiKQogICAganNvbl9yZWYgSlNPTlN0cmluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2pzb25fcmVmX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9qc29uX3JlZl91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gcmVzdWx0ID0gb3AuSnNvblJlZi5qc29uX3VpbnQ2NChhLCBiKQogICAganNvbl9yZWYgSlNPTlVpbnQ2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfanNvbl9yZWZfb2JqZWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2pzb25fcmVmX29iamVjdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTkzCiAgICAvLyByZXN1bHQgPSBvcC5Kc29uUmVmLmpzb25fb2JqZWN0KGEsIGIpCiAgICBqc29uX3JlZiBKU09OT2JqZWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmAwQVH3x1BhUffHUAIAEAMRtBARMxGRREMRhEgiUERYR+6gT1es61BH1jFzAEobJEQQTNe+GsBHz9pksEVKkQ2QTEZWjeBHpGpq4EBDciCQR+X21yBCTrz4QEnAszlwQK1A2kBJUXiHAE3u3JmwSrIVC7BAKlQBcEPbZrQQRuP/OMBI87nxgEFhZvmgQvRyBlBNWnOcMEYfOz4QRWzzaLBJGf+9IEqui2lwSEdCKxBNUmAycEEUyMbQQ56eYqBNakwF4EHvgVGgRm3X+WBE2ezrIEGbpw7jYaAI4lAAoAHgA0AEoAXwBrAIAAjgCaAMAA5QABAPkBCQEdAToBTgFgAXIBhQGbAa8BwQHTAecCBgIlAjkCVwJsAokCmQKpArUC0gLuAwMAADEZFDEYFBBDNhoBFzYaAhceTBZMFlAoTFCwIkM2GgFXAgBeAUkVFlcGAkxQKExQsCJDNhoBVwIAXgBJFRZXBgJMUChMULAiQzYaAVcCADYaAhevTFCTFihMULAiQzYaAReTFihMULAiQzYaAVcCAJZJFRZXBgJMUChMULAiQzYaAVcCABcWKExQsCJDNhoBF68BKUxQsCJDNhoBVwIANhoCVwIANhoDFzYaBBdMr08DUEyvTwJQUAEpTFCwIkM2GgEXNhoCFzYaAxc2GgQXH08DFk8DFlBPAhZQTBZQKExQsCJDNhoBFzYaAhc2GgMXlxYoTFCwIkM2GgEXNhoCF5QWKExQsCJDNhoBFzYaAheVTBZMFlAoTFCwIkM2GgFXAgA2GgIXNhoDF1hJFRZXBgJMUChMULAiQzYaAVcEAEkVFlcGAkxQKExQsCJDNhoBVwIANhoCF1kWKExQsCJDNhoBVwIANhoCF1oWKExQsCJDNhoBVwIANhoCF4EIWChMULAiQzYaAVcCADYaAhdTKiNPAlQoTFCwIkM2GgEXNhoCF1MqI08CVChMULAiQzYaAVcCADYaAhdVFihMULAiQzYaARcWgAYVH3x1AAhMULAiQzYaARc2GgIXHUwWTBZQKExQsCJDNhoBVwIANhoCFzYaA1cCAF1JFRZXBgJMUChMULAiQzYaAVcCADYaAlcCADYaAxdNSRUWVwYCTFAoTFCwIkM2GgEXNhoCFzYaAxdNFihMULAiQzYaAVcCADYaAhc2GgMjU1RJFRZXBgJMUChMULAiQzYaARc2GgIXNhoDI1NUFihMULAiQzYaAVcCADYaAhc2GgMXVkkVFlcGAkxQKExQsCJDNhoBFzYaAheQFihMULAiQzYaARc2GgIXkRYoTFCwIkM2GgEXkhYoTFCwIkM2GgFXAgA2GgIXNhoDF1JJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAF8ASRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgBfARYoTFCwIkM2GgFXAgA2GgJXAgBfAkkVFlcGAkxQKExQsCJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the MiscellaneousOpsContract contract + */ +export type MiscellaneousOpsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_addw(uint64,uint64)(uint64,uint64)': { + a: bigint | number + b: bigint | number + } + 'verify_base64_decode_standard(byte[])byte[]': { + a: Uint8Array + } + 'verify_base64_decode_url(byte[])byte[]': { + a: Uint8Array + } + 'verify_bytes_bitlen(byte[],uint64)uint64': { + a: Uint8Array + padASize: bigint | number + } + 'verify_uint64_bitlen(uint64)uint64': { + a: bigint | number + } + 'verify_bsqrt(byte[])byte[]': { + a: Uint8Array + } + 'verify_btoi(byte[])uint64': { + a: Uint8Array + } + 'verify_bzero(uint64)byte[]': { + a: bigint | number + } + 'verify_concat(byte[],byte[],uint64,uint64)byte[]': { + a: Uint8Array + b: Uint8Array + padASize: bigint | number + padBSize: bigint | number + } + 'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)': { + a: bigint | number + b: bigint | number + c: bigint | number + d: bigint | number + } + 'verify_divw(uint64,uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + c: bigint | number + } + 'verify_err()void': Record + 'verify_exp(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_expw(uint64,uint64)(uint64,uint64)': { + a: bigint | number + b: bigint | number + } + 'verify_extract(byte[],uint64,uint64)byte[]': { + a: Uint8Array + b: bigint | number + c: bigint | number + } + 'verify_extract_from_2(byte[])byte[]': { + a: Uint8Array + } + 'verify_extract_uint16(byte[],uint64)uint64': { + a: Uint8Array + b: bigint | number + } + 'verify_extract_uint32(byte[],uint64)uint64': { + a: Uint8Array + b: bigint | number + } + 'verify_extract_uint64(byte[],uint64)uint64': { + a: Uint8Array + b: bigint | number + } + 'verify_getbit_bytes(byte[],uint64)bool': { + a: Uint8Array + b: bigint | number + } + 'verify_getbit_uint64(uint64,uint64)bool': { + a: bigint | number + b: bigint | number + } + 'verify_getbyte(byte[],uint64)uint64': { + a: Uint8Array + b: bigint | number + } + 'verify_itob(uint64)byte[]': { + a: bigint | number + } + 'verify_mulw(uint64,uint64)(uint64,uint64)': { + a: bigint | number + b: bigint | number + } + 'verify_replace(byte[],uint64,byte[])byte[]': { + a: Uint8Array + b: bigint | number + c: Uint8Array + } + 'verify_select_bytes(byte[],byte[],uint64)byte[]': { + a: Uint8Array + b: Uint8Array + c: bigint | number + } + 'verify_select_uint64(uint64,uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + c: bigint | number + } + 'verify_setbit_bytes(byte[],uint64,bool)byte[]': { + a: Uint8Array + b: bigint | number + c: boolean + } + 'verify_setbit_uint64(uint64,uint64,bool)uint64': { + a: bigint | number + b: bigint | number + c: boolean + } + 'verify_setbyte(byte[],uint64,uint64)byte[]': { + a: Uint8Array + b: bigint | number + c: bigint | number + } + 'verify_shl(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_shr(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_sqrt(uint64)uint64': { + a: bigint | number + } + 'verify_substring(byte[],uint64,uint64)byte[]': { + a: Uint8Array + b: bigint | number + c: bigint | number + } + 'verify_json_ref_string(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_json_ref_uint64(byte[],byte[])uint64': { + a: Uint8Array + b: Uint8Array + } + 'verify_json_ref_object(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_addw(uint64,uint64)(uint64,uint64)': [a: bigint | number, b: bigint | number] + 'verify_base64_decode_standard(byte[])byte[]': [a: Uint8Array] + 'verify_base64_decode_url(byte[])byte[]': [a: Uint8Array] + 'verify_bytes_bitlen(byte[],uint64)uint64': [a: Uint8Array, padASize: bigint | number] + 'verify_uint64_bitlen(uint64)uint64': [a: bigint | number] + 'verify_bsqrt(byte[])byte[]': [a: Uint8Array] + 'verify_btoi(byte[])uint64': [a: Uint8Array] + 'verify_bzero(uint64)byte[]': [a: bigint | number] + 'verify_concat(byte[],byte[],uint64,uint64)byte[]': [a: Uint8Array, b: Uint8Array, padASize: bigint | number, padBSize: bigint | number] + 'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)': [a: bigint | number, b: bigint | number, c: bigint | number, d: bigint | number] + 'verify_divw(uint64,uint64,uint64)uint64': [a: bigint | number, b: bigint | number, c: bigint | number] + 'verify_err()void': [] + 'verify_exp(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_expw(uint64,uint64)(uint64,uint64)': [a: bigint | number, b: bigint | number] + 'verify_extract(byte[],uint64,uint64)byte[]': [a: Uint8Array, b: bigint | number, c: bigint | number] + 'verify_extract_from_2(byte[])byte[]': [a: Uint8Array] + 'verify_extract_uint16(byte[],uint64)uint64': [a: Uint8Array, b: bigint | number] + 'verify_extract_uint32(byte[],uint64)uint64': [a: Uint8Array, b: bigint | number] + 'verify_extract_uint64(byte[],uint64)uint64': [a: Uint8Array, b: bigint | number] + 'verify_getbit_bytes(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] + 'verify_getbit_uint64(uint64,uint64)bool': [a: bigint | number, b: bigint | number] + 'verify_getbyte(byte[],uint64)uint64': [a: Uint8Array, b: bigint | number] + 'verify_itob(uint64)byte[]': [a: bigint | number] + 'verify_mulw(uint64,uint64)(uint64,uint64)': [a: bigint | number, b: bigint | number] + 'verify_replace(byte[],uint64,byte[])byte[]': [a: Uint8Array, b: bigint | number, c: Uint8Array] + 'verify_select_bytes(byte[],byte[],uint64)byte[]': [a: Uint8Array, b: Uint8Array, c: bigint | number] + 'verify_select_uint64(uint64,uint64,uint64)uint64': [a: bigint | number, b: bigint | number, c: bigint | number] + 'verify_setbit_bytes(byte[],uint64,bool)byte[]': [a: Uint8Array, b: bigint | number, c: boolean] + 'verify_setbit_uint64(uint64,uint64,bool)uint64': [a: bigint | number, b: bigint | number, c: boolean] + 'verify_setbyte(byte[],uint64,uint64)byte[]': [a: Uint8Array, b: bigint | number, c: bigint | number] + 'verify_shl(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_shr(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_sqrt(uint64)uint64': [a: bigint | number] + 'verify_substring(byte[],uint64,uint64)byte[]': [a: Uint8Array, b: bigint | number, c: bigint | number] + 'verify_json_ref_string(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_json_ref_uint64(byte[],byte[])uint64': [a: Uint8Array, b: Uint8Array] + 'verify_json_ref_object(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + } +} + +/** + * The return type for each method + */ +export type MiscellaneousOpsContractReturns = { + 'verify_addw(uint64,uint64)(uint64,uint64)': [bigint, bigint] + 'verify_base64_decode_standard(byte[])byte[]': Uint8Array + 'verify_base64_decode_url(byte[])byte[]': Uint8Array + 'verify_bytes_bitlen(byte[],uint64)uint64': bigint + 'verify_uint64_bitlen(uint64)uint64': bigint + 'verify_bsqrt(byte[])byte[]': Uint8Array + 'verify_btoi(byte[])uint64': bigint + 'verify_bzero(uint64)byte[]': Uint8Array + 'verify_concat(byte[],byte[],uint64,uint64)byte[]': Uint8Array + 'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)': [bigint, bigint, bigint, bigint] + 'verify_divw(uint64,uint64,uint64)uint64': bigint + 'verify_err()void': void + 'verify_exp(uint64,uint64)uint64': bigint + 'verify_expw(uint64,uint64)(uint64,uint64)': [bigint, bigint] + 'verify_extract(byte[],uint64,uint64)byte[]': Uint8Array + 'verify_extract_from_2(byte[])byte[]': Uint8Array + 'verify_extract_uint16(byte[],uint64)uint64': bigint + 'verify_extract_uint32(byte[],uint64)uint64': bigint + 'verify_extract_uint64(byte[],uint64)uint64': bigint + 'verify_getbit_bytes(byte[],uint64)bool': boolean + 'verify_getbit_uint64(uint64,uint64)bool': boolean + 'verify_getbyte(byte[],uint64)uint64': bigint + 'verify_itob(uint64)byte[]': Uint8Array + 'verify_mulw(uint64,uint64)(uint64,uint64)': [bigint, bigint] + 'verify_replace(byte[],uint64,byte[])byte[]': Uint8Array + 'verify_select_bytes(byte[],byte[],uint64)byte[]': Uint8Array + 'verify_select_uint64(uint64,uint64,uint64)uint64': bigint + 'verify_setbit_bytes(byte[],uint64,bool)byte[]': Uint8Array + 'verify_setbit_uint64(uint64,uint64,bool)uint64': bigint + 'verify_setbyte(byte[],uint64,uint64)byte[]': Uint8Array + 'verify_shl(uint64,uint64)uint64': bigint + 'verify_shr(uint64,uint64)uint64': bigint + 'verify_sqrt(uint64)uint64': bigint + 'verify_substring(byte[],uint64,uint64)byte[]': Uint8Array + 'verify_json_ref_string(byte[],byte[])byte[]': Uint8Array + 'verify_json_ref_uint64(byte[],byte[])uint64': bigint + 'verify_json_ref_object(byte[],byte[])byte[]': Uint8Array +} + +/** + * Defines the types of available calls and state of the MiscellaneousOpsContract smart contract. + */ +export type MiscellaneousOpsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_addw(uint64,uint64)(uint64,uint64)' | 'verify_addw', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_addw(uint64,uint64)(uint64,uint64)'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_addw(uint64,uint64)(uint64,uint64)'] + returns: MiscellaneousOpsContractReturns['verify_addw(uint64,uint64)(uint64,uint64)'] + }> + & Record<'verify_base64_decode_standard(byte[])byte[]' | 'verify_base64_decode_standard', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_base64_decode_standard(byte[])byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_base64_decode_standard(byte[])byte[]'] + returns: MiscellaneousOpsContractReturns['verify_base64_decode_standard(byte[])byte[]'] + }> + & Record<'verify_base64_decode_url(byte[])byte[]' | 'verify_base64_decode_url', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_base64_decode_url(byte[])byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_base64_decode_url(byte[])byte[]'] + returns: MiscellaneousOpsContractReturns['verify_base64_decode_url(byte[])byte[]'] + }> + & Record<'verify_bytes_bitlen(byte[],uint64)uint64' | 'verify_bytes_bitlen', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_bytes_bitlen(byte[],uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_bytes_bitlen(byte[],uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_bytes_bitlen(byte[],uint64)uint64'] + }> + & Record<'verify_uint64_bitlen(uint64)uint64' | 'verify_uint64_bitlen', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_uint64_bitlen(uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_uint64_bitlen(uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_uint64_bitlen(uint64)uint64'] + }> + & Record<'verify_bsqrt(byte[])byte[]' | 'verify_bsqrt', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_bsqrt(byte[])byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_bsqrt(byte[])byte[]'] + returns: MiscellaneousOpsContractReturns['verify_bsqrt(byte[])byte[]'] + }> + & Record<'verify_btoi(byte[])uint64' | 'verify_btoi', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_btoi(byte[])uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_btoi(byte[])uint64'] + returns: MiscellaneousOpsContractReturns['verify_btoi(byte[])uint64'] + }> + & Record<'verify_bzero(uint64)byte[]' | 'verify_bzero', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_bzero(uint64)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_bzero(uint64)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_bzero(uint64)byte[]'] + }> + & Record<'verify_concat(byte[],byte[],uint64,uint64)byte[]' | 'verify_concat', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_concat(byte[],byte[],uint64,uint64)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_concat(byte[],byte[],uint64,uint64)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_concat(byte[],byte[],uint64,uint64)byte[]'] + }> + & Record<'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)' | 'verify_divmodw', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'] + returns: MiscellaneousOpsContractReturns['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'] + }> + & Record<'verify_divw(uint64,uint64,uint64)uint64' | 'verify_divw', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_divw(uint64,uint64,uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_divw(uint64,uint64,uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_divw(uint64,uint64,uint64)uint64'] + }> + & Record<'verify_err()void' | 'verify_err', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_err()void'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_err()void'] + returns: MiscellaneousOpsContractReturns['verify_err()void'] + }> + & Record<'verify_exp(uint64,uint64)uint64' | 'verify_exp', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_exp(uint64,uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_exp(uint64,uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_exp(uint64,uint64)uint64'] + }> + & Record<'verify_expw(uint64,uint64)(uint64,uint64)' | 'verify_expw', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_expw(uint64,uint64)(uint64,uint64)'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_expw(uint64,uint64)(uint64,uint64)'] + returns: MiscellaneousOpsContractReturns['verify_expw(uint64,uint64)(uint64,uint64)'] + }> + & Record<'verify_extract(byte[],uint64,uint64)byte[]' | 'verify_extract', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract(byte[],uint64,uint64)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract(byte[],uint64,uint64)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_extract(byte[],uint64,uint64)byte[]'] + }> + & Record<'verify_extract_from_2(byte[])byte[]' | 'verify_extract_from_2', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract_from_2(byte[])byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract_from_2(byte[])byte[]'] + returns: MiscellaneousOpsContractReturns['verify_extract_from_2(byte[])byte[]'] + }> + & Record<'verify_extract_uint16(byte[],uint64)uint64' | 'verify_extract_uint16', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract_uint16(byte[],uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract_uint16(byte[],uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_extract_uint16(byte[],uint64)uint64'] + }> + & Record<'verify_extract_uint32(byte[],uint64)uint64' | 'verify_extract_uint32', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract_uint32(byte[],uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract_uint32(byte[],uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_extract_uint32(byte[],uint64)uint64'] + }> + & Record<'verify_extract_uint64(byte[],uint64)uint64' | 'verify_extract_uint64', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract_uint64(byte[],uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract_uint64(byte[],uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_extract_uint64(byte[],uint64)uint64'] + }> + & Record<'verify_getbit_bytes(byte[],uint64)bool' | 'verify_getbit_bytes', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_getbit_bytes(byte[],uint64)bool'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_getbit_bytes(byte[],uint64)bool'] + returns: MiscellaneousOpsContractReturns['verify_getbit_bytes(byte[],uint64)bool'] + }> + & Record<'verify_getbit_uint64(uint64,uint64)bool' | 'verify_getbit_uint64', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_getbit_uint64(uint64,uint64)bool'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_getbit_uint64(uint64,uint64)bool'] + returns: MiscellaneousOpsContractReturns['verify_getbit_uint64(uint64,uint64)bool'] + }> + & Record<'verify_getbyte(byte[],uint64)uint64' | 'verify_getbyte', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_getbyte(byte[],uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_getbyte(byte[],uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_getbyte(byte[],uint64)uint64'] + }> + & Record<'verify_itob(uint64)byte[]' | 'verify_itob', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_itob(uint64)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_itob(uint64)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_itob(uint64)byte[]'] + }> + & Record<'verify_mulw(uint64,uint64)(uint64,uint64)' | 'verify_mulw', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_mulw(uint64,uint64)(uint64,uint64)'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_mulw(uint64,uint64)(uint64,uint64)'] + returns: MiscellaneousOpsContractReturns['verify_mulw(uint64,uint64)(uint64,uint64)'] + }> + & Record<'verify_replace(byte[],uint64,byte[])byte[]' | 'verify_replace', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_replace(byte[],uint64,byte[])byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_replace(byte[],uint64,byte[])byte[]'] + returns: MiscellaneousOpsContractReturns['verify_replace(byte[],uint64,byte[])byte[]'] + }> + & Record<'verify_select_bytes(byte[],byte[],uint64)byte[]' | 'verify_select_bytes', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_select_bytes(byte[],byte[],uint64)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_select_bytes(byte[],byte[],uint64)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_select_bytes(byte[],byte[],uint64)byte[]'] + }> + & Record<'verify_select_uint64(uint64,uint64,uint64)uint64' | 'verify_select_uint64', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_select_uint64(uint64,uint64,uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_select_uint64(uint64,uint64,uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_select_uint64(uint64,uint64,uint64)uint64'] + }> + & Record<'verify_setbit_bytes(byte[],uint64,bool)byte[]' | 'verify_setbit_bytes', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_setbit_bytes(byte[],uint64,bool)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_setbit_bytes(byte[],uint64,bool)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_setbit_bytes(byte[],uint64,bool)byte[]'] + }> + & Record<'verify_setbit_uint64(uint64,uint64,bool)uint64' | 'verify_setbit_uint64', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_setbit_uint64(uint64,uint64,bool)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_setbit_uint64(uint64,uint64,bool)uint64'] + returns: MiscellaneousOpsContractReturns['verify_setbit_uint64(uint64,uint64,bool)uint64'] + }> + & Record<'verify_setbyte(byte[],uint64,uint64)byte[]' | 'verify_setbyte', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_setbyte(byte[],uint64,uint64)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_setbyte(byte[],uint64,uint64)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_setbyte(byte[],uint64,uint64)byte[]'] + }> + & Record<'verify_shl(uint64,uint64)uint64' | 'verify_shl', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_shl(uint64,uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_shl(uint64,uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_shl(uint64,uint64)uint64'] + }> + & Record<'verify_shr(uint64,uint64)uint64' | 'verify_shr', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_shr(uint64,uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_shr(uint64,uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_shr(uint64,uint64)uint64'] + }> + & Record<'verify_sqrt(uint64)uint64' | 'verify_sqrt', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_sqrt(uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_sqrt(uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_sqrt(uint64)uint64'] + }> + & Record<'verify_substring(byte[],uint64,uint64)byte[]' | 'verify_substring', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_substring(byte[],uint64,uint64)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_substring(byte[],uint64,uint64)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_substring(byte[],uint64,uint64)byte[]'] + }> + & Record<'verify_json_ref_string(byte[],byte[])byte[]' | 'verify_json_ref_string', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_json_ref_string(byte[],byte[])byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_json_ref_string(byte[],byte[])byte[]'] + returns: MiscellaneousOpsContractReturns['verify_json_ref_string(byte[],byte[])byte[]'] + }> + & Record<'verify_json_ref_uint64(byte[],byte[])uint64' | 'verify_json_ref_uint64', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_json_ref_uint64(byte[],byte[])uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_json_ref_uint64(byte[],byte[])uint64'] + returns: MiscellaneousOpsContractReturns['verify_json_ref_uint64(byte[],byte[])uint64'] + }> + & Record<'verify_json_ref_object(byte[],byte[])byte[]' | 'verify_json_ref_object', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_json_ref_object(byte[],byte[])byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_json_ref_object(byte[],byte[])byte[]'] + returns: MiscellaneousOpsContractReturns['verify_json_ref_object(byte[],byte[])byte[]'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type MiscellaneousOpsContractSignatures = keyof MiscellaneousOpsContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type MiscellaneousOpsContractNonVoidMethodSignatures = keyof MiscellaneousOpsContractTypes['methods'] extends infer T ? T extends keyof MiscellaneousOpsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the MiscellaneousOpsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = MiscellaneousOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the MiscellaneousOpsContract smart contract to the method's return type + */ +export type MethodReturn = MiscellaneousOpsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type MiscellaneousOpsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type MiscellaneousOpsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: MiscellaneousOpsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the MiscellaneousOpsContract smart contract + */ +export abstract class MiscellaneousOpsContractParamsFactory { + /** + * Constructs a no op call for the verify_addw(uint64,uint64)(uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAddw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_addw(uint64,uint64)(uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_base64_decode_standard(byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBase64DecodeStandard(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_base64_decode_standard(byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_base64_decode_url(byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBase64DecodeUrl(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_base64_decode_url(byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bytes_bitlen(byte[],uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesBitlen(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_bitlen(byte[],uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padASize], + } + } + /** + * Constructs a no op call for the verify_uint64_bitlen(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Bitlen(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_bitlen(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bsqrt(byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBsqrt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bsqrt(byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_btoi(byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBtoi(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_btoi(byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bzero(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBzero(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bzero(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_concat(byte[],byte[],uint64,uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyConcat(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_concat(byte[],byte[],uint64,uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.padASize, params.args.padBSize], + } + } + /** + * Constructs a no op call for the verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyDivmodw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d], + } + } + /** + * Constructs a no op call for the verify_divw(uint64,uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyDivw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_divw(uint64,uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_err()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyErr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_err()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the verify_exp(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExp(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_exp(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_expw(uint64,uint64)(uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExpw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_expw(uint64,uint64)(uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_extract(byte[],uint64,uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExtract(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_extract(byte[],uint64,uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_extract_from_2(byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExtractFrom_2(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_extract_from_2(byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_extract_uint16(byte[],uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExtractUint16(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_extract_uint16(byte[],uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_extract_uint32(byte[],uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExtractUint32(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_extract_uint32(byte[],uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_extract_uint64(byte[],uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExtractUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_extract_uint64(byte[],uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_getbit_bytes(byte[],uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetbitBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_getbit_bytes(byte[],uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_getbit_uint64(uint64,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetbitUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_getbit_uint64(uint64,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_getbyte(byte[],uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetbyte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_getbyte(byte[],uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_itob(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyItob(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_itob(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_mulw(uint64,uint64)(uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyMulw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_mulw(uint64,uint64)(uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_replace(byte[],uint64,byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyReplace(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_replace(byte[],uint64,byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_select_bytes(byte[],byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySelectBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_select_bytes(byte[],byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_select_uint64(uint64,uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySelectUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_select_uint64(uint64,uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_setbit_bytes(byte[],uint64,bool)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySetbitBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_setbit_bytes(byte[],uint64,bool)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_setbit_uint64(uint64,uint64,bool)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySetbitUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_setbit_uint64(uint64,uint64,bool)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_setbyte(byte[],uint64,uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySetbyte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_setbyte(byte[],uint64,uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_shl(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyShl(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_shl(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_shr(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyShr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_shr(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_sqrt(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySqrt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_sqrt(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_substring(byte[],uint64,uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySubstring(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_substring(byte[],uint64,uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_json_ref_string(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyJsonRefString(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_json_ref_string(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_json_ref_uint64(byte[],byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyJsonRefUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_json_ref_uint64(byte[],byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_json_ref_object(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyJsonRefObject(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_json_ref_object(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } +} + +/** + * A factory to create and deploy one or more instance of the MiscellaneousOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class MiscellaneousOpsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `MiscellaneousOpsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new MiscellaneousOpsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new MiscellaneousOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the MiscellaneousOpsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: MiscellaneousOpsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new MiscellaneousOpsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the MiscellaneousOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the MiscellaneousOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the MiscellaneousOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new MiscellaneousOpsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the MiscellaneousOpsContract smart contract + */ +export class MiscellaneousOpsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `MiscellaneousOpsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the MiscellaneousOpsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `MiscellaneousOpsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `MiscellaneousOpsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new MiscellaneousOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `MiscellaneousOpsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new MiscellaneousOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the MiscellaneousOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_addw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAddw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyAddw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_standard(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBase64DecodeStandard: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeStandard(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_url(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBase64DecodeUrl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeUrl(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bytes_bitlen(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesBitlen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBytesBitlen(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_uint64_bitlen(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Bitlen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyUint64Bitlen(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bsqrt(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBsqrt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBsqrt(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_btoi(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBtoi: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBtoi(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bzero(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBzero: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBzero(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_concat(byte[],byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyConcat: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyConcat(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyDivmodw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyDivmodw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divw(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyDivw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyDivw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_err()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyErr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyErr(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_exp(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExp: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExp(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_expw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExpw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExpw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExtract: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtract(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_from_2(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExtractFrom_2: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtractFrom_2(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint16(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExtractUint16: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint16(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint32(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExtractUint32: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint32(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint64(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExtractUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_bytes(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetbitBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyGetbitBytes(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_uint64(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetbitUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyGetbitUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbyte(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetbyte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyGetbyte(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_itob(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyItob: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyItob(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_mulw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyMulw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyMulw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_replace(byte[],uint64,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyReplace: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyReplace(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_bytes(byte[],byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySelectBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySelectBytes(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_uint64(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySelectUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySelectUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_bytes(byte[],uint64,bool)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySetbitBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySetbitBytes(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_uint64(uint64,uint64,bool)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySetbitUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySetbitUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbyte(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySetbyte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySetbyte(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shl(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyShl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyShl(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shr(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyShr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyShr(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_sqrt(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySqrt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySqrt(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_substring(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySubstring: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySubstring(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_string(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyJsonRefString: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefString(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_uint64(byte[],byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyJsonRefUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_object(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyJsonRefObject: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefObject(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the MiscellaneousOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_addw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAddw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyAddw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_standard(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBase64DecodeStandard: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeStandard(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_url(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBase64DecodeUrl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeUrl(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bytes_bitlen(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesBitlen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBytesBitlen(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_uint64_bitlen(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Bitlen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyUint64Bitlen(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bsqrt(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBsqrt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBsqrt(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_btoi(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBtoi: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBtoi(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bzero(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBzero: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBzero(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_concat(byte[],byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyConcat: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyConcat(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyDivmodw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyDivmodw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divw(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyDivw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyDivw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_err()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyErr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyErr(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_exp(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExp: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExp(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_expw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExpw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExpw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExtract: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtract(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_from_2(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExtractFrom_2: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtractFrom_2(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint16(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExtractUint16: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint16(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint32(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExtractUint32: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint32(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint64(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExtractUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_bytes(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetbitBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyGetbitBytes(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_uint64(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetbitUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyGetbitUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbyte(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetbyte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyGetbyte(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_itob(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyItob: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyItob(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_mulw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyMulw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyMulw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_replace(byte[],uint64,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyReplace: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyReplace(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_bytes(byte[],byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySelectBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySelectBytes(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_uint64(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySelectUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySelectUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_bytes(byte[],uint64,bool)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySetbitBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySetbitBytes(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_uint64(uint64,uint64,bool)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySetbitUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySetbitUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbyte(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySetbyte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySetbyte(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shl(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyShl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyShl(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shr(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyShr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyShr(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_sqrt(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySqrt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySqrt(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_substring(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySubstring: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySubstring(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_string(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyJsonRefString: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefString(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_uint64(byte[],byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyJsonRefUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_object(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyJsonRefObject: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefObject(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the MiscellaneousOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_addw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAddw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyAddw(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_addw(uint64,uint64)(uint64,uint64)'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_standard(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBase64DecodeStandard: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeStandard(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_base64_decode_standard(byte[])byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_url(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBase64DecodeUrl: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeUrl(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_base64_decode_url(byte[])byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bytes_bitlen(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesBitlen: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBytesBitlen(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_bytes_bitlen(byte[],uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_uint64_bitlen(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Bitlen: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyUint64Bitlen(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_uint64_bitlen(uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bsqrt(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBsqrt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBsqrt(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_bsqrt(byte[])byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_btoi(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBtoi: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBtoi(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_btoi(byte[])uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bzero(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBzero: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBzero(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_bzero(uint64)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_concat(byte[],byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyConcat: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyConcat(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_concat(byte[],byte[],uint64,uint64)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyDivmodw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyDivmodw(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divw(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyDivw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyDivw(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_divw(uint64,uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_err()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyErr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyErr(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_err()void'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_exp(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExp: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExp(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_exp(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_expw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExpw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExpw(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_expw(uint64,uint64)(uint64,uint64)'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExtract: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtract(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract(byte[],uint64,uint64)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_from_2(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExtractFrom_2: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtractFrom_2(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract_from_2(byte[])byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint16(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExtractUint16: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint16(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract_uint16(byte[],uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint32(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExtractUint32: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint32(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract_uint32(byte[],uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint64(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExtractUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint64(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract_uint64(byte[],uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_bytes(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetbitBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyGetbitBytes(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_getbit_bytes(byte[],uint64)bool'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_uint64(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetbitUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyGetbitUint64(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_getbit_uint64(uint64,uint64)bool'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbyte(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetbyte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyGetbyte(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_getbyte(byte[],uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_itob(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyItob: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyItob(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_itob(uint64)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_mulw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyMulw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyMulw(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_mulw(uint64,uint64)(uint64,uint64)'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_replace(byte[],uint64,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyReplace: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyReplace(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_replace(byte[],uint64,byte[])byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_bytes(byte[],byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySelectBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySelectBytes(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_select_bytes(byte[],byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_uint64(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySelectUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySelectUint64(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_select_uint64(uint64,uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_bytes(byte[],uint64,bool)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySetbitBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySetbitBytes(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_setbit_bytes(byte[],uint64,bool)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_uint64(uint64,uint64,bool)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySetbitUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySetbitUint64(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_setbit_uint64(uint64,uint64,bool)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbyte(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySetbyte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySetbyte(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_setbyte(byte[],uint64,uint64)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shl(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyShl: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyShl(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_shl(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shr(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyShr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyShr(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_shr(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_sqrt(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySqrt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySqrt(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_sqrt(uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_substring(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySubstring: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySubstring(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_substring(byte[],uint64,uint64)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_string(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyJsonRefString: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefString(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_json_ref_string(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_uint64(byte[],byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyJsonRefUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefUint64(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_json_ref_uint64(byte[],byte[])uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_object(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyJsonRefObject: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefObject(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_json_ref_object(byte[],byte[])byte[]'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new MiscellaneousOpsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current MiscellaneousOpsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): MiscellaneousOpsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_addw(uint64,uint64)(uint64,uint64) method call against the MiscellaneousOpsContract contract + */ + verifyAddw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAddw(params))) + return this + }, + /** + * Add a verify_base64_decode_standard(byte[])byte[] method call against the MiscellaneousOpsContract contract + */ + verifyBase64DecodeStandard(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBase64DecodeStandard(params))) + return this + }, + /** + * Add a verify_base64_decode_url(byte[])byte[] method call against the MiscellaneousOpsContract contract + */ + verifyBase64DecodeUrl(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBase64DecodeUrl(params))) + return this + }, + /** + * Add a verify_bytes_bitlen(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyBytesBitlen(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesBitlen(params))) + return this + }, + /** + * Add a verify_uint64_bitlen(uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyUint64Bitlen(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Bitlen(params))) + return this + }, + /** + * Add a verify_bsqrt(byte[])byte[] method call against the MiscellaneousOpsContract contract + */ + verifyBsqrt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBsqrt(params))) + return this + }, + /** + * Add a verify_btoi(byte[])uint64 method call against the MiscellaneousOpsContract contract + */ + verifyBtoi(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBtoi(params))) + return this + }, + /** + * Add a verify_bzero(uint64)byte[] method call against the MiscellaneousOpsContract contract + */ + verifyBzero(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBzero(params))) + return this + }, + /** + * Add a verify_concat(byte[],byte[],uint64,uint64)byte[] method call against the MiscellaneousOpsContract contract + */ + verifyConcat(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyConcat(params))) + return this + }, + /** + * Add a verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64) method call against the MiscellaneousOpsContract contract + */ + verifyDivmodw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyDivmodw(params))) + return this + }, + /** + * Add a verify_divw(uint64,uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyDivw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyDivw(params))) + return this + }, + /** + * Add a verify_err()void method call against the MiscellaneousOpsContract contract + */ + verifyErr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyErr(params))) + return this + }, + /** + * Add a verify_exp(uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyExp(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExp(params))) + return this + }, + /** + * Add a verify_expw(uint64,uint64)(uint64,uint64) method call against the MiscellaneousOpsContract contract + */ + verifyExpw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExpw(params))) + return this + }, + /** + * Add a verify_extract(byte[],uint64,uint64)byte[] method call against the MiscellaneousOpsContract contract + */ + verifyExtract(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtract(params))) + return this + }, + /** + * Add a verify_extract_from_2(byte[])byte[] method call against the MiscellaneousOpsContract contract + */ + verifyExtractFrom_2(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtractFrom_2(params))) + return this + }, + /** + * Add a verify_extract_uint16(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyExtractUint16(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtractUint16(params))) + return this + }, + /** + * Add a verify_extract_uint32(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyExtractUint32(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtractUint32(params))) + return this + }, + /** + * Add a verify_extract_uint64(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyExtractUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtractUint64(params))) + return this + }, + /** + * Add a verify_getbit_bytes(byte[],uint64)bool method call against the MiscellaneousOpsContract contract + */ + verifyGetbitBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetbitBytes(params))) + return this + }, + /** + * Add a verify_getbit_uint64(uint64,uint64)bool method call against the MiscellaneousOpsContract contract + */ + verifyGetbitUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetbitUint64(params))) + return this + }, + /** + * Add a verify_getbyte(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyGetbyte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetbyte(params))) + return this + }, + /** + * Add a verify_itob(uint64)byte[] method call against the MiscellaneousOpsContract contract + */ + verifyItob(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyItob(params))) + return this + }, + /** + * Add a verify_mulw(uint64,uint64)(uint64,uint64) method call against the MiscellaneousOpsContract contract + */ + verifyMulw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyMulw(params))) + return this + }, + /** + * Add a verify_replace(byte[],uint64,byte[])byte[] method call against the MiscellaneousOpsContract contract + */ + verifyReplace(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyReplace(params))) + return this + }, + /** + * Add a verify_select_bytes(byte[],byte[],uint64)byte[] method call against the MiscellaneousOpsContract contract + */ + verifySelectBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySelectBytes(params))) + return this + }, + /** + * Add a verify_select_uint64(uint64,uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifySelectUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySelectUint64(params))) + return this + }, + /** + * Add a verify_setbit_bytes(byte[],uint64,bool)byte[] method call against the MiscellaneousOpsContract contract + */ + verifySetbitBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySetbitBytes(params))) + return this + }, + /** + * Add a verify_setbit_uint64(uint64,uint64,bool)uint64 method call against the MiscellaneousOpsContract contract + */ + verifySetbitUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySetbitUint64(params))) + return this + }, + /** + * Add a verify_setbyte(byte[],uint64,uint64)byte[] method call against the MiscellaneousOpsContract contract + */ + verifySetbyte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySetbyte(params))) + return this + }, + /** + * Add a verify_shl(uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyShl(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyShl(params))) + return this + }, + /** + * Add a verify_shr(uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyShr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyShr(params))) + return this + }, + /** + * Add a verify_sqrt(uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifySqrt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySqrt(params))) + return this + }, + /** + * Add a verify_substring(byte[],uint64,uint64)byte[] method call against the MiscellaneousOpsContract contract + */ + verifySubstring(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySubstring(params))) + return this + }, + /** + * Add a verify_json_ref_string(byte[],byte[])byte[] method call against the MiscellaneousOpsContract contract + */ + verifyJsonRefString(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyJsonRefString(params))) + return this + }, + /** + * Add a verify_json_ref_uint64(byte[],byte[])uint64 method call against the MiscellaneousOpsContract contract + */ + verifyJsonRefUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyJsonRefUint64(params))) + return this + }, + /** + * Add a verify_json_ref_object(byte[],byte[])byte[] method call against the MiscellaneousOpsContract contract + */ + verifyJsonRefObject(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyJsonRefObject(params))) + return this + }, + /** + * Add a clear state call to the MiscellaneousOpsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as MiscellaneousOpsContractComposer + } +} +export type MiscellaneousOpsContractComposer = { + /** + * Calls the verify_addw(uint64,uint64)(uint64,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAddw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_addw(uint64,uint64)(uint64,uint64)'] | undefined]> + + /** + * Calls the verify_base64_decode_standard(byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBase64DecodeStandard(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_base64_decode_standard(byte[])byte[]'] | undefined]> + + /** + * Calls the verify_base64_decode_url(byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBase64DecodeUrl(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_base64_decode_url(byte[])byte[]'] | undefined]> + + /** + * Calls the verify_bytes_bitlen(byte[],uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesBitlen(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_bytes_bitlen(byte[],uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_bitlen(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Bitlen(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_uint64_bitlen(uint64)uint64'] | undefined]> + + /** + * Calls the verify_bsqrt(byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBsqrt(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_bsqrt(byte[])byte[]'] | undefined]> + + /** + * Calls the verify_btoi(byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBtoi(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_btoi(byte[])uint64'] | undefined]> + + /** + * Calls the verify_bzero(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBzero(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_bzero(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_concat(byte[],byte[],uint64,uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyConcat(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_concat(byte[],byte[],uint64,uint64)byte[]'] | undefined]> + + /** + * Calls the verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyDivmodw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'] | undefined]> + + /** + * Calls the verify_divw(uint64,uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyDivw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_divw(uint64,uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_err()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyErr(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_err()void'] | undefined]> + + /** + * Calls the verify_exp(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExp(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_exp(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_expw(uint64,uint64)(uint64,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExpw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_expw(uint64,uint64)(uint64,uint64)'] | undefined]> + + /** + * Calls the verify_extract(byte[],uint64,uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExtract(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract(byte[],uint64,uint64)byte[]'] | undefined]> + + /** + * Calls the verify_extract_from_2(byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExtractFrom_2(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract_from_2(byte[])byte[]'] | undefined]> + + /** + * Calls the verify_extract_uint16(byte[],uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExtractUint16(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract_uint16(byte[],uint64)uint64'] | undefined]> + + /** + * Calls the verify_extract_uint32(byte[],uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExtractUint32(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract_uint32(byte[],uint64)uint64'] | undefined]> + + /** + * Calls the verify_extract_uint64(byte[],uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExtractUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract_uint64(byte[],uint64)uint64'] | undefined]> + + /** + * Calls the verify_getbit_bytes(byte[],uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetbitBytes(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_getbit_bytes(byte[],uint64)bool'] | undefined]> + + /** + * Calls the verify_getbit_uint64(uint64,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetbitUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_getbit_uint64(uint64,uint64)bool'] | undefined]> + + /** + * Calls the verify_getbyte(byte[],uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetbyte(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_getbyte(byte[],uint64)uint64'] | undefined]> + + /** + * Calls the verify_itob(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyItob(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_itob(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_mulw(uint64,uint64)(uint64,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyMulw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_mulw(uint64,uint64)(uint64,uint64)'] | undefined]> + + /** + * Calls the verify_replace(byte[],uint64,byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyReplace(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_replace(byte[],uint64,byte[])byte[]'] | undefined]> + + /** + * Calls the verify_select_bytes(byte[],byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySelectBytes(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_select_bytes(byte[],byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_select_uint64(uint64,uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySelectUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_select_uint64(uint64,uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_setbit_bytes(byte[],uint64,bool)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySetbitBytes(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_setbit_bytes(byte[],uint64,bool)byte[]'] | undefined]> + + /** + * Calls the verify_setbit_uint64(uint64,uint64,bool)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySetbitUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_setbit_uint64(uint64,uint64,bool)uint64'] | undefined]> + + /** + * Calls the verify_setbyte(byte[],uint64,uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySetbyte(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_setbyte(byte[],uint64,uint64)byte[]'] | undefined]> + + /** + * Calls the verify_shl(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyShl(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_shl(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_shr(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyShr(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_shr(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_sqrt(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySqrt(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_sqrt(uint64)uint64'] | undefined]> + + /** + * Calls the verify_substring(byte[],uint64,uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySubstring(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_substring(byte[],uint64,uint64)byte[]'] | undefined]> + + /** + * Calls the verify_json_ref_string(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyJsonRefString(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_json_ref_string(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_json_ref_uint64(byte[],byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyJsonRefUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_json_ref_uint64(byte[],byte[])uint64'] | undefined]> + + /** + * Calls the verify_json_ref_object(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyJsonRefObject(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_json_ref_object(byte[],byte[])byte[]'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the MiscellaneousOpsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): MiscellaneousOpsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): MiscellaneousOpsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type MiscellaneousOpsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/PrimitiveOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/PrimitiveOpsContract.ts new file mode 100644 index 0000000..5ff671b --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/PrimitiveOpsContract.ts @@ -0,0 +1,4701 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"PrimitiveOpsContract","structs":{},"methods":[{"name":"verify_uint64_init","args":[{"type":"byte[]","name":"raw_value"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_add","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_sub","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_mul","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_div","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_mod","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_and","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_or","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_xor","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_not","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_lshift","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_rshift","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_pow","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_eq","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_ne","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_lt","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_le","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_gt","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_ge","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_init","args":[{"type":"uint64","name":"raw_value"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_add","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"uint64","name":"pad_a_size"},{"type":"uint64","name":"pad_b_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_and","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_or","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_xor","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_not","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_add","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_add_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_sub","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_sub_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_mul","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_mul_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_div","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_div_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_mod","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_mod_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_and","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_and_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_or","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_or_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_xor","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_xor_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_eq_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_ne_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_lt_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_le_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_gt_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_ge_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_init","args":[{"type":"string","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_startswith","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_endswith","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_join","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_log","args":[{"type":"string","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"},{"type":"bool","name":"e"},{"type":"string","name":"f"},{"type":"uint64","name":"g"},{"type":"uint256","name":"h"},{"type":"ufixed32x8","name":"i"},{"type":"ufixed256x16","name":"j"},{"type":"byte[]","name":"k"},{"type":"byte[]","name":"m"},{"type":"byte[]","name":"n"},{"type":"byte[5]","name":"o"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDAwICItIiAweDE1MWY3Yzc1MDAyMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANjcKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDcyNWM2OTJiIDB4MTczMTQ1NTkgMHg1M2YzNDg5MyAweDg4YzhiMjY5IDB4YTQ2NGI3YWIgMHg5YzhiMTFiOCAweDZmNDA2NTRlIDB4ZWM5YTI5NzQgMHhjNzkzNzA4ZiAweDdkZGI3NDk5IDB4YTIxYzQ0M2QgMHg2ZTdmYjIxMiAweGIwMDdmY2IwIDB4MmViYzIwZDQgMHhiMDk1NGI2NiAweGRkMTQwYWVmIDB4YWNlNDc0ZGEgMHhiYTY5NDk5MCAweDZkYjU4MWMwIDB4OTFjOGRiODkgMHhkYmU3NzE1OCAweDlhMGYyMmUxIDB4NjQwMzNkMzcgMHgyYTcyMzdjNSAweGUzYTk0NDU4IDB4NDJmODdmN2QgMHgyYjU1NDJhNCAweDliZTJmYmU5IDB4MWNkOTI1MTUgMHg2NGUxNzA1YyAweGYxMjcxYzUwIDB4MmFiNjNiNzAgMHg4MzRiYjdkMiAweDUzMTYyMGQ3IDB4M2ZiOWU3NjkgMHhmYThkYjBiYyAweGE3MmVhNDg1IDB4YjdiMGJhMTkgMHg3NDQ2MGM0MiAweGFiMzIwNzM4IDB4NTJhZDQ2NTQgMHgxMDE1NjM5OSAweDBmMDc1OTU3IDB4YmQ4NDNkZmYgMHhiMzc3ZDM4MSAweDg5NzY3MjY1IDB4NDU2YjRiMjMgMHgzM2QxYjg4YyAweDZiZjk3M2VhIDB4NjdjZDZiYjIgMHgzZjU4ODA1YSAweDFlMTMwMDM5IDB4NTA5ZGM5MWQgMHhhNTY0YTIwMiAweDIzNjUwNzYzIDB4ZjhjOGY4ZDUgMHgyM2ZhZjdhNCAweDdkMGFmZTE1IDB4NDg1ODFhZGYgMHgzZGFlZjljZCAvLyBtZXRob2QgInZlcmlmeV91aW50NjRfaW5pdChieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2FkZCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9zdWIodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbXVsKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2Rpdih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9tb2QodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfYW5kKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X29yKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X3hvcih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9ub3QodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9sc2hpZnQodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfcnNoaWZ0KHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X3Bvdyh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9lcSh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbmUodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2x0KHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9sZSh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfZ3QodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2dlKHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2luaXQodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2FkZChieXRlW10sYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfYW5kKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfb3IoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc194b3IoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc19ub3QoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2FkZChieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfYWRkX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfc3ViKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9zdWJfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9tdWwoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X211bF91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2RpdihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZGl2X3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbW9kKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9tb2RfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9hbmQoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X29yKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9vcl91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X3hvcihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfeG9yX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9lcV91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9uZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2x0KGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9sZV91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9ndChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2dlKGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19pbml0KHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aChzdHJpbmcsc3RyaW5nKWJvb2wiLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfZW5kc3dpdGgoc3RyaW5nLHN0cmluZylib29sIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2pvaW4oc3RyaW5nLHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9sb2coc3RyaW5nLHVpbnQ2NCxieXRlW10sYnl0ZVtdLGJvb2wsc3RyaW5nLHVpbnQ2NCx1aW50MjU2LHVmaXhlZDMyeDgsdWZpeGVkMjU2eDE2LGJ5dGVbXSxieXRlW10sYnl0ZVtdLGJ5dGVbNV0pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV91aW50NjRfaW5pdCB2ZXJpZnlfdWludDY0X2FkZCB2ZXJpZnlfdWludDY0X3N1YiB2ZXJpZnlfdWludDY0X211bCB2ZXJpZnlfdWludDY0X2RpdiB2ZXJpZnlfdWludDY0X21vZCB2ZXJpZnlfdWludDY0X2FuZCB2ZXJpZnlfdWludDY0X29yIHZlcmlmeV91aW50NjRfeG9yIHZlcmlmeV91aW50NjRfbm90IHZlcmlmeV91aW50NjRfbHNoaWZ0IHZlcmlmeV91aW50NjRfcnNoaWZ0IHZlcmlmeV91aW50NjRfcG93IHZlcmlmeV91aW50NjRfZXEgdmVyaWZ5X3VpbnQ2NF9uZSB2ZXJpZnlfdWludDY0X2x0IHZlcmlmeV91aW50NjRfbGUgdmVyaWZ5X3VpbnQ2NF9ndCB2ZXJpZnlfdWludDY0X2dlIHZlcmlmeV9ieXRlc19pbml0IHZlcmlmeV9ieXRlc19hZGQgdmVyaWZ5X2J5dGVzX2VxIHZlcmlmeV9ieXRlc19uZSB2ZXJpZnlfYnl0ZXNfYW5kIHZlcmlmeV9ieXRlc19vciB2ZXJpZnlfYnl0ZXNfeG9yIHZlcmlmeV9ieXRlc19ub3QgdmVyaWZ5X2JpZ3VpbnRfYWRkIHZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfc3ViIHZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbXVsIHZlcmlmeV9iaWd1aW50X211bF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfZGl2IHZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbW9kIHZlcmlmeV9iaWd1aW50X21vZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfYW5kIHZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfb3IgdmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0IHZlcmlmeV9iaWd1aW50X3hvciB2ZXJpZnlfYmlndWludF94b3JfdWludDY0IHZlcmlmeV9iaWd1aW50X2VxIHZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NCB2ZXJpZnlfYmlndWludF9uZSB2ZXJpZnlfYmlndWludF9uZV91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbHQgdmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0IHZlcmlmeV9iaWd1aW50X2xlIHZlcmlmeV9iaWd1aW50X2xlX3VpbnQ2NCB2ZXJpZnlfYmlndWludF9ndCB2ZXJpZnlfYmlndWludF9ndF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfZ2UgdmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0IHZlcmlmeV9zdHJpbmdfaW5pdCB2ZXJpZnlfc3RyaW5nX3N0YXJ0c3dpdGggdmVyaWZ5X3N0cmluZ19lbmRzd2l0aCB2ZXJpZnlfc3RyaW5nX2pvaW4gdmVyaWZ5X2xvZwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDY3OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjkKICAgIC8vIHJlc3VsdCA9IG9wLmJ0b2kocmF3X3ZhbHVlKQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9hZGRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0CiAgICAvLyByZXN1bHQgPSBhICsgYgogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfc3ViW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9zdWI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOQogICAgLy8gcmVzdWx0ID0gYSAtIGIKICAgIC0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X211bFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbXVsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQKICAgIC8vIHJlc3VsdCA9IGEgKiBiCiAgICAqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9kaXZbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2RpdjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI5CiAgICAvLyByZXN1bHQgPSBhIC8vIGIKICAgIC8KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X21vZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbW9kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzQKICAgIC8vIHJlc3VsdCA9IGEgJSBiCiAgICAlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9hbmRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2FuZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM5CiAgICAvLyByZXN1bHQgPSBhICYgYgogICAgJgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfb3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X29yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDQKICAgIC8vIHJlc3VsdCA9IGEgfCBiCiAgICB8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF94b3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X3hvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyByZXN1bHQgPSBhIF4gYgogICAgXgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbm90W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9ub3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NAogICAgLy8gcmVzdWx0ID0gfmEKICAgIH4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2xzaGlmdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbHNoaWZ0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIHJlc3VsdCA9IGEgPDwgYgogICAgc2hsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9yc2hpZnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X3JzaGlmdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY0CiAgICAvLyByZXN1bHQgPSBhID4+IGIKICAgIHNocgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfcG93W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9wb3c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2OQogICAgLy8gcmVzdWx0ID0gYSoqYgogICAgZXhwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfZXE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3NAogICAgLy8gcmVzdWx0ID0gYSA9PSBiCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9uZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyByZXN1bHQgPSBhICE9IGIKICAgICE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODQKICAgIC8vIHJlc3VsdCA9IGEgPCBiCiAgICA8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2xlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODkKICAgIC8vIHJlc3VsdCA9IGEgPD0gYgogICAgPD0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9ndFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NAogICAgLy8gcmVzdWx0ID0gYSA+IGIKICAgID4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9nZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5OQogICAgLy8gcmVzdWx0ID0gYSA+PSBiCiAgICA+PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ieXRlc19pbml0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmVzdWx0ID0gb3AuaXRvYihyYXdfdmFsdWUpCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1MDAwOAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19hZGRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfYWRkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTExCiAgICAvLyBhID0gb3AuYnplcm8ocGFkX2Ffc2l6ZSkgKyBhCiAgICBzd2FwCiAgICBiemVybwogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTEyCiAgICAvLyBiID0gb3AuYnplcm8ocGFkX2Jfc2l6ZSkgKyBiCiAgICBzd2FwCiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTEzCiAgICAvLyByZXN1bHQgPSBhICsgYgogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExNAogICAgLy8gcmVzdWx0ID0gb3Auc2hhMjU2KHJlc3VsdCkKICAgIHNoYTI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUwMDIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX2VxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTE5CiAgICAvLyByZXN1bHQgPSBhID09IGIKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfbmVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfbmU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjQKICAgIC8vIHJlc3VsdCA9IGEgIT0gYgogICAgIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19hbmRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfYW5kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTI5CiAgICAvLyByZXN1bHQgPSBhICYgYgogICAgYiYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19vcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ieXRlc19vcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gcmVzdWx0ID0gYSB8IGIKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfeG9yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX3hvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gcmVzdWx0ID0gYSBeIGIKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfbm90W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX25vdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQ0CiAgICAvLyBhID0gb3AuYnplcm8ocGFkX3NpemUpICsgYQogICAgYnplcm8KICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDUKICAgIC8vIHJlc3VsdCA9IH5hCiAgICBifgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDYKICAgIC8vIHJlc3VsdCA9IG9wLnNoYTI1NihyZXN1bHQpCiAgICBzaGEyNTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FkZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICsgYl9iaWd1aW50CiAgICBiKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfYWRkX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1OQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICsgYgogICAgaXRvYgogICAgYisKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3N1Yltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X3N1YjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IC0gYl9iaWd1aW50CiAgICBiLQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfc3ViX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3MgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IC0gYgogICAgaXRvYgogICAgYi0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X211bFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X211bDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3OQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICogYl9iaWd1aW50CiAgICBiKgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbXVsX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X211bF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICogYgogICAgaXRvYgogICAgYioKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2Rpdltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2RpdjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE5MgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IC8vIGJfYmlndWludAogICAgYi8KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9kaXZfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTgKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCAvLyBiCiAgICBpdG9iCiAgICBiLwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbW9kW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbW9kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjA1CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJSBiX2JpZ3VpbnQKICAgIGIlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9tb2RfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbW9kX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjExCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJSBiCiAgICBpdG9iCiAgICBiJQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfYW5kW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfYW5kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjE4CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJiBiX2JpZ3VpbnQKICAgIGImCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9hbmRfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfYW5kX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI0CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJiBiCiAgICBpdG9iCiAgICBiJgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfb3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9vcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzMQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IHwgYl9iaWd1aW50CiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzcKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCB8IGIKICAgIGl0b2IKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF94b3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF94b3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDQKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCBeIGJfYmlndWludAogICAgYl4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3hvcl91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF94b3JfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTAKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCBeIGIKICAgIGl0b2IKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjU3CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPT0gYl9iaWd1aW50CiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjYzCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPT0gYgogICAgaXRvYgogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9uZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcwCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgIT0gYl9iaWd1aW50CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjc2CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgIT0gYgogICAgaXRvYgogICAgYiE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9sdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjgzCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPCBiX2JpZ3VpbnQKICAgIGI8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9sdF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9sdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI4OQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IDwgYgogICAgaXRvYgogICAgYjwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTYKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA8PSBiX2JpZ3VpbnQKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMDIKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA8PSBiCiAgICBpdG9iCiAgICBiPD0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2d0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMDkKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA+IGJfYmlndWludAogICAgYj4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzE1CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPiBiCiAgICBpdG9iCiAgICBiPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9nZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyMgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ID49IGJfYmlndWludAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9nZV91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9nZV91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ID49IGIKICAgIGl0b2IKICAgIGI+PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N0cmluZ19pbml0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzMzCiAgICAvLyByZXN1bHQgPSBTdHJpbmcoIkhlbGxvLCAiKSArIGEKICAgIHB1c2hieXRlcyAiSGVsbG8sICIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzM4CiAgICAvLyByZXN1bHQgPSBhLnN0YXJ0c3dpdGgoYikKICAgIGxlbgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGxlbgogICAgPgogICAgYnogdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoX3Rlcm5hcnlfZmFsc2VAMwogICAgaW50Y18xIC8vIDAKCnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aF90ZXJuYXJ5X21lcmdlQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoX3Rlcm5hcnlfZmFsc2VAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzM4CiAgICAvLyByZXN1bHQgPSBhLnN0YXJ0c3dpdGgoYikKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMAogICAgZGlnIDIKICAgIGV4dHJhY3QzCiAgICBkaWcgMgogICAgPT0KICAgIGIgdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoX3Rlcm5hcnlfbWVyZ2VANAoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19lbmRzd2l0aFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfZW5kc3dpdGg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gcmVzdWx0ID0gYS5lbmRzd2l0aChiKQogICAgbGVuCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID4KICAgIGJ6IHZlcmlmeV9zdHJpbmdfZW5kc3dpdGhfdGVybmFyeV9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMAoKdmVyaWZ5X3N0cmluZ19lbmRzd2l0aF90ZXJuYXJ5X21lcmdlQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKdmVyaWZ5X3N0cmluZ19lbmRzd2l0aF90ZXJuYXJ5X2ZhbHNlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gcmVzdWx0ID0gYS5lbmRzd2l0aChiKQogICAgZHVwCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICAtCiAgICBkaWcgNQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0MwogICAgZGlnIDMKICAgID09CiAgICBiIHZlcmlmeV9zdHJpbmdfZW5kc3dpdGhfdGVybmFyeV9tZXJnZUA0CgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2pvaW5bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2pvaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzQ4CiAgICAvLyByZXN1bHQgPSBTdHJpbmcoIiwgIikuam9pbigoYSwgYikpCiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgIiwgIgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNzMKICAgIC8vIGxvZyhhLCBiLCBjLCBkX2JpZ3VpbnQsIGUsIGYsIGcsIGgsIGksIGosIGFyYzRfaywgYXJjNF9tLCBhcmM0X24sIG8sIHNlcD0iLSIpCiAgICB1bmNvdmVyIDEzCiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmBAQVH3x1AQABLQYVH3x1ACAxG0EBszEZFEQxGESCPARyXGkrBBcxRVkEU/NIkwSIyLJpBKRkt6sEnIsRuARvQGVOBOyaKXQEx5NwjwR923SZBKIcRD0Ebn+yEgSwB/ywBC68INQEsJVLZgTdFArvBKzkdNoEumlJkARttYHABJHI24kE2+dxWASaDyLhBGQDPTcEKnI3xQTjqURYBEL4f30EK1VCpASb4vvpBBzZJRUEZOFwXATxJxxQBCq2O3AEg0u30gRTFiDXBD+552kE+o2wvASnLqSFBLewuhkEdEYMQgSrMgc4BFKtRlQEEBVjmQQPB1lXBL2EPf8Es3fTgQSJdnJlBEVrSyMEM9G4jARr+XPqBGfNa7IEP1iAWgQeEwA5BFCdyR0EpWSiAgQjZQdjBPjI+NUEI/r3pAR9Cv4VBEhYGt8EPa75zTYaAI48AAkAFwAnADcARwBXAGcAdwCHAJcAowCzAMMA0wDnAPsBDwEjATcBSwFdAYMBmwGzAc4B6QIEAhkCNAJOAmkCgwKeArgC0wLtAwgDIgM9A1cDcgOMA6cDwQPZA/AECAQfBDcETgRmBH0ElQSsBMQE2wT6BSsFZgWIADEZFDEYFBBDNhoBVwIAFxYoTFCwIkM2GgEXNhoCFwgWKExQsCJDNhoBFzYaAhcJFihMULAiQzYaARc2GgIXCxYoTFCwIkM2GgEXNhoCFwoWKExQsCJDNhoBFzYaAhcYFihMULAiQzYaARc2GgIXGhYoTFCwIkM2GgEXNhoCFxkWKExQsCJDNhoBFzYaAhcbFihMULAiQzYaARccFihMULAiQzYaARc2GgIXkBYoTFCwIkM2GgEXNhoCF5EWKExQsCJDNhoBFzYaAheUFihMULAiQzYaARc2GgIXEikjTwJUKExQsCJDNhoBFzYaAhcTKSNPAlQoTFCwIkM2GgEXNhoCFwwpI08CVChMULAiQzYaARc2GgIXDikjTwJUKExQsCJDNhoBFzYaAhcNKSNPAlQoTFCwIkM2GgEXNhoCFw8pI08CVChMULAiQzYaARcWgAYVH3x1AAhMULAiQzYaAVcCADYaAlcCADYaAxc2GgQXTK9PA1BMr08CUFABK0xQsCJDNhoBVwIANhoCVwIAEikjTwJUKExQsCJDNhoBVwIANhoCVwIAEykjTwJUKExQsCJDNhoBVwIANhoCVwIArEkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAq0kVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIArUkVFlcGAkxQKExQsCJDNhoBVwIANhoCF69MUK4BK0xQsCJDNhoBVwIANhoCVwIAoEkVFlcGAkxQKExQsCJDNhoBVwIANhoCFxagSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgChSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFqFJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKNJFRZXBgJMUChMULAiQzYaAVcCADYaAhcWo0kVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAokkVFlcGAkxQKExQsCJDNhoBVwIANhoCFxaiSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCqSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFqpJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKxJFRZXBgJMUChMULAiQzYaAVcCADYaAhcWrEkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAq0kVFlcGAkxQKExQsCJDNhoBVwIANhoCFxarSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCtSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFq1JFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKgpI08CVChMULAiQzYaAVcCADYaAhcWqCkjTwJUKExQsCJDNhoBVwIANhoCVwIAqSkjTwJUKExQsCJDNhoBVwIANhoCFxapKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgCkKSNPAlQoTFCwIkM2GgFXAgA2GgIXFqQpI08CVChMULAiQzYaAVcCADYaAlcCAKYpI08CVChMULAiQzYaAVcCADYaAhcWpikjTwJUKExQsCJDNhoBVwIANhoCVwIApSkjTwJUKExQsCJDNhoBVwIANhoCFxalKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgCnKSNPAlQoTFCwIkM2GgFXAgA2GgIXFqcpI08CVChMULAiQzYaAVcCAIAHSGVsbG8sIExQSRUWVwYCTFAoTFCwIkM2GgFXAgBJNhoCVwIASU4CFUlPAhUNQQAMIykjTwJUKExQsCJDSwIjSwJYSwISQv/pNhoBVwIASTYaAlcCAElOAhVJTwIVSU4CDUEADCMpI08CVChMULAiQ0lLAklOAglLBUxPAlhLAxJC/+I2GgFXAgA2GgJXAgBMgAIsIFBMUEkVFlcGAkxQKExQsCJDNhoBVwIANhoCFzYaA1cCADYaBFcCADYaBTYaBjYaBzYaCDYaCTYaCjYaC1cCADYaDFcCADYaDVcCADYaDk8NKlBPDRZQKlBPDFAqUE8LUCpQTwpQKlBPCVAqUE8IUCpQTwdQKlBPBlAqUE8FUCpQTwRQKlBPA1AqUE8CUCpQTFCwIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the PrimitiveOpsContract contract + */ +export type PrimitiveOpsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_uint64_init(byte[])uint64': { + rawValue: Uint8Array + } + 'verify_uint64_add(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_sub(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_mul(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_div(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_mod(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_and(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_or(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_xor(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_not(uint64)uint64': { + a: bigint | number + } + 'verify_uint64_lshift(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_rshift(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_pow(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_eq(uint64,uint64)bool': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_ne(uint64,uint64)bool': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_lt(uint64,uint64)bool': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_le(uint64,uint64)bool': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_gt(uint64,uint64)bool': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_ge(uint64,uint64)bool': { + a: bigint | number + b: bigint | number + } + 'verify_bytes_init(uint64)byte[]': { + rawValue: bigint | number + } + 'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]': { + a: Uint8Array + b: Uint8Array + padASize: bigint | number + padBSize: bigint | number + } + 'verify_bytes_eq(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_bytes_ne(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_bytes_and(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_bytes_or(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_bytes_xor(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_bytes_not(byte[],uint64)byte[]': { + a: Uint8Array + padSize: bigint | number + } + 'verify_biguint_add(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_add_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_sub(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_sub_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_mul(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_mul_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_div(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_div_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_mod(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_mod_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_and(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_and_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_or(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_or_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_xor(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_xor_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_eq(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_eq_uint64(byte[],uint64)bool': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_ne(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_ne_uint64(byte[],uint64)bool': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_lt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_lt_uint64(byte[],uint64)bool': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_le(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_le_uint64(byte[],uint64)bool': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_gt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_gt_uint64(byte[],uint64)bool': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_ge(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_ge_uint64(byte[],uint64)bool': { + a: Uint8Array + b: bigint | number + } + 'verify_string_init(string)string': { + a: string + } + 'verify_string_startswith(string,string)bool': { + a: string + b: string + } + 'verify_string_endswith(string,string)bool': { + a: string + b: string + } + 'verify_string_join(string,string)string': { + a: string + b: string + } + 'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void': { + a: string + b: bigint | number + c: Uint8Array + d: Uint8Array + e: boolean + f: string + g: bigint | number + h: bigint | number + i: number + j: number + k: Uint8Array + m: Uint8Array + n: Uint8Array + o: Uint8Array + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_uint64_init(byte[])uint64': [rawValue: Uint8Array] + 'verify_uint64_add(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_sub(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_mul(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_div(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_mod(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_and(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_or(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_xor(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_not(uint64)uint64': [a: bigint | number] + 'verify_uint64_lshift(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_rshift(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_pow(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_eq(uint64,uint64)bool': [a: bigint | number, b: bigint | number] + 'verify_uint64_ne(uint64,uint64)bool': [a: bigint | number, b: bigint | number] + 'verify_uint64_lt(uint64,uint64)bool': [a: bigint | number, b: bigint | number] + 'verify_uint64_le(uint64,uint64)bool': [a: bigint | number, b: bigint | number] + 'verify_uint64_gt(uint64,uint64)bool': [a: bigint | number, b: bigint | number] + 'verify_uint64_ge(uint64,uint64)bool': [a: bigint | number, b: bigint | number] + 'verify_bytes_init(uint64)byte[]': [rawValue: bigint | number] + 'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]': [a: Uint8Array, b: Uint8Array, padASize: bigint | number, padBSize: bigint | number] + 'verify_bytes_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_bytes_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_bytes_and(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_bytes_or(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_bytes_xor(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_bytes_not(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] + 'verify_biguint_add(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_add_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_sub(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_sub_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_mul(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_mul_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_div(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_div_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_mod(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_mod_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_and(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_and_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_or(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_or_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_xor(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_xor_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_eq_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] + 'verify_biguint_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_ne_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] + 'verify_biguint_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_lt_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] + 'verify_biguint_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_le_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] + 'verify_biguint_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_gt_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] + 'verify_biguint_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_ge_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] + 'verify_string_init(string)string': [a: string] + 'verify_string_startswith(string,string)bool': [a: string, b: string] + 'verify_string_endswith(string,string)bool': [a: string, b: string] + 'verify_string_join(string,string)string': [a: string, b: string] + 'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void': [a: string, b: bigint | number, c: Uint8Array, d: Uint8Array, e: boolean, f: string, g: bigint | number, h: bigint | number, i: number, j: number, k: Uint8Array, m: Uint8Array, n: Uint8Array, o: Uint8Array] + } +} + +/** + * The return type for each method + */ +export type PrimitiveOpsContractReturns = { + 'verify_uint64_init(byte[])uint64': bigint + 'verify_uint64_add(uint64,uint64)uint64': bigint + 'verify_uint64_sub(uint64,uint64)uint64': bigint + 'verify_uint64_mul(uint64,uint64)uint64': bigint + 'verify_uint64_div(uint64,uint64)uint64': bigint + 'verify_uint64_mod(uint64,uint64)uint64': bigint + 'verify_uint64_and(uint64,uint64)uint64': bigint + 'verify_uint64_or(uint64,uint64)uint64': bigint + 'verify_uint64_xor(uint64,uint64)uint64': bigint + 'verify_uint64_not(uint64)uint64': bigint + 'verify_uint64_lshift(uint64,uint64)uint64': bigint + 'verify_uint64_rshift(uint64,uint64)uint64': bigint + 'verify_uint64_pow(uint64,uint64)uint64': bigint + 'verify_uint64_eq(uint64,uint64)bool': boolean + 'verify_uint64_ne(uint64,uint64)bool': boolean + 'verify_uint64_lt(uint64,uint64)bool': boolean + 'verify_uint64_le(uint64,uint64)bool': boolean + 'verify_uint64_gt(uint64,uint64)bool': boolean + 'verify_uint64_ge(uint64,uint64)bool': boolean + 'verify_bytes_init(uint64)byte[]': Uint8Array + 'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]': Uint8Array + 'verify_bytes_eq(byte[],byte[])bool': boolean + 'verify_bytes_ne(byte[],byte[])bool': boolean + 'verify_bytes_and(byte[],byte[])byte[]': Uint8Array + 'verify_bytes_or(byte[],byte[])byte[]': Uint8Array + 'verify_bytes_xor(byte[],byte[])byte[]': Uint8Array + 'verify_bytes_not(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_add(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_add_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_sub(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_sub_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_mul(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_mul_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_div(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_div_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_mod(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_mod_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_and(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_and_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_or(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_or_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_xor(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_xor_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_eq(byte[],byte[])bool': boolean + 'verify_biguint_eq_uint64(byte[],uint64)bool': boolean + 'verify_biguint_ne(byte[],byte[])bool': boolean + 'verify_biguint_ne_uint64(byte[],uint64)bool': boolean + 'verify_biguint_lt(byte[],byte[])bool': boolean + 'verify_biguint_lt_uint64(byte[],uint64)bool': boolean + 'verify_biguint_le(byte[],byte[])bool': boolean + 'verify_biguint_le_uint64(byte[],uint64)bool': boolean + 'verify_biguint_gt(byte[],byte[])bool': boolean + 'verify_biguint_gt_uint64(byte[],uint64)bool': boolean + 'verify_biguint_ge(byte[],byte[])bool': boolean + 'verify_biguint_ge_uint64(byte[],uint64)bool': boolean + 'verify_string_init(string)string': string + 'verify_string_startswith(string,string)bool': boolean + 'verify_string_endswith(string,string)bool': boolean + 'verify_string_join(string,string)string': string + 'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void': void +} + +/** + * Defines the types of available calls and state of the PrimitiveOpsContract smart contract. + */ +export type PrimitiveOpsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_uint64_init(byte[])uint64' | 'verify_uint64_init', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_init(byte[])uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_init(byte[])uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_init(byte[])uint64'] + }> + & Record<'verify_uint64_add(uint64,uint64)uint64' | 'verify_uint64_add', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_add(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_add(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_add(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_sub(uint64,uint64)uint64' | 'verify_uint64_sub', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_sub(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_sub(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_sub(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_mul(uint64,uint64)uint64' | 'verify_uint64_mul', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_mul(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_mul(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_mul(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_div(uint64,uint64)uint64' | 'verify_uint64_div', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_div(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_div(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_div(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_mod(uint64,uint64)uint64' | 'verify_uint64_mod', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_mod(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_mod(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_mod(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_and(uint64,uint64)uint64' | 'verify_uint64_and', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_and(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_and(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_and(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_or(uint64,uint64)uint64' | 'verify_uint64_or', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_or(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_or(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_or(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_xor(uint64,uint64)uint64' | 'verify_uint64_xor', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_xor(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_xor(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_xor(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_not(uint64)uint64' | 'verify_uint64_not', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_not(uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_not(uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_not(uint64)uint64'] + }> + & Record<'verify_uint64_lshift(uint64,uint64)uint64' | 'verify_uint64_lshift', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_lshift(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_lshift(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_lshift(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_rshift(uint64,uint64)uint64' | 'verify_uint64_rshift', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_rshift(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_rshift(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_rshift(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_pow(uint64,uint64)uint64' | 'verify_uint64_pow', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_pow(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_pow(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_pow(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_eq(uint64,uint64)bool' | 'verify_uint64_eq', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_eq(uint64,uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_eq(uint64,uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_uint64_eq(uint64,uint64)bool'] + }> + & Record<'verify_uint64_ne(uint64,uint64)bool' | 'verify_uint64_ne', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_ne(uint64,uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_ne(uint64,uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_uint64_ne(uint64,uint64)bool'] + }> + & Record<'verify_uint64_lt(uint64,uint64)bool' | 'verify_uint64_lt', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_lt(uint64,uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_lt(uint64,uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_uint64_lt(uint64,uint64)bool'] + }> + & Record<'verify_uint64_le(uint64,uint64)bool' | 'verify_uint64_le', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_le(uint64,uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_le(uint64,uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_uint64_le(uint64,uint64)bool'] + }> + & Record<'verify_uint64_gt(uint64,uint64)bool' | 'verify_uint64_gt', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_gt(uint64,uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_gt(uint64,uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_uint64_gt(uint64,uint64)bool'] + }> + & Record<'verify_uint64_ge(uint64,uint64)bool' | 'verify_uint64_ge', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_ge(uint64,uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_ge(uint64,uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_uint64_ge(uint64,uint64)bool'] + }> + & Record<'verify_bytes_init(uint64)byte[]' | 'verify_bytes_init', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_init(uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_init(uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_bytes_init(uint64)byte[]'] + }> + & Record<'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]' | 'verify_bytes_add', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'] + }> + & Record<'verify_bytes_eq(byte[],byte[])bool' | 'verify_bytes_eq', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_eq(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_eq(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_bytes_eq(byte[],byte[])bool'] + }> + & Record<'verify_bytes_ne(byte[],byte[])bool' | 'verify_bytes_ne', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_ne(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_ne(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_bytes_ne(byte[],byte[])bool'] + }> + & Record<'verify_bytes_and(byte[],byte[])byte[]' | 'verify_bytes_and', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_and(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_and(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_bytes_and(byte[],byte[])byte[]'] + }> + & Record<'verify_bytes_or(byte[],byte[])byte[]' | 'verify_bytes_or', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_or(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_or(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_bytes_or(byte[],byte[])byte[]'] + }> + & Record<'verify_bytes_xor(byte[],byte[])byte[]' | 'verify_bytes_xor', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_xor(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_xor(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_bytes_xor(byte[],byte[])byte[]'] + }> + & Record<'verify_bytes_not(byte[],uint64)byte[]' | 'verify_bytes_not', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_not(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_not(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_bytes_not(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_add(byte[],byte[])byte[]' | 'verify_biguint_add', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_add(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_add(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_add(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_add_uint64(byte[],uint64)byte[]' | 'verify_biguint_add_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_add_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_add_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_add_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_sub(byte[],byte[])byte[]' | 'verify_biguint_sub', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_sub(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_sub(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_sub(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_sub_uint64(byte[],uint64)byte[]' | 'verify_biguint_sub_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_sub_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_sub_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_sub_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_mul(byte[],byte[])byte[]' | 'verify_biguint_mul', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_mul(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_mul(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_mul(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_mul_uint64(byte[],uint64)byte[]' | 'verify_biguint_mul_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_mul_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_mul_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_mul_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_div(byte[],byte[])byte[]' | 'verify_biguint_div', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_div(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_div(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_div(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_div_uint64(byte[],uint64)byte[]' | 'verify_biguint_div_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_div_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_div_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_div_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_mod(byte[],byte[])byte[]' | 'verify_biguint_mod', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_mod(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_mod(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_mod(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_mod_uint64(byte[],uint64)byte[]' | 'verify_biguint_mod_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_mod_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_mod_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_mod_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_and(byte[],byte[])byte[]' | 'verify_biguint_and', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_and(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_and(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_and(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_and_uint64(byte[],uint64)byte[]' | 'verify_biguint_and_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_and_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_and_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_and_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_or(byte[],byte[])byte[]' | 'verify_biguint_or', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_or(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_or(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_or(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_or_uint64(byte[],uint64)byte[]' | 'verify_biguint_or_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_or_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_or_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_or_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_xor(byte[],byte[])byte[]' | 'verify_biguint_xor', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_xor(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_xor(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_xor(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_xor_uint64(byte[],uint64)byte[]' | 'verify_biguint_xor_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_xor_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_xor_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_xor_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_eq(byte[],byte[])bool' | 'verify_biguint_eq', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_eq(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_eq(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_eq(byte[],byte[])bool'] + }> + & Record<'verify_biguint_eq_uint64(byte[],uint64)bool' | 'verify_biguint_eq_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_eq_uint64(byte[],uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_eq_uint64(byte[],uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_eq_uint64(byte[],uint64)bool'] + }> + & Record<'verify_biguint_ne(byte[],byte[])bool' | 'verify_biguint_ne', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_ne(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_ne(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_ne(byte[],byte[])bool'] + }> + & Record<'verify_biguint_ne_uint64(byte[],uint64)bool' | 'verify_biguint_ne_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_ne_uint64(byte[],uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_ne_uint64(byte[],uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_ne_uint64(byte[],uint64)bool'] + }> + & Record<'verify_biguint_lt(byte[],byte[])bool' | 'verify_biguint_lt', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_lt(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_lt(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_lt(byte[],byte[])bool'] + }> + & Record<'verify_biguint_lt_uint64(byte[],uint64)bool' | 'verify_biguint_lt_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_lt_uint64(byte[],uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_lt_uint64(byte[],uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_lt_uint64(byte[],uint64)bool'] + }> + & Record<'verify_biguint_le(byte[],byte[])bool' | 'verify_biguint_le', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_le(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_le(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_le(byte[],byte[])bool'] + }> + & Record<'verify_biguint_le_uint64(byte[],uint64)bool' | 'verify_biguint_le_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_le_uint64(byte[],uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_le_uint64(byte[],uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_le_uint64(byte[],uint64)bool'] + }> + & Record<'verify_biguint_gt(byte[],byte[])bool' | 'verify_biguint_gt', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_gt(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_gt(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_gt(byte[],byte[])bool'] + }> + & Record<'verify_biguint_gt_uint64(byte[],uint64)bool' | 'verify_biguint_gt_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_gt_uint64(byte[],uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_gt_uint64(byte[],uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_gt_uint64(byte[],uint64)bool'] + }> + & Record<'verify_biguint_ge(byte[],byte[])bool' | 'verify_biguint_ge', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_ge(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_ge(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_ge(byte[],byte[])bool'] + }> + & Record<'verify_biguint_ge_uint64(byte[],uint64)bool' | 'verify_biguint_ge_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_ge_uint64(byte[],uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_ge_uint64(byte[],uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_ge_uint64(byte[],uint64)bool'] + }> + & Record<'verify_string_init(string)string' | 'verify_string_init', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_string_init(string)string'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_string_init(string)string'] + returns: PrimitiveOpsContractReturns['verify_string_init(string)string'] + }> + & Record<'verify_string_startswith(string,string)bool' | 'verify_string_startswith', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_string_startswith(string,string)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_string_startswith(string,string)bool'] + returns: PrimitiveOpsContractReturns['verify_string_startswith(string,string)bool'] + }> + & Record<'verify_string_endswith(string,string)bool' | 'verify_string_endswith', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_string_endswith(string,string)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_string_endswith(string,string)bool'] + returns: PrimitiveOpsContractReturns['verify_string_endswith(string,string)bool'] + }> + & Record<'verify_string_join(string,string)string' | 'verify_string_join', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_string_join(string,string)string'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_string_join(string,string)string'] + returns: PrimitiveOpsContractReturns['verify_string_join(string,string)string'] + }> + & Record<'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void' | 'verify_log', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'] + returns: PrimitiveOpsContractReturns['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type PrimitiveOpsContractSignatures = keyof PrimitiveOpsContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type PrimitiveOpsContractNonVoidMethodSignatures = keyof PrimitiveOpsContractTypes['methods'] extends infer T ? T extends keyof PrimitiveOpsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the PrimitiveOpsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = PrimitiveOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the PrimitiveOpsContract smart contract to the method's return type + */ +export type MethodReturn = PrimitiveOpsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type PrimitiveOpsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type PrimitiveOpsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: PrimitiveOpsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the PrimitiveOpsContract smart contract + */ +export abstract class PrimitiveOpsContractParamsFactory { + /** + * Constructs a no op call for the verify_uint64_init(byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Init(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_init(byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.rawValue], + } + } + /** + * Constructs a no op call for the verify_uint64_add(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Add(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_add(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_sub(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Sub(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_sub(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_mul(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Mul(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_mul(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_div(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Div(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_div(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_mod(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Mod(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_mod(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_and(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64And(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_and(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_or(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Or(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_or(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_xor(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Xor(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_xor(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_not(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Not(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_not(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_uint64_lshift(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Lshift(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_lshift(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_rshift(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Rshift(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_rshift(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_pow(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Pow(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_pow(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_eq(uint64,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Eq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_eq(uint64,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_ne(uint64,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Ne(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_ne(uint64,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_lt(uint64,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Lt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_lt(uint64,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_le(uint64,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Le(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_le(uint64,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_gt(uint64,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Gt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_gt(uint64,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_ge(uint64,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Ge(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_ge(uint64,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_bytes_init(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_init(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.rawValue], + } + } + /** + * Constructs a no op call for the verify_bytes_add(byte[],byte[],uint64,uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesAdd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.padASize, params.args.padBSize], + } + } + /** + * Constructs a no op call for the verify_bytes_eq(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_eq(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_bytes_ne(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_ne(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_bytes_and(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesAnd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_and(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_bytes_or(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesOr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_or(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_bytes_xor(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesXor(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_xor(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_bytes_not(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesNot(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_not(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], + } + } + /** + * Constructs a no op call for the verify_biguint_add(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintAdd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_add(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_add_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintAddUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_add_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_sub(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintSub(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_sub(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_sub_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintSubUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_sub_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_mul(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintMul(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_mul(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_mul_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintMulUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_mul_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_div(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintDiv(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_div(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_div_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintDivUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_div_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_mod(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintMod(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_mod(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_mod_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintModUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_mod_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_and(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintAnd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_and(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_and_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintAndUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_and_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_or(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintOr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_or(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_or_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintOrUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_or_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_xor(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintXor(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_xor(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_xor_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintXorUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_xor_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_eq(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_eq(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_eq_uint64(byte[],uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintEqUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_eq_uint64(byte[],uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_ne(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_ne(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_ne_uint64(byte[],uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintNeUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_ne_uint64(byte[],uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_lt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_lt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_lt_uint64(byte[],uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintLtUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_lt_uint64(byte[],uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_le(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_le(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_le_uint64(byte[],uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintLeUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_le_uint64(byte[],uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_gt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_gt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_gt_uint64(byte[],uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintGtUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_gt_uint64(byte[],uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_ge(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_ge(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_ge_uint64(byte[],uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintGeUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_ge_uint64(byte[],uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_string_init(string)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_init(string)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_string_startswith(string,string)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringStartswith(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_startswith(string,string)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_string_endswith(string,string)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringEndswith(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_endswith(string,string)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_string_join(string,string)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringJoin(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_join(string,string)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d, params.args.e, params.args.f, params.args.g, params.args.h, params.args.i, params.args.j, params.args.k, params.args.m, params.args.n, params.args.o], + } + } +} + +/** + * A factory to create and deploy one or more instance of the PrimitiveOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class PrimitiveOpsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `PrimitiveOpsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new PrimitiveOpsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new PrimitiveOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the PrimitiveOpsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: PrimitiveOpsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new PrimitiveOpsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the PrimitiveOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the PrimitiveOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the PrimitiveOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new PrimitiveOpsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the PrimitiveOpsContract smart contract + */ +export class PrimitiveOpsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `PrimitiveOpsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the PrimitiveOpsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `PrimitiveOpsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `PrimitiveOpsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new PrimitiveOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `PrimitiveOpsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new PrimitiveOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the PrimitiveOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_init(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Init: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Init(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_add(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Add: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Add(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_sub(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Sub: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Sub(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mul(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Mul: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Mul(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_div(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Div: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Div(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mod(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Mod: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Mod(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_and(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64And: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64And(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_or(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Or: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Or(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_xor(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Xor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Xor(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_not(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Not: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Not(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lshift(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Lshift: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Lshift(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_rshift(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Rshift: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Rshift(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_pow(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Pow: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Pow(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_eq(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Eq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Eq(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ne(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Ne: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Ne(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lt(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Lt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Lt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_le(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Le: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Le(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_gt(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Gt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Gt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ge(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Ge: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Ge(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_init(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesInit(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_add(byte[],byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesAdd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesEq(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesNe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_and(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesAnd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesAnd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_or(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesOr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesOr(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_xor(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesXor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesXor(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_not(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesNot: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesNot(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintAdd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintAddUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintAddUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintSub: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintSub(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintSubUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintSubUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintMul: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintMul(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintMulUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintMulUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintDiv: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintDiv(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintDivUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintDivUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintMod: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintMod(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintModUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintModUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintAnd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintAnd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintAndUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintAndUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintOr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintOr(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintOrUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintOrUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintXor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintXor(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintXorUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintXorUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintEq(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintEqUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintEqUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintNe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintNeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintNeUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintLt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintLtUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintLtUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintLe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintLeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintLeUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintGt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintGtUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintGtUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintGe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintGeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintGeUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyStringInit(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_startswith(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringStartswith: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyStringStartswith(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_endswith(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringEndswith: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyStringEndswith(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_join(string,string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringJoin: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyStringJoin(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyLog(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the PrimitiveOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_init(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Init: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Init(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_add(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Add: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Add(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_sub(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Sub: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Sub(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mul(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Mul: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Mul(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_div(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Div: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Div(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mod(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Mod: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Mod(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_and(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64And: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64And(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_or(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Or: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Or(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_xor(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Xor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Xor(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_not(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Not: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Not(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lshift(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Lshift: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Lshift(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_rshift(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Rshift: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Rshift(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_pow(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Pow: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Pow(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_eq(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Eq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Eq(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ne(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Ne: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Ne(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lt(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Lt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Lt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_le(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Le: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Le(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_gt(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Gt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Gt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ge(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Ge: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Ge(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_init(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesInit(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_add(byte[],byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesAdd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesEq(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesNe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_and(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesAnd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesAnd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_or(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesOr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesOr(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_xor(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesXor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesXor(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_not(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesNot: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesNot(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintAdd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintAddUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintAddUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintSub: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintSub(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintSubUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintSubUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintMul: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintMul(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintMulUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintMulUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintDiv: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintDiv(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintDivUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintDivUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintMod: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintMod(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintModUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintModUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintAnd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintAnd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintAndUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintAndUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintOr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintOr(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintOrUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintOrUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintXor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintXor(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintXorUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintXorUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintEq(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintEqUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintEqUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintNe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintNeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintNeUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintLt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintLtUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintLtUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintLe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintLeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintLeUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintGt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintGtUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintGtUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintGe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintGeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintGeUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyStringInit(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_startswith(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringStartswith: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyStringStartswith(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_endswith(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringEndswith: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyStringEndswith(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_join(string,string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringJoin: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyStringJoin(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyLog(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the PrimitiveOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_init(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Init: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Init(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_init(byte[])uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_add(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Add: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Add(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_add(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_sub(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Sub: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Sub(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_sub(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mul(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Mul: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Mul(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_mul(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_div(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Div: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Div(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_div(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mod(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Mod: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Mod(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_mod(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_and(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64And: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64And(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_and(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_or(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Or: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Or(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_or(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_xor(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Xor: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Xor(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_xor(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_not(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Not: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Not(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_not(uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lshift(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Lshift: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Lshift(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_lshift(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_rshift(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Rshift: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Rshift(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_rshift(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_pow(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Pow: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Pow(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_pow(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_eq(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Eq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Eq(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_eq(uint64,uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ne(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Ne: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Ne(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_ne(uint64,uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lt(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Lt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Lt(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_lt(uint64,uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_le(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Le: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Le(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_le(uint64,uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_gt(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Gt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Gt(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_gt(uint64,uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ge(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Ge: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Ge(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_ge(uint64,uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_init(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesInit(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_init(uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_add(byte[],byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesAdd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesAdd(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesEq(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_eq(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesNe(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_ne(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_and(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesAnd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesAnd(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_and(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_or(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesOr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesOr(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_or(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_xor(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesXor: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesXor(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_xor(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_not(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesNot: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesNot(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_not(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintAdd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintAdd(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_add(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintAddUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintAddUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_add_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintSub: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintSub(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_sub(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintSubUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintSubUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_sub_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintMul: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintMul(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_mul(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintMulUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintMulUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_mul_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintDiv: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintDiv(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_div(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintDivUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintDivUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_div_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintMod: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintMod(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_mod(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintModUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintModUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_mod_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintAnd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintAnd(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_and(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintAndUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintAndUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_and_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintOr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintOr(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_or(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintOrUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintOrUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_or_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintXor: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintXor(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_xor(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintXorUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintXorUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_xor_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintEq(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_eq(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintEqUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintEqUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_eq_uint64(byte[],uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintNe(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_ne(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintNeUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintNeUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_ne_uint64(byte[],uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintLt(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_lt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintLtUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintLtUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_lt_uint64(byte[],uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintLe(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_le(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintLeUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintLeUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_le_uint64(byte[],uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintGt(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_gt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintGtUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintGtUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_gt_uint64(byte[],uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintGe(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_ge(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintGeUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintGeUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_ge_uint64(byte[],uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyStringInit(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_string_init(string)string'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_startswith(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringStartswith: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyStringStartswith(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_string_startswith(string,string)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_endswith(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringEndswith: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyStringEndswith(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_string_endswith(string,string)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_join(string,string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringJoin: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyStringJoin(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_string_join(string,string)string'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyLog(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new PrimitiveOpsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current PrimitiveOpsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): PrimitiveOpsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_uint64_init(byte[])uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Init(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Init(params))) + return this + }, + /** + * Add a verify_uint64_add(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Add(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Add(params))) + return this + }, + /** + * Add a verify_uint64_sub(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Sub(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Sub(params))) + return this + }, + /** + * Add a verify_uint64_mul(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Mul(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Mul(params))) + return this + }, + /** + * Add a verify_uint64_div(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Div(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Div(params))) + return this + }, + /** + * Add a verify_uint64_mod(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Mod(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Mod(params))) + return this + }, + /** + * Add a verify_uint64_and(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64And(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64And(params))) + return this + }, + /** + * Add a verify_uint64_or(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Or(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Or(params))) + return this + }, + /** + * Add a verify_uint64_xor(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Xor(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Xor(params))) + return this + }, + /** + * Add a verify_uint64_not(uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Not(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Not(params))) + return this + }, + /** + * Add a verify_uint64_lshift(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Lshift(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Lshift(params))) + return this + }, + /** + * Add a verify_uint64_rshift(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Rshift(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Rshift(params))) + return this + }, + /** + * Add a verify_uint64_pow(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Pow(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Pow(params))) + return this + }, + /** + * Add a verify_uint64_eq(uint64,uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyUint64Eq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Eq(params))) + return this + }, + /** + * Add a verify_uint64_ne(uint64,uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyUint64Ne(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Ne(params))) + return this + }, + /** + * Add a verify_uint64_lt(uint64,uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyUint64Lt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Lt(params))) + return this + }, + /** + * Add a verify_uint64_le(uint64,uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyUint64Le(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Le(params))) + return this + }, + /** + * Add a verify_uint64_gt(uint64,uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyUint64Gt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Gt(params))) + return this + }, + /** + * Add a verify_uint64_ge(uint64,uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyUint64Ge(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Ge(params))) + return this + }, + /** + * Add a verify_bytes_init(uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBytesInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesInit(params))) + return this + }, + /** + * Add a verify_bytes_add(byte[],byte[],uint64,uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBytesAdd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesAdd(params))) + return this + }, + /** + * Add a verify_bytes_eq(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBytesEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesEq(params))) + return this + }, + /** + * Add a verify_bytes_ne(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBytesNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesNe(params))) + return this + }, + /** + * Add a verify_bytes_and(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBytesAnd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesAnd(params))) + return this + }, + /** + * Add a verify_bytes_or(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBytesOr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesOr(params))) + return this + }, + /** + * Add a verify_bytes_xor(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBytesXor(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesXor(params))) + return this + }, + /** + * Add a verify_bytes_not(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBytesNot(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesNot(params))) + return this + }, + /** + * Add a verify_biguint_add(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintAdd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintAdd(params))) + return this + }, + /** + * Add a verify_biguint_add_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintAddUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintAddUint64(params))) + return this + }, + /** + * Add a verify_biguint_sub(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintSub(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintSub(params))) + return this + }, + /** + * Add a verify_biguint_sub_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintSubUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintSubUint64(params))) + return this + }, + /** + * Add a verify_biguint_mul(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintMul(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintMul(params))) + return this + }, + /** + * Add a verify_biguint_mul_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintMulUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintMulUint64(params))) + return this + }, + /** + * Add a verify_biguint_div(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintDiv(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintDiv(params))) + return this + }, + /** + * Add a verify_biguint_div_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintDivUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintDivUint64(params))) + return this + }, + /** + * Add a verify_biguint_mod(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintMod(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintMod(params))) + return this + }, + /** + * Add a verify_biguint_mod_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintModUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintModUint64(params))) + return this + }, + /** + * Add a verify_biguint_and(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintAnd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintAnd(params))) + return this + }, + /** + * Add a verify_biguint_and_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintAndUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintAndUint64(params))) + return this + }, + /** + * Add a verify_biguint_or(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintOr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintOr(params))) + return this + }, + /** + * Add a verify_biguint_or_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintOrUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintOrUint64(params))) + return this + }, + /** + * Add a verify_biguint_xor(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintXor(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintXor(params))) + return this + }, + /** + * Add a verify_biguint_xor_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintXorUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintXorUint64(params))) + return this + }, + /** + * Add a verify_biguint_eq(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintEq(params))) + return this + }, + /** + * Add a verify_biguint_eq_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintEqUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintEqUint64(params))) + return this + }, + /** + * Add a verify_biguint_ne(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintNe(params))) + return this + }, + /** + * Add a verify_biguint_ne_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintNeUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintNeUint64(params))) + return this + }, + /** + * Add a verify_biguint_lt(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintLt(params))) + return this + }, + /** + * Add a verify_biguint_lt_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintLtUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintLtUint64(params))) + return this + }, + /** + * Add a verify_biguint_le(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintLe(params))) + return this + }, + /** + * Add a verify_biguint_le_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintLeUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintLeUint64(params))) + return this + }, + /** + * Add a verify_biguint_gt(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintGt(params))) + return this + }, + /** + * Add a verify_biguint_gt_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintGtUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintGtUint64(params))) + return this + }, + /** + * Add a verify_biguint_ge(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintGe(params))) + return this + }, + /** + * Add a verify_biguint_ge_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintGeUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintGeUint64(params))) + return this + }, + /** + * Add a verify_string_init(string)string method call against the PrimitiveOpsContract contract + */ + verifyStringInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringInit(params))) + return this + }, + /** + * Add a verify_string_startswith(string,string)bool method call against the PrimitiveOpsContract contract + */ + verifyStringStartswith(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringStartswith(params))) + return this + }, + /** + * Add a verify_string_endswith(string,string)bool method call against the PrimitiveOpsContract contract + */ + verifyStringEndswith(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringEndswith(params))) + return this + }, + /** + * Add a verify_string_join(string,string)string method call against the PrimitiveOpsContract contract + */ + verifyStringJoin(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringJoin(params))) + return this + }, + /** + * Add a verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void method call against the PrimitiveOpsContract contract + */ + verifyLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyLog(params))) + return this + }, + /** + * Add a clear state call to the PrimitiveOpsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as PrimitiveOpsContractComposer + } +} +export type PrimitiveOpsContractComposer = { + /** + * Calls the verify_uint64_init(byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Init(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_init(byte[])uint64'] | undefined]> + + /** + * Calls the verify_uint64_add(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Add(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_add(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_sub(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Sub(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_sub(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_mul(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Mul(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_mul(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_div(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Div(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_div(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_mod(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Mod(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_mod(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_and(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64And(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_and(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_or(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Or(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_or(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_xor(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Xor(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_xor(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_not(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Not(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_not(uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_lshift(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Lshift(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_lshift(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_rshift(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Rshift(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_rshift(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_pow(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Pow(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_pow(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_eq(uint64,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Eq(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_eq(uint64,uint64)bool'] | undefined]> + + /** + * Calls the verify_uint64_ne(uint64,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Ne(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_ne(uint64,uint64)bool'] | undefined]> + + /** + * Calls the verify_uint64_lt(uint64,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Lt(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_lt(uint64,uint64)bool'] | undefined]> + + /** + * Calls the verify_uint64_le(uint64,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Le(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_le(uint64,uint64)bool'] | undefined]> + + /** + * Calls the verify_uint64_gt(uint64,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Gt(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_gt(uint64,uint64)bool'] | undefined]> + + /** + * Calls the verify_uint64_ge(uint64,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Ge(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_ge(uint64,uint64)bool'] | undefined]> + + /** + * Calls the verify_bytes_init(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesInit(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_init(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_bytes_add(byte[],byte[],uint64,uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesAdd(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'] | undefined]> + + /** + * Calls the verify_bytes_eq(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesEq(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_eq(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_bytes_ne(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesNe(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_ne(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_bytes_and(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesAnd(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_and(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_bytes_or(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesOr(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_or(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_bytes_xor(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesXor(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_xor(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_bytes_not(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesNot(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_not(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_add(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintAdd(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_add(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_add_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintAddUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_add_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_sub(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintSub(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_sub(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_sub_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintSubUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_sub_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_mul(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintMul(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_mul(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_mul_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintMulUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_mul_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_div(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintDiv(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_div(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_div_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintDivUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_div_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_mod(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintMod(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_mod(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_mod_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintModUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_mod_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_and(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintAnd(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_and(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_and_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintAndUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_and_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_or(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintOr(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_or(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_or_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintOrUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_or_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_xor(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintXor(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_xor(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_xor_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintXorUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_xor_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_eq(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintEq(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_eq(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguint_eq_uint64(byte[],uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintEqUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_eq_uint64(byte[],uint64)bool'] | undefined]> + + /** + * Calls the verify_biguint_ne(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintNe(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_ne(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguint_ne_uint64(byte[],uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintNeUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_ne_uint64(byte[],uint64)bool'] | undefined]> + + /** + * Calls the verify_biguint_lt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintLt(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_lt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguint_lt_uint64(byte[],uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintLtUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_lt_uint64(byte[],uint64)bool'] | undefined]> + + /** + * Calls the verify_biguint_le(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintLe(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_le(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguint_le_uint64(byte[],uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintLeUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_le_uint64(byte[],uint64)bool'] | undefined]> + + /** + * Calls the verify_biguint_gt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintGt(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_gt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguint_gt_uint64(byte[],uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintGtUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_gt_uint64(byte[],uint64)bool'] | undefined]> + + /** + * Calls the verify_biguint_ge(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintGe(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_ge(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguint_ge_uint64(byte[],uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintGeUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_ge_uint64(byte[],uint64)bool'] | undefined]> + + /** + * Calls the verify_string_init(string)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringInit(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_string_init(string)string'] | undefined]> + + /** + * Calls the verify_string_startswith(string,string)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringStartswith(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_string_startswith(string,string)bool'] | undefined]> + + /** + * Calls the verify_string_endswith(string,string)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringEndswith(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_string_endswith(string,string)bool'] | undefined]> + + /** + * Calls the verify_string_join(string,string)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringJoin(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_string_join(string,string)string'] | undefined]> + + /** + * Calls the verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyLog(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the PrimitiveOpsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): PrimitiveOpsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): PrimitiveOpsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type PrimitiveOpsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/SignaturesContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/SignaturesContract.ts new file mode 100644 index 0000000..e810782 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/SignaturesContract.ts @@ -0,0 +1,1203 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"SignaturesContract","structs":{"AnotherStruct":[{"name":"one","type":"uint64"},{"name":"two","type":"string"}],"MyStruct":[{"name":"anotherStruct","type":"AnotherStruct"},{"name":"anotherStructAlias","type":"AnotherStruct"},{"name":"three","type":"uint128"},{"name":"four","type":"uint128"}]},"methods":[{"name":"create","args":[],"returns":{"type":"void"},"actions":{"create":["NoOp"],"call":[]},"readonly":false,"events":[],"recommendations":{}},{"name":"sink","args":[{"type":"string","name":"value"},{"type":"uint8[]","name":"arr"},{"type":"byte[4]","name":"fixed_bytes"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"alias","args":[{"type":"string","name":"value"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"with_txn","args":[{"type":"string","name":"value"},{"type":"pay","name":"pay"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"with_asset","args":[{"type":"string","name":"value"},{"type":"asset","name":"asset"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"with_app","args":[{"type":"string","name":"value"},{"type":"application","name":"app"},{"type":"uint64","name":"app_id"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"with_acc","args":[{"type":"string","name":"value"},{"type":"account","name":"acc"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"complex_sig","args":[{"type":"((uint64,string),(uint64,string),uint128,uint128)","struct":"MyStruct","name":"struct1"},{"type":"txn","name":"txn"},{"type":"account","name":"acc"},{"type":"uint8[]","name":"five"}],"returns":{"type":"((uint64,string),((uint64,string),(uint64,string),uint128,uint128))"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"echo_resource_by_index","args":[{"type":"asset","name":"asset"},{"type":"application","name":"app"},{"type":"account","name":"acc"}],"returns":{"type":"(uint64,uint64,address)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"echo_resource_by_value","args":[{"type":"uint64","name":"asset"},{"type":"uint64","name":"app"},{"type":"address","name":"acc"}],"returns":{"type":"(uint64,uint64,address)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":[],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[348,353,547,552],"errorMessage":"account funded"},{"pc":[284],"errorMessage":"application exists"},{"pc":[242],"errorMessage":"asset exists"},{"pc":[639],"errorMessage":"expected account to be passed by index"},{"pc":[693],"errorMessage":"expected account to be passed by value"},{"pc":[280],"errorMessage":"expected app id to match provided app id"},{"pc":[629],"errorMessage":"expected application to be passed by index"},{"pc":[687],"errorMessage":"expected application to be passed by value"},{"pc":[619],"errorMessage":"expected asset to be passed by index"},{"pc":[679],"errorMessage":"expected asset to be passed by value"},{"pc":[138],"errorMessage":"expected global to have app address"},{"pc":[132],"errorMessage":"expected global to have app id"},{"pc":[288],"errorMessage":"expected other app to have same creator"},{"pc":[143,147],"errorMessage":"expected txn to have 0"},{"pc":[392],"errorMessage":"invalid array length header"},{"pc":[400],"errorMessage":"invalid number of bytes for arc4.dynamic_array"},{"pc":[671],"errorMessage":"invalid number of bytes for arc4.static_array"},{"pc":[129,294],"errorMessage":"transaction type is appl"},{"pc":[190],"errorMessage":"transaction type is pay"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgNiAxMjMKICAgIGJ5dGVjYmxvY2sgMHgwMDAwIDB4MTUxZjdjNzUgMHgwMDAwMDAwMDAwMDAwMDAxIDB4MDAwMTMyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyNQogICAgLy8gY2xhc3MgU2lnbmF0dXJlc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDEzCiAgICBwdXNoYnl0ZXNzIDB4MmUwMTc4MWUgMHgzYjA1Y2YxNyAweDA2NThkY2MzIDB4NWI2NDQ3ZGUgMHgwNjFmNGU3NyAweGVhYTg5MTM5IDB4NTEwZTcyYTQgMHhkNmMyYWM3ZiAweDQ4MTQyZDVlIC8vIG1ldGhvZCAic2luayhzdHJpbmcsdWludDhbXSxieXRlWzRdKXZvaWQiLCBtZXRob2QgImFsaWFzKHN0cmluZyx1aW50OFtdKXZvaWQiLCBtZXRob2QgIndpdGhfdHhuKHN0cmluZyxwYXksdWludDhbXSl2b2lkIiwgbWV0aG9kICJ3aXRoX2Fzc2V0KHN0cmluZyxhc3NldCx1aW50OFtdKXZvaWQiLCBtZXRob2QgIndpdGhfYXBwKHN0cmluZyxhcHBsaWNhdGlvbix1aW50NjQsdWludDhbXSl2b2lkIiwgbWV0aG9kICJ3aXRoX2FjYyhzdHJpbmcsYWNjb3VudCx1aW50OFtdKXZvaWQiLCBtZXRob2QgImNvbXBsZXhfc2lnKCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpLHVpbnQxMjgsdWludDEyOCksdHhuLGFjY291bnQsdWludDhbXSkoKHVpbnQ2NCxzdHJpbmcpLCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpLHVpbnQxMjgsdWludDEyOCkpIiwgbWV0aG9kICJlY2hvX3Jlc291cmNlX2J5X2luZGV4KGFzc2V0LGFwcGxpY2F0aW9uLGFjY291bnQpKHVpbnQ2NCx1aW50NjQsYWRkcmVzcykiLCBtZXRob2QgImVjaG9fcmVzb3VyY2VfYnlfdmFsdWUodWludDY0LHVpbnQ2NCxhZGRyZXNzKSh1aW50NjQsdWludDY0LGFkZHJlc3MpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggc2luayBzaW5rMiB3aXRoX3R4biB3aXRoX2Fzc2V0IHdpdGhfYXBwIHdpdGhfYWNjIGNvbXBsZXhfc2lnIGVjaG9fcmVzb3VyY2VfYnlfaW5kZXggZWNob19yZXNvdXJjZV9ieV92YWx1ZQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjUKICAgIC8vIGNsYXNzIFNpZ25hdHVyZXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgcHVzaGJ5dGVzIDB4NGM1YzYxYmEgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGUKICAgIGVycgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyOAogICAgLy8gYXBwX3R4biA9IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24oMCkKICAgIGludGNfMSAvLyAwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyOQogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkICE9IDAsICJleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgaWQiCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzICE9IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozMC0zMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzICE9IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIC8vICksICJleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgYWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjgKICAgIC8vIGFwcF90eG4gPSBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKDApCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzMKICAgIC8vIGFzc2VydCBhcHBfdHhuLmFwcF9pZCA9PSAwLCAiZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMCIKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBleHBlY3RlZCB0eG4gdG8gaGF2ZSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozNAogICAgLy8gYXNzZXJ0IFR4bi5hcHBsaWNhdGlvbl9pZCA9PSAwLCAiZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMCIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5zaW5rW3JvdXRpbmddKCkgLT4gdm9pZDoKc2luazoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QodmFsaWRhdGVfZW5jb2Rpbmc9InVuc2FmZV9kaXNhYmxlZCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0MAogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDEKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHZhbGlkYXRlX2VuY29kaW5nPSJ1bnNhZmVfZGlzYWJsZWQiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5zaW5rMltyb3V0aW5nXSgpIC0+IHZvaWQ6CnNpbmsyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPSJhbGlhcyIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0NgogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDcKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9ImFsaWFzIikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF90eG5bcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX3R4bjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTEKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgdW5jb3ZlciAyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTIKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1MwogICAgLy8gYXNzZXJ0IHBheS5ncm91cF9pbmRleCA9PSAwCiAgICBkdXAKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTQKICAgIC8vIGFzc2VydCBUeG4uZ3JvdXBfaW5kZXggPT0gMQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1NQogICAgLy8gYXNzZXJ0IHBheS5hbW91bnQgPT0gMTIzCiAgICBndHhucyBBbW91bnQKICAgIGludGNfMyAvLyAxMjMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hc3NldFtyb3V0aW5nXSgpIC0+IHZvaWQ6CndpdGhfYXNzZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBhc3NlcnQgdmFsdWUKICAgIHVuY292ZXIgMgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBhc3NlcnQgYXJyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjEKICAgIC8vIGFzc2VydCBhc3NldC50b3RhbCA9PSAxMjMKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpbnRjXzMgLy8gMTIzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo2MgogICAgLy8gYXNzZXJ0IFR4bi5hc3NldHMoMCkgPT0gYXNzZXQKICAgIHR4bmEgQXNzZXRzIDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hcHBbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX2FwcDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjgKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgdW5jb3ZlciAzCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjkKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3MAogICAgLy8gYXNzZXJ0IGFwcC5pZCA9PSBhcHBfaWQsICJleHBlY3RlZCBhcHAgaWQgdG8gbWF0Y2ggcHJvdmlkZWQgYXBwIGlkIgogICAgZGlnIDEKICAgIGl0b2IKICAgIGI9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcCBpZCB0byBtYXRjaCBwcm92aWRlZCBhcHAgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBhc3NlcnQgYXBwLmNyZWF0b3IgPT0gb3AuR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgImV4cGVjdGVkIG90aGVyIGFwcCB0byBoYXZlIHNhbWUgY3JlYXRvciIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG90aGVyIGFwcCB0byBoYXZlIHNhbWUgY3JlYXRvcgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NzIKICAgIC8vIGFwcF90eG4gPSBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKDApCiAgICBpbnRjXzEgLy8gMAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjczCiAgICAvLyBhc3NlcnQgYXBwX3R4bi5hcHBzKDApID09IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkCiAgICBkdXAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25zCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9ucygwKSA9PSBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZAogICAgdHhuYSBBcHBsaWNhdGlvbnMgMAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3MgogICAgLy8gYXBwX3R4biA9IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24oMCkKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3NQogICAgLy8gYXNzZXJ0IGFwcF90eG4uYXBwcygxKSA9PSBhcHAKICAgIGludGNfMCAvLyAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9ucwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9ucygxKSA9PSBhcHAKICAgIHR4bmEgQXBwbGljYXRpb25zIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hY2Nbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX2FjYzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4MAogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4MQogICAgLy8gYXNzZXJ0IGFycgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBhc3NlcnQgYWNjLmJhbGFuY2UgPT0gYWNjLm1pbl9iYWxhbmNlICsgMTIzNAogICAgZHVwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBwdXNoaW50IDEyMzQKICAgICsKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBhc3NlcnQgVHhuLmFjY291bnRzKDApID09IFR4bi5zZW5kZXIKICAgIHR4bmEgQWNjb3VudHMgMAogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6ODQKICAgIC8vIGFzc2VydCBUeG4uYWNjb3VudHMoMSkgPT0gYWNjCiAgICB0eG5hIEFjY291bnRzIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3QuY29tcGxleF9zaWdbcm91dGluZ10oKSAtPiB2b2lkOgpjb21wbGV4X3NpZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBmaXZlLnZhbGlkYXRlKCkKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5MQogICAgLy8gYXNzZXJ0IFR4bi5udW1fYXBwX2FyZ3MgPT0gNAogICAgdHhuIE51bUFwcEFyZ3MKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTItOTMKICAgIC8vICMgc3RydWN0CiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdC5vbmUgPT0gMQogICAgZGlnIDMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDQKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyA1CiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4CiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjkyLTk0CiAgICAvLyAjIHN0cnVjdAogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3Qub25lID09IDEKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0LnR3byA9PSAiMiIKICAgIGR1cAogICAgcHVzaGludCA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdC50d28gPT0gIjIiCiAgICBieXRlY18zIC8vIDB4MDAwMTMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5NQogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3RfYWxpYXMub25lID09IDEKICAgIGRpZyA2CiAgICBsZW4KICAgIGRpZyA3CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5NS05NgogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3RfYWxpYXMub25lID09IDEKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0X2FsaWFzLnR3byA9PSAiMiIKICAgIGR1cAogICAgcHVzaGludCA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTQKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0LnR3byA9PSAiMiIKICAgIGJ5dGVjXzMgLy8gMHgwMDAxMzIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdF9hbGlhcy50d28gPT0gIjIiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5NwogICAgLy8gYXNzZXJ0IHN0cnVjdDEudGhyZWUgPT0gMwogICAgZGlnIDUKICAgIGV4dHJhY3QgNCAxNgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5OAogICAgLy8gYXNzZXJ0IHN0cnVjdDEuZm91ciA9PSA0CiAgICBkaWcgNQogICAgZXh0cmFjdCAyMCAxNgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMDAtMTAxCiAgICAvLyAjIHR4bgogICAgLy8gYXNzZXJ0IHR4bi5ncm91cF9pbmRleCA9PSBUeG4uZ3JvdXBfaW5kZXggLSAxCiAgICB1bmNvdmVyIDQKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTAzLTEwNAogICAgLy8gIyBhY2MKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygyKSA9PSBhcmM0LlVJbnQ4KDEpLmJ5dGVzICAjIGFjYyBhcnJheSByZWYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHB1c2hieXRlcyAweDAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMDUKICAgIC8vIGFzc2VydCBhY2MuYmFsYW5jZSA9PSBhY2MubWluX2JhbGFuY2UgKyAxMjM0CiAgICBkaWcgMwogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIHVuY292ZXIgNAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIHB1c2hpbnQgMTIzNAogICAgKwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTA2CiAgICAvLyBhc3NlcnQgZml2ZVswXSA9PSA1CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAxCiAgICBwdXNoYnl0ZXMgMHgwNQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHB1c2hpbnQgNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3QuZWNob19yZXNvdXJjZV9ieV9pbmRleFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmVjaG9fcmVzb3VyY2VfYnlfaW5kZXg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTAtMTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IiwKICAgIC8vICkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NldF9pZHggPSBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTE3CiAgICAvLyBhc3NlcnQgYXNzZXQgPT0gVHhuLmFzc2V0cyhhc3NldF9pZHgpLCAiZXhwZWN0ZWQgYXNzZXQgdG8gYmUgcGFzc2VkIGJ5IGluZGV4IgogICAgdHhuYXMgQXNzZXRzCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCB0byBiZSBwYXNzZWQgYnkgaW5kZXgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjExOAogICAgLy8gYXBwX2lkeCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMikpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTkKICAgIC8vIGFzc2VydCBhcHAgPT0gVHhuLmFwcGxpY2F0aW9ucyhhcHBfaWR4KSwgImV4cGVjdGVkIGFwcGxpY2F0aW9uIHRvIGJlIHBhc3NlZCBieSBpbmRleCIKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXBwbGljYXRpb24gdG8gYmUgcGFzc2VkIGJ5IGluZGV4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMjAKICAgIC8vIGFjY19pZHggPSBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDMpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTIxCiAgICAvLyBhc3NlcnQgYWNjID09IFR4bi5hY2NvdW50cyhhY2NfaWR4KSwgImV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IGluZGV4IgogICAgdHhuYXMgQWNjb3VudHMKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IGluZGV4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTAtMTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IiwKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5lY2hvX3Jlc291cmNlX2J5X3ZhbHVlW3JvdXRpbmddKCkgLT4gdm9pZDoKZWNob19yZXNvdXJjZV9ieV92YWx1ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEyNC0xMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICByZXNvdXJjZV9lbmNvZGluZz0idmFsdWUiLAogICAgLy8gKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMwCiAgICAvLyBhY2MudmFsaWRhdGUoKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMxCiAgICAvLyBhc3NldF9pZCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMzIKICAgIC8vIGFzc2VydCBhc3NldC5pZCA9PSBhc3NldF9pZCwgImV4cGVjdGVkIGFzc2V0IHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFzc2V0IHRvIGJlIHBhc3NlZCBieSB2YWx1ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMzCiAgICAvLyBhcHBfaWQgPSBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDIpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTM0CiAgICAvLyBhc3NlcnQgYXBwLmlkID09IGFwcF9pZCwgImV4cGVjdGVkIGFwcGxpY2F0aW9uIHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcGxpY2F0aW9uIHRvIGJlIHBhc3NlZCBieSB2YWx1ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTM2CiAgICAvLyBhc3NlcnQgYWNjLmJ5dGVzID09IGFkZHJlc3MsICJleHBlY3RlZCBhY2NvdW50IHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTM1CiAgICAvLyBhZGRyZXNzID0gVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMykKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gYXNzZXJ0IGFjYy5ieXRlcyA9PSBhZGRyZXNzLCAiZXhwZWN0ZWQgYWNjb3VudCB0byBiZSBwYXNzZWQgYnkgdmFsdWUiCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IHZhbHVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMjQtMTI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9InZhbHVlIiwKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAQAGeyYEAgAABBUffHUIAAAAAAAAAAEDAAEyMRkURDEYQQBHggkELgF4HgQ7Bc8XBAZY3MMEW2RH3gQGH053BOqokTkEUQ5ypATWwqx/BEgULV42GgCOCQApADcARQBuAJAA2AEJAeMCIgCABExcYbo2GgCOAQABACM4ECQSRDIIRDIKMgMTRCM4GBREMRgURCJDNhoCNhoBKBNEKBNEIkM2GgI2GgEoE0QoE0QiQzYaATEWIglJOBAiEkQ2GgJPAigTRCgTREk4FhREMRYiEkQ4CCUSRCJDNhoBNhoCF8AwNhoDTwIoE0QoE0RJcQBEJRJENjAAEkQiQzYaATYaAhfAMjYaAzYaBE8DKBNEKBNESwEWqERJcgdEMgkSRCM4ECQSRCNJwjIyCBJENjIAMggSRCMiwjJLARJENjIBEkQiQzYaATYaAhfAHDYaA08CKBNEKBNESXMAREsBcwFEgdIJCBJENhwAMQASRDYcARJEIkM2GgExFiIJNhoCF8AcNhoDSSNZgQIISwEVEkQxG4EEEkRLAyNZSwSBAllLBU8CSwJSSVcACCqoREmBCFlLARVLAk8CSwJSKxJESwYVSwdPBE8CUklXAAgqqERJgQhZSwEVUisSREsFVwQQgBAAAAAAAAAAAAAAAAAAAAADqERLBVcUEIAQAAAAAAAAAAAAAAAAAAAABKhETwQ4FjEWIgkSRDYaAoABARJESwNzAERPBHMBRIHSCQgSRE8CVwIBgAEFqESBBAgWVwYCgAIABExQTFBMUClMULAiQzYaARfAMDYaAhfAMjYaAxfAHDYaARfAMEsDEkQ2GgIXwDJLAhJENhoDF8AcSwESRE8CFk8CFlBMUClMULAiQzYaARc2GgIXNhoDSRWBIBJENhoBF0sDEkQ2GgIXSwISREk2GgMSRE8CFk8CFlBMUClMULAiQw==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +// Type definitions for ARC-56 structs + +export type AnotherStruct = { + one: bigint, + two: string +} + + +/** + * Converts the ABI tuple representation of a AnotherStruct to the struct representation + */ +export function AnotherStructFromTuple(abiTuple: [bigint, string]) { + const abiStructType = ABIStructType.fromStruct('AnotherStruct', APP_SPEC.structs) + return getStructValueFromTupleValue(abiStructType, abiTuple) as AnotherStruct +} + +export type MyStruct = { + anotherStruct: AnotherStruct, + anotherStructAlias: AnotherStruct, + three: bigint, + four: bigint +} + + +/** + * Converts the ABI tuple representation of a MyStruct to the struct representation + */ +export function MyStructFromTuple(abiTuple: [AnotherStruct, AnotherStruct, bigint, bigint]) { + const abiStructType = ABIStructType.fromStruct('MyStruct', APP_SPEC.structs) + return getStructValueFromTupleValue(abiStructType, abiTuple) as MyStruct +} + +/** + * The argument types for the SignaturesContract contract + */ +export type SignaturesContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'create()void': Record + 'sink(string,uint8[],byte[4])void': { + value: string + arr: bigint[] | number[] + fixedBytes: Uint8Array + } + 'alias(string,uint8[])void': { + value: string + arr: bigint[] | number[] + } + 'with_txn(string,pay,uint8[])void': { + value: string + pay: AppMethodCallTransactionArgument + arr: bigint[] | number[] + } + 'with_asset(string,asset,uint8[])void': { + value: string + asset: bigint + arr: bigint[] | number[] + } + 'with_app(string,application,uint64,uint8[])void': { + value: string + app: bigint + appId: bigint | number + arr: bigint[] | number[] + } + 'with_acc(string,account,uint8[])void': { + value: string + acc: Uint8Array | string + arr: bigint[] | number[] + } + 'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))': { + struct1: MyStruct + txn: AppMethodCallTransactionArgument + acc: Uint8Array | string + five: bigint[] | number[] + } + 'echo_resource_by_index(asset,application,account)(uint64,uint64,address)': { + asset: bigint + app: bigint + acc: Uint8Array | string + } + 'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)': { + asset: bigint | number + app: bigint | number + acc: string + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'create()void': [] + 'sink(string,uint8[],byte[4])void': [value: string, arr: bigint[] | number[], fixedBytes: Uint8Array] + 'alias(string,uint8[])void': [value: string, arr: bigint[] | number[]] + 'with_txn(string,pay,uint8[])void': [value: string, pay: AppMethodCallTransactionArgument, arr: bigint[] | number[]] + 'with_asset(string,asset,uint8[])void': [value: string, asset: bigint, arr: bigint[] | number[]] + 'with_app(string,application,uint64,uint8[])void': [value: string, app: bigint, appId: bigint | number, arr: bigint[] | number[]] + 'with_acc(string,account,uint8[])void': [value: string, acc: Uint8Array | string, arr: bigint[] | number[]] + 'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))': [struct1: MyStruct, txn: AppMethodCallTransactionArgument, acc: Uint8Array | string, five: bigint[] | number[]] + 'echo_resource_by_index(asset,application,account)(uint64,uint64,address)': [asset: bigint, app: bigint, acc: Uint8Array | string] + 'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)': [asset: bigint | number, app: bigint | number, acc: string] + } +} + +/** + * The return type for each method + */ +export type SignaturesContractReturns = { + 'create()void': void + 'sink(string,uint8[],byte[4])void': void + 'alias(string,uint8[])void': void + 'with_txn(string,pay,uint8[])void': void + 'with_asset(string,asset,uint8[])void': void + 'with_app(string,application,uint64,uint8[])void': void + 'with_acc(string,account,uint8[])void': void + 'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))': [[bigint, string], [[bigint, string], [bigint, string], bigint, bigint]] + 'echo_resource_by_index(asset,application,account)(uint64,uint64,address)': [bigint, bigint, string] + 'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)': [bigint, bigint, string] +} + +/** + * Defines the types of available calls and state of the SignaturesContract smart contract. + */ +export type SignaturesContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'create()void' | 'create', { + argsObj: SignaturesContractArgs['obj']['create()void'] + argsTuple: SignaturesContractArgs['tuple']['create()void'] + returns: SignaturesContractReturns['create()void'] + }> + & Record<'sink(string,uint8[],byte[4])void' | 'sink', { + argsObj: SignaturesContractArgs['obj']['sink(string,uint8[],byte[4])void'] + argsTuple: SignaturesContractArgs['tuple']['sink(string,uint8[],byte[4])void'] + returns: SignaturesContractReturns['sink(string,uint8[],byte[4])void'] + }> + & Record<'alias(string,uint8[])void' | 'alias', { + argsObj: SignaturesContractArgs['obj']['alias(string,uint8[])void'] + argsTuple: SignaturesContractArgs['tuple']['alias(string,uint8[])void'] + returns: SignaturesContractReturns['alias(string,uint8[])void'] + }> + & Record<'with_txn(string,pay,uint8[])void' | 'with_txn', { + argsObj: SignaturesContractArgs['obj']['with_txn(string,pay,uint8[])void'] + argsTuple: SignaturesContractArgs['tuple']['with_txn(string,pay,uint8[])void'] + returns: SignaturesContractReturns['with_txn(string,pay,uint8[])void'] + }> + & Record<'with_asset(string,asset,uint8[])void' | 'with_asset', { + argsObj: SignaturesContractArgs['obj']['with_asset(string,asset,uint8[])void'] + argsTuple: SignaturesContractArgs['tuple']['with_asset(string,asset,uint8[])void'] + returns: SignaturesContractReturns['with_asset(string,asset,uint8[])void'] + }> + & Record<'with_app(string,application,uint64,uint8[])void' | 'with_app', { + argsObj: SignaturesContractArgs['obj']['with_app(string,application,uint64,uint8[])void'] + argsTuple: SignaturesContractArgs['tuple']['with_app(string,application,uint64,uint8[])void'] + returns: SignaturesContractReturns['with_app(string,application,uint64,uint8[])void'] + }> + & Record<'with_acc(string,account,uint8[])void' | 'with_acc', { + argsObj: SignaturesContractArgs['obj']['with_acc(string,account,uint8[])void'] + argsTuple: SignaturesContractArgs['tuple']['with_acc(string,account,uint8[])void'] + returns: SignaturesContractReturns['with_acc(string,account,uint8[])void'] + }> + & Record<'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))' | 'complex_sig', { + argsObj: SignaturesContractArgs['obj']['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'] + argsTuple: SignaturesContractArgs['tuple']['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'] + returns: SignaturesContractReturns['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'] + }> + & Record<'echo_resource_by_index(asset,application,account)(uint64,uint64,address)' | 'echo_resource_by_index', { + argsObj: SignaturesContractArgs['obj']['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'] + argsTuple: SignaturesContractArgs['tuple']['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'] + returns: SignaturesContractReturns['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'] + }> + & Record<'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)' | 'echo_resource_by_value', { + argsObj: SignaturesContractArgs['obj']['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'] + argsTuple: SignaturesContractArgs['tuple']['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'] + returns: SignaturesContractReturns['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type SignaturesContractSignatures = keyof SignaturesContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type SignaturesContractNonVoidMethodSignatures = keyof SignaturesContractTypes['methods'] extends infer T ? T extends keyof SignaturesContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the SignaturesContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = SignaturesContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the SignaturesContract smart contract to the method's return type + */ +export type MethodReturn = SignaturesContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type SignaturesContractCreateCallParams = + | Expand & {method: 'create'} & { onComplete?: OnApplicationComplete.NoOp } & CreateSchema> + | Expand & {method: 'create()void'} & { onComplete?: OnApplicationComplete.NoOp } & CreateSchema> +/** + * Defines arguments required for the deploy method. + */ +export type SignaturesContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: SignaturesContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the SignaturesContract smart contract + */ +export abstract class SignaturesContractParamsFactory { + /** + * Gets available create ABI call param factories + */ + static get create() { + return { + _resolveByMethod(params: TParams) { + switch(params.method) { + case 'create': + case 'create()void': + return SignaturesContractParamsFactory.create.create(params) + } + throw new Error(`Unknown ' + verb + ' method`) + }, + + /** + * Constructs create ABI call params for the SignaturesContract smart contract using the create()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + create(params: CallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.NoOp }): AppClientMethodCallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.NoOp } { + return { + ...params, + method: 'create()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + + /** + * Constructs a no op call for the sink(string,uint8[],byte[4])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static sink(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'sink(string,uint8[],byte[4])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.arr, params.args.fixedBytes], + } + } + /** + * Constructs a no op call for the alias(string,uint8[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static alias(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'alias(string,uint8[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.arr], + } + } + /** + * Constructs a no op call for the with_txn(string,pay,uint8[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static withTxn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'with_txn(string,pay,uint8[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.pay, params.args.arr], + } + } + /** + * Constructs a no op call for the with_asset(string,asset,uint8[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static withAsset(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'with_asset(string,asset,uint8[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.asset, params.args.arr], + } + } + /** + * Constructs a no op call for the with_app(string,application,uint64,uint8[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static withApp(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'with_app(string,application,uint64,uint8[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.app, params.args.appId, params.args.arr], + } + } + /** + * Constructs a no op call for the with_acc(string,account,uint8[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static withAcc(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'with_acc(string,account,uint8[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.acc, params.args.arr], + } + } + /** + * Constructs a no op call for the complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128)) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static complexSig(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))' as const, + args: Array.isArray(params.args) ? params.args : [params.args.struct1, params.args.txn, params.args.acc, params.args.five], + } + } + /** + * Constructs a no op call for the echo_resource_by_index(asset,application,account)(uint64,uint64,address) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static echoResourceByIndex(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'echo_resource_by_index(asset,application,account)(uint64,uint64,address)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset, params.args.app, params.args.acc], + } + } + /** + * Constructs a no op call for the echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static echoResourceByValue(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset, params.args.app, params.args.acc], + } + } +} + +/** + * A factory to create and deploy one or more instance of the SignaturesContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class SignaturesContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `SignaturesContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new SignaturesContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new SignaturesContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the SignaturesContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: SignaturesContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + createParams: params.createParams?.method ? SignaturesContractParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (SignaturesContractCreateCallParams & { args: Uint8Array[] }) : undefined, + }) + return { result: result.result, appClient: new SignaturesContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the SignaturesContract smart contract using the create()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create params + */ + create: (params: CallParams & AppClientCompilationParams & CreateSchema & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appFactory.params.create(SignaturesContractParamsFactory.create.create(params)) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the SignaturesContract smart contract using the create()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create transaction + */ + create: (params: CallParams & AppClientCompilationParams & CreateSchema & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appFactory.createTransaction.create(SignaturesContractParamsFactory.create.create(params)) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the SignaturesContract smart contract using an ABI method call using the create()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create result + */ + create: async (params: CallParams & AppClientCompilationParams & CreateSchema & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appFactory.send.create(SignaturesContractParamsFactory.create.create(params)) + return { result: { ...result.result, return: result.result.return as unknown as (undefined | SignaturesContractReturns['create()void']) }, appClient: new SignaturesContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the SignaturesContract smart contract + */ +export class SignaturesContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `SignaturesContractClient` + * + * @param appClient An `AppClient` instance which has been created with the SignaturesContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `SignaturesContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `SignaturesContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new SignaturesContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `SignaturesContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new SignaturesContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the SignaturesContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `sink(string,uint8[],byte[4])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + sink: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.sink(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `alias(string,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + alias: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.alias(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_txn(string,pay,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + withTxn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.withTxn(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_asset(string,asset,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + withAsset: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.withAsset(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_app(string,application,uint64,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + withApp: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.withApp(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_acc(string,account,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + withAcc: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.withAcc(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + complexSig: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.complexSig(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_index(asset,application,account)(uint64,uint64,address)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + echoResourceByIndex: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.echoResourceByIndex(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + echoResourceByValue: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.echoResourceByValue(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the SignaturesContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `sink(string,uint8[],byte[4])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + sink: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.sink(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `alias(string,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + alias: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.alias(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_txn(string,pay,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + withTxn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.withTxn(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_asset(string,asset,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + withAsset: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.withAsset(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_app(string,application,uint64,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + withApp: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.withApp(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_acc(string,account,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + withAcc: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.withAcc(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + complexSig: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.complexSig(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_index(asset,application,account)(uint64,uint64,address)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + echoResourceByIndex: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.echoResourceByIndex(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + echoResourceByValue: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.echoResourceByValue(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the SignaturesContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `sink(string,uint8[],byte[4])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + sink: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.sink(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['sink(string,uint8[],byte[4])void'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `alias(string,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + alias: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.alias(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['alias(string,uint8[])void'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_txn(string,pay,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + withTxn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.withTxn(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['with_txn(string,pay,uint8[])void'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_asset(string,asset,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + withAsset: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.withAsset(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['with_asset(string,asset,uint8[])void'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_app(string,application,uint64,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + withApp: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.withApp(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['with_app(string,application,uint64,uint8[])void'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_acc(string,account,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + withAcc: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.withAcc(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['with_acc(string,account,uint8[])void'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + complexSig: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.complexSig(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_index(asset,application,account)(uint64,uint64,address)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + echoResourceByIndex: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.echoResourceByIndex(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + echoResourceByValue: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.echoResourceByValue(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new SignaturesContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current SignaturesContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): SignaturesContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a sink(string,uint8[],byte[4])void method call against the SignaturesContract contract + */ + sink(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sink(params))) + return this + }, + /** + * Add a alias(string,uint8[])void method call against the SignaturesContract contract + */ + alias(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.alias(params))) + return this + }, + /** + * Add a with_txn(string,pay,uint8[])void method call against the SignaturesContract contract + */ + withTxn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withTxn(params))) + return this + }, + /** + * Add a with_asset(string,asset,uint8[])void method call against the SignaturesContract contract + */ + withAsset(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withAsset(params))) + return this + }, + /** + * Add a with_app(string,application,uint64,uint8[])void method call against the SignaturesContract contract + */ + withApp(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withApp(params))) + return this + }, + /** + * Add a with_acc(string,account,uint8[])void method call against the SignaturesContract contract + */ + withAcc(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withAcc(params))) + return this + }, + /** + * Add a complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128)) method call against the SignaturesContract contract + */ + complexSig(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.complexSig(params))) + return this + }, + /** + * Add a echo_resource_by_index(asset,application,account)(uint64,uint64,address) method call against the SignaturesContract contract + */ + echoResourceByIndex(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.echoResourceByIndex(params))) + return this + }, + /** + * Add a echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address) method call against the SignaturesContract contract + */ + echoResourceByValue(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.echoResourceByValue(params))) + return this + }, + /** + * Add a clear state call to the SignaturesContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as SignaturesContractComposer + } +} +export type SignaturesContractComposer = { + /** + * Calls the sink(string,uint8[],byte[4])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + sink(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['sink(string,uint8[],byte[4])void'] | undefined]> + + /** + * Calls the alias(string,uint8[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + alias(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['alias(string,uint8[])void'] | undefined]> + + /** + * Calls the with_txn(string,pay,uint8[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + withTxn(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['with_txn(string,pay,uint8[])void'] | undefined]> + + /** + * Calls the with_asset(string,asset,uint8[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + withAsset(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['with_asset(string,asset,uint8[])void'] | undefined]> + + /** + * Calls the with_app(string,application,uint64,uint8[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + withApp(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['with_app(string,application,uint64,uint8[])void'] | undefined]> + + /** + * Calls the with_acc(string,account,uint8[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + withAcc(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['with_acc(string,account,uint8[])void'] | undefined]> + + /** + * Calls the complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128)) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + complexSig(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'] | undefined]> + + /** + * Calls the echo_resource_by_index(asset,application,account)(uint64,uint64,address) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + echoResourceByIndex(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'] | undefined]> + + /** + * Calls the echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + echoResourceByValue(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the SignaturesContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): SignaturesContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): SignaturesContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type SignaturesContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGet.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGet.ts new file mode 100644 index 0000000..62c4b5b --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGet.ts @@ -0,0 +1,1319 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"arcs":[],"name":"StateAcctParamsGet","structs":{},"methods":[{"name":"verify_acct_balance","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_min_balance","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_auth_addr","args":[{"name":"a","type":"account"}],"returns":{"type":"byte[]"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_num_uint","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_num_byte_slice","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_extra_app_pages","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_apps_created","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_apps_opted_in","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_assets_created","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_assets","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_boxes","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_box_bytes","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}}],"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LmFwcHJvdmFsX3Byb2dyYW06CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDE2CiAgICBtZXRob2QgInZlcmlmeV9hY2N0X2JhbGFuY2UoYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X21pbl9iYWxhbmNlKGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF9hdXRoX2FkZHIoYWNjb3VudClieXRlW10iCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50KGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhY2NvdW50KXVpbnQ2NCIKICAgIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzKGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQoYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4oYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMoYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2JveGVzKGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMoYWNjb3VudCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3ZlcmlmeV9hY2N0X2JhbGFuY2Vfcm91dGVAMiBtYWluX3ZlcmlmeV9hY2N0X21pbl9iYWxhbmNlX3JvdXRlQDMgbWFpbl92ZXJpZnlfYWNjdF9hdXRoX2FkZHJfcm91dGVANCBtYWluX3ZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50X3JvdXRlQDUgbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZV9yb3V0ZUA2IG1haW5fdmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzX3JvdXRlQDcgbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWRfcm91dGVAOCBtYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW5fcm91dGVAOSBtYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkX3JvdXRlQDEwIG1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX3JvdXRlQDExIG1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXNfcm91dGVAMTIgbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXNfcm91dGVAMTMKICAgIGVyciAvLyByZWplY3QgdHJhbnNhY3Rpb24KCm1haW5fdmVyaWZ5X2FjY3RfYmFsYW5jZV9yb3V0ZUAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXQoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X2JhbGFuY2UKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfbWluX2JhbGFuY2Vfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF9taW5fYmFsYW5jZQogICAgaXRvYgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl92ZXJpZnlfYWNjdF9hdXRoX2FkZHJfcm91dGVANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF9hdXRoX2FkZHIKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50X3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2Vfcm91dGVANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZQogICAgaXRvYgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXNfcm91dGVANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkX3JvdXRlQDg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW5fcm91dGVAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX29wdGVkX2luCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkX3JvdXRlQDEwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXQoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19yb3V0ZUAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXNfcm91dGVAMTI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXMKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYm94X2J5dGVzX3JvdXRlQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXQoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlcwogICAgaXRvYgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIHJlamVjdCB0cmFuc2FjdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50IDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXQudmVyaWZ5X2FjY3RfYmFsYW5jZShhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4LTE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9hY2N0X2JhbGFuY2Uoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMAogICAgLy8gYmFsYW5jZSwgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9iYWxhbmNlKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBiYWxhbmNlCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LnZlcmlmeV9hY2N0X21pbl9iYWxhbmNlKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X21pbl9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzLTI0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9hY2N0X21pbl9iYWxhbmNlKHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhbGdvcHkuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUKICAgIC8vIG1pbl9iYWxhbmNlLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X21pbl9iYWxhbmNlKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjYKICAgIC8vIHJldHVybiBtaW5fYmFsYW5jZQogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF9hdXRoX2FkZHIoYTogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYWNjdF9hdXRoX2FkZHI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgtMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfYXV0aF9hZGRyKHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhbGdvcHkuQnl0ZXM6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMAogICAgLy8gYXV0aF9hZGRyLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2F1dGhfYWRkcihhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEF1dGhBZGRyCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMQogICAgLy8gcmV0dXJuIGF1dGhfYWRkci5ieXRlcwogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludChhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMy0zNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludChzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM1CiAgICAvLyB0b3RhbF9udW1fdWludCwgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9udW1fdWludChhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtVWludAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzYKICAgIC8vIHJldHVybiB0b3RhbF9udW1fdWludAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOC0zOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwCiAgICAvLyB0b3RhbF9udW1fYnl0ZV9zbGljZSwgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MQogICAgLy8gcmV0dXJuIHRvdGFsX251bV9ieXRlX3NsaWNlCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LnZlcmlmeV9hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlcyhhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDMtNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzKHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhbGdvcHkuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDUKICAgIC8vIHRvdGFsX2V4dHJhX2FwcF9wYWdlcywgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEV4dHJhQXBwUGFnZXMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2CiAgICAvLyByZXR1cm4gdG90YWxfZXh0cmFfYXBwX3BhZ2VzCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgtNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkKHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhbGdvcHkuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTAKICAgIC8vIHRvdGFsX2FwcHNfY3JlYXRlZCwgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNDcmVhdGVkCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MQogICAgLy8gcmV0dXJuIHRvdGFsX2FwcHNfY3JlYXRlZAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF90b3RhbF9hcHBzX29wdGVkX2luKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTMtNTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbihzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1CiAgICAvLyB0b3RhbF9hcHBzX29wdGVkX2luLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4oYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNPcHRlZEluCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NgogICAgLy8gcmV0dXJuIHRvdGFsX2FwcHNfb3B0ZWRfaW4KICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXQudmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTgtNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MAogICAgLy8gdG90YWxfYXNzZXRzX2NyZWF0ZWQsIF92YWwgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFzc2V0c0NyZWF0ZWQKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxCiAgICAvLyByZXR1cm4gdG90YWxfYXNzZXRzX2NyZWF0ZWQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXQudmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0czoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2My02NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NQogICAgLy8gdG90YWxfYXNzZXRzLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0cyhhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXNzZXRzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NgogICAgLy8gcmV0dXJuIHRvdGFsX2Fzc2V0cwogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF90b3RhbF9ib3hlcyhhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9ib3hlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OC02OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9ib3hlcyhzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwCiAgICAvLyB0b3RhbF9ib3hlcywgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9ib3hlcyhhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94ZXMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxCiAgICAvLyByZXR1cm4gdG90YWxfYm94ZXMKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXQudmVyaWZ5X2FjY3RfdG90YWxfYm94X2J5dGVzKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3My03NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NQogICAgLy8gdG90YWxfYm94X2J5dGVzLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveF9ieXRlcyhhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94Qnl0ZXMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyByZXR1cm4gdG90YWxfYm94X2J5dGVzCiAgICByZXRzdWIK","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgaW50IDEKICAgIHJldHVybgo="},"bareActions":{"create":["NoOp"],"call":[]}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAcctParamsGet contract + */ +export type StateAcctParamsGetArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_acct_balance(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_min_balance(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_auth_addr(account)byte[]': { + a: Uint8Array | string + } + 'verify_acct_total_num_uint(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_num_byte_slice(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_extra_app_pages(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_apps_created(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_apps_opted_in(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_assets_created(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_assets(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_boxes(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_box_bytes(account)uint64': { + a: Uint8Array | string + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_acct_balance(account)uint64': [a: Uint8Array | string] + 'verify_acct_min_balance(account)uint64': [a: Uint8Array | string] + 'verify_acct_auth_addr(account)byte[]': [a: Uint8Array | string] + 'verify_acct_total_num_uint(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_num_byte_slice(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_extra_app_pages(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_apps_created(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_apps_opted_in(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_assets_created(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_assets(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_boxes(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_box_bytes(account)uint64': [a: Uint8Array | string] + } +} + +/** + * The return type for each method + */ +export type StateAcctParamsGetReturns = { + 'verify_acct_balance(account)uint64': bigint + 'verify_acct_min_balance(account)uint64': bigint + 'verify_acct_auth_addr(account)byte[]': Uint8Array + 'verify_acct_total_num_uint(account)uint64': bigint + 'verify_acct_total_num_byte_slice(account)uint64': bigint + 'verify_acct_total_extra_app_pages(account)uint64': bigint + 'verify_acct_total_apps_created(account)uint64': bigint + 'verify_acct_total_apps_opted_in(account)uint64': bigint + 'verify_acct_total_assets_created(account)uint64': bigint + 'verify_acct_total_assets(account)uint64': bigint + 'verify_acct_total_boxes(account)uint64': bigint + 'verify_acct_total_box_bytes(account)uint64': bigint +} + +/** + * Defines the types of available calls and state of the StateAcctParamsGet smart contract. + */ +export type StateAcctParamsGetTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_acct_balance(account)uint64' | 'verify_acct_balance', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_balance(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_balance(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_balance(account)uint64'] + }> + & Record<'verify_acct_min_balance(account)uint64' | 'verify_acct_min_balance', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_min_balance(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_min_balance(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_min_balance(account)uint64'] + }> + & Record<'verify_acct_auth_addr(account)byte[]' | 'verify_acct_auth_addr', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_auth_addr(account)byte[]'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_auth_addr(account)byte[]'] + returns: StateAcctParamsGetReturns['verify_acct_auth_addr(account)byte[]'] + }> + & Record<'verify_acct_total_num_uint(account)uint64' | 'verify_acct_total_num_uint', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_num_uint(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_num_uint(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_num_uint(account)uint64'] + }> + & Record<'verify_acct_total_num_byte_slice(account)uint64' | 'verify_acct_total_num_byte_slice', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_num_byte_slice(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_num_byte_slice(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_num_byte_slice(account)uint64'] + }> + & Record<'verify_acct_total_extra_app_pages(account)uint64' | 'verify_acct_total_extra_app_pages', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_extra_app_pages(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_extra_app_pages(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_extra_app_pages(account)uint64'] + }> + & Record<'verify_acct_total_apps_created(account)uint64' | 'verify_acct_total_apps_created', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_apps_created(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_apps_created(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_apps_created(account)uint64'] + }> + & Record<'verify_acct_total_apps_opted_in(account)uint64' | 'verify_acct_total_apps_opted_in', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_apps_opted_in(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_apps_opted_in(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_apps_opted_in(account)uint64'] + }> + & Record<'verify_acct_total_assets_created(account)uint64' | 'verify_acct_total_assets_created', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_assets_created(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_assets_created(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_assets_created(account)uint64'] + }> + & Record<'verify_acct_total_assets(account)uint64' | 'verify_acct_total_assets', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_assets(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_assets(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_assets(account)uint64'] + }> + & Record<'verify_acct_total_boxes(account)uint64' | 'verify_acct_total_boxes', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_boxes(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_boxes(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_boxes(account)uint64'] + }> + & Record<'verify_acct_total_box_bytes(account)uint64' | 'verify_acct_total_box_bytes', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_box_bytes(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_box_bytes(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_box_bytes(account)uint64'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAcctParamsGetSignatures = keyof StateAcctParamsGetTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateAcctParamsGetNonVoidMethodSignatures = keyof StateAcctParamsGetTypes['methods'] extends infer T ? T extends keyof StateAcctParamsGetTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAcctParamsGet smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAcctParamsGetTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAcctParamsGet smart contract to the method's return type + */ +export type MethodReturn = StateAcctParamsGetTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAcctParamsGetCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAcctParamsGetDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAcctParamsGetCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAcctParamsGet smart contract + */ +export abstract class StateAcctParamsGetParamsFactory { + /** + * Constructs a no op call for the verify_acct_balance(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctBalance(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_balance(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_min_balance(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctMinBalance(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_min_balance(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_auth_addr(account)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctAuthAddr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_auth_addr(account)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_num_uint(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalNumUint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_num_uint(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_num_byte_slice(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalNumByteSlice(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_num_byte_slice(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_extra_app_pages(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalExtraAppPages(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_extra_app_pages(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_apps_created(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAppsCreated(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_apps_created(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_apps_opted_in(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAppsOptedIn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_apps_opted_in(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_assets_created(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAssetsCreated(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_assets_created(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_assets(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAssets(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_assets(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_boxes(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_boxes(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_box_bytes(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalBoxBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_box_bytes(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateAcctParamsGet smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAcctParamsGetFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAcctParamsGetFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAcctParamsGetClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAcctParamsGetClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAcctParamsGet smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAcctParamsGetDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAcctParamsGetClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAcctParamsGet smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAcctParamsGet smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAcctParamsGet smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAcctParamsGetClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAcctParamsGet smart contract + */ +export class StateAcctParamsGetClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAcctParamsGetClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAcctParamsGet app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAcctParamsGetClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAcctParamsGetClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAcctParamsGetClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAcctParamsGetClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAcctParamsGetClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGet smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_min_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctMinBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctMinBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_auth_addr(account)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctAuthAddr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctAuthAddr(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumUint(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalExtraAppPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalExtraAppPages(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAppsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAppsOptedIn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsOptedIn(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAssetsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssetsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAssets: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssets(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxes(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalBoxBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxBytes(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGet smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_min_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctMinBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctMinBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_auth_addr(account)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctAuthAddr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctAuthAddr(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumUint(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalExtraAppPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalExtraAppPages(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAppsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAppsOptedIn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsOptedIn(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAssetsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssetsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAssets: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssets(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxes(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalBoxBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxBytes(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGet smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctBalance: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctBalance(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_balance(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_min_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctMinBalance: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctMinBalance(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_min_balance(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_auth_addr(account)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctAuthAddr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctAuthAddr(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_auth_addr(account)byte[]'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalNumUint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumUint(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_num_uint(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalNumByteSlice: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumByteSlice(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_num_byte_slice(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalExtraAppPages: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalExtraAppPages(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_extra_app_pages(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAppsCreated: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsCreated(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_apps_created(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAppsOptedIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsOptedIn(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_apps_opted_in(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAssetsCreated: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssetsCreated(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_assets_created(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAssets: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssets(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_assets(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxes(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_boxes(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalBoxBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_box_bytes(account)uint64'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAcctParamsGetClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAcctParamsGet app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAcctParamsGetComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_acct_balance(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctBalance(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctBalance(params))) + return this + }, + /** + * Add a verify_acct_min_balance(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctMinBalance(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctMinBalance(params))) + return this + }, + /** + * Add a verify_acct_auth_addr(account)byte[] method call against the StateAcctParamsGet contract + */ + verifyAcctAuthAddr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctAuthAddr(params))) + return this + }, + /** + * Add a verify_acct_total_num_uint(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalNumUint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalNumUint(params))) + return this + }, + /** + * Add a verify_acct_total_num_byte_slice(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalNumByteSlice(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalNumByteSlice(params))) + return this + }, + /** + * Add a verify_acct_total_extra_app_pages(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalExtraAppPages(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalExtraAppPages(params))) + return this + }, + /** + * Add a verify_acct_total_apps_created(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalAppsCreated(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAppsCreated(params))) + return this + }, + /** + * Add a verify_acct_total_apps_opted_in(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalAppsOptedIn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAppsOptedIn(params))) + return this + }, + /** + * Add a verify_acct_total_assets_created(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalAssetsCreated(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAssetsCreated(params))) + return this + }, + /** + * Add a verify_acct_total_assets(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalAssets(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAssets(params))) + return this + }, + /** + * Add a verify_acct_total_boxes(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalBoxes(params))) + return this + }, + /** + * Add a verify_acct_total_box_bytes(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalBoxBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalBoxBytes(params))) + return this + }, + /** + * Add a clear state call to the StateAcctParamsGet contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAcctParamsGetComposer + } +} +export type StateAcctParamsGetComposer = { + /** + * Calls the verify_acct_balance(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctBalance(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_balance(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_min_balance(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctMinBalance(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_min_balance(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_auth_addr(account)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctAuthAddr(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_auth_addr(account)byte[]'] | undefined]> + + /** + * Calls the verify_acct_total_num_uint(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalNumUint(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_num_uint(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_num_byte_slice(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalNumByteSlice(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_num_byte_slice(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_extra_app_pages(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalExtraAppPages(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_extra_app_pages(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_apps_created(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAppsCreated(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_apps_created(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_apps_opted_in(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAppsOptedIn(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_apps_opted_in(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_assets_created(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAssetsCreated(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_assets_created(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_assets(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAssets(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_assets(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_boxes(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalBoxes(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_boxes(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_box_bytes(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalBoxBytes(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_box_bytes(account)uint64'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGet smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAcctParamsGetComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAcctParamsGetComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAcctParamsGetComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGetContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGetContract.ts new file mode 100644 index 0000000..01c1c8f --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGetContract.ts @@ -0,0 +1,1526 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAcctParamsGetContract","structs":{},"methods":[{"name":"verify_acct_balance","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_min_balance","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_auth_addr","args":[{"type":"account","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_num_uint","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_num_byte_slice","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_extra_app_pages","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_apps_created","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_apps_opted_in","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_assets_created","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_assets","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_boxes","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_box_bytes","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_incentive_eligible","args":[{"type":"account","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_last_heartbeat","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_last_proposed","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[171,225],"errorMessage":"account funded"},{"pc":[175],"errorMessage":"expected Account balance to match"},{"pc":[229],"errorMessage":"expected Account min_balance to match"},{"pc":[166,220,273,301,330,359,388,417,446,475,504,533,562,598,627],"errorMessage":"expected funded by index to match"},{"pc":[190],"errorMessage":"expected op.balance by index to match"},{"pc":[181],"errorMessage":"expected op.balance to match"},{"pc":[244],"errorMessage":"expected op.min_balance by index to match"},{"pc":[235],"errorMessage":"expected op.min_balance to match"},{"pc":[164,218,271,299,328,357,386,415,444,473,502,531,560,596,625],"errorMessage":"expected value by index to match"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNAogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NWY1YjQzZTQgMHg3M2RjOTNjNyAweDU2MjZkZmViIDB4ZGM4YTI1YmYgMHgxOThlYmQ4YyAweDIzMDFhYjI2IDB4OWY2OGZjYTYgMHhhOTc1YzJkMSAweGQxZTA0ODAxIDB4YjY5NjZiZTUgMHgxOTVkNTQxOCAweDZhZGFlM2YxIDB4ZGY4Y2ZlZTUgMHg2YWQ3MGQyMSAweDE3MzVmZDIyIC8vIG1ldGhvZCAidmVyaWZ5X2FjY3RfYmFsYW5jZShhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfbWluX2JhbGFuY2UoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X2F1dGhfYWRkcihhY2NvdW50KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50KGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4oYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2JveGVzKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X2luY2VudGl2ZV9lbGlnaWJsZShhY2NvdW50KWJvb2wiLCBtZXRob2QgInZlcmlmeV9hY2N0X2xhc3RfaGVhcnRiZWF0KGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF9sYXN0X3Byb3Bvc2VkKGFjY291bnQpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X2FjY3RfYmFsYW5jZSB2ZXJpZnlfYWNjdF9taW5fYmFsYW5jZSB2ZXJpZnlfYWNjdF9hdXRoX2FkZHIgdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQgdmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2UgdmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzIHZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZCB2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX29wdGVkX2luIHZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkIHZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0cyB2ZXJpZnlfYWNjdF90b3RhbF9ib3hlcyB2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMgdmVyaWZ5X2FjY3RfaW5jZW50aXZlX2VsaWdpYmxlIHZlcmlmeV9hY2N0X2xhc3RfaGVhcnRiZWF0IHZlcmlmeV9hY2N0X2xhc3RfcHJvcG9zZWQKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyMjoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2JhbGFuY2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjcKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYmFsYW5jZShhKQogICAgZHVwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYmFsYW5jZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYS5iYWxhbmNlLCAiZXhwZWN0ZWQgQWNjb3VudCBiYWxhbmNlIHRvIG1hdGNoIgogICAgZGlnIDEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBBY2NvdW50IGJhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMgogICAgLy8gYXNzZXJ0IHZhbHVlID09IGFsZ29weS5vcC5iYWxhbmNlKGEpLCAiZXhwZWN0ZWQgb3AuYmFsYW5jZSB0byBtYXRjaCIKICAgIHN3YXAKICAgIGJhbGFuY2UKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG9wLmJhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzMtMzUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhbGdvcHkub3AuYmFsYW5jZSgKICAgIC8vICAgICBfZ2V0XzFzdF9yZWZfaW5kZXgoKQogICAgLy8gKSwgImV4cGVjdGVkIG9wLmJhbGFuY2UgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBiYWxhbmNlCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvcC5iYWxhbmNlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF9taW5fYmFsYW5jZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X21pbl9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDAKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbWluX2JhbGFuY2UoYSkKICAgIGR1cAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQxCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X21pbl9iYWxhbmNlKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDIKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhLm1pbl9iYWxhbmNlLCAiZXhwZWN0ZWQgQWNjb3VudCBtaW5fYmFsYW5jZSB0byBtYXRjaCIKICAgIGRpZyAxCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgQWNjb3VudCBtaW5fYmFsYW5jZSB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYWxnb3B5Lm9wLm1pbl9iYWxhbmNlKGEpLCAiZXhwZWN0ZWQgb3AubWluX2JhbGFuY2UgdG8gbWF0Y2giCiAgICBzd2FwCiAgICBtaW5fYmFsYW5jZQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgb3AubWluX2JhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDYtNDgKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhbGdvcHkub3AubWluX2JhbGFuY2UoCiAgICAvLyAgICAgX2dldF8xc3RfcmVmX2luZGV4KCkKICAgIC8vICksICJleHBlY3RlZCBvcC5taW5fYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaCIKICAgIG1pbl9iYWxhbmNlCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvcC5taW5fYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfYXV0aF9hZGRyW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfYXV0aF9hZGRyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTMKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYXV0aF9hZGRyKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEF1dGhBZGRyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2F1dGhfYWRkcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QXV0aEFkZHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTYKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9udW1fdWludChhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbE51bVVpbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfbnVtX3VpbnQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtVWludAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwLTcyCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlKAogICAgLy8gICAgIF9nZXRfMXN0X3JlZl9pbmRleCgpCiAgICAvLyApCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3OQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxFeHRyYUFwcFBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjgwLTgyCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlcygKICAgIC8vICAgICBfZ2V0XzFzdF9yZWZfaW5kZXgoKQogICAgLy8gKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEV4dHJhQXBwUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo4MwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6ODQKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNDcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjkwCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBcHBzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5MgogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hcHBzX29wdGVkX2luKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXBwc09wdGVkSW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXBwc19vcHRlZF9pbihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBcHBzT3B0ZWRJbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMDAKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTA1CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXNzZXRzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMDYtMTA4CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKAogICAgLy8gICAgIF9nZXRfMXN0X3JlZl9pbmRleCgpCiAgICAvLyApCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXNzZXRzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTEwCiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExNQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hc3NldHMoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTE2CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0cyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMTcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExOAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTIzCiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveGVzKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI0CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveGVzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEJveGVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjYKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTMxCiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveF9ieXRlcyhhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEJveEJ5dGVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9ib3hfYnl0ZXMoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94Qnl0ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2luY2VudGl2ZV9lbGlnaWJsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X2luY2VudGl2ZV9lbGlnaWJsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfaW5jZW50aXZlX2VsaWdpYmxlKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEluY2VudGl2ZUVsaWdpYmxlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE0MAogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9pbmNlbnRpdmVfZWxpZ2libGUoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEluY2VudGl2ZUVsaWdpYmxlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTQxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDIKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIHB1c2hpbnQgMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfbGFzdF9oZWFydGJlYXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF9sYXN0X2hlYXJ0YmVhdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDcKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbGFzdF9oZWFydGJlYXQoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TGFzdEhlYXJ0YmVhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbGFzdF9oZWFydGJlYXQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdExhc3RIZWFydGJlYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDkKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1MAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2xhc3RfcHJvcG9zZWRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF9sYXN0X3Byb3Bvc2VkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1NQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9sYXN0X3Byb3Bvc2VkKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdExhc3RQcm9wb3NlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTYKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbGFzdF9wcm9wb3NlZChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TGFzdFByb3Bvc2VkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTU3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTgKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyABASYBBBUffHUxG0EAeDEZFEQxGESCDwRfW0PkBHPck8cEVibf6wTciiW/BBmOvYwEIwGrJgSfaPymBKl1wtEE0eBIAQS2lmvlBBldVBgEatrj8QTfjP7lBGrXDSEEFzX9IjYaAI4PAAkAPwB1AJEArgDLAOgBBQEiAT8BXAF5AZYBugHXADEZFDEYFBBDNhoBF8AcSXMANhoBF3MASwNPAhJEEkRLAXMAREsBEkRMYEsBEkQ2GgEXYEsBEkQWKExQsCJDNhoBF8AcSXMBNhoBF3MBSwNPAhJEEkRLAXMBREsBEkRMeEsBEkQ2GgEXeEsBEkQWKExQsCJDNhoBF8AccwI2GgEXcwJLA08CEkQSRChMULAiQzYaARfAHHMDNhoBF3MDSwNPAhJEEkQWKExQsCJDNhoBF8AccwQ2GgEXcwRLA08CEkQSRBYoTFCwIkM2GgEXwBxzBTYaARdzBUsDTwISRBJEFihMULAiQzYaARfAHHMGNhoBF3MGSwNPAhJEEkQWKExQsCJDNhoBF8Accwc2GgEXcwdLA08CEkQSRBYoTFCwIkM2GgEXwBxzCDYaARdzCEsDTwISRBJEFihMULAiQzYaARfAHHMJNhoBF3MJSwNPAhJEEkQWKExQsCJDNhoBF8Accwo2GgEXcwpLA08CEkQSRBYoTFCwIkM2GgEXwBxzCzYaARdzC0sDTwISRBJEFihMULAiQzYaARfAHHMMNhoBF3MMSwNPAhJEEkSAAQCBAE8CVChMULAiQzYaARfAHHMONhoBF3MOSwNPAhJEEkQWKExQsCJDNhoBF8Accw02GgEXcw1LA08CEkQSRBYoTFCwIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAcctParamsGetContract contract + */ +export type StateAcctParamsGetContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_acct_balance(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_min_balance(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_auth_addr(account)address': { + a: Uint8Array | string + } + 'verify_acct_total_num_uint(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_num_byte_slice(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_extra_app_pages(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_apps_created(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_apps_opted_in(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_assets_created(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_assets(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_boxes(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_box_bytes(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_incentive_eligible(account)bool': { + a: Uint8Array | string + } + 'verify_acct_last_heartbeat(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_last_proposed(account)uint64': { + a: Uint8Array | string + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_acct_balance(account)uint64': [a: Uint8Array | string] + 'verify_acct_min_balance(account)uint64': [a: Uint8Array | string] + 'verify_acct_auth_addr(account)address': [a: Uint8Array | string] + 'verify_acct_total_num_uint(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_num_byte_slice(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_extra_app_pages(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_apps_created(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_apps_opted_in(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_assets_created(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_assets(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_boxes(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_box_bytes(account)uint64': [a: Uint8Array | string] + 'verify_acct_incentive_eligible(account)bool': [a: Uint8Array | string] + 'verify_acct_last_heartbeat(account)uint64': [a: Uint8Array | string] + 'verify_acct_last_proposed(account)uint64': [a: Uint8Array | string] + } +} + +/** + * The return type for each method + */ +export type StateAcctParamsGetContractReturns = { + 'verify_acct_balance(account)uint64': bigint + 'verify_acct_min_balance(account)uint64': bigint + 'verify_acct_auth_addr(account)address': string + 'verify_acct_total_num_uint(account)uint64': bigint + 'verify_acct_total_num_byte_slice(account)uint64': bigint + 'verify_acct_total_extra_app_pages(account)uint64': bigint + 'verify_acct_total_apps_created(account)uint64': bigint + 'verify_acct_total_apps_opted_in(account)uint64': bigint + 'verify_acct_total_assets_created(account)uint64': bigint + 'verify_acct_total_assets(account)uint64': bigint + 'verify_acct_total_boxes(account)uint64': bigint + 'verify_acct_total_box_bytes(account)uint64': bigint + 'verify_acct_incentive_eligible(account)bool': boolean + 'verify_acct_last_heartbeat(account)uint64': bigint + 'verify_acct_last_proposed(account)uint64': bigint +} + +/** + * Defines the types of available calls and state of the StateAcctParamsGetContract smart contract. + */ +export type StateAcctParamsGetContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_acct_balance(account)uint64' | 'verify_acct_balance', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_balance(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_balance(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_balance(account)uint64'] + }> + & Record<'verify_acct_min_balance(account)uint64' | 'verify_acct_min_balance', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_min_balance(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_min_balance(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_min_balance(account)uint64'] + }> + & Record<'verify_acct_auth_addr(account)address' | 'verify_acct_auth_addr', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_auth_addr(account)address'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_auth_addr(account)address'] + returns: StateAcctParamsGetContractReturns['verify_acct_auth_addr(account)address'] + }> + & Record<'verify_acct_total_num_uint(account)uint64' | 'verify_acct_total_num_uint', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_num_uint(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_num_uint(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_num_uint(account)uint64'] + }> + & Record<'verify_acct_total_num_byte_slice(account)uint64' | 'verify_acct_total_num_byte_slice', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_num_byte_slice(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_num_byte_slice(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_num_byte_slice(account)uint64'] + }> + & Record<'verify_acct_total_extra_app_pages(account)uint64' | 'verify_acct_total_extra_app_pages', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_extra_app_pages(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_extra_app_pages(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_extra_app_pages(account)uint64'] + }> + & Record<'verify_acct_total_apps_created(account)uint64' | 'verify_acct_total_apps_created', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_apps_created(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_apps_created(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_apps_created(account)uint64'] + }> + & Record<'verify_acct_total_apps_opted_in(account)uint64' | 'verify_acct_total_apps_opted_in', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_apps_opted_in(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_apps_opted_in(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_apps_opted_in(account)uint64'] + }> + & Record<'verify_acct_total_assets_created(account)uint64' | 'verify_acct_total_assets_created', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_assets_created(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_assets_created(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_assets_created(account)uint64'] + }> + & Record<'verify_acct_total_assets(account)uint64' | 'verify_acct_total_assets', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_assets(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_assets(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_assets(account)uint64'] + }> + & Record<'verify_acct_total_boxes(account)uint64' | 'verify_acct_total_boxes', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_boxes(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_boxes(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_boxes(account)uint64'] + }> + & Record<'verify_acct_total_box_bytes(account)uint64' | 'verify_acct_total_box_bytes', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_box_bytes(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_box_bytes(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_box_bytes(account)uint64'] + }> + & Record<'verify_acct_incentive_eligible(account)bool' | 'verify_acct_incentive_eligible', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_incentive_eligible(account)bool'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_incentive_eligible(account)bool'] + returns: StateAcctParamsGetContractReturns['verify_acct_incentive_eligible(account)bool'] + }> + & Record<'verify_acct_last_heartbeat(account)uint64' | 'verify_acct_last_heartbeat', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_last_heartbeat(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_last_heartbeat(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_last_heartbeat(account)uint64'] + }> + & Record<'verify_acct_last_proposed(account)uint64' | 'verify_acct_last_proposed', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_last_proposed(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_last_proposed(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_last_proposed(account)uint64'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAcctParamsGetContractSignatures = keyof StateAcctParamsGetContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateAcctParamsGetContractNonVoidMethodSignatures = keyof StateAcctParamsGetContractTypes['methods'] extends infer T ? T extends keyof StateAcctParamsGetContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAcctParamsGetContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAcctParamsGetContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAcctParamsGetContract smart contract to the method's return type + */ +export type MethodReturn = StateAcctParamsGetContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAcctParamsGetContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAcctParamsGetContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAcctParamsGetContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAcctParamsGetContract smart contract + */ +export abstract class StateAcctParamsGetContractParamsFactory { + /** + * Constructs a no op call for the verify_acct_balance(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctBalance(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_balance(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_min_balance(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctMinBalance(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_min_balance(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_auth_addr(account)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctAuthAddr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_auth_addr(account)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_num_uint(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalNumUint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_num_uint(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_num_byte_slice(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalNumByteSlice(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_num_byte_slice(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_extra_app_pages(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalExtraAppPages(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_extra_app_pages(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_apps_created(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAppsCreated(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_apps_created(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_apps_opted_in(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAppsOptedIn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_apps_opted_in(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_assets_created(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAssetsCreated(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_assets_created(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_assets(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAssets(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_assets(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_boxes(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_boxes(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_box_bytes(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalBoxBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_box_bytes(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_incentive_eligible(account)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctIncentiveEligible(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_incentive_eligible(account)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_last_heartbeat(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctLastHeartbeat(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_last_heartbeat(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_last_proposed(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctLastProposed(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_last_proposed(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateAcctParamsGetContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAcctParamsGetContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAcctParamsGetContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAcctParamsGetContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAcctParamsGetContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAcctParamsGetContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAcctParamsGetContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAcctParamsGetContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAcctParamsGetContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAcctParamsGetContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAcctParamsGetContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAcctParamsGetContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAcctParamsGetContract smart contract + */ +export class StateAcctParamsGetContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAcctParamsGetContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAcctParamsGetContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAcctParamsGetContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAcctParamsGetContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAcctParamsGetContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAcctParamsGetContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAcctParamsGetContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGetContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_min_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctMinBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctMinBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_auth_addr(account)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctAuthAddr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctAuthAddr(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumUint(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalExtraAppPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalExtraAppPages(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAppsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAppsOptedIn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsOptedIn(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAssetsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssetsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAssets: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssets(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxes(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalBoxBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxBytes(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_incentive_eligible(account)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctIncentiveEligible: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctIncentiveEligible(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_heartbeat(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctLastHeartbeat: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastHeartbeat(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_proposed(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctLastProposed: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastProposed(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGetContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_min_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctMinBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctMinBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_auth_addr(account)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctAuthAddr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctAuthAddr(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumUint(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalExtraAppPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalExtraAppPages(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAppsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAppsOptedIn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsOptedIn(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAssetsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssetsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAssets: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssets(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxes(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalBoxBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxBytes(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_incentive_eligible(account)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctIncentiveEligible: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctIncentiveEligible(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_heartbeat(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctLastHeartbeat: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastHeartbeat(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_proposed(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctLastProposed: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastProposed(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGetContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctBalance: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctBalance(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_balance(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_min_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctMinBalance: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctMinBalance(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_min_balance(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_auth_addr(account)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctAuthAddr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctAuthAddr(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_auth_addr(account)address'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalNumUint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumUint(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_num_uint(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalNumByteSlice: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumByteSlice(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_num_byte_slice(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalExtraAppPages: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalExtraAppPages(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_extra_app_pages(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAppsCreated: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsCreated(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_apps_created(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAppsOptedIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsOptedIn(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_apps_opted_in(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAssetsCreated: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssetsCreated(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_assets_created(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAssets: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssets(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_assets(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxes(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_boxes(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalBoxBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_box_bytes(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_incentive_eligible(account)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctIncentiveEligible: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctIncentiveEligible(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_incentive_eligible(account)bool'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_heartbeat(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctLastHeartbeat: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastHeartbeat(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_last_heartbeat(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_proposed(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctLastProposed: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastProposed(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_last_proposed(account)uint64'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAcctParamsGetContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAcctParamsGetContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAcctParamsGetContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_acct_balance(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctBalance(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctBalance(params))) + return this + }, + /** + * Add a verify_acct_min_balance(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctMinBalance(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctMinBalance(params))) + return this + }, + /** + * Add a verify_acct_auth_addr(account)address method call against the StateAcctParamsGetContract contract + */ + verifyAcctAuthAddr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctAuthAddr(params))) + return this + }, + /** + * Add a verify_acct_total_num_uint(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalNumUint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalNumUint(params))) + return this + }, + /** + * Add a verify_acct_total_num_byte_slice(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalNumByteSlice(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalNumByteSlice(params))) + return this + }, + /** + * Add a verify_acct_total_extra_app_pages(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalExtraAppPages(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalExtraAppPages(params))) + return this + }, + /** + * Add a verify_acct_total_apps_created(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalAppsCreated(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAppsCreated(params))) + return this + }, + /** + * Add a verify_acct_total_apps_opted_in(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalAppsOptedIn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAppsOptedIn(params))) + return this + }, + /** + * Add a verify_acct_total_assets_created(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalAssetsCreated(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAssetsCreated(params))) + return this + }, + /** + * Add a verify_acct_total_assets(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalAssets(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAssets(params))) + return this + }, + /** + * Add a verify_acct_total_boxes(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalBoxes(params))) + return this + }, + /** + * Add a verify_acct_total_box_bytes(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalBoxBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalBoxBytes(params))) + return this + }, + /** + * Add a verify_acct_incentive_eligible(account)bool method call against the StateAcctParamsGetContract contract + */ + verifyAcctIncentiveEligible(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctIncentiveEligible(params))) + return this + }, + /** + * Add a verify_acct_last_heartbeat(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctLastHeartbeat(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctLastHeartbeat(params))) + return this + }, + /** + * Add a verify_acct_last_proposed(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctLastProposed(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctLastProposed(params))) + return this + }, + /** + * Add a clear state call to the StateAcctParamsGetContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAcctParamsGetContractComposer + } +} +export type StateAcctParamsGetContractComposer = { + /** + * Calls the verify_acct_balance(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctBalance(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_balance(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_min_balance(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctMinBalance(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_min_balance(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_auth_addr(account)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctAuthAddr(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_auth_addr(account)address'] | undefined]> + + /** + * Calls the verify_acct_total_num_uint(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalNumUint(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_num_uint(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_num_byte_slice(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalNumByteSlice(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_num_byte_slice(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_extra_app_pages(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalExtraAppPages(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_extra_app_pages(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_apps_created(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAppsCreated(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_apps_created(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_apps_opted_in(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAppsOptedIn(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_apps_opted_in(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_assets_created(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAssetsCreated(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_assets_created(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_assets(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAssets(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_assets(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_boxes(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalBoxes(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_boxes(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_box_bytes(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalBoxBytes(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_box_bytes(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_incentive_eligible(account)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctIncentiveEligible(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_incentive_eligible(account)bool'] | undefined]> + + /** + * Calls the verify_acct_last_heartbeat(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctLastHeartbeat(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_last_heartbeat(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_last_proposed(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctLastProposed(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_last_proposed(account)uint64'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGetContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAcctParamsGetContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAcctParamsGetContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAcctParamsGetContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalContract.ts new file mode 100644 index 0000000..fc6b74f --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalContract.ts @@ -0,0 +1,1018 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAppGlobalContract","structs":{},"methods":[{"name":"verify_get_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_uint64","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_ex_bytes","args":[{"type":"uint64","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"(byte[],bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_ex_uint64","args":[{"type":"uint64","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"(uint64,bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_delete","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_put_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_put_bytes","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":1,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"global_uint64":{"keyType":"AVMString","valueType":"AVMUint64","key":"Z2xvYmFsX3VpbnQ2NA=="},"global_bytes":{"keyType":"AVMString","valueType":"AVMBytes","key":"Z2xvYmFsX2J5dGVz"}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQ1CiAgICAvLyBjbGFzcyBTdGF0ZUFwcEdsb2JhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxNgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4YTk5N2ExODcgMHg0ZGI4YWE0MSAweDBjMWY1NmE3IDB4YWZkZGIwODggMHg5M2E4NTJlMSAweDM2OTk2NDUxIDB4MzkyMGE1N2IgLy8gbWV0aG9kICJ2ZXJpZnlfZ2V0X2J5dGVzKGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9nZXRfdWludDY0KGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfYnl0ZXModWludDY0LGJ5dGVbXSkoYnl0ZVtdLGJvb2wpIiwgbWV0aG9kICJ2ZXJpZnlfZ2V0X2V4X3VpbnQ2NCh1aW50NjQsYnl0ZVtdKSh1aW50NjQsYm9vbCkiLCBtZXRob2QgInZlcmlmeV9kZWxldGUoYnl0ZVtdKXZvaWQiLCBtZXRob2QgInZlcmlmeV9wdXRfdWludDY0KGJ5dGVbXSx1aW50NjQpdm9pZCIsIG1ldGhvZCAidmVyaWZ5X3B1dF9ieXRlcyhieXRlW10sYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfZ2V0X2J5dGVzIHZlcmlmeV9nZXRfdWludDY0IHZlcmlmeV9nZXRfZXhfYnl0ZXMgdmVyaWZ5X2dldF9leF91aW50NjQgdmVyaWZ5X2RlbGV0ZSB2ZXJpZnlfcHV0X3VpbnQ2NCB2ZXJpZnlfcHV0X2J5dGVzCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTY6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9nZXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDU5CiAgICAvLyB2YWx1ZSA9IG9wLkFwcEdsb2JhbC5nZXRfYnl0ZXMoYSkKICAgIGFwcF9nbG9iYWxfZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDY0CiAgICAvLyB2YWx1ZSA9IG9wLkFwcEdsb2JhbC5nZXRfdWludDY0KGEpCiAgICBhcHBfZ2xvYmFsX2dldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF9leF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2OQogICAgLy8gcmV0dXJuIG9wLkFwcEdsb2JhbC5nZXRfZXhfYnl0ZXMoYSwgYikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfZXhfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDczCiAgICAvLyByZXR1cm4gb3AuQXBwR2xvYmFsLmdldF9leF91aW50NjQoYSwgYikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgc3dhcAogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9kZWxldGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGVsZXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDc3CiAgICAvLyBvcC5BcHBHbG9iYWwuZGVsZXRlKGEpCiAgICBhcHBfZ2xvYmFsX2RlbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfcHV0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgxCiAgICAvLyBvcC5BcHBHbG9iYWwucHV0KGEsIGIpCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfcHV0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3B1dF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODUKICAgIC8vIG9wLkFwcEdsb2JhbC5wdXQoYSwgYikKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmAgQVH3x1AQAxG0EAQDEZFEQxGESCBwSpl6GHBE24qkEEDB9WpwSv3bCIBJOoUuEENplkUQQ5IKV7NhoAjgcACQAeACwAVABtAHYAgwAxGRQxGBQQQzYaAVcCAGRJFRZXBgJMUChMULAiQzYaAVcCAGQWKExQsCJDNhoBFzYaAlcCAGVLARUWVwYCTwJQKSNPA1SAAgADTFBMUChMULAiQzYaARc2GgJXAgBlTBYpI08DVFAoTFCwIkM2GgFXAgBpIkM2GgFXAgA2GgIXZyJDNhoBVwIANhoCVwIAZyJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAppGlobalContract contract + */ +export type StateAppGlobalContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_get_bytes(byte[])byte[]': { + a: Uint8Array + } + 'verify_get_uint64(byte[])uint64': { + a: Uint8Array + } + 'verify_get_ex_bytes(uint64,byte[])(byte[],bool)': { + a: bigint | number + b: Uint8Array + } + 'verify_get_ex_uint64(uint64,byte[])(uint64,bool)': { + a: bigint | number + b: Uint8Array + } + 'verify_delete(byte[])void': { + a: Uint8Array + } + 'verify_put_uint64(byte[],uint64)void': { + a: Uint8Array + b: bigint | number + } + 'verify_put_bytes(byte[],byte[])void': { + a: Uint8Array + b: Uint8Array + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_get_bytes(byte[])byte[]': [a: Uint8Array] + 'verify_get_uint64(byte[])uint64': [a: Uint8Array] + 'verify_get_ex_bytes(uint64,byte[])(byte[],bool)': [a: bigint | number, b: Uint8Array] + 'verify_get_ex_uint64(uint64,byte[])(uint64,bool)': [a: bigint | number, b: Uint8Array] + 'verify_delete(byte[])void': [a: Uint8Array] + 'verify_put_uint64(byte[],uint64)void': [a: Uint8Array, b: bigint | number] + 'verify_put_bytes(byte[],byte[])void': [a: Uint8Array, b: Uint8Array] + } +} + +/** + * The return type for each method + */ +export type StateAppGlobalContractReturns = { + 'verify_get_bytes(byte[])byte[]': Uint8Array + 'verify_get_uint64(byte[])uint64': bigint + 'verify_get_ex_bytes(uint64,byte[])(byte[],bool)': [Uint8Array, boolean] + 'verify_get_ex_uint64(uint64,byte[])(uint64,bool)': [bigint, boolean] + 'verify_delete(byte[])void': void + 'verify_put_uint64(byte[],uint64)void': void + 'verify_put_bytes(byte[],byte[])void': void +} + +/** + * Defines the types of available calls and state of the StateAppGlobalContract smart contract. + */ +export type StateAppGlobalContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_get_bytes(byte[])byte[]' | 'verify_get_bytes', { + argsObj: StateAppGlobalContractArgs['obj']['verify_get_bytes(byte[])byte[]'] + argsTuple: StateAppGlobalContractArgs['tuple']['verify_get_bytes(byte[])byte[]'] + returns: StateAppGlobalContractReturns['verify_get_bytes(byte[])byte[]'] + }> + & Record<'verify_get_uint64(byte[])uint64' | 'verify_get_uint64', { + argsObj: StateAppGlobalContractArgs['obj']['verify_get_uint64(byte[])uint64'] + argsTuple: StateAppGlobalContractArgs['tuple']['verify_get_uint64(byte[])uint64'] + returns: StateAppGlobalContractReturns['verify_get_uint64(byte[])uint64'] + }> + & Record<'verify_get_ex_bytes(uint64,byte[])(byte[],bool)' | 'verify_get_ex_bytes', { + argsObj: StateAppGlobalContractArgs['obj']['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'] + argsTuple: StateAppGlobalContractArgs['tuple']['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'] + returns: StateAppGlobalContractReturns['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'] + }> + & Record<'verify_get_ex_uint64(uint64,byte[])(uint64,bool)' | 'verify_get_ex_uint64', { + argsObj: StateAppGlobalContractArgs['obj']['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'] + argsTuple: StateAppGlobalContractArgs['tuple']['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'] + returns: StateAppGlobalContractReturns['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'] + }> + & Record<'verify_delete(byte[])void' | 'verify_delete', { + argsObj: StateAppGlobalContractArgs['obj']['verify_delete(byte[])void'] + argsTuple: StateAppGlobalContractArgs['tuple']['verify_delete(byte[])void'] + returns: StateAppGlobalContractReturns['verify_delete(byte[])void'] + }> + & Record<'verify_put_uint64(byte[],uint64)void' | 'verify_put_uint64', { + argsObj: StateAppGlobalContractArgs['obj']['verify_put_uint64(byte[],uint64)void'] + argsTuple: StateAppGlobalContractArgs['tuple']['verify_put_uint64(byte[],uint64)void'] + returns: StateAppGlobalContractReturns['verify_put_uint64(byte[],uint64)void'] + }> + & Record<'verify_put_bytes(byte[],byte[])void' | 'verify_put_bytes', { + argsObj: StateAppGlobalContractArgs['obj']['verify_put_bytes(byte[],byte[])void'] + argsTuple: StateAppGlobalContractArgs['tuple']['verify_put_bytes(byte[],byte[])void'] + returns: StateAppGlobalContractReturns['verify_put_bytes(byte[],byte[])void'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + global: { + keys: { + globalUint64: bigint + globalBytes: BinaryState + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAppGlobalContractSignatures = keyof StateAppGlobalContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateAppGlobalContractNonVoidMethodSignatures = keyof StateAppGlobalContractTypes['methods'] extends infer T ? T extends keyof StateAppGlobalContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAppGlobalContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAppGlobalContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAppGlobalContract smart contract to the method's return type + */ +export type MethodReturn = StateAppGlobalContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed global state of the application. + */ +export type GlobalKeysState = StateAppGlobalContractTypes['state']['global']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAppGlobalContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAppGlobalContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAppGlobalContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppGlobalContract smart contract + */ +export abstract class StateAppGlobalContractParamsFactory { + /** + * Constructs a no op call for the verify_get_bytes(byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_bytes(byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_get_uint64(byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_uint64(byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_get_ex_bytes(uint64,byte[])(byte[],bool) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetExBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_ex_bytes(uint64,byte[])(byte[],bool)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_get_ex_uint64(uint64,byte[])(uint64,bool) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetExUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_ex_uint64(uint64,byte[])(uint64,bool)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_delete(byte[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyDelete(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_delete(byte[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_put_uint64(byte[],uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyPutUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_put_uint64(byte[],uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_put_bytes(byte[],byte[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyPutBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_put_bytes(byte[],byte[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateAppGlobalContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAppGlobalContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAppGlobalContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAppGlobalContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAppGlobalContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAppGlobalContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAppGlobalContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAppGlobalContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppGlobalContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppGlobalContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppGlobalContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAppGlobalContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAppGlobalContract smart contract + */ +export class StateAppGlobalContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAppGlobalContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAppGlobalContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAppGlobalContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAppGlobalContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAppGlobalContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAppGlobalContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAppGlobalContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_bytes(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyGetBytes(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyGetUint64(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_bytes(uint64,byte[])(byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetExBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyGetExBytes(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_uint64(uint64,byte[])(uint64,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetExUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyGetExUint64(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_delete(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyDelete: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyDelete(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_uint64(byte[],uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyPutUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyPutUint64(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_bytes(byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyPutBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyPutBytes(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_bytes(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyGetBytes(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyGetUint64(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_bytes(uint64,byte[])(byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetExBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyGetExBytes(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_uint64(uint64,byte[])(uint64,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetExUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyGetExUint64(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_delete(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyDelete: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyDelete(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_uint64(byte[],uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyPutUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyPutUint64(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_bytes(byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyPutBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyPutBytes(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_bytes(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyGetBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_get_bytes(byte[])byte[]'])} + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyGetUint64(params)) + return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_get_uint64(byte[])uint64'])} + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_bytes(uint64,byte[])(byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetExBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyGetExBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'])} + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_uint64(uint64,byte[])(uint64,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetExUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyGetExUint64(params)) + return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'])} + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_delete(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyDelete: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyDelete(params)) + return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_delete(byte[])void'])} + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_uint64(byte[],uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyPutUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyPutUint64(params)) + return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_put_uint64(byte[],uint64)void'])} + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_bytes(byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyPutBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyPutBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_put_bytes(byte[],byte[])void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAppGlobalContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAppGlobalContract app + */ + state = { + /** + * Methods to access global state for the current StateAppGlobalContract app + */ + global: { + /** + * Get all current keyed values from global state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.global.getAll() + return { + globalUint64: result.global_uint64, + globalBytes: new BinaryStateValue(result.global_bytes), + } + }, + /** + * Get the current value of the global_uint64 key in global state + */ + globalUint64: async (): Promise => { return (await this.appClient.state.global.getValue("global_uint64")) as bigint | undefined }, + /** + * Get the current value of the global_bytes key in global state + */ + globalBytes: async (): Promise => { return new BinaryStateValue((await this.appClient.state.global.getValue("global_bytes")) as Uint8Array | undefined) }, + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAppGlobalContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_get_bytes(byte[])byte[] method call against the StateAppGlobalContract contract + */ + verifyGetBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetBytes(params))) + return this + }, + /** + * Add a verify_get_uint64(byte[])uint64 method call against the StateAppGlobalContract contract + */ + verifyGetUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetUint64(params))) + return this + }, + /** + * Add a verify_get_ex_bytes(uint64,byte[])(byte[],bool) method call against the StateAppGlobalContract contract + */ + verifyGetExBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetExBytes(params))) + return this + }, + /** + * Add a verify_get_ex_uint64(uint64,byte[])(uint64,bool) method call against the StateAppGlobalContract contract + */ + verifyGetExUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetExUint64(params))) + return this + }, + /** + * Add a verify_delete(byte[])void method call against the StateAppGlobalContract contract + */ + verifyDelete(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyDelete(params))) + return this + }, + /** + * Add a verify_put_uint64(byte[],uint64)void method call against the StateAppGlobalContract contract + */ + verifyPutUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyPutUint64(params))) + return this + }, + /** + * Add a verify_put_bytes(byte[],byte[])void method call against the StateAppGlobalContract contract + */ + verifyPutBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyPutBytes(params))) + return this + }, + /** + * Add a clear state call to the StateAppGlobalContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAppGlobalContractComposer + } +} +export type StateAppGlobalContractComposer = { + /** + * Calls the verify_get_bytes(byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetBytes(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_get_bytes(byte[])byte[]'] | undefined]> + + /** + * Calls the verify_get_uint64(byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetUint64(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_get_uint64(byte[])uint64'] | undefined]> + + /** + * Calls the verify_get_ex_bytes(uint64,byte[])(byte[],bool) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetExBytes(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'] | undefined]> + + /** + * Calls the verify_get_ex_uint64(uint64,byte[])(uint64,bool) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetExUint64(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'] | undefined]> + + /** + * Calls the verify_delete(byte[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyDelete(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_delete(byte[])void'] | undefined]> + + /** + * Calls the verify_put_uint64(byte[],uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyPutUint64(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_put_uint64(byte[],uint64)void'] | undefined]> + + /** + * Calls the verify_put_bytes(byte[],byte[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyPutBytes(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_put_bytes(byte[],byte[])void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAppGlobalContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppGlobalContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAppGlobalContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalExContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalExContract.ts new file mode 100644 index 0000000..cf78371 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalExContract.ts @@ -0,0 +1,551 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAppGlobalExContract","structs":{},"methods":[],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":2,"bytes":4},"local":{"ints":0,"bytes":0}},"keys":{"global":{"global_uint64":{"keyType":"AVMString","valueType":"AVMUint64","key":"Z2xvYmFsX3VpbnQ2NA=="},"global_bytes":{"keyType":"AVMString","valueType":"AVMBytes","key":"Z2xvYmFsX2J5dGVz"},"global_uint64_explicit":{"keyType":"AVMString","valueType":"AVMUint64","key":"Z2xvYmFsX3VpbnQ2NF9leHBsaWNpdA=="},"global_bytes_explicit":{"keyType":"AVMString","valueType":"AVMBytes","key":"Z2xvYmFsX2J5dGVzX2V4cGxpY2l0"},"global_arc4_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"Z2xvYmFsX2FyYzRfYnl0ZXM="},"global_arc4_bytes_explicit":{"keyType":"AVMString","valueType":"byte[]","key":"Z2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQ="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDMxCiAgICAvLyBrZXk9Imdsb2JhbF91aW50NjQiLAogICAgcHVzaGJ5dGVzICJnbG9iYWxfdWludDY0IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzMAogICAgLy8gVUludDY0KDIpLAogICAgcHVzaGludCAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDI5LTQzMgogICAgLy8gc2VsZi5nbG9iYWxfdWludDY0ID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgVUludDY0KDIpLAogICAgLy8gICAgIGtleT0iZ2xvYmFsX3VpbnQ2NCIsCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzNQogICAgLy8ga2V5PSJnbG9iYWxfYnl0ZXMiLAogICAgcHVzaGJ5dGVzICJnbG9iYWxfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM0CiAgICAvLyBCeXRlcyhiImR1bW15X2J5dGVzIiksCiAgICBieXRlY18wIC8vIDB4NjQ3NTZkNmQ3OTVmNjI3OTc0NjU3MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzMy00MzYKICAgIC8vIHNlbGYuZ2xvYmFsX2J5dGVzID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgQnl0ZXMoYiJkdW1teV9ieXRlcyIpLAogICAgLy8gICAgIGtleT0iZ2xvYmFsX2J5dGVzIiwKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM3CiAgICAvLyBzZWxmLmdsb2JhbF91aW50NjRfZXhwbGljaXQgPSBhbGdvcHkuVUludDY0KDIpCiAgICBwdXNoYnl0ZXMgImdsb2JhbF91aW50NjRfZXhwbGljaXQiCiAgICBwdXNoaW50IDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM4CiAgICAvLyBzZWxmLmdsb2JhbF9ieXRlc19leHBsaWNpdCA9IGFsZ29weS5CeXRlcyhiImR1bW15X2J5dGVzIikKICAgIHB1c2hieXRlcyAiZ2xvYmFsX2J5dGVzX2V4cGxpY2l0IgogICAgYnl0ZWNfMCAvLyAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQwCiAgICAvLyBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIiksIGtleT0iZ2xvYmFsX2FyYzRfYnl0ZXMiCiAgICBwdXNoYnl0ZXMgImdsb2JhbF9hcmM0X2J5dGVzIgogICAgYnl0ZWNfMSAvLyAweDAwMTA2NDc1NmQ2ZDc5NWY2MTcyNjMzNDVmNjI3OTc0NjU3MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzOS00NDEKICAgIC8vIHNlbGYuZ2xvYmFsX2FyYzRfYnl0ZXMgPSBHbG9iYWxTdGF0ZSgKICAgIC8vICAgICBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIiksIGtleT0iZ2xvYmFsX2FyYzRfYnl0ZXMiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ0MgogICAgLy8gc2VsZi5nbG9iYWxfYXJjNF9ieXRlc19leHBsaWNpdCA9IGFsZ29weS5hcmM0LkR5bmFtaWNCeXRlcyhiImR1bW15X2FyYzRfYnl0ZXMiKQogICAgcHVzaGJ5dGVzICJnbG9iYWxfYXJjNF9ieXRlc19leHBsaWNpdCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDAKICAgIC8vIGFsZ29weS5hcmM0LkR5bmFtaWNCeXRlcyhiImR1bW15X2FyYzRfYnl0ZXMiKSwga2V5PSJnbG9iYWxfYXJjNF9ieXRlcyIKICAgIGJ5dGVjXzEgLy8gMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDIKICAgIC8vIHNlbGYuZ2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQgPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIikKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjcKICAgIC8vIGNsYXNzIFN0YXRlQXBwR2xvYmFsRXhDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgICEKICAgIGFzc2VydAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyYCC2R1bW15X2J5dGVzEgAQZHVtbXlfYXJjNF9ieXRlczEYQACJgA1nbG9iYWxfdWludDY0gQJngAxnbG9iYWxfYnl0ZXMoZ4AWZ2xvYmFsX3VpbnQ2NF9leHBsaWNpdIECZ4AVZ2xvYmFsX2J5dGVzX2V4cGxpY2l0KGeAEWdsb2JhbF9hcmM0X2J5dGVzKWeAGmdsb2JhbF9hcmM0X2J5dGVzX2V4cGxpY2l0KWcxGxREMRkUMRgUEEM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAppGlobalExContract contract + */ +export type StateAppGlobalExContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + } +} + +/** + * The return type for each method + */ +export type StateAppGlobalExContractReturns = { +} + +/** + * Defines the types of available calls and state of the StateAppGlobalExContract smart contract. + */ +export type StateAppGlobalExContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: {} + /** + * Defines the shape of the state of the application. + */ + state: { + global: { + keys: { + globalUint64: bigint + globalBytes: BinaryState + globalUint64Explicit: bigint + globalBytesExplicit: BinaryState + globalArc4Bytes: Uint8Array + globalArc4BytesExplicit: Uint8Array + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAppGlobalExContractSignatures = keyof StateAppGlobalExContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAppGlobalExContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAppGlobalExContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAppGlobalExContract smart contract to the method's return type + */ +export type MethodReturn = StateAppGlobalExContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed global state of the application. + */ +export type GlobalKeysState = StateAppGlobalExContractTypes['state']['global']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAppGlobalExContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAppGlobalExContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAppGlobalExContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppGlobalExContract smart contract + */ +export abstract class StateAppGlobalExContractParamsFactory { +} + +/** + * A factory to create and deploy one or more instance of the StateAppGlobalExContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAppGlobalExContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAppGlobalExContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAppGlobalExContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAppGlobalExContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAppGlobalExContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAppGlobalExContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAppGlobalExContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppGlobalExContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppGlobalExContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppGlobalExContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAppGlobalExContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAppGlobalExContract smart contract + */ +export class StateAppGlobalExContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAppGlobalExContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAppGlobalExContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAppGlobalExContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAppGlobalExContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAppGlobalExContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAppGlobalExContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAppGlobalExContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalExContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalExContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalExContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAppGlobalExContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAppGlobalExContract app + */ + state = { + /** + * Methods to access global state for the current StateAppGlobalExContract app + */ + global: { + /** + * Get all current keyed values from global state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.global.getAll() + return { + globalUint64: result.global_uint64, + globalBytes: new BinaryStateValue(result.global_bytes), + globalUint64Explicit: result.global_uint64_explicit, + globalBytesExplicit: new BinaryStateValue(result.global_bytes_explicit), + globalArc4Bytes: result.global_arc4_bytes, + globalArc4BytesExplicit: result.global_arc4_bytes_explicit, + } + }, + /** + * Get the current value of the global_uint64 key in global state + */ + globalUint64: async (): Promise => { return (await this.appClient.state.global.getValue("global_uint64")) as bigint | undefined }, + /** + * Get the current value of the global_bytes key in global state + */ + globalBytes: async (): Promise => { return new BinaryStateValue((await this.appClient.state.global.getValue("global_bytes")) as Uint8Array | undefined) }, + /** + * Get the current value of the global_uint64_explicit key in global state + */ + globalUint64Explicit: async (): Promise => { return (await this.appClient.state.global.getValue("global_uint64_explicit")) as bigint | undefined }, + /** + * Get the current value of the global_bytes_explicit key in global state + */ + globalBytesExplicit: async (): Promise => { return new BinaryStateValue((await this.appClient.state.global.getValue("global_bytes_explicit")) as Uint8Array | undefined) }, + /** + * Get the current value of the global_arc4_bytes key in global state + */ + globalArc4Bytes: async (): Promise => { return (await this.appClient.state.global.getValue("global_arc4_bytes")) as Uint8Array | undefined }, + /** + * Get the current value of the global_arc4_bytes_explicit key in global state + */ + globalArc4BytesExplicit: async (): Promise => { return (await this.appClient.state.global.getValue("global_arc4_bytes_explicit")) as Uint8Array | undefined }, + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAppGlobalExContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a clear state call to the StateAppGlobalExContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAppGlobalExContractComposer + } +} +export type StateAppGlobalExContractComposer = { + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalExContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAppGlobalExContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppGlobalExContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAppGlobalExContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalContract.ts new file mode 100644 index 0000000..be9dae8 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalContract.ts @@ -0,0 +1,1197 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAppLocalContract","structs":{},"methods":[{"name":"opt_in","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["OptIn"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_bytes","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_uint64","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_ex_bytes","args":[{"type":"address","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_ex_uint64","args":[{"type":"address","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_delete","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_exists","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_put_uint64","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_put_bytes","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":1,"bytes":1}},"keys":{"global":{},"local":{"local_uint64":{"keyType":"AVMString","valueType":"AVMUint64","key":"bG9jYWxfdWludDY0"},"local_bytes":{"keyType":"AVMString","valueType":"AVMBytes","key":"bG9jYWxfYnl0ZXM="}},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM3MgogICAgLy8gY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxOQogICAgcHVzaGJ5dGVzIDB4MzBjNmQ1OGEgLy8gbWV0aG9kICJvcHRfaW4oKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX29wdF9pbl9yb3V0ZUA1CgptYWluX3N3aXRjaF9jYXNlX25leHRANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNzIKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4YTg4MzAyZmUgMHg0OWI3ZGRmOSAweGMwNzhiZWFkIDB4YTUyZjk5MmIgMHg4YzU2YWQ5MCAweDRjN2FkODIzIDB4Y2FhN2I4NjQgMHgyNGY5ZjA4NSAvLyBtZXRob2QgInZlcmlmeV9nZXRfYnl0ZXMoYWRkcmVzcyxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZ2V0X3VpbnQ2NChhZGRyZXNzLGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfYnl0ZXMoYWRkcmVzcyx1aW50NjQsYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2dldF9leF91aW50NjQoYWRkcmVzcyx1aW50NjQsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2RlbGV0ZShhZGRyZXNzLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfZXhpc3RzKGFkZHJlc3MsYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9wdXRfdWludDY0KGFkZHJlc3MsYnl0ZVtdLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfcHV0X2J5dGVzKGFkZHJlc3MsYnl0ZVtdLGJ5dGVbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X2dldF9ieXRlcyB2ZXJpZnlfZ2V0X3VpbnQ2NCB2ZXJpZnlfZ2V0X2V4X2J5dGVzIHZlcmlmeV9nZXRfZXhfdWludDY0IHZlcmlmeV9kZWxldGUgdmVyaWZ5X2V4aXN0cyB2ZXJpZnlfcHV0X3VpbnQ2NCB2ZXJpZnlfcHV0X2J5dGVzCiAgICBlcnIKCm1haW5fb3B0X2luX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gT3B0SW4KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBvcHRfaW4KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3Qub3B0X2luW3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4NgogICAgLy8gc2VsZi5sb2NhbF9ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IEJ5dGVzKGIiZHVtbXlfYnl0ZXMiKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBwdXNoYnl0ZXNzICJsb2NhbF9ieXRlcyIgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzg3CiAgICAvLyBzZWxmLmxvY2FsX3VpbnQ2NFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IFVJbnQ2NCg5OTkpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIHB1c2hieXRlcyAibG9jYWxfdWludDY0IgogICAgcHVzaGludCA5OTkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9nZXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzkxCiAgICAvLyB2YWx1ZSA9IG9wLkFwcExvY2FsLmdldF9ieXRlcyhhLCBiKQogICAgYXBwX2xvY2FsX2dldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzk2CiAgICAvLyB2YWx1ZSA9IG9wLkFwcExvY2FsLmdldF91aW50NjQoYSwgYikKICAgIGFwcF9sb2NhbF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF9leF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gdmFsdWUsIF92YWwgPSBvcC5BcHBMb2NhbC5nZXRfZXhfYnl0ZXMoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfZXhfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDA2CiAgICAvLyB2YWx1ZSwgX3ZhbCA9IG9wLkFwcExvY2FsLmdldF9leF91aW50NjQoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9kZWxldGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGVsZXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDExCiAgICAvLyBvcC5BcHBMb2NhbC5kZWxldGUoYSwgYikKICAgIGFwcF9sb2NhbF9kZWwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZXhpc3RzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4aXN0czoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQxNQogICAgLy8gX3ZhbHVlLCBleGlzdHMgPSBvcC5BcHBMb2NhbC5nZXRfZXhfdWludDY0KGEsIDAsIGIpCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAogICAgYXBwX2xvY2FsX2dldF9leAogICAgYnVyeSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X3B1dF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfcHV0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQyMAogICAgLy8gb3AuQXBwTG9jYWwucHV0KGEsIGIsIGMpCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X3B1dF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDI0CiAgICAvLyBvcC5BcHBMb2NhbC5wdXQoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmAQQVH3x1MRtBAF+ABDDG1Yo2GgCOAQBHMRkURDEYRIIIBKiDAv4ESbfd+QTAeL6tBKUvmSsEjFatkARMetgjBMqnuGQEJPnwhTYaAI4IAEcAXwBwAI0AowCvAMoA2gAxGSISMRgQREIACDEZFDEYFBBDMgmCAgtsb2NhbF9ieXRlcwtkdW1teV9ieXRlc2YyCYAMbG9jYWxfdWludDY0gecHZiJDNhoBNhoCVwIAYkkVFlcGAkxQKExQsCJDNhoBNhoCVwIAYhYoTFCwIkM2GgE2GgIXNhoDVwIAY0hJFRZXBgJMUChMULAiQzYaATYaAhc2GgNXAgBjSBYoTFCwIkM2GgE2GgJXAgBoIkM2GgE2GgJXAgAjTGNFAYABACNPAlQoTFCwIkM2GgE2GgJXAgA2GgMXZiJDNhoBNhoCVwIANhoDVwIAZiJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAppLocalContract contract + */ +export type StateAppLocalContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'opt_in()void': Record + 'verify_get_bytes(address,byte[])byte[]': { + a: string + b: Uint8Array + } + 'verify_get_uint64(address,byte[])uint64': { + a: string + b: Uint8Array + } + 'verify_get_ex_bytes(address,uint64,byte[])byte[]': { + a: string + b: bigint | number + c: Uint8Array + } + 'verify_get_ex_uint64(address,uint64,byte[])uint64': { + a: string + b: bigint | number + c: Uint8Array + } + 'verify_delete(address,byte[])void': { + a: string + b: Uint8Array + } + 'verify_exists(address,byte[])bool': { + a: string + b: Uint8Array + } + 'verify_put_uint64(address,byte[],uint64)void': { + a: string + b: Uint8Array + c: bigint | number + } + 'verify_put_bytes(address,byte[],byte[])void': { + a: string + b: Uint8Array + c: Uint8Array + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'opt_in()void': [] + 'verify_get_bytes(address,byte[])byte[]': [a: string, b: Uint8Array] + 'verify_get_uint64(address,byte[])uint64': [a: string, b: Uint8Array] + 'verify_get_ex_bytes(address,uint64,byte[])byte[]': [a: string, b: bigint | number, c: Uint8Array] + 'verify_get_ex_uint64(address,uint64,byte[])uint64': [a: string, b: bigint | number, c: Uint8Array] + 'verify_delete(address,byte[])void': [a: string, b: Uint8Array] + 'verify_exists(address,byte[])bool': [a: string, b: Uint8Array] + 'verify_put_uint64(address,byte[],uint64)void': [a: string, b: Uint8Array, c: bigint | number] + 'verify_put_bytes(address,byte[],byte[])void': [a: string, b: Uint8Array, c: Uint8Array] + } +} + +/** + * The return type for each method + */ +export type StateAppLocalContractReturns = { + 'opt_in()void': void + 'verify_get_bytes(address,byte[])byte[]': Uint8Array + 'verify_get_uint64(address,byte[])uint64': bigint + 'verify_get_ex_bytes(address,uint64,byte[])byte[]': Uint8Array + 'verify_get_ex_uint64(address,uint64,byte[])uint64': bigint + 'verify_delete(address,byte[])void': void + 'verify_exists(address,byte[])bool': boolean + 'verify_put_uint64(address,byte[],uint64)void': void + 'verify_put_bytes(address,byte[],byte[])void': void +} + +/** + * Defines the types of available calls and state of the StateAppLocalContract smart contract. + */ +export type StateAppLocalContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'opt_in()void' | 'opt_in', { + argsObj: StateAppLocalContractArgs['obj']['opt_in()void'] + argsTuple: StateAppLocalContractArgs['tuple']['opt_in()void'] + returns: StateAppLocalContractReturns['opt_in()void'] + }> + & Record<'verify_get_bytes(address,byte[])byte[]' | 'verify_get_bytes', { + argsObj: StateAppLocalContractArgs['obj']['verify_get_bytes(address,byte[])byte[]'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_get_bytes(address,byte[])byte[]'] + returns: StateAppLocalContractReturns['verify_get_bytes(address,byte[])byte[]'] + }> + & Record<'verify_get_uint64(address,byte[])uint64' | 'verify_get_uint64', { + argsObj: StateAppLocalContractArgs['obj']['verify_get_uint64(address,byte[])uint64'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_get_uint64(address,byte[])uint64'] + returns: StateAppLocalContractReturns['verify_get_uint64(address,byte[])uint64'] + }> + & Record<'verify_get_ex_bytes(address,uint64,byte[])byte[]' | 'verify_get_ex_bytes', { + argsObj: StateAppLocalContractArgs['obj']['verify_get_ex_bytes(address,uint64,byte[])byte[]'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_get_ex_bytes(address,uint64,byte[])byte[]'] + returns: StateAppLocalContractReturns['verify_get_ex_bytes(address,uint64,byte[])byte[]'] + }> + & Record<'verify_get_ex_uint64(address,uint64,byte[])uint64' | 'verify_get_ex_uint64', { + argsObj: StateAppLocalContractArgs['obj']['verify_get_ex_uint64(address,uint64,byte[])uint64'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_get_ex_uint64(address,uint64,byte[])uint64'] + returns: StateAppLocalContractReturns['verify_get_ex_uint64(address,uint64,byte[])uint64'] + }> + & Record<'verify_delete(address,byte[])void' | 'verify_delete', { + argsObj: StateAppLocalContractArgs['obj']['verify_delete(address,byte[])void'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_delete(address,byte[])void'] + returns: StateAppLocalContractReturns['verify_delete(address,byte[])void'] + }> + & Record<'verify_exists(address,byte[])bool' | 'verify_exists', { + argsObj: StateAppLocalContractArgs['obj']['verify_exists(address,byte[])bool'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_exists(address,byte[])bool'] + returns: StateAppLocalContractReturns['verify_exists(address,byte[])bool'] + }> + & Record<'verify_put_uint64(address,byte[],uint64)void' | 'verify_put_uint64', { + argsObj: StateAppLocalContractArgs['obj']['verify_put_uint64(address,byte[],uint64)void'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_put_uint64(address,byte[],uint64)void'] + returns: StateAppLocalContractReturns['verify_put_uint64(address,byte[],uint64)void'] + }> + & Record<'verify_put_bytes(address,byte[],byte[])void' | 'verify_put_bytes', { + argsObj: StateAppLocalContractArgs['obj']['verify_put_bytes(address,byte[],byte[])void'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_put_bytes(address,byte[],byte[])void'] + returns: StateAppLocalContractReturns['verify_put_bytes(address,byte[],byte[])void'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + local: { + keys: { + localUint64: bigint + localBytes: BinaryState + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAppLocalContractSignatures = keyof StateAppLocalContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateAppLocalContractNonVoidMethodSignatures = keyof StateAppLocalContractTypes['methods'] extends infer T ? T extends keyof StateAppLocalContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAppLocalContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAppLocalContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAppLocalContract smart contract to the method's return type + */ +export type MethodReturn = StateAppLocalContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed local state of the application. + */ +export type LocalKeysState = StateAppLocalContractTypes['state']['local']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAppLocalContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAppLocalContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAppLocalContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppLocalContract smart contract + */ +export abstract class StateAppLocalContractParamsFactory { + /** + * Gets available optIn ABI call param factories + */ + static get optIn() { + return { + /** + * Constructs opt-in ABI call params for the StateAppLocalContract smart contract using the opt_in()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + optIn(params: CallParams): AppClientMethodCallParams { + return { + ...params, + method: 'opt_in()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + + /** + * Constructs a no op call for the verify_get_bytes(address,byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_bytes(address,byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_get_uint64(address,byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_uint64(address,byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_get_ex_bytes(address,uint64,byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetExBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_ex_bytes(address,uint64,byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_get_ex_uint64(address,uint64,byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetExUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_ex_uint64(address,uint64,byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_delete(address,byte[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyDelete(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_delete(address,byte[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_exists(address,byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExists(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_exists(address,byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_put_uint64(address,byte[],uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyPutUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_put_uint64(address,byte[],uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_put_bytes(address,byte[],byte[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyPutBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_put_bytes(address,byte[],byte[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateAppLocalContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAppLocalContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAppLocalContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAppLocalContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAppLocalContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAppLocalContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAppLocalContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAppLocalContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppLocalContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppLocalContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppLocalContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAppLocalContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAppLocalContract smart contract + */ +export class StateAppLocalContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAppLocalContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAppLocalContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAppLocalContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAppLocalContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAppLocalContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAppLocalContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAppLocalContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn params + */ + optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + return this.appClient.params.optIn(StateAppLocalContractParamsFactory.optIn.optIn(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_bytes(address,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyGetBytes(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_uint64(address,byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyGetUint64(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_bytes(address,uint64,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetExBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyGetExBytes(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_uint64(address,uint64,byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetExUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyGetExUint64(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_delete(address,byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyDelete: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyDelete(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_exists(address,byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExists: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyExists(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_put_uint64(address,byte[],uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyPutUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyPutUint64(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_put_bytes(address,byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyPutBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyPutBytes(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn transaction + */ + optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + return this.appClient.createTransaction.optIn(StateAppLocalContractParamsFactory.optIn.optIn(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_bytes(address,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyGetBytes(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_uint64(address,byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyGetUint64(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_bytes(address,uint64,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetExBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyGetExBytes(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_uint64(address,uint64,byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetExUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyGetExUint64(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_delete(address,byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyDelete: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyDelete(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_exists(address,byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExists: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyExists(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_put_uint64(address,byte[],uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyPutUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyPutUint64(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_put_bytes(address,byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyPutBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyPutBytes(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn result + */ + optIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + const result = await this.appClient.send.optIn(StateAppLocalContractParamsFactory.optIn.optIn(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['opt_in()void'])} + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_bytes(address,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyGetBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_get_bytes(address,byte[])byte[]'])} + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_uint64(address,byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyGetUint64(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_get_uint64(address,byte[])uint64'])} + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_bytes(address,uint64,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetExBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyGetExBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_get_ex_bytes(address,uint64,byte[])byte[]'])} + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_uint64(address,uint64,byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetExUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyGetExUint64(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_get_ex_uint64(address,uint64,byte[])uint64'])} + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_delete(address,byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyDelete: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyDelete(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_delete(address,byte[])void'])} + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_exists(address,byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExists: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyExists(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_exists(address,byte[])bool'])} + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_put_uint64(address,byte[],uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyPutUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyPutUint64(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_put_uint64(address,byte[],uint64)void'])} + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_put_bytes(address,byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyPutBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyPutBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_put_bytes(address,byte[],byte[])void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAppLocalContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAppLocalContract app + */ + state = { + /** + * Methods to access local state for the current StateAppLocalContract app + */ + local: (address: string | Address) => { + const encodedAddress = typeof address === 'string' ? address : encodeAddress(address.publicKey) + return { + /** + * Get all current keyed values from local state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.local(encodedAddress).getAll() + return { + localUint64: result.local_uint64, + localBytes: new BinaryStateValue(result.local_bytes), + } + }, + /** + * Get the current value of the local_uint64 key in local state + */ + localUint64: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("local_uint64")) as bigint | undefined }, + /** + * Get the current value of the local_bytes key in local state + */ + localBytes: async (): Promise => { return new BinaryStateValue((await this.appClient.state.local(encodedAddress).getValue("local_bytes")) as Uint8Array | undefined) }, + } + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAppLocalContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_get_bytes(address,byte[])byte[] method call against the StateAppLocalContract contract + */ + verifyGetBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetBytes(params))) + return this + }, + /** + * Add a verify_get_uint64(address,byte[])uint64 method call against the StateAppLocalContract contract + */ + verifyGetUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetUint64(params))) + return this + }, + /** + * Add a verify_get_ex_bytes(address,uint64,byte[])byte[] method call against the StateAppLocalContract contract + */ + verifyGetExBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetExBytes(params))) + return this + }, + /** + * Add a verify_get_ex_uint64(address,uint64,byte[])uint64 method call against the StateAppLocalContract contract + */ + verifyGetExUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetExUint64(params))) + return this + }, + /** + * Add a verify_delete(address,byte[])void method call against the StateAppLocalContract contract + */ + verifyDelete(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyDelete(params))) + return this + }, + /** + * Add a verify_exists(address,byte[])bool method call against the StateAppLocalContract contract + */ + verifyExists(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExists(params))) + return this + }, + /** + * Add a verify_put_uint64(address,byte[],uint64)void method call against the StateAppLocalContract contract + */ + verifyPutUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyPutUint64(params))) + return this + }, + /** + * Add a verify_put_bytes(address,byte[],byte[])void method call against the StateAppLocalContract contract + */ + verifyPutBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyPutBytes(params))) + return this + }, + get optIn() { + return { + optIn: (params: CallParams) => { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn.optIn(params))) + return this + }, + } + }, + /** + * Add a clear state call to the StateAppLocalContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAppLocalContractComposer + } +} +export type StateAppLocalContractComposer = { + /** + * Calls the verify_get_bytes(address,byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetBytes(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_get_bytes(address,byte[])byte[]'] | undefined]> + + /** + * Calls the verify_get_uint64(address,byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetUint64(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_get_uint64(address,byte[])uint64'] | undefined]> + + /** + * Calls the verify_get_ex_bytes(address,uint64,byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetExBytes(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_get_ex_bytes(address,uint64,byte[])byte[]'] | undefined]> + + /** + * Calls the verify_get_ex_uint64(address,uint64,byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetExUint64(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_get_ex_uint64(address,uint64,byte[])uint64'] | undefined]> + + /** + * Calls the verify_delete(address,byte[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyDelete(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_delete(address,byte[])void'] | undefined]> + + /** + * Calls the verify_exists(address,byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExists(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_exists(address,byte[])bool'] | undefined]> + + /** + * Calls the verify_put_uint64(address,byte[],uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyPutUint64(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_put_uint64(address,byte[],uint64)void'] | undefined]> + + /** + * Calls the verify_put_bytes(address,byte[],byte[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyPutBytes(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_put_bytes(address,byte[],byte[])void'] | undefined]> + + /** + * Gets available optIn methods + */ + readonly optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalContract smart contract using the opt_in()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + optIn(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['opt_in()void'] | undefined]> + } + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAppLocalContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppLocalContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAppLocalContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalExContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalExContract.ts new file mode 100644 index 0000000..53a53bd --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalExContract.ts @@ -0,0 +1,635 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAppLocalExContract","structs":{},"methods":[{"name":"opt_in","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["OptIn"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":1,"bytes":2}},"keys":{"global":{},"local":{"local_uint64":{"keyType":"AVMString","valueType":"AVMUint64","key":"bG9jYWxfdWludDY0"},"local_bytes":{"keyType":"AVMString","valueType":"AVMBytes","key":"bG9jYWxfYnl0ZXM="},"local_arc4_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"bG9jYWxfYXJjNF9ieXRlcw=="}},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNDYKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxFeENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA3CiAgICBwdXNoYnl0ZXMgMHgzMGM2ZDU4YSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2luX3JvdXRlQDUKICAgIGVycgoKbWFpbl9vcHRfaW5fcm91dGVANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgMSAvLyBPcHRJbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIG9wdF9pbgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA3OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbEV4Q29udHJhY3Qub3B0X2luW3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM2NQogICAgLy8gc2VsZi5sb2NhbF9ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IEJ5dGVzKGIiZHVtbXlfYnl0ZXNfZnJvbV9leHRlcm5hbF9jb250cmFjdCIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIHB1c2hieXRlc3MgImxvY2FsX2J5dGVzIiAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzM1ZjY2NzI2ZjZkNWY2NTc4NzQ2NTcyNmU2MTZjNWY2MzZmNmU3NDcyNjE2Mzc0CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzY2CiAgICAvLyBzZWxmLmxvY2FsX3VpbnQ2NFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IFVJbnQ2NCg5OSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgcHVzaGJ5dGVzICJsb2NhbF91aW50NjQiCiAgICBwdXNoaW50IDk5CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzY3CiAgICAvLyBzZWxmLmxvY2FsX2FyYzRfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjctMzY5CiAgICAvLyBzZWxmLmxvY2FsX2FyYzRfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoCiAgICAvLyAgICAgYiJkdW1teV9hcmM0X2J5dGVzIgogICAgLy8gKQogICAgcHVzaGJ5dGVzcyAibG9jYWxfYXJjNF9ieXRlcyIgMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAagAQwxtWKNhoAjgEAAQAxGYEBEjEYEERCAAgxGRQxGBQQQzIJggILbG9jYWxfYnl0ZXMiZHVtbXlfYnl0ZXNfZnJvbV9leHRlcm5hbF9jb250cmFjdGYyCYAMbG9jYWxfdWludDY0gWNmMgmCAhBsb2NhbF9hcmM0X2J5dGVzEgAQZHVtbXlfYXJjNF9ieXRlc2aBAUM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAppLocalExContract contract + */ +export type StateAppLocalExContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'opt_in()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'opt_in()void': [] + } +} + +/** + * The return type for each method + */ +export type StateAppLocalExContractReturns = { + 'opt_in()void': void +} + +/** + * Defines the types of available calls and state of the StateAppLocalExContract smart contract. + */ +export type StateAppLocalExContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'opt_in()void' | 'opt_in', { + argsObj: StateAppLocalExContractArgs['obj']['opt_in()void'] + argsTuple: StateAppLocalExContractArgs['tuple']['opt_in()void'] + returns: StateAppLocalExContractReturns['opt_in()void'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + local: { + keys: { + localUint64: bigint + localBytes: BinaryState + localArc4Bytes: Uint8Array + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAppLocalExContractSignatures = keyof StateAppLocalExContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAppLocalExContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAppLocalExContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAppLocalExContract smart contract to the method's return type + */ +export type MethodReturn = StateAppLocalExContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed local state of the application. + */ +export type LocalKeysState = StateAppLocalExContractTypes['state']['local']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAppLocalExContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAppLocalExContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAppLocalExContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppLocalExContract smart contract + */ +export abstract class StateAppLocalExContractParamsFactory { + /** + * Gets available optIn ABI call param factories + */ + static get optIn() { + return { + /** + * Constructs opt-in ABI call params for the StateAppLocalExContract smart contract using the opt_in()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + optIn(params: CallParams): AppClientMethodCallParams { + return { + ...params, + method: 'opt_in()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + +} + +/** + * A factory to create and deploy one or more instance of the StateAppLocalExContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAppLocalExContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAppLocalExContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAppLocalExContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAppLocalExContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAppLocalExContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAppLocalExContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAppLocalExContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppLocalExContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppLocalExContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppLocalExContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAppLocalExContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAppLocalExContract smart contract + */ +export class StateAppLocalExContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAppLocalExContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAppLocalExContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAppLocalExContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAppLocalExContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAppLocalExContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAppLocalExContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAppLocalExContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalExContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn params + */ + optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + return this.appClient.params.optIn(StateAppLocalExContractParamsFactory.optIn.optIn(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalExContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalExContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn transaction + */ + optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + return this.appClient.createTransaction.optIn(StateAppLocalExContractParamsFactory.optIn.optIn(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalExContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalExContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn result + */ + optIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + const result = await this.appClient.send.optIn(StateAppLocalExContractParamsFactory.optIn.optIn(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalExContractReturns['opt_in()void'])} + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalExContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAppLocalExContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAppLocalExContract app + */ + state = { + /** + * Methods to access local state for the current StateAppLocalExContract app + */ + local: (address: string | Address) => { + const encodedAddress = typeof address === 'string' ? address : encodeAddress(address.publicKey) + return { + /** + * Get all current keyed values from local state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.local(encodedAddress).getAll() + return { + localUint64: result.local_uint64, + localBytes: new BinaryStateValue(result.local_bytes), + localArc4Bytes: result.local_arc4_bytes, + } + }, + /** + * Get the current value of the local_uint64 key in local state + */ + localUint64: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("local_uint64")) as bigint | undefined }, + /** + * Get the current value of the local_bytes key in local state + */ + localBytes: async (): Promise => { return new BinaryStateValue((await this.appClient.state.local(encodedAddress).getValue("local_bytes")) as Uint8Array | undefined) }, + /** + * Get the current value of the local_arc4_bytes key in local state + */ + localArc4Bytes: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("local_arc4_bytes")) as Uint8Array | undefined }, + } + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAppLocalExContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + get optIn() { + return { + optIn: (params: CallParams) => { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn.optIn(params))) + return this + }, + } + }, + /** + * Add a clear state call to the StateAppLocalExContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAppLocalExContractComposer + } +} +export type StateAppLocalExContractComposer = { + /** + * Gets available optIn methods + */ + readonly optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalExContract smart contract using the opt_in()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + optIn(params?: CallParams): StateAppLocalExContractComposer<[...TReturns, StateAppLocalExContractReturns['opt_in()void'] | undefined]> + } + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalExContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAppLocalExContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppLocalExContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAppLocalExContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppParamsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppParamsContract.ts new file mode 100644 index 0000000..182a6a4 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppParamsContract.ts @@ -0,0 +1,1112 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAppParamsContract","structs":{},"methods":[{"name":"verify_app_params_get_approval_program","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_clear_state_program","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_global_num_uint","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_global_num_byte_slice","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_local_num_uint","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_local_num_byte_slice","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_extra_program_pages","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_creator","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_address","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[121,155,189,216,243,270,297,324,350],"errorMessage":"expected exists by index to match"},{"pc":[119,153,187,214,241,268,295,322,348],"errorMessage":"expected value by index to match"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzIKICAgIC8vIGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhiOWQxM2MxYiAweGU1YzNjODg5IDB4ZWU0ZTdiMmEgMHg3ZmEyMzRjYiAweDE5Zjc3NDM5IDB4OTJjNTcyYWEgMHhhZTljNmVmYiAweGUzNmVkNzA1IDB4OGM2NmE4NDIgLy8gbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYXBwcm92YWxfcHJvZ3JhbSh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbSh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV91aW50KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZSh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlcyh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvcih1aW50NjQpYWRkcmVzcyIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FkZHJlc3ModWludDY0KWFkZHJlc3MiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYXBwcm92YWxfcHJvZ3JhbSB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbSB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50IHZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV91aW50IHZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZSB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlcyB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvciB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzcwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfYXBwcm92YWxfcHJvZ3JhbVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzUKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FwcHJvdmFsX3Byb2dyYW0oYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFwcHJvdmFsUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FwcHJvdmFsX3Byb2dyYW0oX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBcHByb3ZhbFByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3OAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NsZWFyX3N0YXRlX3Byb2dyYW1bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgzCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9jbGVhcl9zdGF0ZV9wcm9ncmFtKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDbGVhclN0YXRlUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODQKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2NsZWFyX3N0YXRlX3Byb2dyYW0oX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDbGVhclN0YXRlUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjg2CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkxCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX3VpbnQoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEdsb2JhbE51bVVpbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkyCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX3VpbnQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1VaW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOTQKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5OQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfZ2xvYmFsX251bV9ieXRlX3NsaWNlKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzAwCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDEKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwMgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwNwogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfbG9jYWxfbnVtX3VpbnQoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcExvY2FsTnVtVWludAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDgKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2xvY2FsX251bV91aW50KF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1VaW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzA5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTUKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2xvY2FsX251bV9ieXRlX3NsaWNlKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2xvY2FsX251bV9ieXRlX3NsaWNlKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxOAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjMKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2V4dHJhX3Byb2dyYW1fcGFnZXMoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyNAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFwcFBhcmFtc0dldC5hcHBfZXh0cmFfcHJvZ3JhbV9wYWdlcyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzI1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjYKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NyZWF0b3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzMxCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9jcmVhdG9yKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDcmVhdG9yCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzMgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFwcFBhcmFtc0dldC5hcHBfY3JlYXRvcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzNAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMzkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FkZHJlc3MoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQwCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9hZGRyZXNzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQyCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyABASYBBBUffHUxG0EATjEZFEQxGESCCQS50TwbBOXDyIkE7k57KgR/ojTLBBn3dDkEksVyqgSunG77BONu1wUEjGaoQjYaAI4JAAkAKwBNAGgAgwCeALkA1ADuADEZFDEYFBBDNhoBF3IANhoBF3IASwNPAhJEEkRJFRZXBgJMUChMULAiQzYaARdyATYaARdyAUsDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcgI2GgEXcgJLA08CEkQSRBYoTFCwIkM2GgEXcgM2GgEXcgNLA08CEkQSRBYoTFCwIkM2GgEXcgQ2GgEXcgRLA08CEkQSRBYoTFCwIkM2GgEXcgU2GgEXcgVLA08CEkQSRBYoTFCwIkM2GgEXcgY2GgEXcgZLA08CEkQSRBYoTFCwIkM2GgEXcgc2GgEXcgdLA08CEkQSRChMULAiQzYaARdyCDYaARdyCEsDTwISRBJEKExQsCJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAppParamsContract contract + */ +export type StateAppParamsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_app_params_get_approval_program(uint64)byte[]': { + a: bigint | number + } + 'verify_app_params_get_clear_state_program(uint64)byte[]': { + a: bigint | number + } + 'verify_app_params_get_global_num_uint(uint64)uint64': { + a: bigint | number + } + 'verify_app_params_get_global_num_byte_slice(uint64)uint64': { + a: bigint | number + } + 'verify_app_params_get_local_num_uint(uint64)uint64': { + a: bigint | number + } + 'verify_app_params_get_local_num_byte_slice(uint64)uint64': { + a: bigint | number + } + 'verify_app_params_get_extra_program_pages(uint64)uint64': { + a: bigint | number + } + 'verify_app_params_get_creator(uint64)address': { + a: bigint | number + } + 'verify_app_params_get_address(uint64)address': { + a: bigint | number + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_app_params_get_approval_program(uint64)byte[]': [a: bigint | number] + 'verify_app_params_get_clear_state_program(uint64)byte[]': [a: bigint | number] + 'verify_app_params_get_global_num_uint(uint64)uint64': [a: bigint | number] + 'verify_app_params_get_global_num_byte_slice(uint64)uint64': [a: bigint | number] + 'verify_app_params_get_local_num_uint(uint64)uint64': [a: bigint | number] + 'verify_app_params_get_local_num_byte_slice(uint64)uint64': [a: bigint | number] + 'verify_app_params_get_extra_program_pages(uint64)uint64': [a: bigint | number] + 'verify_app_params_get_creator(uint64)address': [a: bigint | number] + 'verify_app_params_get_address(uint64)address': [a: bigint | number] + } +} + +/** + * The return type for each method + */ +export type StateAppParamsContractReturns = { + 'verify_app_params_get_approval_program(uint64)byte[]': Uint8Array + 'verify_app_params_get_clear_state_program(uint64)byte[]': Uint8Array + 'verify_app_params_get_global_num_uint(uint64)uint64': bigint + 'verify_app_params_get_global_num_byte_slice(uint64)uint64': bigint + 'verify_app_params_get_local_num_uint(uint64)uint64': bigint + 'verify_app_params_get_local_num_byte_slice(uint64)uint64': bigint + 'verify_app_params_get_extra_program_pages(uint64)uint64': bigint + 'verify_app_params_get_creator(uint64)address': string + 'verify_app_params_get_address(uint64)address': string +} + +/** + * Defines the types of available calls and state of the StateAppParamsContract smart contract. + */ +export type StateAppParamsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_app_params_get_approval_program(uint64)byte[]' | 'verify_app_params_get_approval_program', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_approval_program(uint64)byte[]'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_approval_program(uint64)byte[]'] + returns: StateAppParamsContractReturns['verify_app_params_get_approval_program(uint64)byte[]'] + }> + & Record<'verify_app_params_get_clear_state_program(uint64)byte[]' | 'verify_app_params_get_clear_state_program', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_clear_state_program(uint64)byte[]'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_clear_state_program(uint64)byte[]'] + returns: StateAppParamsContractReturns['verify_app_params_get_clear_state_program(uint64)byte[]'] + }> + & Record<'verify_app_params_get_global_num_uint(uint64)uint64' | 'verify_app_params_get_global_num_uint', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_global_num_uint(uint64)uint64'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_global_num_uint(uint64)uint64'] + returns: StateAppParamsContractReturns['verify_app_params_get_global_num_uint(uint64)uint64'] + }> + & Record<'verify_app_params_get_global_num_byte_slice(uint64)uint64' | 'verify_app_params_get_global_num_byte_slice', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_global_num_byte_slice(uint64)uint64'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_global_num_byte_slice(uint64)uint64'] + returns: StateAppParamsContractReturns['verify_app_params_get_global_num_byte_slice(uint64)uint64'] + }> + & Record<'verify_app_params_get_local_num_uint(uint64)uint64' | 'verify_app_params_get_local_num_uint', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_local_num_uint(uint64)uint64'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_local_num_uint(uint64)uint64'] + returns: StateAppParamsContractReturns['verify_app_params_get_local_num_uint(uint64)uint64'] + }> + & Record<'verify_app_params_get_local_num_byte_slice(uint64)uint64' | 'verify_app_params_get_local_num_byte_slice', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_local_num_byte_slice(uint64)uint64'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_local_num_byte_slice(uint64)uint64'] + returns: StateAppParamsContractReturns['verify_app_params_get_local_num_byte_slice(uint64)uint64'] + }> + & Record<'verify_app_params_get_extra_program_pages(uint64)uint64' | 'verify_app_params_get_extra_program_pages', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_extra_program_pages(uint64)uint64'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_extra_program_pages(uint64)uint64'] + returns: StateAppParamsContractReturns['verify_app_params_get_extra_program_pages(uint64)uint64'] + }> + & Record<'verify_app_params_get_creator(uint64)address' | 'verify_app_params_get_creator', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_creator(uint64)address'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_creator(uint64)address'] + returns: StateAppParamsContractReturns['verify_app_params_get_creator(uint64)address'] + }> + & Record<'verify_app_params_get_address(uint64)address' | 'verify_app_params_get_address', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_address(uint64)address'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_address(uint64)address'] + returns: StateAppParamsContractReturns['verify_app_params_get_address(uint64)address'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAppParamsContractSignatures = keyof StateAppParamsContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateAppParamsContractNonVoidMethodSignatures = keyof StateAppParamsContractTypes['methods'] extends infer T ? T extends keyof StateAppParamsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAppParamsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAppParamsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAppParamsContract smart contract to the method's return type + */ +export type MethodReturn = StateAppParamsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAppParamsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAppParamsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAppParamsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppParamsContract smart contract + */ +export abstract class StateAppParamsContractParamsFactory { + /** + * Constructs a no op call for the verify_app_params_get_approval_program(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetApprovalProgram(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_approval_program(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_clear_state_program(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetClearStateProgram(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_clear_state_program(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_global_num_uint(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetGlobalNumUint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_global_num_uint(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_global_num_byte_slice(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetGlobalNumByteSlice(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_global_num_byte_slice(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_local_num_uint(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetLocalNumUint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_local_num_uint(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_local_num_byte_slice(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetLocalNumByteSlice(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_local_num_byte_slice(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_extra_program_pages(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetExtraProgramPages(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_extra_program_pages(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_creator(uint64)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetCreator(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_creator(uint64)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_address(uint64)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetAddress(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_address(uint64)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateAppParamsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAppParamsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAppParamsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAppParamsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAppParamsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAppParamsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAppParamsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAppParamsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppParamsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppParamsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppParamsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAppParamsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAppParamsContract smart contract + */ +export class StateAppParamsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAppParamsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAppParamsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAppParamsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAppParamsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAppParamsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAppParamsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAppParamsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StateAppParamsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_approval_program(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetApprovalProgram: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetApprovalProgram(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_clear_state_program(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetClearStateProgram: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetClearStateProgram(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_uint(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetGlobalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumUint(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_byte_slice(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetGlobalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_uint(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetLocalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumUint(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_byte_slice(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetLocalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_extra_program_pages(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetExtraProgramPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetExtraProgramPages(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_creator(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetCreator: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetCreator(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_address(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetAddress: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetAddress(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StateAppParamsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_approval_program(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetApprovalProgram: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetApprovalProgram(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_clear_state_program(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetClearStateProgram: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetClearStateProgram(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_uint(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetGlobalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumUint(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_byte_slice(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetGlobalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_uint(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetLocalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumUint(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_byte_slice(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetLocalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_extra_program_pages(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetExtraProgramPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetExtraProgramPages(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_creator(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetCreator: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetCreator(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_address(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetAddress: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetAddress(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StateAppParamsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_approval_program(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetApprovalProgram: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetApprovalProgram(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_approval_program(uint64)byte[]'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_clear_state_program(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetClearStateProgram: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetClearStateProgram(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_clear_state_program(uint64)byte[]'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_uint(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetGlobalNumUint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumUint(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_global_num_uint(uint64)uint64'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_byte_slice(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetGlobalNumByteSlice: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumByteSlice(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_global_num_byte_slice(uint64)uint64'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_uint(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetLocalNumUint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumUint(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_local_num_uint(uint64)uint64'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_byte_slice(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetLocalNumByteSlice: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumByteSlice(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_local_num_byte_slice(uint64)uint64'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_extra_program_pages(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetExtraProgramPages: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetExtraProgramPages(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_extra_program_pages(uint64)uint64'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_creator(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetCreator: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetCreator(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_creator(uint64)address'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_address(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetAddress: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetAddress(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_address(uint64)address'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAppParamsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAppParamsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAppParamsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_app_params_get_approval_program(uint64)byte[] method call against the StateAppParamsContract contract + */ + verifyAppParamsGetApprovalProgram(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetApprovalProgram(params))) + return this + }, + /** + * Add a verify_app_params_get_clear_state_program(uint64)byte[] method call against the StateAppParamsContract contract + */ + verifyAppParamsGetClearStateProgram(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetClearStateProgram(params))) + return this + }, + /** + * Add a verify_app_params_get_global_num_uint(uint64)uint64 method call against the StateAppParamsContract contract + */ + verifyAppParamsGetGlobalNumUint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetGlobalNumUint(params))) + return this + }, + /** + * Add a verify_app_params_get_global_num_byte_slice(uint64)uint64 method call against the StateAppParamsContract contract + */ + verifyAppParamsGetGlobalNumByteSlice(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetGlobalNumByteSlice(params))) + return this + }, + /** + * Add a verify_app_params_get_local_num_uint(uint64)uint64 method call against the StateAppParamsContract contract + */ + verifyAppParamsGetLocalNumUint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetLocalNumUint(params))) + return this + }, + /** + * Add a verify_app_params_get_local_num_byte_slice(uint64)uint64 method call against the StateAppParamsContract contract + */ + verifyAppParamsGetLocalNumByteSlice(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetLocalNumByteSlice(params))) + return this + }, + /** + * Add a verify_app_params_get_extra_program_pages(uint64)uint64 method call against the StateAppParamsContract contract + */ + verifyAppParamsGetExtraProgramPages(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetExtraProgramPages(params))) + return this + }, + /** + * Add a verify_app_params_get_creator(uint64)address method call against the StateAppParamsContract contract + */ + verifyAppParamsGetCreator(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetCreator(params))) + return this + }, + /** + * Add a verify_app_params_get_address(uint64)address method call against the StateAppParamsContract contract + */ + verifyAppParamsGetAddress(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetAddress(params))) + return this + }, + /** + * Add a clear state call to the StateAppParamsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAppParamsContractComposer + } +} +export type StateAppParamsContractComposer = { + /** + * Calls the verify_app_params_get_approval_program(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetApprovalProgram(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_approval_program(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_app_params_get_clear_state_program(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetClearStateProgram(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_clear_state_program(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_app_params_get_global_num_uint(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetGlobalNumUint(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_global_num_uint(uint64)uint64'] | undefined]> + + /** + * Calls the verify_app_params_get_global_num_byte_slice(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetGlobalNumByteSlice(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_global_num_byte_slice(uint64)uint64'] | undefined]> + + /** + * Calls the verify_app_params_get_local_num_uint(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetLocalNumUint(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_local_num_uint(uint64)uint64'] | undefined]> + + /** + * Calls the verify_app_params_get_local_num_byte_slice(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetLocalNumByteSlice(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_local_num_byte_slice(uint64)uint64'] | undefined]> + + /** + * Calls the verify_app_params_get_extra_program_pages(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetExtraProgramPages(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_extra_program_pages(uint64)uint64'] | undefined]> + + /** + * Calls the verify_app_params_get_creator(uint64)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetCreator(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_creator(uint64)address'] | undefined]> + + /** + * Calls the verify_app_params_get_address(uint64)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetAddress(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_address(uint64)address'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the StateAppParamsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAppParamsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppParamsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAppParamsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetHoldingContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetHoldingContract.ts new file mode 100644 index 0000000..c46961a --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetHoldingContract.ts @@ -0,0 +1,631 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAssetHoldingContract","structs":{},"methods":[{"name":"verify_asset_holding_get","args":[{"type":"address","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_frozen_get","args":[{"type":"address","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gY2xhc3MgU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4OGY1MjM1YjQgMHhkZTdhMzlmNiAvLyBtZXRob2QgInZlcmlmeV9hc3NldF9ob2xkaW5nX2dldChhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hc3NldF9mcm96ZW5fZ2V0KGFkZHJlc3MsdWludDY0KWJvb2wiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXQgdmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXQKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdC52ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2NQogICAgLy8gYmFsYW5jZSwgX3ZhbCA9IG9wLkFzc2V0SG9sZGluZ0dldC5hc3NldF9iYWxhbmNlKGEsIGIpCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRIb2xkaW5nQ29udHJhY3QudmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfZnJvemVuX2dldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcwCiAgICAvLyBmcm96ZW4sIF92YWwgPSBvcC5Bc3NldEhvbGRpbmdHZXQuYXNzZXRfZnJvemVuKGEsIGIpCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEZyb3plbgogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIHB1c2hpbnQgMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyYBBBUffHUxG0EAHTEZFEQxGESCAgSPUjW0BN56OfY2GgCOAgAJABsAMRkUMRgUEEM2GgE2GgIXcABIFihMULCBAUM2GgE2GgIXcAFIgAEAgQBPAlQoTFCwgQFD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAssetHoldingContract contract + */ +export type StateAssetHoldingContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_asset_holding_get(address,uint64)uint64': { + a: string + b: bigint | number + } + 'verify_asset_frozen_get(address,uint64)bool': { + a: string + b: bigint | number + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_asset_holding_get(address,uint64)uint64': [a: string, b: bigint | number] + 'verify_asset_frozen_get(address,uint64)bool': [a: string, b: bigint | number] + } +} + +/** + * The return type for each method + */ +export type StateAssetHoldingContractReturns = { + 'verify_asset_holding_get(address,uint64)uint64': bigint + 'verify_asset_frozen_get(address,uint64)bool': boolean +} + +/** + * Defines the types of available calls and state of the StateAssetHoldingContract smart contract. + */ +export type StateAssetHoldingContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_asset_holding_get(address,uint64)uint64' | 'verify_asset_holding_get', { + argsObj: StateAssetHoldingContractArgs['obj']['verify_asset_holding_get(address,uint64)uint64'] + argsTuple: StateAssetHoldingContractArgs['tuple']['verify_asset_holding_get(address,uint64)uint64'] + returns: StateAssetHoldingContractReturns['verify_asset_holding_get(address,uint64)uint64'] + }> + & Record<'verify_asset_frozen_get(address,uint64)bool' | 'verify_asset_frozen_get', { + argsObj: StateAssetHoldingContractArgs['obj']['verify_asset_frozen_get(address,uint64)bool'] + argsTuple: StateAssetHoldingContractArgs['tuple']['verify_asset_frozen_get(address,uint64)bool'] + returns: StateAssetHoldingContractReturns['verify_asset_frozen_get(address,uint64)bool'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAssetHoldingContractSignatures = keyof StateAssetHoldingContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateAssetHoldingContractNonVoidMethodSignatures = keyof StateAssetHoldingContractTypes['methods'] extends infer T ? T extends keyof StateAssetHoldingContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAssetHoldingContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAssetHoldingContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAssetHoldingContract smart contract to the method's return type + */ +export type MethodReturn = StateAssetHoldingContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAssetHoldingContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAssetHoldingContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAssetHoldingContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAssetHoldingContract smart contract + */ +export abstract class StateAssetHoldingContractParamsFactory { + /** + * Constructs a no op call for the verify_asset_holding_get(address,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetHoldingGet(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_holding_get(address,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_asset_frozen_get(address,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetFrozenGet(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_frozen_get(address,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateAssetHoldingContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAssetHoldingContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAssetHoldingContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAssetHoldingContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAssetHoldingContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAssetHoldingContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAssetHoldingContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAssetHoldingContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAssetHoldingContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAssetHoldingContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAssetHoldingContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAssetHoldingContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAssetHoldingContract smart contract + */ +export class StateAssetHoldingContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAssetHoldingContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAssetHoldingContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAssetHoldingContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAssetHoldingContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAssetHoldingContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAssetHoldingContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAssetHoldingContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StateAssetHoldingContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_holding_get(address,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetHoldingGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetHoldingContractParamsFactory.verifyAssetHoldingGet(params)) + }, + + /** + * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_frozen_get(address,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetFrozenGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetHoldingContractParamsFactory.verifyAssetFrozenGet(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StateAssetHoldingContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_holding_get(address,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetHoldingGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetHoldingContractParamsFactory.verifyAssetHoldingGet(params)) + }, + + /** + * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_frozen_get(address,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetFrozenGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetHoldingContractParamsFactory.verifyAssetFrozenGet(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StateAssetHoldingContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_holding_get(address,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetHoldingGet: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetHoldingContractParamsFactory.verifyAssetHoldingGet(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetHoldingContractReturns['verify_asset_holding_get(address,uint64)uint64'])} + }, + + /** + * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_frozen_get(address,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetFrozenGet: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetHoldingContractParamsFactory.verifyAssetFrozenGet(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetHoldingContractReturns['verify_asset_frozen_get(address,uint64)bool'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAssetHoldingContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAssetHoldingContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAssetHoldingContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_asset_holding_get(address,uint64)uint64 method call against the StateAssetHoldingContract contract + */ + verifyAssetHoldingGet(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetHoldingGet(params))) + return this + }, + /** + * Add a verify_asset_frozen_get(address,uint64)bool method call against the StateAssetHoldingContract contract + */ + verifyAssetFrozenGet(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetFrozenGet(params))) + return this + }, + /** + * Add a clear state call to the StateAssetHoldingContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAssetHoldingContractComposer + } +} +export type StateAssetHoldingContractComposer = { + /** + * Calls the verify_asset_holding_get(address,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetHoldingGet(params?: CallParams): StateAssetHoldingContractComposer<[...TReturns, StateAssetHoldingContractReturns['verify_asset_holding_get(address,uint64)uint64'] | undefined]> + + /** + * Calls the verify_asset_frozen_get(address,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetFrozenGet(params?: CallParams): StateAssetHoldingContractComposer<[...TReturns, StateAssetHoldingContractReturns['verify_asset_frozen_get(address,uint64)bool'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the StateAssetHoldingContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAssetHoldingContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAssetHoldingContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAssetHoldingContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetParamsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetParamsContract.ts new file mode 100644 index 0000000..b627ecf --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetParamsContract.ts @@ -0,0 +1,1319 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAssetParamsContract","structs":{},"methods":[{"name":"verify_asset_params_get_total","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_decimals","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_default_frozen","args":[{"type":"uint64","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_unit_name","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_name","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_url","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_metadata_hash","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_manager","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_reserve","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_freeze","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_clawback","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_creator","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[142,169,196,230,264,298,332,366,392,418,444,470],"errorMessage":"expected exists by index to match"},{"pc":[140,167,194,228,262,296,330,364,390,416,442,468],"errorMessage":"expected value by index to match"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzQKICAgIC8vIGNsYXNzIFN0YXRlQXNzZXRQYXJhbXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGYwNWRhN2E0IDB4YzBlOWMzMTUgMHhkODUyODI3MyAweGY0NDY4YWQ5IDB4MjI5ZDEyZjcgMHhkZjUzNGY3YiAweGUwNTBiNWE5IDB4OGIyYTJkNTggMHhlZTE1YzRmNyAweDE1NzU0NGZmIDB4MTA0OTJjMDcgMHg1MjI5ZmEzNyAvLyBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3RvdGFsKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlY2ltYWxzKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlZmF1bHRfZnJvemVuKHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWUodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbmFtZSh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmwodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaCh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyKHVpbnQ2NClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9yZXNlcnZlKHVpbnQ2NClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemUodWludDY0KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NsYXdiYWNrKHVpbnQ2NClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jcmVhdG9yKHVpbnQ2NClhZGRyZXNzIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWwgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVjaW1hbHMgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVmYXVsdF9mcm96ZW4gdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdW5pdF9uYW1lIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X25hbWUgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdXJsIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21ldGFkYXRhX2hhc2ggdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWFuYWdlciB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9yZXNlcnZlIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2ZyZWV6ZSB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jbGF3YmFjayB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jcmVhdG9yCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF90b3RhbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTc3CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfdG90YWwoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzgKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF90b3RhbChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3OQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTgwCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVjaW1hbHNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWNpbWFsczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTg1CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfZGVjaW1hbHMoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9kZWNpbWFscyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVmYXVsdF9mcm96ZW5bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTkzCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfZGVmYXVsdF9mcm96ZW4oYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWZhdWx0RnJvemVuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2RlZmF1bHRfZnJvemVuKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlZmF1bHRGcm96ZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxOTUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHB1c2hieXRlcyAweDAwCiAgICBwdXNoaW50IDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3VuaXRfbmFtZShhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3VuaXRfbmFtZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjA0CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X25hbWVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9uYW1lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9uYW1lKGEpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTAKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9uYW1lKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTEKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxMgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmw6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxNwogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3VybChhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTgKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF91cmwoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjE5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21ldGFkYXRhX2hhc2g6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X21ldGFkYXRhX2hhc2goYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNZXRhZGF0YUhhc2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjI2CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbWV0YWRhdGFfaGFzaChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNZXRhZGF0YUhhc2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWFuYWdlcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjMzCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbWFuYWdlcihhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1hbmFnZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjM0CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbWFuYWdlcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjM1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzYKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9yZXNlcnZlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfcmVzZXJ2ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQxCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfcmVzZXJ2ZShhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFJlc2VydmUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQyCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfcmVzZXJ2ZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRSZXNlcnZlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDQKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2ZyZWV6ZShhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldEZyZWV6ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTAKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9mcmVlemUoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTIKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jbGF3YmFja1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NsYXdiYWNrOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTcKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9jbGF3YmFjayhhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NsYXdiYWNrKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjU5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jcmVhdG9yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY3JlYXRvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjY1CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjY2CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjY3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjgKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyABASYBBBUffHUxG0EAYzEZFEQxGESCDATwXaekBMDpwxUE2FKCcwT0RorZBCKdEvcE31NPewTgULWpBIsqLVgE7hXE9wQVdUT/BBBJLAcEUin6NzYaAI4MAAkAJAA/AGEAgwClAMcA6QEDAR0BNwFRADEZFDEYFBBDNhoBF3EANhoBF3EASwNPAhJEEkQWKExQsCJDNhoBF3EBNhoBF3EBSwNPAhJEEkQWKExQsCJDNhoBF3ECNhoBF3ECSwNPAhJEEkSAAQCBAE8CVChMULAiQzYaARdxAzYaARdxA0sDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcQQ2GgEXcQRLA08CEkQSREkVFlcGAkxQKExQsCJDNhoBF3EFNhoBF3EFSwNPAhJEEkRJFRZXBgJMUChMULAiQzYaARdxBjYaARdxBksDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcQc2GgEXcQdLA08CEkQSRChMULAiQzYaARdxCDYaARdxCEsDTwISRBJEKExQsCJDNhoBF3EJNhoBF3EJSwNPAhJEEkQoTFCwIkM2GgEXcQo2GgEXcQpLA08CEkQSRChMULAiQzYaARdxCzYaARdxC0sDTwISRBJEKExQsCJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAssetParamsContract contract + */ +export type StateAssetParamsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_asset_params_get_total(uint64)uint64': { + a: bigint | number + } + 'verify_asset_params_get_decimals(uint64)uint64': { + a: bigint | number + } + 'verify_asset_params_get_default_frozen(uint64)bool': { + a: bigint | number + } + 'verify_asset_params_get_unit_name(uint64)byte[]': { + a: bigint | number + } + 'verify_asset_params_get_name(uint64)byte[]': { + a: bigint | number + } + 'verify_asset_params_get_url(uint64)byte[]': { + a: bigint | number + } + 'verify_asset_params_get_metadata_hash(uint64)byte[]': { + a: bigint | number + } + 'verify_asset_params_get_manager(uint64)address': { + a: bigint | number + } + 'verify_asset_params_get_reserve(uint64)address': { + a: bigint | number + } + 'verify_asset_params_get_freeze(uint64)address': { + a: bigint | number + } + 'verify_asset_params_get_clawback(uint64)address': { + a: bigint | number + } + 'verify_asset_params_get_creator(uint64)address': { + a: bigint | number + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_asset_params_get_total(uint64)uint64': [a: bigint | number] + 'verify_asset_params_get_decimals(uint64)uint64': [a: bigint | number] + 'verify_asset_params_get_default_frozen(uint64)bool': [a: bigint | number] + 'verify_asset_params_get_unit_name(uint64)byte[]': [a: bigint | number] + 'verify_asset_params_get_name(uint64)byte[]': [a: bigint | number] + 'verify_asset_params_get_url(uint64)byte[]': [a: bigint | number] + 'verify_asset_params_get_metadata_hash(uint64)byte[]': [a: bigint | number] + 'verify_asset_params_get_manager(uint64)address': [a: bigint | number] + 'verify_asset_params_get_reserve(uint64)address': [a: bigint | number] + 'verify_asset_params_get_freeze(uint64)address': [a: bigint | number] + 'verify_asset_params_get_clawback(uint64)address': [a: bigint | number] + 'verify_asset_params_get_creator(uint64)address': [a: bigint | number] + } +} + +/** + * The return type for each method + */ +export type StateAssetParamsContractReturns = { + 'verify_asset_params_get_total(uint64)uint64': bigint + 'verify_asset_params_get_decimals(uint64)uint64': bigint + 'verify_asset_params_get_default_frozen(uint64)bool': boolean + 'verify_asset_params_get_unit_name(uint64)byte[]': Uint8Array + 'verify_asset_params_get_name(uint64)byte[]': Uint8Array + 'verify_asset_params_get_url(uint64)byte[]': Uint8Array + 'verify_asset_params_get_metadata_hash(uint64)byte[]': Uint8Array + 'verify_asset_params_get_manager(uint64)address': string + 'verify_asset_params_get_reserve(uint64)address': string + 'verify_asset_params_get_freeze(uint64)address': string + 'verify_asset_params_get_clawback(uint64)address': string + 'verify_asset_params_get_creator(uint64)address': string +} + +/** + * Defines the types of available calls and state of the StateAssetParamsContract smart contract. + */ +export type StateAssetParamsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_asset_params_get_total(uint64)uint64' | 'verify_asset_params_get_total', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_total(uint64)uint64'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_total(uint64)uint64'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_total(uint64)uint64'] + }> + & Record<'verify_asset_params_get_decimals(uint64)uint64' | 'verify_asset_params_get_decimals', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_decimals(uint64)uint64'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_decimals(uint64)uint64'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_decimals(uint64)uint64'] + }> + & Record<'verify_asset_params_get_default_frozen(uint64)bool' | 'verify_asset_params_get_default_frozen', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_default_frozen(uint64)bool'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_default_frozen(uint64)bool'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_default_frozen(uint64)bool'] + }> + & Record<'verify_asset_params_get_unit_name(uint64)byte[]' | 'verify_asset_params_get_unit_name', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_unit_name(uint64)byte[]'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_unit_name(uint64)byte[]'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_unit_name(uint64)byte[]'] + }> + & Record<'verify_asset_params_get_name(uint64)byte[]' | 'verify_asset_params_get_name', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_name(uint64)byte[]'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_name(uint64)byte[]'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_name(uint64)byte[]'] + }> + & Record<'verify_asset_params_get_url(uint64)byte[]' | 'verify_asset_params_get_url', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_url(uint64)byte[]'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_url(uint64)byte[]'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_url(uint64)byte[]'] + }> + & Record<'verify_asset_params_get_metadata_hash(uint64)byte[]' | 'verify_asset_params_get_metadata_hash', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_metadata_hash(uint64)byte[]'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_metadata_hash(uint64)byte[]'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_metadata_hash(uint64)byte[]'] + }> + & Record<'verify_asset_params_get_manager(uint64)address' | 'verify_asset_params_get_manager', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_manager(uint64)address'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_manager(uint64)address'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_manager(uint64)address'] + }> + & Record<'verify_asset_params_get_reserve(uint64)address' | 'verify_asset_params_get_reserve', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_reserve(uint64)address'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_reserve(uint64)address'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_reserve(uint64)address'] + }> + & Record<'verify_asset_params_get_freeze(uint64)address' | 'verify_asset_params_get_freeze', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_freeze(uint64)address'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_freeze(uint64)address'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_freeze(uint64)address'] + }> + & Record<'verify_asset_params_get_clawback(uint64)address' | 'verify_asset_params_get_clawback', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_clawback(uint64)address'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_clawback(uint64)address'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_clawback(uint64)address'] + }> + & Record<'verify_asset_params_get_creator(uint64)address' | 'verify_asset_params_get_creator', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_creator(uint64)address'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_creator(uint64)address'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_creator(uint64)address'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAssetParamsContractSignatures = keyof StateAssetParamsContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateAssetParamsContractNonVoidMethodSignatures = keyof StateAssetParamsContractTypes['methods'] extends infer T ? T extends keyof StateAssetParamsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAssetParamsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAssetParamsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAssetParamsContract smart contract to the method's return type + */ +export type MethodReturn = StateAssetParamsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAssetParamsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAssetParamsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAssetParamsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAssetParamsContract smart contract + */ +export abstract class StateAssetParamsContractParamsFactory { + /** + * Constructs a no op call for the verify_asset_params_get_total(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetTotal(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_total(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_decimals(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetDecimals(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_decimals(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_default_frozen(uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetDefaultFrozen(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_default_frozen(uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_unit_name(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetUnitName(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_unit_name(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_name(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetName(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_name(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_url(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetUrl(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_url(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_metadata_hash(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetMetadataHash(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_metadata_hash(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_manager(uint64)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetManager(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_manager(uint64)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_reserve(uint64)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetReserve(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_reserve(uint64)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_freeze(uint64)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetFreeze(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_freeze(uint64)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_clawback(uint64)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetClawback(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_clawback(uint64)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_creator(uint64)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetCreator(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_creator(uint64)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateAssetParamsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAssetParamsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAssetParamsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAssetParamsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAssetParamsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAssetParamsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAssetParamsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAssetParamsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAssetParamsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAssetParamsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAssetParamsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAssetParamsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAssetParamsContract smart contract + */ +export class StateAssetParamsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAssetParamsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAssetParamsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAssetParamsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAssetParamsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAssetParamsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAssetParamsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAssetParamsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StateAssetParamsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_total(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetTotal: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetTotal(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_decimals(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetDecimals: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDecimals(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_default_frozen(uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetDefaultFrozen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDefaultFrozen(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_unit_name(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetUnitName: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUnitName(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_name(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetName: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetName(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_url(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetUrl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUrl(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_metadata_hash(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetMetadataHash: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetMetadataHash(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_manager(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetManager: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetManager(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_reserve(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetReserve: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetReserve(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_freeze(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetFreeze: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetFreeze(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_clawback(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetClawback: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetClawback(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_creator(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetCreator: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetCreator(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StateAssetParamsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_total(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetTotal: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetTotal(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_decimals(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetDecimals: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDecimals(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_default_frozen(uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetDefaultFrozen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDefaultFrozen(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_unit_name(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetUnitName: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUnitName(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_name(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetName: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetName(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_url(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetUrl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUrl(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_metadata_hash(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetMetadataHash: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetMetadataHash(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_manager(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetManager: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetManager(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_reserve(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetReserve: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetReserve(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_freeze(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetFreeze: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetFreeze(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_clawback(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetClawback: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetClawback(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_creator(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetCreator: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetCreator(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StateAssetParamsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_total(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetTotal: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetTotal(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_total(uint64)uint64'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_decimals(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetDecimals: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDecimals(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_decimals(uint64)uint64'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_default_frozen(uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetDefaultFrozen: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDefaultFrozen(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_default_frozen(uint64)bool'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_unit_name(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetUnitName: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUnitName(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_unit_name(uint64)byte[]'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_name(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetName: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetName(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_name(uint64)byte[]'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_url(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetUrl: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUrl(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_url(uint64)byte[]'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_metadata_hash(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetMetadataHash: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetMetadataHash(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_metadata_hash(uint64)byte[]'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_manager(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetManager: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetManager(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_manager(uint64)address'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_reserve(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetReserve: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetReserve(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_reserve(uint64)address'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_freeze(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetFreeze: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetFreeze(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_freeze(uint64)address'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_clawback(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetClawback: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetClawback(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_clawback(uint64)address'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_creator(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetCreator: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetCreator(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_creator(uint64)address'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAssetParamsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAssetParamsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAssetParamsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_asset_params_get_total(uint64)uint64 method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetTotal(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetTotal(params))) + return this + }, + /** + * Add a verify_asset_params_get_decimals(uint64)uint64 method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetDecimals(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetDecimals(params))) + return this + }, + /** + * Add a verify_asset_params_get_default_frozen(uint64)bool method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetDefaultFrozen(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetDefaultFrozen(params))) + return this + }, + /** + * Add a verify_asset_params_get_unit_name(uint64)byte[] method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetUnitName(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetUnitName(params))) + return this + }, + /** + * Add a verify_asset_params_get_name(uint64)byte[] method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetName(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetName(params))) + return this + }, + /** + * Add a verify_asset_params_get_url(uint64)byte[] method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetUrl(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetUrl(params))) + return this + }, + /** + * Add a verify_asset_params_get_metadata_hash(uint64)byte[] method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetMetadataHash(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetMetadataHash(params))) + return this + }, + /** + * Add a verify_asset_params_get_manager(uint64)address method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetManager(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetManager(params))) + return this + }, + /** + * Add a verify_asset_params_get_reserve(uint64)address method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetReserve(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetReserve(params))) + return this + }, + /** + * Add a verify_asset_params_get_freeze(uint64)address method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetFreeze(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetFreeze(params))) + return this + }, + /** + * Add a verify_asset_params_get_clawback(uint64)address method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetClawback(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetClawback(params))) + return this + }, + /** + * Add a verify_asset_params_get_creator(uint64)address method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetCreator(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetCreator(params))) + return this + }, + /** + * Add a clear state call to the StateAssetParamsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAssetParamsContractComposer + } +} +export type StateAssetParamsContractComposer = { + /** + * Calls the verify_asset_params_get_total(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetTotal(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_total(uint64)uint64'] | undefined]> + + /** + * Calls the verify_asset_params_get_decimals(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetDecimals(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_decimals(uint64)uint64'] | undefined]> + + /** + * Calls the verify_asset_params_get_default_frozen(uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetDefaultFrozen(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_default_frozen(uint64)bool'] | undefined]> + + /** + * Calls the verify_asset_params_get_unit_name(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetUnitName(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_unit_name(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_asset_params_get_name(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetName(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_name(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_asset_params_get_url(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetUrl(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_url(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_asset_params_get_metadata_hash(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetMetadataHash(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_metadata_hash(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_asset_params_get_manager(uint64)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetManager(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_manager(uint64)address'] | undefined]> + + /** + * Calls the verify_asset_params_get_reserve(uint64)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetReserve(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_reserve(uint64)address'] | undefined]> + + /** + * Calls the verify_asset_params_get_freeze(uint64)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetFreeze(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_freeze(uint64)address'] | undefined]> + + /** + * Calls the verify_asset_params_get_clawback(uint64)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetClawback(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_clawback(uint64)address'] | undefined]> + + /** + * Calls the verify_asset_params_get_creator(uint64)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetCreator(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_creator(uint64)address'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the StateAssetParamsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAssetParamsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAssetParamsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAssetParamsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateMutations.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateMutations.ts new file mode 100644 index 0000000..01c58bc --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateMutations.ts @@ -0,0 +1,880 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateMutations","structs":{},"methods":[{"name":"append","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"modify","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get","args":[],"returns":{"type":"(uint64,string)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":3},"local":{"ints":0,"bytes":1}},"keys":{"global":{"no_proxy":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"bm9fcHJveHk="},"glob_assign":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"Z2xvYl9hc3NpZ24="},"glob":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"Z2xvYg=="}},"local":{"loc":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"bG9j"}},"box":{"box":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"Ym94"}}},"maps":{"global":{},"local":{},"box":{"map":{"keyType":"address","valueType":"(uint64,string)[]","prefix":"bWFw"}}}},"bareActions":{"create":["NoOp"],"call":["OptIn"]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[526,795,931],"errorMessage":"check self.box exists"},{"pc":[481,684,921],"errorMessage":"check self.glob exists"},{"pc":[440,577,916],"errorMessage":"check self.glob_assign exists"},{"pc":[506,742,928],"errorMessage":"check self.loc exists for account"},{"pc":[553,855,938],"errorMessage":"check self.map entry exists"},{"pc":[460,630,912],"errorMessage":"check self.no_proxy exists"},{"pc":[962],"errorMessage":"expected box == no_proxy"},{"pc":[950],"errorMessage":"expected global == no_proxy"},{"pc":[944],"errorMessage":"expected global assign == no_proxy"},{"pc":[956],"errorMessage":"expected local == no_proxy"},{"pc":[966],"errorMessage":"expected map == no_proxy"},{"pc":[593,619,646,672,700,726,758,784,811,837,871,897],"errorMessage":"index access is out of bounds"},{"pc":[585,638,692,750,803,863],"errorMessage":"invalid array length header"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA4CiAgICBieXRlY2Jsb2NrICJib3giICJub19wcm94eSIgMHgwMDAwICJnbG9iX2Fzc2lnbiIgImdsb2IiICJsb2MiIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YSAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0ICJtYXAiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MjQKICAgIC8vIHNlbGYubm9fcHJveHkgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weToyMgogICAgLy8gY2xhc3MgU3RhdGVNdXRhdGlvbnMoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AxMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NTI2ZThiYmYgMHg5NWZlZjEzZCAweDBjMjk0NDRiIC8vIG1ldGhvZCAiYXBwZW5kKCl2b2lkIiwgbWV0aG9kICJtb2RpZnkoKXZvaWQiLCBtZXRob2QgImdldCgpKHVpbnQ2NCxzdHJpbmcpW10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhcHBlbmQgbW9kaWZ5IGdldAogICAgZXJyCgptYWluX2JhcmVfcm91dGluZ0AxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weToyMgogICAgLy8gY2xhc3MgU3RhdGVNdXRhdGlvbnMoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHN3aXRjaCBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDEzIG1haW5fb3B0X2luQDE0CiAgICBlcnIKCm1haW5fb3B0X2luQDE0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMxCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18zIC8vICJnbG9iX2Fzc2lnbiIKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM0CiAgICAvLyBzZWxmLmdsb2IudmFsdWUgPSBNeUFycmF5KCkKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzMKICAgIC8vIHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzQKICAgIC8vIHNlbGYuZ2xvYi52YWx1ZSA9IE15QXJyYXkoKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNQogICAgLy8gc2VsZi5ib3gudmFsdWUgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM1CiAgICAvLyBzZWxmLmJveC52YWx1ZSA9IE15QXJyYXkoKQogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM2CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgdHhuIFNlbmRlcgogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM2CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM3CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM3CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMxCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMzoKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQoYXJyYXlfaXRlbXNfY291bnQ6IHVpbnQ2NCwgYXJyYXlfaGVhZF9hbmRfdGFpbDogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0LCBuZXdfaGVhZF9hbmRfdGFpbDogYnl0ZXMpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQ6CiAgICBwcm90byA0IDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzAgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQoc291cmNlOiBieXRlcywgbmV3X2l0ZW06IGJ5dGVzLCBpbmRleDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBzdWJzdHJpbmcgMCAyCiAgICBkdXAKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAyCiAgICBkaWcgMQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA1CiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZHVwCiAgICBkaWcgNAogICAgLQogICAgY292ZXIgNgogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGNvdmVyIDYKICAgIGRpZyA0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA1CiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgc3dhcAoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDUKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgMgogICAgc3dhcAogICAgcmVwbGFjZTMKICAgIGZyYW1lX2J1cnkgMwogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNQogICAgYiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU11dGF0aW9ucy5zdGF0ZW11dGF0aW9ucy5TdGF0ZU11dGF0aW9ucy5hcHBlbmRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBlbmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDIKICAgIC8vIGFyciA9IHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUuY29weSgpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYl9hc3NpZ24gZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDMKICAgIC8vIGFyci5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIGJ5dGVjIDYgLy8gMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMGEwMDAzNjI2MTdhCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ1CiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gYXJyLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ2CiAgICAvLyBzZWxmLm5vX3Byb3h5LmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vX3Byb3h5IGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQzCiAgICAvLyBhcnIuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBieXRlYyA2IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ2CiAgICAvLyBzZWxmLm5vX3Byb3h5LmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0NwogICAgLy8gc2VsZi5nbG9iLnZhbHVlLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYiBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0NwogICAgLy8gc2VsZi5nbG9iLnZhbHVlLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ4CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImxvYyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxvYyBleGlzdHMgZm9yIGFjY291bnQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0OAogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl0uYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgc3dhcAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ5CiAgICAvLyBzZWxmLmJveC52YWx1ZS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveCBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0OQogICAgLy8gc2VsZi5ib3gudmFsdWUuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18wIC8vICJib3giCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTAKICAgIC8vIHNlbGYubWFwW1R4bi5zZW5kZXJdLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hcCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1MAogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0uYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVNdXRhdGlvbnMuc3RhdGVtdXRhdGlvbnMuU3RhdGVNdXRhdGlvbnMubW9kaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKbW9kaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU2CiAgICAvLyBhcnIgPSBzZWxmLmdsb2JfYXNzaWduLnZhbHVlLmNvcHkoKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImdsb2JfYXNzaWduIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JfYXNzaWduIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU3CiAgICAvLyBhcnJbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NwogICAgLy8gYXJyWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU4CiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gYXJyLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYwCiAgICAvLyBzZWxmLm5vX3Byb3h5WzBdLmJheiA9IG1vZGlmaWVkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAibm9fcHJveHkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9fcHJveHkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NAogICAgLy8gbW9kaWZpZWQgPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgYnl0ZWMgNyAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjAKICAgIC8vIHNlbGYubm9fcHJveHlbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGNvbmNhdAogICAgc3dhcAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBieXRlY18xIC8vICJub19wcm94eSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjEKICAgIC8vIHNlbGYuZ2xvYi52YWx1ZVswXS5iYXogPSBtb2RpZmllZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYiBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MQogICAgLy8gc2VsZi5nbG9iLnZhbHVlWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNCAvLyAiZ2xvYiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjIKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdWzBdLmJheiA9IG1vZGlmaWVkCiAgICB0eG4gU2VuZGVyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJsb2MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sb2MgZXhpc3RzIGZvciBhY2NvdW50CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NAogICAgLy8gbW9kaWZpZWQgPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgYnl0ZWMgNyAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjIKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgc3dhcAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYzCiAgICAvLyBzZWxmLmJveC52YWx1ZVswXS5iYXogPSBtb2RpZmllZAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTQKICAgIC8vIG1vZGlmaWVkID0gYXJjNC5TdHJpbmcoIm1vZGlmaWVkIikKICAgIGJ5dGVjIDcgLy8gMHgwMDA4NmQ2ZjY0Njk2NjY5NjU2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYzCiAgICAvLyBzZWxmLmJveC52YWx1ZVswXS5iYXogPSBtb2RpZmllZAogICAgY29uY2F0CiAgICBzd2FwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjY0CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXVswXS5iYXogPSBtb2RpZmllZAogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hcCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2NAogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl1bMF0uYmF6ID0gbW9kaWZpZWQKICAgIGNvbmNhdAogICAgc3dhcAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU11dGF0aW9ucy5zdGF0ZW11dGF0aW9ucy5TdGF0ZU11dGF0aW9ucy5nZXRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjgKICAgIC8vIGEwID0gc2VsZi5ub19wcm94eS5jb3B5KCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJub19wcm94eSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub19wcm94eSBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2OQogICAgLy8gYTEgPSBzZWxmLmdsb2JfYXNzaWduLnZhbHVlLmNvcHkoKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImdsb2JfYXNzaWduIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JfYXNzaWduIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjcwCiAgICAvLyBhMiA9IHNlbGYuZ2xvYi52YWx1ZS5jb3B5KCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJnbG9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2IgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzEKICAgIC8vIGEzID0gc2VsZi5sb2NbVHhuLnNlbmRlcl0uY29weSgpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubG9jIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjcyCiAgICAvLyBhNCA9IHNlbGYuYm94LnZhbHVlLmNvcHkoKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjczCiAgICAvLyBhNSA9IHNlbGYubWFwW1R4bi5zZW5kZXJdLmNvcHkoKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXAgZW50cnkgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzUKICAgIC8vIGFzc2VydCBhMCA9PSBhMSwgImV4cGVjdGVkIGdsb2JhbCBhc3NpZ24gPT0gbm9fcHJveHkiCiAgICBkaWcgNQogICAgdW5jb3ZlciA1CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGdsb2JhbCBhc3NpZ24gPT0gbm9fcHJveHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3NgogICAgLy8gYXNzZXJ0IGEwID09IGEyLCAiZXhwZWN0ZWQgZ2xvYmFsID09IG5vX3Byb3h5IgogICAgZGlnIDQKICAgIHVuY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgPT0gbm9fcHJveHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3NwogICAgLy8gYXNzZXJ0IGEwID09IGEzLCAiZXhwZWN0ZWQgbG9jYWwgPT0gbm9fcHJveHkiCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxvY2FsID09IG5vX3Byb3h5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzgKICAgIC8vIGFzc2VydCBhMCA9PSBhNCwgImV4cGVjdGVkIGJveCA9PSBub19wcm94eSIKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYm94ID09IG5vX3Byb3h5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzkKICAgIC8vIGFzc2VydCBhMCA9PSBhNSwgImV4cGVjdGVkIG1hcCA9PSBub19wcm94eSIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG1hcCA9PSBub19wcm94eQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAAECCCYJA2JveAhub19wcm94eQIAAAtnbG9iX2Fzc2lnbgRnbG9iA2xvYxEAAgAAAAAAAAABAAoAA2JhegoACG1vZGlmaWVkA21hcDEYQAADKSpnMRtBACQxGRREMRhEggMEUm6LvwSV/vE9BAwpREs2GgCOAwE2Ab8DDgAxGY0CACMAAQAxGEQrKmcnBCpnKLxIKCq/MQAnBSpmJwgxAFBJvEgqvyNDMRgUQ4oEAYAASYv+JAuL/CQLIosEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAIowEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiYoDAYv9UQACSReL/VcCAIv/JAtLAUxZi/8jCCQLSwJLAVlLAxVLBYv/CSMJSwFPA08CTUlLBAlOBov+FU4GSwQiTwVSi/5QTwRPAk8DUlBOAkwkC0yLBYsEDEEAIIsDSYsFSU4DWYsCCIsBCRZXBgJLAkxdjAMkCIwFQv/YiwCLA1CMAIkiK2VESSJZTFcCACMnBoj+6StMZyIpZURJIllMVwIAIycGiP7VKUxnIicEZURJIllMVwIAIycGiP7AJwRMZzEASSInBWNESSJZTFcCACMnBoj+pycFTGYovkRJIllMVwIAIycGiP6TKLxIKEy/JwgxAFBJvkRJIllMVwIAIycGiP54SwG8SL8jQyIrZURJVwIASwEiWUsBIllLASMJSwMVSwQkWU8CTU8DTgJSSSVZIkxYJwdQTEQiiP7AK0xnIillRElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/ospTGciJwRlRElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/lUnBExnMQBJIicFY0RJVwIASwEiWUsBIllLASMJSwMVSwQkWU8CTU8DTgJSSSVZIkxYJwdQTEQiiP4bJwVMZii+RElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/eYovEgoTL8nCDEAUEm+RElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/apLAbxIvyNDIillRCIrZUQiJwRlRDEAIicFY0QovkQnCDEAUL5ESwVPBRJESwRPBBJESwNPAxJESwJPAhJESwESRIAEFR98dUxQsCND","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateMutations contract + */ +export type StateMutationsArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'append()void': Record + 'modify()void': Record + 'get()(uint64,string)[]': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'append()void': [] + 'modify()void': [] + 'get()(uint64,string)[]': [] + } +} + +/** + * The return type for each method + */ +export type StateMutationsReturns = { + 'append()void': void + 'modify()void': void + 'get()(uint64,string)[]': [bigint, string][] +} + +/** + * Defines the types of available calls and state of the StateMutations smart contract. + */ +export type StateMutationsTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'append()void' | 'append', { + argsObj: StateMutationsArgs['obj']['append()void'] + argsTuple: StateMutationsArgs['tuple']['append()void'] + returns: StateMutationsReturns['append()void'] + }> + & Record<'modify()void' | 'modify', { + argsObj: StateMutationsArgs['obj']['modify()void'] + argsTuple: StateMutationsArgs['tuple']['modify()void'] + returns: StateMutationsReturns['modify()void'] + }> + & Record<'get()(uint64,string)[]' | 'get', { + argsObj: StateMutationsArgs['obj']['get()(uint64,string)[]'] + argsTuple: StateMutationsArgs['tuple']['get()(uint64,string)[]'] + returns: StateMutationsReturns['get()(uint64,string)[]'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + global: { + keys: { + noProxy: [bigint, string][] + globAssign: [bigint, string][] + glob: [bigint, string][] + } + maps: {} + } + local: { + keys: { + loc: [bigint, string][] + } + maps: {} + } + box: { + keys: { + box: [bigint, string][] + } + maps: { + map: Map + } + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type StateMutationsSignatures = keyof StateMutationsTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateMutationsNonVoidMethodSignatures = keyof StateMutationsTypes['methods'] extends infer T ? T extends keyof StateMutationsTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateMutations smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateMutationsTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateMutations smart contract to the method's return type + */ +export type MethodReturn = StateMutationsTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed global state of the application. + */ +export type GlobalKeysState = StateMutationsTypes['state']['global']['keys'] + +/** + * Defines the shape of the keyed local state of the application. + */ +export type LocalKeysState = StateMutationsTypes['state']['local']['keys'] + +/** + * Defines the shape of the keyed box state of the application. + */ +export type BoxKeysState = StateMutationsTypes['state']['box']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateMutationsCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateMutationsDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateMutationsCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateMutations smart contract + */ +export abstract class StateMutationsParamsFactory { + /** + * Constructs a no op call for the append()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static append(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'append()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the modify()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static modify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'modify()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get()(uint64,string)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static get(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get()(uint64,string)[]' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateMutations smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateMutationsFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateMutationsFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateMutationsClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateMutationsClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateMutations smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateMutationsDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateMutationsClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateMutations smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateMutations smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateMutations smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateMutationsClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateMutations smart contract + */ +export class StateMutationsClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateMutationsClient` + * + * @param appClient An `AppClient` instance which has been created with the StateMutations app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateMutationsClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateMutationsClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateMutationsClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateMutationsClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateMutationsClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateMutations smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The optIn result + */ + bare: (params?: Expand) => { + return this.appClient.params.bare.optIn(params) + }, + }, + + /** + * Makes a clear_state call to an existing instance of the StateMutations smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateMutations smart contract using the `append()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + append: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(StateMutationsParamsFactory.append(params)) + }, + + /** + * Makes a call to the StateMutations smart contract using the `modify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + modify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(StateMutationsParamsFactory.modify(params)) + }, + + /** + * Makes a call to the StateMutations smart contract using the `get()(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + get: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(StateMutationsParamsFactory.get(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateMutations smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The optIn result + */ + bare: (params?: Expand) => { + return this.appClient.createTransaction.bare.optIn(params) + }, + }, + + /** + * Makes a clear_state call to an existing instance of the StateMutations smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateMutations smart contract using the `append()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + append: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(StateMutationsParamsFactory.append(params)) + }, + + /** + * Makes a call to the StateMutations smart contract using the `modify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + modify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(StateMutationsParamsFactory.modify(params)) + }, + + /** + * Makes a call to the StateMutations smart contract using the `get()(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + get: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(StateMutationsParamsFactory.get(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateMutations smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The optIn result + */ + bare: (params?: Expand) => { + return this.appClient.send.bare.optIn(params) + }, + }, + + /** + * Makes a clear_state call to an existing instance of the StateMutations smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateMutations smart contract using the `append()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + append: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(StateMutationsParamsFactory.append(params)) + return {...result, return: result.return as unknown as (undefined | StateMutationsReturns['append()void'])} + }, + + /** + * Makes a call to the StateMutations smart contract using the `modify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + modify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(StateMutationsParamsFactory.modify(params)) + return {...result, return: result.return as unknown as (undefined | StateMutationsReturns['modify()void'])} + }, + + /** + * Makes a call to the StateMutations smart contract using the `get()(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + get: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(StateMutationsParamsFactory.get(params)) + return {...result, return: result.return as unknown as (undefined | StateMutationsReturns['get()(uint64,string)[]'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateMutationsClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateMutations app + */ + state = { + /** + * Methods to access global state for the current StateMutations app + */ + global: { + /** + * Get all current keyed values from global state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.global.getAll() + return { + noProxy: result.no_proxy, + globAssign: result.glob_assign, + glob: result.glob, + } + }, + /** + * Get the current value of the no_proxy key in global state + */ + noProxy: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.global.getValue("no_proxy")) as [bigint, string][] | undefined }, + /** + * Get the current value of the glob_assign key in global state + */ + globAssign: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.global.getValue("glob_assign")) as [bigint, string][] | undefined }, + /** + * Get the current value of the glob key in global state + */ + glob: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.global.getValue("glob")) as [bigint, string][] | undefined }, + }, + /** + * Methods to access local state for the current StateMutations app + */ + local: (address: string | Address) => { + const encodedAddress = typeof address === 'string' ? address : encodeAddress(address.publicKey) + return { + /** + * Get all current keyed values from local state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.local(encodedAddress).getAll() + return { + loc: result.loc, + } + }, + /** + * Get the current value of the loc key in local state + */ + loc: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.local(encodedAddress).getValue("loc")) as [bigint, string][] | undefined }, + } + }, + /** + * Methods to access box state for the current StateMutations app + */ + box: { + /** + * Get all current keyed values from box state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.box.getAll() + return { + box: result.box, + } + }, + /** + * Get the current value of the box key in box state + */ + box: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.box.getValue("box")) as [bigint, string][] | undefined }, + /** + * Get values from the map map in box state + */ + map: { + /** + * Get all current values of the map map in box state + */ + getMap: async (): Promise> => { return (await this.appClient.state.box.getMap("map")) as Map }, + /** + * Get a current value of the map map by key from box state + */ + value: async (key: string): Promise<[bigint, string][] | undefined> => { return await this.appClient.state.box.getMapValue("map", key) as [bigint, string][] | undefined }, + }, + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateMutationsComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a append()void method call against the StateMutations contract + */ + append(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.append(params))) + return this + }, + /** + * Add a modify()void method call against the StateMutations contract + */ + modify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.modify(params))) + return this + }, + /** + * Add a get()(uint64,string)[] method call against the StateMutations contract + */ + get(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.get(params))) + return this + }, + get optIn() { + return { + bare: (params?: AppClientBareCallParams ) => { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.optIn.bare(params))) + return this + }, + } + }, + /** + * Add a clear state call to the StateMutations contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateMutationsComposer + } +} +export type StateMutationsComposer = { + /** + * Calls the append()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + append(params?: CallParams): StateMutationsComposer<[...TReturns, StateMutationsReturns['append()void'] | undefined]> + + /** + * Calls the modify()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + modify(params?: CallParams): StateMutationsComposer<[...TReturns, StateMutationsReturns['modify()void'] | undefined]> + + /** + * Calls the get()(uint64,string)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + get(params?: CallParams): StateMutationsComposer<[...TReturns, StateMutationsReturns['get()(uint64,string)[]'] | undefined]> + + /** + * Gets available optIn methods + */ + readonly optIn: { + /** + * Opts the user into an existing instance of the StateMutations smart contract using a bare call. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + bare(params?: AppClientBareCallParams ): StateMutationsComposer + } + + /** + * Makes a clear_state call to an existing instance of the StateMutations smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateMutationsComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateMutationsComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateMutationsComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StaticSizeContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StaticSizeContract.ts new file mode 100644 index 0000000..a0eb9be --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StaticSizeContract.ts @@ -0,0 +1,1009 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StaticSizeContract","structs":{},"methods":[{"name":"test_array","args":[{"type":"uint64","name":"x1"},{"type":"uint64","name":"y1"},{"type":"uint64","name":"x2"},{"type":"uint64","name":"y2"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_extend_from_tuple","args":[{"type":"((uint64,uint64),(uint64,uint64))","name":"some_more"}],"returns":{"type":"(uint64,uint64)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_extend_from_arc4_tuple","args":[{"type":"((uint64,uint64),(uint64,uint64))","name":"some_more"}],"returns":{"type":"(uint64,uint64)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_bool_array","args":[{"type":"uint64","name":"length"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_arc4_conversion","args":[{"type":"uint64","name":"length"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"sum_array","args":[{"type":"uint64[]","name":"arc4_arr"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_arc4_bool","args":[],"returns":{"type":"bool[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":1,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{"count":{"keyType":"AVMString","valueType":"AVMUint64","key":"Y291bnQ="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[1188,1205,1215],"errorMessage":"check self.count exists"},{"pc":[1033],"errorMessage":"expected 3 bytes"},{"pc":[750,761,861,1026,1115],"errorMessage":"expected correct length"},{"pc":[1053,1128],"errorMessage":"expected correct value at 0"},{"pc":[1073,1141],"errorMessage":"expected correct value at 1"},{"pc":[1154],"errorMessage":"expected correct value at 2"},{"pc":[1166],"errorMessage":"expected correct value at 3"},{"pc":[403,478,517,637,665,784,883,1035,1056,1117,1130,1143,1155],"errorMessage":"index access is out of bounds"},{"pc":[653,1018],"errorMessage":"invalid array length header"},{"pc":[729,753,840,908,999,1098],"errorMessage":"max array length exceeded"},{"pc":[283,342,377],"errorMessage":"overflow"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAxNiAxNDQKICAgIGJ5dGVjYmxvY2sgMHggMHgxNTFmN2M3NSAiY291bnQiIDB4MDAgMHgwMDAwCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjM5CiAgICAvLyBzZWxmLmNvdW50ID0gVUludDY0KDApCiAgICBieXRlY18yIC8vICJjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjM3CiAgICAvLyBjbGFzcyBTdGF0aWNTaXplQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDI4ZDdjMWI4IDB4ZmE5Y2I5NzMgMHg2MDM5YTI0MCAweGY4ZmQ2OGE3IDB4MWYwMjhkYjEgMHgwOTZiM2E1OSAweDhkNmUzYTI1IC8vIG1ldGhvZCAidGVzdF9hcnJheSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2V4dGVuZF9mcm9tX3R1cGxlKCgodWludDY0LHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQpKSkodWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAidGVzdF9leHRlbmRfZnJvbV9hcmM0X3R1cGxlKCgodWludDY0LHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQpKSkodWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAidGVzdF9ib29sX2FycmF5KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRlc3RfYXJjNF9jb252ZXJzaW9uKHVpbnQ2NCl1aW50NjRbXSIsIG1ldGhvZCAic3VtX2FycmF5KHVpbnQ2NFtdKXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9hcmM0X2Jvb2woKWJvb2xbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHRlc3RfYXJyYXkgdGVzdF9leHRlbmRfZnJvbV90dXBsZSB0ZXN0X2V4dGVuZF9mcm9tX2FyYzRfdHVwbGUgdGVzdF9ib29sX2FycmF5IHRlc3RfYXJjNF9jb252ZXJzaW9uIHN1bV9hcnJheSB0ZXN0X2FyYzRfYm9vbAogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9iaXRzKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIHJlYWRfc3RlcDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYml0czoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiAyCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwbiAyCiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAtNAogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgY292ZXIgMgogICAgc3dhcAogICAgcHVzaGludCA3CiAgICArCiAgICBpbnRjXzIgLy8gOAogICAgLwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNwogICAgKwogICAgaW50Y18yIC8vIDgKICAgIC8KICAgIGR1cAogICAgY292ZXIgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl9pZl9lbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgLQogICAgYnplcm8KICAgIGZyYW1lX2RpZyA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgNAoKZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl9pZl9lbHNlQDI6CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDE2CiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBmcmFtZV9idXJ5IDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfd2hpbGVfdG9wQDM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfYWZ0ZXJfd2hpbGVANQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBnZXRiaXQKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX3doaWxlX3RvcEAzCgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX3doaWxlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC50ZXN0X2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcnJheToKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDMKICAgIC8vIHNlbGYuY291bnQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQ2CiAgICAvLyBQb2ludCh4PWFyYzQuVUludDY0KCksIHk9VUludDY0KCksIG90aGVyPXNlbGYueHRyYSgpKSwKICAgIGNhbGxzdWIgeHRyYQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0NwogICAgLy8gUG9pbnQoeD14MSwgeT15MSwgb3RoZXI9c2VsZi54dHJhKCkpLAogICAgY2FsbHN1YiB4dHJhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQ4CiAgICAvLyBQb2ludCh4PXgyLCB5PXkyLCBvdGhlcj1zZWxmLnh0cmEoKSksCiAgICBjYWxsc3ViIHh0cmEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDQtNTAKICAgIC8vIHBhdGggPSBSZWZlcmVuY2VBcnJheSgKICAgIC8vICAgICAoCiAgICAvLyAgICAgICAgIFBvaW50KHg9YXJjNC5VSW50NjQoKSwgeT1VSW50NjQoKSwgb3RoZXI9c2VsZi54dHJhKCkpLAogICAgLy8gICAgICAgICBQb2ludCh4PXgxLCB5PXkxLCBvdGhlcj1zZWxmLnh0cmEoKSksCiAgICAvLyAgICAgICAgIFBvaW50KHg9eDIsIHk9eTIsIG90aGVyPXNlbGYueHRyYSgpKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICBkaWcgMTEKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgcHVzaGludCA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMTIKICAgIGRpZyAxCiAgICBifAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTQKICAgIGl0b2IKICAgIHVuY292ZXIgMTUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgZGlnIDkKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgdW5jb3ZlciA5CiAgICBkaWcgNAogICAgYnwKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgdW5jb3ZlciA4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIGJ8CiAgICBjb25jYXQKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjUxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjUxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBkdXAKICAgIHB1c2hpbnQgMwogICAgPAogICAgYnogdGVzdF9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1MgogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuYiA9PSBpICsgMQogICAgZHVwMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjIDQgLy8gMTQ0CiAgICAqCiAgICBpbnRjIDQgLy8gMTQ0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGV4dHJhY3QgMTYgMTI4CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1MwogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuZC5mb28gPT0gaSArIDIKICAgIHN3YXAKICAgIGV4dHJhY3QgNDggMTYKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIHVuY292ZXIgMwogICAgcHVzaGludCAyCiAgICArCiAgICBpdG9iCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1NAogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuZC5iYXIgPT0gKGkgKyAxKSAqIChpICsgMSkKICAgIGV4dHJhY3QgOCA4CiAgICBkaWcgMQogICAgZGlnIDIKICAgICoKICAgIGl0b2IKICAgIGI9PQogICAgYXNzZXJ0CiAgICBidXJ5IDEKICAgIGIgdGVzdF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1NgogICAgLy8gQm94KEltbXV0YWJsZUFycmF5W1BvaW50XSwga2V5PSJhIikudmFsdWUgPSBwYXRoLmZyZWV6ZSgpCiAgICBkdXAKICAgIGxlbgogICAgaW50YyA0IC8vIDE0NAogICAgLwogICAgZHVwCiAgICBidXJ5IDEwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzICJhIgogICAgYm94X2RlbAogICAgcG9wCiAgICBwdXNoYnl0ZXMgImEiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2OAogICAgLy8gbGFzdF9wb2ludCA9IHBhdGhbMF0KICAgIGV4dHJhY3QgMCAxNDQgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIGJ1cnkgMTAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2OQogICAgLy8gbGVuZ3RoID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTcwCiAgICAvLyBmb3IgcG9pbnRfaWR4IGluIHVyYW5nZSgxLCBwYXRoLmxlbmd0aCk6CiAgICBpbnRjXzEgLy8gMQogICAgYnVyeSAzCgp0ZXN0X2FycmF5X2Zvcl9oZWFkZXJANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTcwCiAgICAvLyBmb3IgcG9pbnRfaWR4IGluIHVyYW5nZSgxLCBwYXRoLmxlbmd0aCk6CiAgICBkaWcgMgogICAgZGlnIDgKICAgIDwKICAgIGJ6IHRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDE1CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzEKICAgIC8vIHBvaW50ID0gcGF0aFtwb2ludF9pZHhdCiAgICBkaWcgMwogICAgaW50YyA0IC8vIDE0NAogICAgKgogICAgaW50YyA0IC8vIDE0NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXBuIDIKICAgIGV4dHJhY3QgMCA4CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzIKICAgIC8vIGlmIHBvaW50LnggPCBsYXN0X3BvaW50Lng6CiAgICBkaWcgMTAKICAgIGI8CiAgICBieiB0ZXN0X2FycmF5X2Vsc2VfYm9keUAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzMKICAgIC8vIGR4ID0gbGFzdF9wb2ludC54LmFzX3VpbnQ2NCgpIC0gcG9pbnQueC5hc191aW50NjQoKQogICAgZGlnIDEwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2OAogICAgLy8gbGFzdF9wb2ludCA9IHBhdGhbMF0KICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3MwogICAgLy8gZHggPSBsYXN0X3BvaW50LnguYXNfdWludDY0KCkgLSBwb2ludC54LmFzX3VpbnQ2NCgpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzEKICAgIC8vIHBvaW50ID0gcGF0aFtwb2ludF9pZHhdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzMKICAgIC8vIGR4ID0gbGFzdF9wb2ludC54LmFzX3VpbnQ2NCgpIC0gcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIGJ1cnkgNwoKdGVzdF9hcnJheV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzYKICAgIC8vIGlmIHBvaW50LnkgPCBsYXN0X3BvaW50Lnk6CiAgICBkaWcgMwogICAgZGlnIDYKICAgIDwKICAgIGJ6IHRlc3RfYXJyYXlfZWxzZV9ib2R5QDEzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3NwogICAgLy8gZHkgPSBsYXN0X3BvaW50LnkgLSBwb2ludC55CiAgICBkaWcgNQogICAgZGlnIDQKICAgIC0KCnRlc3RfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTgwCiAgICAvLyBsZW5ndGggKz0gb3Auc3FydChkeCAqIGR4ICsgZHkgKiBkeSkKICAgIGRpZyA3CiAgICBkdXAKICAgICoKICAgIHN3YXAKICAgIGR1cAogICAgKgogICAgKwogICAgc3FydAogICAgZGlnIDUKICAgICsKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzAKICAgIC8vIGZvciBwb2ludF9pZHggaW4gdXJhbmdlKDEsIHBhdGgubGVuZ3RoKToKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAzCiAgICBiIHRlc3RfYXJyYXlfZm9yX2hlYWRlckA3Cgp0ZXN0X2FycmF5X2Vsc2VfYm9keUAxMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTc5CiAgICAvLyBkeSA9IHBvaW50LnkgLSBsYXN0X3BvaW50LnkKICAgIGRpZyAzCiAgICBkaWcgNgogICAgLQogICAgYiB0ZXN0X2FycmF5X2FmdGVyX2lmX2Vsc2VAMTQKCnRlc3RfYXJyYXlfZWxzZV9ib2R5QDEwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzEKICAgIC8vIHBvaW50ID0gcGF0aFtwb2ludF9pZHhdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzUKICAgIC8vIGR4ID0gcG9pbnQueC5hc191aW50NjQoKSAtIGxhc3RfcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjgKICAgIC8vIGxhc3RfcG9pbnQgPSBwYXRoWzBdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzUKICAgIC8vIGR4ID0gcG9pbnQueC5hc191aW50NjQoKSAtIGxhc3RfcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIGJ1cnkgNwogICAgYiB0ZXN0X2FycmF5X2FmdGVyX2lmX2Vsc2VAMTEKCnRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyA0CiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QudGVzdF9leHRlbmRfZnJvbV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZXh0ZW5kX2Zyb21fdHVwbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgMTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMTYgMTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjIKICAgIC8vIGFyci5leHRlbmQoc29tZV9tb3JlKQogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2MwogICAgLy8gbGFzdCA9IGFyclstMV0KICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMTYKICAgIC8KICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyAxNgogICAgKgogICAgZGlnIDIKICAgIHN3YXAKICAgIGludGNfMyAvLyAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY0CiAgICAvLyBhc3NlcnQgbGFzdCA9PSBzb21lX21vcmVbMV0KICAgIGR1cAogICAgdW5jb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY1CiAgICAvLyByZXN1bHQgPSBhcnIuZnJlZXplKCkKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2NgogICAgLy8gYXNzZXJ0IHJlc3VsdFstMV0gPT0gbGFzdAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDE2CiAgICAqCiAgICBpbnRjXzMgLy8gMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfZXh0ZW5kX2Zyb21fYXJjNF90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZXh0ZW5kX2Zyb21fYXJjNF90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojc1CiAgICAvLyByZXR1cm4gYXJyLmZyZWV6ZSgpCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDE2CiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfYm9vbF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYm9vbF9hcnJheToKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3OQogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbYm9vbF0oKQogICAgYnl0ZWNfMCAvLyAweAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGludGNfMSAvLyAxCgp0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjgzCiAgICAvLyBhcnIuYXBwZW5kKGkgJSAyID09IDApCiAgICBkdXBuIDIKICAgIHB1c2hpbnQgMgogICAgJQogICAgIQogICAgZGlnIDQKICAgIHN3YXAKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMgogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojg0CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGgsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGxlbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6ODcKICAgIC8vIGFycjIuZXh0ZW5kKGFycikKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4OAogICAgLy8gYXNzZXJ0IGFycjIubGVuZ3RoID09IGxlbmd0aCAqIDIsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDIKICAgICoKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6OTAKICAgIC8vIGNvdW50ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjkxCiAgICAvLyBmb3IgdmFsIGluIGFycjoKICAgIGxlbgogICAgYnVyeSA3CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1Cgp0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5MQogICAgLy8gZm9yIHZhbCBpbiBhcnI6CiAgICBkaWcgNAogICAgZGlnIDcKICAgIDwKICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9mb3JAMTEKICAgIGRpZyAyCiAgICBkaWcgNQogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5MgogICAgLy8gaWYgdmFsOgogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5MwogICAgLy8gY291bnQgKz0gMQogICAgZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDYKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDk6CiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiB0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckA2Cgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfZm9yQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyA1CiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QudGVzdF9hcmM0X2NvbnZlcnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY29udmVyc2lvbjoKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5OAogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbYXJjNC5VSW50NjRdKCkKICAgIGJ5dGVjXzAgLy8gMHgKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTAxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMSwgbGVuZ3RoICsgMSk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaW50Y18xIC8vIDEKCnRlc3RfYXJjNF9jb252ZXJzaW9uX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTAxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMSwgbGVuZ3RoICsgMSk6CiAgICBkdXAKICAgIGRpZyAyCiAgICA8CiAgICBieiB0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDIKICAgIC8vIGFyci5hcHBlbmQoYXJjNC5VSW50NjQoaSkpCiAgICBkdXBuIDIKICAgIGl0b2IKICAgIGRpZyA0CiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDEKICAgIC8vIGZvciBpIGluIHVyYW5nZSgxLCBsZW5ndGggKyAxKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9hcmM0X2NvbnZlcnNpb25fZm9yX2hlYWRlckAyCgp0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9mb3JANToKICAgIGRpZyAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwMwogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gbGVuZ3RoLCAiZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgiCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBkdXAKICAgIGJ1cnkgOAogICAgZGlnIDQKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTA0CiAgICAvLyBjb3VudCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9hcmM0X2NvbnZlcnNpb25fZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDUKICAgIC8vIGZvciB2YWwgaW4gYXJyOgogICAgZGlnIDQKICAgIGRpZyA3CiAgICA8CiAgICBieiB0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9mb3JAMTEKICAgIGRpZyAyCiAgICBkaWcgNQogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTA2CiAgICAvLyBpZiB2YWw6CiAgICBieXRlY18wIC8vIDB4CiAgICBiIT0KICAgIGJ6IHRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDcKICAgIC8vIGNvdW50ICs9IDEKICAgIGRpZyA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA2Cgp0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9pZl9lbHNlQDk6CiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiB0ZXN0X2FyYzRfY29udmVyc2lvbl9mb3JfaGVhZGVyQDYKCnRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2ZvckAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTA5CiAgICAvLyBhcmM0X2FyciA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSgpCiAgICBieXRlYyA0IC8vIDB4MDAwMAogICAgZGlnIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTEwCiAgICAvLyBhcmM0X2Fyci5leHRlbmQoYXJyKQogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC5zdW1fYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgpzdW1fYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTE3CiAgICAvLyBhcnIuZXh0ZW5kKGFyYzRfYXJyKQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMTkKICAgIC8vIHRvdGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjAKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgIC8KICAgIGludGNfMCAvLyAwCgpzdW1fYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjAKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IHN1bV9hcnJheV9hZnRlcl9mb3JANQogICAgZGlnIDMKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEyMQogICAgLy8gdG90YWwgKz0gaXRlbS5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA0CiAgICArCiAgICBidXJ5IDQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgc3VtX2FycmF5X2Zvcl9oZWFkZXJAMgoKc3VtX2FycmF5X2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0MgogICAgLy8gYXJyLmFwcGVuZChhcmM0LkJvb2woVHhuLnNlbmRlciA9PSBUeG4ucmVjZWl2ZXIpKQogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICA9PQogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQzCiAgICAvLyBhcnIuYXBwZW5kKGFyYzQuQm9vbChUeG4uc2VuZGVyICE9IFR4bi5yZWNlaXZlcikpCiAgICB0eG4gU2VuZGVyCiAgICB0eG4gUmVjZWl2ZXIKICAgICE9CiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ2CiAgICAvLyBkeW5fYXJyLmV4dGVuZChhcnIpCiAgICBsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ1CiAgICAvLyBkeW5fYXJyID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5Cb29sXSgpCiAgICBieXRlYyA0IC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDYKICAgIC8vIGR5bl9hcnIuZXh0ZW5kKGFycikKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDcKICAgIC8vIGFzc2VydCBkeW5fYXJyLmxlbmd0aCA9PSAyLCAiZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgiCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGR1cAogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0OAogICAgLy8gYXNzZXJ0IGR5bl9hcnIuYnl0ZXMubGVuZ3RoID09IDMsICJleHBlY3RlZCAzIGJ5dGVzIgogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDMgYnl0ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ5CiAgICAvLyBhc3NlcnQgZHluX2FyclswXSA9PSAoVHhuLnNlbmRlciA9PSBUeG4ucmVjZWl2ZXIpLCAiZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAwIgogICAgZHVwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMTYKICAgIGdldGJpdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgPT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE1MAogICAgLy8gYXNzZXJ0IGR5bl9hcnJbMV0gPT0gKFR4bi5zZW5kZXIgIT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMSIKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hpbnQgMTcKICAgIGdldGJpdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxCiAgICBpbnRjXzAgLy8gMAoKdGVzdF9hcmM0X2Jvb2xfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTMtMTU1CiAgICAvLyAjIG5vdGU6IG5vdCBzdXBwb3J0ZWQgY3VycmVudGx5CiAgICAvLyAjIGFycjIuZXh0ZW5kKGR5bl9hcnJheSkKICAgIC8vIGZvciBiIGluIGR5bl9hcnI6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2FyYzRfYm9vbF9hZnRlcl9mb3JANQogICAgZHVwbiAyCiAgICBpbnRjXzMgLy8gMTYKICAgICsKICAgIGRpZyA1CiAgICBzd2FwCiAgICBnZXRiaXQKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTYKICAgIC8vIGFycjIuYXBwZW5kKGIpCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FyYzRfYm9vbF9mb3JfaGVhZGVyQDIKCnRlc3RfYXJjNF9ib29sX2FmdGVyX2ZvckA1OgogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTU3CiAgICAvLyBhc3NlcnQgYXJyMi5sZW5ndGggPT0gNCwgImV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoIgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTgKICAgIC8vIGFzc2VydCBhcnIyWzBdID09IChUeG4uc2VuZGVyID09IFR4bi5yZWNlaXZlciksICJleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDAiCiAgICBkdXAKICAgIGV4dHJhY3QgMCAxIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICA9PQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTU5CiAgICAvLyBhc3NlcnQgYXJyMlsxXSA9PSAoVHhuLnNlbmRlciAhPSBUeG4ucmVjZWl2ZXIpLCAiZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxIgogICAgZHVwCiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2MAogICAgLy8gYXNzZXJ0IGFycjJbMl0gPT0gKFR4bi5zZW5kZXIgPT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMiIKICAgIGR1cAogICAgZXh0cmFjdCAyIDEgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG4gU2VuZGVyCiAgICB0eG4gUmVjZWl2ZXIKICAgID09CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjEKICAgIC8vIGFzc2VydCBhcnIyWzNdID09IChUeG4uc2VuZGVyICE9IFR4bi5yZWNlaXZlciksICJleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDMiCiAgICBleHRyYWN0IDMgMSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAzCiAgICBkaWcgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjMKICAgIC8vIHJldHVybiBhcnIuZnJlZXplKCkKICAgIGR1cAogICAgbGVuCiAgICBieXRlYyA0IC8vIDB4MDAwMAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYml0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QueHRyYSgpIC0+IHVpbnQ2NCwgdWludDY0LCBieXRlcywgYnl0ZXMsIGJ5dGVzOgp4dHJhOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjYKICAgIC8vIHNlbGYuY291bnQgKz0gMQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEyOAogICAgLy8gYT1UeG4ubnVtX2FwcF9hcmdzLAogICAgdHhuIE51bUFwcEFyZ3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTMwCiAgICAvLyBjPVR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEzMQogICAgLy8gZD1zZWxmLm1vcmUoKSwKICAgIGNhbGxzdWIgbW9yZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMzIKICAgIC8vIGU9QmlnVUludChzZWxmLmNvdW50KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3VudCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTI3LTEzMwogICAgLy8gcmV0dXJuIFh0cmEoCiAgICAvLyAgICAgYT1UeG4ubnVtX2FwcF9hcmdzLAogICAgLy8gICAgIGI9c2VsZi5jb3VudCwKICAgIC8vICAgICBjPVR4bi5zZW5kZXIsCiAgICAvLyAgICAgZD1zZWxmLm1vcmUoKSwKICAgIC8vICAgICBlPUJpZ1VJbnQoc2VsZi5jb3VudCksCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0Lm1vcmUoKSAtPiBieXRlczoKbW9yZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTM3CiAgICAvLyByZXR1cm4gTW9yZShmb289YXJjNC5VSW50NjQoc2VsZi5jb3VudCArIDEpLCBiYXI9YXJjNC5VSW50NjQoc2VsZi5jb3VudCAqIHNlbGYuY291bnQpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50IGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZGlnIDEKICAgIHVuY292ZXIgMgogICAgKgogICAgaXRvYgogICAgY29uY2F0CiAgICByZXRzdWIK","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAFAAEIEJABJgUABBUffHUFY291bnQBAAIAADEYQAADKiJnMRtBAEAxGRREMRhEggcEKNfBuAT6nLlzBGA5okAE+P1opwQfAo2xBAlrOlkEjW46JTYaAI4HAIEB+QI8Ak8CxgM4A2sAMRkUMRgUEEOKBAEoRwKL/CJZRwKL/ghJFlcGAIv8TFwATgJMgQcIJApJTwKBBwgkCklOAgxBAAyLBosFCa+LBExQjAQijACLAyUISYwCi/4IjAGLAosBDEEAIIv9iwBJTgJTiwSLAklOA08CVIwEIwiMAov/CIwAQv/YiwSMAIkiSShHBTYaATYaAhc2GgM2GgQXKiJniAOfiAOciAOZTw4WTw4WUE8NUE8MUEsLFYFADkSBQK9PDEsBq08CTFCAEAAAAAAAAAAAAAAAAAAAAABMUE8OFk8PTFBPDBZPDBZQTwtQTwpQSwkVgUAORE8JSwSrUFBQTwcWTwhMUE8HFk8HFlBPBlBPBVBLBBWBQA5ETwRPBKtQUFAiSYEDDEEAOUpJTgIhBAshBFhXEIBJJFtLAiMITEsBEkRMVzAQSVcACE8DgQIIFqhEVwgISwFLAgsWqERFAUL/wEsBSRUhBApJRQoWVwYCSwFQgAFhvEiAAWFMv1cAkElFC0lXAAhFCiRbRQYiRQUjRQNLAksIDEEAXEsBSwMhBAshBFhHAlcACEwkW0UGSwqkQQA2SwoiW0wiWwlFB0sDSwYMQQAcSwVLBAlLB0kLTEkLCJJLBQhFBUsCIwhFA0L/sEsDSwYJQv/hIltLCiJbCUUHQv/ISwQWKUxQsCNDNhoBSVcAEExXEBBMSwFQSRUlCkkjCSULSwJMJVhJTwQSREwWVwYCTwJQSSJZIwlLAVcCAEwlCyVYTwISRClMULAjQzYaAUkVJQoWVwYCTFApTFCwI0MoRwI2GgEXSShMIwgjSUsCDEEAGEcCgQIYFEsETCsiTwJUUEUEIwhFAUL/4UsCRwIVSwZJTgQSREsBUBVPAoECCxJEIkUHFUUHIkUFSwRLBwxBABpLAksFI1giU0EABksFIwhFBksEIwhFBUL/3ksFFilMULAjQyhHAjYaARdJKEwjCCNJSwIMQQAQRwIWSwRMUEUEIwhFAUL/6UsCFSQKSUUISwQSRCJFBiJFBUsESwcMQQAcSwJLBSQLJFgoqUEABksFIwhFBksEIwhFBUL/3CcESwNQSVcCABUkChZXBgJcAClMULAjQzYaAVcCAEkiTBUkCiJJSwIMQQAWSwNLAUlOAiQLW0sECEUEIwhFAUL/40sCFilMULAjQzEAMQcSKyJPAlQxADEHEysiTwJUUEcCFScESwJPAiSI/HxJTgJJIllJTgNJgQISREsBFYEDEkRJREsBJVMrIk8CVCJTMQAxBxISRCMNRIERUysiTwJUIlMxADEHExJEIklLAwxBABpHAiUISwVMUysiTwJUSwNMUEUDIwhFAUL/30sBSRWBBBJESVcAASJTMQAxBxISRElXAQEiUzEAMQcTEkRJVwIBIlMxADEHEhJEVwMBIlMxADEHExJESwRJFScETgIkiPvWKUxQsCNDIiplRCMIKksBZzEbMQCIAAoiKmVEFk8DTgSJIiplREkjCBZLAU8CCxZQiQ==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StaticSizeContract contract + */ +export type StaticSizeContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'test_array(uint64,uint64,uint64,uint64)uint64': { + x1: bigint | number + y1: bigint | number + x2: bigint | number + y2: bigint | number + } + 'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': { + someMore: [[bigint | number, bigint | number], [bigint | number, bigint | number]] + } + 'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': { + someMore: [[bigint | number, bigint | number], [bigint | number, bigint | number]] + } + 'test_bool_array(uint64)uint64': { + length: bigint | number + } + 'test_arc4_conversion(uint64)uint64[]': { + length: bigint | number + } + 'sum_array(uint64[])uint64': { + arc4Arr: bigint[] | number[] + } + 'test_arc4_bool()bool[]': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'test_array(uint64,uint64,uint64,uint64)uint64': [x1: bigint | number, y1: bigint | number, x2: bigint | number, y2: bigint | number] + 'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': [someMore: [[bigint | number, bigint | number], [bigint | number, bigint | number]]] + 'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': [someMore: [[bigint | number, bigint | number], [bigint | number, bigint | number]]] + 'test_bool_array(uint64)uint64': [length: bigint | number] + 'test_arc4_conversion(uint64)uint64[]': [length: bigint | number] + 'sum_array(uint64[])uint64': [arc4Arr: bigint[] | number[]] + 'test_arc4_bool()bool[]': [] + } +} + +/** + * The return type for each method + */ +export type StaticSizeContractReturns = { + 'test_array(uint64,uint64,uint64,uint64)uint64': bigint + 'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': [bigint, bigint][] + 'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': [bigint, bigint][] + 'test_bool_array(uint64)uint64': bigint + 'test_arc4_conversion(uint64)uint64[]': bigint[] + 'sum_array(uint64[])uint64': bigint + 'test_arc4_bool()bool[]': boolean[] +} + +/** + * Defines the types of available calls and state of the StaticSizeContract smart contract. + */ +export type StaticSizeContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'test_array(uint64,uint64,uint64,uint64)uint64' | 'test_array', { + argsObj: StaticSizeContractArgs['obj']['test_array(uint64,uint64,uint64,uint64)uint64'] + argsTuple: StaticSizeContractArgs['tuple']['test_array(uint64,uint64,uint64,uint64)uint64'] + returns: StaticSizeContractReturns['test_array(uint64,uint64,uint64,uint64)uint64'] + }> + & Record<'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]' | 'test_extend_from_tuple', { + argsObj: StaticSizeContractArgs['obj']['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] + argsTuple: StaticSizeContractArgs['tuple']['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] + returns: StaticSizeContractReturns['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] + }> + & Record<'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]' | 'test_extend_from_arc4_tuple', { + argsObj: StaticSizeContractArgs['obj']['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] + argsTuple: StaticSizeContractArgs['tuple']['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] + returns: StaticSizeContractReturns['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] + }> + & Record<'test_bool_array(uint64)uint64' | 'test_bool_array', { + argsObj: StaticSizeContractArgs['obj']['test_bool_array(uint64)uint64'] + argsTuple: StaticSizeContractArgs['tuple']['test_bool_array(uint64)uint64'] + returns: StaticSizeContractReturns['test_bool_array(uint64)uint64'] + }> + & Record<'test_arc4_conversion(uint64)uint64[]' | 'test_arc4_conversion', { + argsObj: StaticSizeContractArgs['obj']['test_arc4_conversion(uint64)uint64[]'] + argsTuple: StaticSizeContractArgs['tuple']['test_arc4_conversion(uint64)uint64[]'] + returns: StaticSizeContractReturns['test_arc4_conversion(uint64)uint64[]'] + }> + & Record<'sum_array(uint64[])uint64' | 'sum_array', { + argsObj: StaticSizeContractArgs['obj']['sum_array(uint64[])uint64'] + argsTuple: StaticSizeContractArgs['tuple']['sum_array(uint64[])uint64'] + returns: StaticSizeContractReturns['sum_array(uint64[])uint64'] + }> + & Record<'test_arc4_bool()bool[]' | 'test_arc4_bool', { + argsObj: StaticSizeContractArgs['obj']['test_arc4_bool()bool[]'] + argsTuple: StaticSizeContractArgs['tuple']['test_arc4_bool()bool[]'] + returns: StaticSizeContractReturns['test_arc4_bool()bool[]'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + global: { + keys: { + count: bigint + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type StaticSizeContractSignatures = keyof StaticSizeContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StaticSizeContractNonVoidMethodSignatures = keyof StaticSizeContractTypes['methods'] extends infer T ? T extends keyof StaticSizeContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StaticSizeContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StaticSizeContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StaticSizeContract smart contract to the method's return type + */ +export type MethodReturn = StaticSizeContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed global state of the application. + */ +export type GlobalKeysState = StaticSizeContractTypes['state']['global']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StaticSizeContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StaticSizeContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StaticSizeContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StaticSizeContract smart contract + */ +export abstract class StaticSizeContractParamsFactory { + /** + * Constructs a no op call for the test_array(uint64,uint64,uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_array(uint64,uint64,uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.x1, params.args.y1, params.args.x2, params.args.y2], + } + } + /** + * Constructs a no op call for the test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testExtendFromTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.someMore], + } + } + /** + * Constructs a no op call for the test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testExtendFromArc4Tuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.someMore], + } + } + /** + * Constructs a no op call for the test_bool_array(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testBoolArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_bool_array(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.length], + } + } + /** + * Constructs a no op call for the test_arc4_conversion(uint64)uint64[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testArc4Conversion(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_arc4_conversion(uint64)uint64[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.length], + } + } + /** + * Constructs a no op call for the sum_array(uint64[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static sumArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'sum_array(uint64[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arc4Arr], + } + } + /** + * Constructs a no op call for the test_arc4_bool()bool[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_arc4_bool()bool[]' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StaticSizeContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StaticSizeContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StaticSizeContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StaticSizeContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StaticSizeContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StaticSizeContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StaticSizeContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StaticSizeContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StaticSizeContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StaticSizeContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StaticSizeContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StaticSizeContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StaticSizeContract smart contract + */ +export class StaticSizeContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StaticSizeContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StaticSizeContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StaticSizeContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StaticSizeContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StaticSizeContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StaticSizeContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StaticSizeContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StaticSizeContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_array(uint64,uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StaticSizeContractParamsFactory.testArray(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testExtendFromTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StaticSizeContractParamsFactory.testExtendFromTuple(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testExtendFromArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StaticSizeContractParamsFactory.testExtendFromArc4Tuple(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_bool_array(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testBoolArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StaticSizeContractParamsFactory.testBoolArray(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_arc4_conversion(uint64)uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testArc4Conversion: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StaticSizeContractParamsFactory.testArc4Conversion(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `sum_array(uint64[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + sumArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StaticSizeContractParamsFactory.sumArray(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_arc4_bool()bool[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(StaticSizeContractParamsFactory.testArc4Bool(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StaticSizeContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_array(uint64,uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testArray(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testExtendFromTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testExtendFromTuple(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testExtendFromArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testExtendFromArc4Tuple(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_bool_array(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testBoolArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testBoolArray(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_arc4_conversion(uint64)uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testArc4Conversion: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testArc4Conversion(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `sum_array(uint64[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + sumArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.sumArray(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_arc4_bool()bool[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testArc4Bool(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StaticSizeContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_array(uint64,uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testArray(params)) + return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_array(uint64,uint64,uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testExtendFromTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testExtendFromTuple(params)) + return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'])} + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testExtendFromArc4Tuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testExtendFromArc4Tuple(params)) + return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'])} + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_bool_array(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testBoolArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testBoolArray(params)) + return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_bool_array(uint64)uint64'])} + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_arc4_conversion(uint64)uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testArc4Conversion: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testArc4Conversion(params)) + return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_arc4_conversion(uint64)uint64[]'])} + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `sum_array(uint64[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + sumArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StaticSizeContractParamsFactory.sumArray(params)) + return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['sum_array(uint64[])uint64'])} + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_arc4_bool()bool[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testArc4Bool(params)) + return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_arc4_bool()bool[]'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StaticSizeContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StaticSizeContract app + */ + state = { + /** + * Methods to access global state for the current StaticSizeContract app + */ + global: { + /** + * Get all current keyed values from global state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.global.getAll() + return { + count: result.count, + } + }, + /** + * Get the current value of the count key in global state + */ + count: async (): Promise => { return (await this.appClient.state.global.getValue("count")) as bigint | undefined }, + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): StaticSizeContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a test_array(uint64,uint64,uint64,uint64)uint64 method call against the StaticSizeContract contract + */ + testArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testArray(params))) + return this + }, + /** + * Add a test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] method call against the StaticSizeContract contract + */ + testExtendFromTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testExtendFromTuple(params))) + return this + }, + /** + * Add a test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] method call against the StaticSizeContract contract + */ + testExtendFromArc4Tuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testExtendFromArc4Tuple(params))) + return this + }, + /** + * Add a test_bool_array(uint64)uint64 method call against the StaticSizeContract contract + */ + testBoolArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBoolArray(params))) + return this + }, + /** + * Add a test_arc4_conversion(uint64)uint64[] method call against the StaticSizeContract contract + */ + testArc4Conversion(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testArc4Conversion(params))) + return this + }, + /** + * Add a sum_array(uint64[])uint64 method call against the StaticSizeContract contract + */ + sumArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sumArray(params))) + return this + }, + /** + * Add a test_arc4_bool()bool[] method call against the StaticSizeContract contract + */ + testArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testArc4Bool(params))) + return this + }, + /** + * Add a clear state call to the StaticSizeContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StaticSizeContractComposer + } +} +export type StaticSizeContractComposer = { + /** + * Calls the test_array(uint64,uint64,uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testArray(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_array(uint64,uint64,uint64,uint64)uint64'] | undefined]> + + /** + * Calls the test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testExtendFromTuple(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] | undefined]> + + /** + * Calls the test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testExtendFromArc4Tuple(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] | undefined]> + + /** + * Calls the test_bool_array(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testBoolArray(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_bool_array(uint64)uint64'] | undefined]> + + /** + * Calls the test_arc4_conversion(uint64)uint64[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testArc4Conversion(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_arc4_conversion(uint64)uint64[]'] | undefined]> + + /** + * Calls the sum_array(uint64[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + sumArray(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['sum_array(uint64[])uint64'] | undefined]> + + /** + * Calls the test_arc4_bool()bool[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testArc4Bool(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_arc4_bool()bool[]'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the StaticSizeContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StaticSizeContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StaticSizeContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StaticSizeContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/TuplesContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/TuplesContract.ts new file mode 100644 index 0000000..1e2fe54 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/TuplesContract.ts @@ -0,0 +1,558 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"TuplesContract","structs":{},"methods":[{"name":"test_tuple_with_primitive_type","args":[],"returns":{"type":"(uint64,bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9UdXBsZXMvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgVHVwbGVzQ29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHg3MjI5ZDc5YSAvLyBtZXRob2QgInRlc3RfdHVwbGVfd2l0aF9wcmltaXRpdmVfdHlwZSgpKHVpbnQ2NCxib29sKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdF90dXBsZV93aXRoX3ByaW1pdGl2ZV90eXBlX3JvdXRlQDMKICAgIGVycgoKbWFpbl90ZXN0X3R1cGxlX3dpdGhfcHJpbWl0aXZlX3R5cGVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9UdXBsZXMvY29udHJhY3QucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDAwMDA4MAogICAgbG9nCiAgICBwdXNoaW50IDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAogARyKdeaNhoAjgEAAQAxGRQxGBBEgA0VH3x1AAAAAAAAAACAsIEBQzEZFDEYFBBD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the TuplesContract contract + */ +export type TuplesContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'test_tuple_with_primitive_type()(uint64,bool)': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'test_tuple_with_primitive_type()(uint64,bool)': [] + } +} + +/** + * The return type for each method + */ +export type TuplesContractReturns = { + 'test_tuple_with_primitive_type()(uint64,bool)': [bigint, boolean] +} + +/** + * Defines the types of available calls and state of the TuplesContract smart contract. + */ +export type TuplesContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'test_tuple_with_primitive_type()(uint64,bool)' | 'test_tuple_with_primitive_type', { + argsObj: TuplesContractArgs['obj']['test_tuple_with_primitive_type()(uint64,bool)'] + argsTuple: TuplesContractArgs['tuple']['test_tuple_with_primitive_type()(uint64,bool)'] + returns: TuplesContractReturns['test_tuple_with_primitive_type()(uint64,bool)'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type TuplesContractSignatures = keyof TuplesContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type TuplesContractNonVoidMethodSignatures = keyof TuplesContractTypes['methods'] extends infer T ? T extends keyof TuplesContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the TuplesContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = TuplesContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the TuplesContract smart contract to the method's return type + */ +export type MethodReturn = TuplesContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type TuplesContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type TuplesContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: TuplesContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the TuplesContract smart contract + */ +export abstract class TuplesContractParamsFactory { + /** + * Constructs a no op call for the test_tuple_with_primitive_type()(uint64,bool) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testTupleWithPrimitiveType(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_tuple_with_primitive_type()(uint64,bool)' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the TuplesContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class TuplesContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `TuplesContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new TuplesContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new TuplesContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the TuplesContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: TuplesContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new TuplesContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the TuplesContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the TuplesContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the TuplesContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new TuplesContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the TuplesContract smart contract + */ +export class TuplesContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `TuplesContractClient` + * + * @param appClient An `AppClient` instance which has been created with the TuplesContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `TuplesContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `TuplesContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new TuplesContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `TuplesContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new TuplesContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the TuplesContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the TuplesContract smart contract using the `test_tuple_with_primitive_type()(uint64,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testTupleWithPrimitiveType: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(TuplesContractParamsFactory.testTupleWithPrimitiveType(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the TuplesContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the TuplesContract smart contract using the `test_tuple_with_primitive_type()(uint64,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testTupleWithPrimitiveType: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(TuplesContractParamsFactory.testTupleWithPrimitiveType(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the TuplesContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the TuplesContract smart contract using the `test_tuple_with_primitive_type()(uint64,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testTupleWithPrimitiveType: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(TuplesContractParamsFactory.testTupleWithPrimitiveType(params)) + return {...result, return: result.return as unknown as (undefined | TuplesContractReturns['test_tuple_with_primitive_type()(uint64,bool)'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new TuplesContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current TuplesContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): TuplesContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a test_tuple_with_primitive_type()(uint64,bool) method call against the TuplesContract contract + */ + testTupleWithPrimitiveType(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testTupleWithPrimitiveType(params))) + return this + }, + /** + * Add a clear state call to the TuplesContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as TuplesContractComposer + } +} +export type TuplesContractComposer = { + /** + * Calls the test_tuple_with_primitive_type()(uint64,bool) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testTupleWithPrimitiveType(params?: CallParams): TuplesContractComposer<[...TReturns, TuplesContractReturns['test_tuple_with_primitive_type()(uint64,bool)'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the TuplesContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): TuplesContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): TuplesContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type TuplesContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/VerifierContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/VerifierContract.ts new file mode 100644 index 0000000..9633b90 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/VerifierContract.ts @@ -0,0 +1,554 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"VerifierContract","structs":{},"methods":[{"name":"verify","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[56],"errorMessage":"Txn must be pay"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvdmVyaWZpZXIucHk6MTEKICAgIC8vIGNsYXNzIFZlcmlmaWVyQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweDY1YTlhZWNjIC8vIG1ldGhvZCAidmVyaWZ5KCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl92ZXJpZnlfcm91dGVAMwogICAgZXJyCgptYWluX3ZlcmlmeV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC92ZXJpZmllci5weToxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiB2ZXJpZnkKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLmR5bmFtaWNfaXR4bl9ncm91cC52ZXJpZmllci5WZXJpZmllckNvbnRyYWN0LnZlcmlmeVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvdmVyaWZpZXIucHk6MTQKICAgIC8vIGZvciBpIGluIHVyYW5nZShUeG4uZ3JvdXBfaW5kZXgpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIHB1c2hpbnQgMAoKdmVyaWZ5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvdmVyaWZpZXIucHk6MTQKICAgIC8vIGZvciBpIGluIHVyYW5nZShUeG4uZ3JvdXBfaW5kZXgpOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogdmVyaWZ5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL3ZlcmlmaWVyLnB5OjE2CiAgICAvLyBhc3NlcnQgdHhuLnR5cGUgPT0gVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQsICJUeG4gbXVzdCBiZSBwYXkiCiAgICBkdXBuIDIKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIFR4biBtdXN0IGJlIHBheQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC92ZXJpZmllci5weToxNAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKFR4bi5ncm91cF9pbmRleCk6CiAgICBwdXNoaW50IDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB2ZXJpZnlfZm9yX2hlYWRlckAyCgp2ZXJpZnlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL3ZlcmlmaWVyLnB5OjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgARlqa7MNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEMxFoEASUsCDEEAEEcCOBCBARJEgQEIRQFC/+mBAUM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the VerifierContract contract + */ +export type VerifierContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify()void': [] + } +} + +/** + * The return type for each method + */ +export type VerifierContractReturns = { + 'verify()void': void +} + +/** + * Defines the types of available calls and state of the VerifierContract smart contract. + */ +export type VerifierContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify()void' | 'verify', { + argsObj: VerifierContractArgs['obj']['verify()void'] + argsTuple: VerifierContractArgs['tuple']['verify()void'] + returns: VerifierContractReturns['verify()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type VerifierContractSignatures = keyof VerifierContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the VerifierContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = VerifierContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the VerifierContract smart contract to the method's return type + */ +export type MethodReturn = VerifierContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type VerifierContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type VerifierContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: VerifierContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the VerifierContract smart contract + */ +export abstract class VerifierContractParamsFactory { + /** + * Constructs a no op call for the verify()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the VerifierContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class VerifierContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `VerifierContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new VerifierContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new VerifierContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the VerifierContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: VerifierContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new VerifierContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the VerifierContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the VerifierContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the VerifierContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new VerifierContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the VerifierContract smart contract + */ +export class VerifierContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `VerifierContractClient` + * + * @param appClient An `AppClient` instance which has been created with the VerifierContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `VerifierContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `VerifierContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new VerifierContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `VerifierContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new VerifierContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the VerifierContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the VerifierContract smart contract using the `verify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(VerifierContractParamsFactory.verify(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the VerifierContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the VerifierContract smart contract using the `verify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(VerifierContractParamsFactory.verify(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the VerifierContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the VerifierContract smart contract using the `verify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(VerifierContractParamsFactory.verify(params)) + return {...result, return: result.return as unknown as (undefined | VerifierContractReturns['verify()void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new VerifierContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current VerifierContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): VerifierContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify()void method call against the VerifierContract contract + */ + verify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verify(params))) + return this + }, + /** + * Add a clear state call to the VerifierContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as VerifierContractComposer + } +} +export type VerifierContractComposer = { + /** + * Calls the verify()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verify(params?: CallParams): VerifierContractComposer<[...TReturns, VerifierContractReturns['verify()void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the VerifierContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): VerifierContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): VerifierContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type VerifierContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/interfaces/network.ts b/examples/p-py/projects/p-py-frontend/src/interfaces/network.ts index a458edc..fdb97ae 100644 --- a/examples/p-py/projects/p-py-frontend/src/interfaces/network.ts +++ b/examples/p-py/projects/p-py-frontend/src/interfaces/network.ts @@ -1,5 +1,4 @@ -import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/types/network-client' -import type { TokenHeader } from 'algosdk/dist/types/client/urlTokenBaseHTTPClient' +import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/network-client' export interface AlgoViteClientConfig extends AlgoClientConfig { /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ @@ -7,7 +6,7 @@ export interface AlgoViteClientConfig extends AlgoClientConfig { /** The port to use e.g. 4001, 443, etc. */ port: string | number /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string | TokenHeader + token: string /** String representing current Algorand Network type (testnet/mainnet and etc) */ network: string } @@ -18,7 +17,7 @@ export interface AlgoViteKMDConfig extends AlgoClientConfig { /** The port to use e.g. 4001, 443, etc. */ port: string | number /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string | TokenHeader + token: string /** KMD wallet name */ wallet: string /** KMD wallet password */ diff --git a/examples/p-py/projects/p-py-frontend/tsconfig.json b/examples/p-py/projects/p-py-frontend/tsconfig.json index 5cde02a..855bfc3 100644 --- a/examples/p-py/projects/p-py-frontend/tsconfig.json +++ b/examples/p-py/projects/p-py-frontend/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, - "module": "ES2022" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + "module": "ESNext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, "declaration": true /* Generates corresponding '.d.ts' file. */, "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, "sourceMap": true /* Generates corresponding '.map' file. */, @@ -15,7 +15,7 @@ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, "allowJs": false, "allowSyntheticDefaultImports": true, - "moduleResolution": "Node", + "moduleResolution": "Bundler", "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, diff --git a/examples/p-py/projects/p-py-frontend/tsconfig.node.json b/examples/p-py/projects/p-py-frontend/tsconfig.node.json index 9d31e2a..e32f207 100644 --- a/examples/p-py/projects/p-py-frontend/tsconfig.node.json +++ b/examples/p-py/projects/p-py-frontend/tsconfig.node.json @@ -1,8 +1,8 @@ { "compilerOptions": { "composite": true, - "module": "ESNext", - "moduleResolution": "Node", + "module": "NodeNext", + "moduleResolution": "NodeNext", "allowSyntheticDefaultImports": true }, "include": ["vite.config.ts"] From 954a4535a8cc5d1ae04d307d35f78f30261ef0a3 Mon Sep 17 00:00:00 2001 From: p2arthur Date: Mon, 9 Mar 2026 18:37:41 -0700 Subject: [PATCH 08/12] ci: add branch references for python and ts template providers to the check python ci --- .github/workflows/check-python.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check-python.yaml b/.github/workflows/check-python.yaml index 15eed9d..82a215a 100644 --- a/.github/workflows/check-python.yaml +++ b/.github/workflows/check-python.yaml @@ -52,8 +52,10 @@ jobs: - name: Run tests shell: bash env: - FRONTEND_TEMPLATE_URL: gh:algorandfoundation/algokit-react-frontend-template # If empty defaults to production templates on algokit cli - FRONTEND_TEMPLATE_REF: prep/beta-release # If empty defaults to production templates on algokit cli + FRONTEND_TEMPLATE_URL: gh:algorandfoundation/algokit-react-frontend-template # If not provided Defaults to algokit production template + FRONTEND_TEMPLATE_REF: prep/beta-release + PYTHON_CONTRACT_TEMPLATE_REF: prep/beta-release + TYPESCRIPT_CONTRACT_TEMPLATE_REF: prep/beta-release run: | set -o pipefail poetry run pytest --junitxml=pytest-junit.xml -n 1 From c0dd34e373546ce2c3087d0995bc7eb8c812573b Mon Sep 17 00:00:00 2001 From: p2arthur Date: Mon, 9 Mar 2026 18:53:31 -0700 Subject: [PATCH 09/12] chore: regenerate templates --- examples/p-py/.algokit/.copier-answers.yml | 4 +- .../p-py-frontend/src/contracts/AppCall.ts | 558 -- .../src/contracts/AppExpectingEffects.ts | 630 --- .../src/contracts/Arc4InnerTxnsContract.ts | 556 -- .../src/contracts/Arc4PrimitiveOpsContract.ts | 3982 -------------- .../src/contracts/BoxContract.ts | 2352 --------- .../p-py-frontend/src/contracts/Contract.ts | 621 --- .../p-py-frontend/src/contracts/ContractV0.ts | 621 --- .../p-py-frontend/src/contracts/ContractV1.ts | 621 --- .../src/contracts/CryptoOpsContract.ts | 1422 ----- .../src/contracts/DynamicArrayInitContract.ts | 755 --- .../src/contracts/DynamicItxnGroup.ts | 629 --- .../src/contracts/GlobalStateContract.ts | 2649 ---------- .../src/contracts/GlobalStateValidator.ts | 557 -- .../p-py-frontend/src/contracts/HelloWorld.ts | 560 -- .../src/contracts/ITxnOpsContract.ts | 554 -- .../src/contracts/ImmutableArrayContract.ts | 2231 -------- .../contracts/ImmutableArrayInitContract.ts | 755 --- .../src/contracts/LocalStateContract.ts | 1746 ------ .../src/contracts/MiscellaneousOpsContract.ts | 3082 ----------- .../src/contracts/PrimitiveOpsContract.ts | 4701 ----------------- .../src/contracts/SignaturesContract.ts | 1203 ----- .../src/contracts/StateAcctParamsGet.ts | 1319 ----- .../contracts/StateAcctParamsGetContract.ts | 1526 ------ .../src/contracts/StateAppGlobalContract.ts | 1018 ---- .../src/contracts/StateAppGlobalExContract.ts | 551 -- .../src/contracts/StateAppLocalContract.ts | 1197 ----- .../src/contracts/StateAppLocalExContract.ts | 635 --- .../src/contracts/StateAppParamsContract.ts | 1112 ---- .../contracts/StateAssetHoldingContract.ts | 631 --- .../src/contracts/StateAssetParamsContract.ts | 1319 ----- .../src/contracts/StateMutations.ts | 880 --- .../src/contracts/StaticSizeContract.ts | 1009 ---- .../src/contracts/TuplesContract.ts | 558 -- .../src/contracts/VerifierContract.ts | 554 -- examples/p-tls/.algokit/.copier-answers.yml | 4 +- .../contracts/clients/CalculatorClient.ts | 742 --- .../.algokit/.copier-answers.yml | 2 +- .../projects/p-tls-frontend/.env.template | 3 + .../projects/p-tls-frontend/package.json | 10 +- .../src/components/Transact.tsx | 11 +- .../src/contracts/Calculator.ts | 742 --- .../p-tls-frontend/src/interfaces/network.ts | 7 +- .../projects/p-tls-frontend/tsconfig.json | 4 +- .../p-tls-frontend/tsconfig.node.json | 4 +- examples/p-ts/.algokit/.copier-answers.yml | 4 +- .../.algokit/.copier-answers.yml | 1 + .../generators/create_contract/copier.yaml | 6 +- .../generators/create_env_file/copier.yaml | 16 +- .../projects/p-ts-contracts/.prettierrc.js | 2 +- .../p-ts-contracts/.vscode/launch.json | 4 +- .../p-ts-contracts/.vscode/settings.json | 2 +- .../p-ts-contracts/.vscode/tasks.json | 8 +- .../p-ts/projects/p-ts-contracts/README.md | 68 +- .../projects/p-ts-contracts/eslint.config.mjs | 6 +- .../hello_world/contract.algo.spec.ts | 18 +- .../hello_world/contract.algo.ts | 4 +- .../hello_world/contract.e2e.spec.ts | 65 +- .../hello_world/deploy-config.ts | 25 +- .../p-ts-contracts/smart_contracts/index.ts | 53 +- .../projects/p-ts-contracts/vitest.config.mts | 10 +- .../p-ts-frontend/src/contracts/HelloWorld.ts | 560 -- examples/s-py/.algokit/.copier-answers.yml | 4 +- .../.algokit/.copier-answers.yml | 2 +- .../s-py/projects/s-py-contracts/README.md | 2 +- .../s-py/projects/s-py-contracts/package.json | 16 +- .../projects/s-py-contracts/pyproject.toml | 4 +- .../s-py-contracts/smart_contracts/index.ts | 12 +- .../projects/s-py-contracts/tsconfig.json | 4 +- .../.algokit/.copier-answers.yml | 2 +- .../s-py/projects/s-py-frontend/.env.template | 3 + .../s-py/projects/s-py-frontend/package.json | 10 +- .../s-py-frontend/src/components/Transact.tsx | 11 +- .../s-py-frontend/src/contracts/HelloWorld.ts | 581 -- .../s-py-frontend/src/interfaces/network.ts | 7 +- .../s-py/projects/s-py-frontend/tsconfig.json | 4 +- .../projects/s-py-frontend/tsconfig.node.json | 4 +- examples/s-tls/.algokit/.copier-answers.yml | 4 +- .../contracts/clients/CalculatorClient.ts | 742 --- .../.algokit/.copier-answers.yml | 2 +- .../projects/s-tls-frontend/.env.template | 3 + .../projects/s-tls-frontend/package.json | 10 +- .../src/components/Transact.tsx | 11 +- .../src/contracts/Calculator.ts | 742 --- .../s-tls-frontend/src/interfaces/network.ts | 7 +- .../projects/s-tls-frontend/tsconfig.json | 4 +- .../s-tls-frontend/tsconfig.node.json | 4 +- examples/s-ts/.algokit/.copier-answers.yml | 4 +- .../s-ts-frontend/src/contracts/HelloWorld.ts | 560 -- 89 files changed, 240 insertions(+), 47998 deletions(-) delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/AppCall.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/AppExpectingEffects.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/Arc4InnerTxnsContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/Arc4PrimitiveOpsContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/BoxContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/Contract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ContractV0.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ContractV1.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/CryptoOpsContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/DynamicArrayInitContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/DynamicItxnGroup.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateValidator.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/HelloWorld.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ITxnOpsContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayInitContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/LocalStateContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/MiscellaneousOpsContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/PrimitiveOpsContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/SignaturesContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGet.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGetContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalExContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalExContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppParamsContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAssetHoldingContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAssetParamsContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateMutations.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StaticSizeContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/TuplesContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/VerifierContract.ts delete mode 100644 examples/p-tls/projects/p-tls-contracts/contracts/clients/CalculatorClient.ts delete mode 100644 examples/p-tls/projects/p-tls-frontend/src/contracts/Calculator.ts delete mode 100644 examples/p-ts/projects/p-ts-frontend/src/contracts/HelloWorld.ts delete mode 100644 examples/s-py/projects/s-py-frontend/src/contracts/HelloWorld.ts delete mode 100644 examples/s-tls/projects/s-tls-contracts/contracts/clients/CalculatorClient.ts delete mode 100644 examples/s-tls/projects/s-tls-frontend/src/contracts/Calculator.ts delete mode 100644 examples/s-ts/projects/s-ts-frontend/src/contracts/HelloWorld.ts diff --git a/examples/p-py/.algokit/.copier-answers.yml b/examples/p-py/.algokit/.copier-answers.yml index e14c54a..2869b87 100644 --- a/examples/p-py/.algokit/.copier-answers.yml +++ b/examples/p-py/.algokit/.copier-answers.yml @@ -1,6 +1,6 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 2.1.8-6-g5214399 -_src_path: /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpearc_7jg/template +_commit: 2.1.8-8-g954a453 +_src_path: .. author_email: None author_name: None cloud_provider: netlify diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/AppCall.ts b/examples/p-py/projects/p-py-frontend/src/contracts/AppCall.ts deleted file mode 100644 index c61e144..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/AppCall.ts +++ /dev/null @@ -1,558 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"AppCall","structs":{},"methods":[{"name":"some_value","args":[],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NAogICAgLy8gY2xhc3MgQXBwQ2FsbChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANQogICAgcHVzaGJ5dGVzIDB4ZDM0NzllNjUgLy8gbWV0aG9kICJzb21lX3ZhbHVlKCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3NvbWVfdmFsdWVfcm91dGVAMwogICAgZXJyCgptYWluX3NvbWVfdmFsdWVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIHNvbWVfdmFsdWUKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyZWF0ZWRBcHBBc3NldC5vdGhlci5BcHBDYWxsLnNvbWVfdmFsdWVbcm91dGluZ10oKSAtPiB2b2lkOgpzb21lX3ZhbHVlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9vdGhlci5weTo3CiAgICAvLyByZXR1cm4gR2xvYmFsLmdyb3VwX3NpemUgKiAoVHhuLmdyb3VwX2luZGV4ICsgMSkKICAgIGdsb2JhbCBHcm91cFNpemUKICAgIHR4biBHcm91cEluZGV4CiAgICBwdXNoaW50IDEKICAgICsKICAgICoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcHVzaGludCAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgATTR55lNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEMyBDEWgQEICxaABBUffHVMULCBAUM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the AppCall contract - */ -export type AppCallArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'some_value()uint64': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'some_value()uint64': [] - } -} - -/** - * The return type for each method - */ -export type AppCallReturns = { - 'some_value()uint64': bigint -} - -/** - * Defines the types of available calls and state of the AppCall smart contract. - */ -export type AppCallTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'some_value()uint64' | 'some_value', { - argsObj: AppCallArgs['obj']['some_value()uint64'] - argsTuple: AppCallArgs['tuple']['some_value()uint64'] - returns: AppCallReturns['some_value()uint64'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type AppCallSignatures = keyof AppCallTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type AppCallNonVoidMethodSignatures = keyof AppCallTypes['methods'] extends infer T ? T extends keyof AppCallTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the AppCall smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = AppCallTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the AppCall smart contract to the method's return type - */ -export type MethodReturn = AppCallTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type AppCallCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type AppCallDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: AppCallCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the AppCall smart contract - */ -export abstract class AppCallParamsFactory { - /** - * Constructs a no op call for the some_value()uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static someValue(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'some_value()uint64' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } -} - -/** - * A factory to create and deploy one or more instance of the AppCall smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class AppCallFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `AppCallFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new AppCallClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new AppCallClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the AppCall smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: AppCallDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new AppCallClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the AppCall smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the AppCall smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the AppCall smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new AppCallClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the AppCall smart contract - */ -export class AppCallClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `AppCallClient` - * - * @param appClient An `AppClient` instance which has been created with the AppCall app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `AppCallClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `AppCallClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new AppCallClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `AppCallClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new AppCallClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the AppCall smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the AppCall smart contract using the `some_value()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - someValue: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(AppCallParamsFactory.someValue(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the AppCall smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the AppCall smart contract using the `some_value()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - someValue: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(AppCallParamsFactory.someValue(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the AppCall smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the AppCall smart contract using the `some_value()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - someValue: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(AppCallParamsFactory.someValue(params)) - return {...result, return: result.return as unknown as (undefined | AppCallReturns['some_value()uint64'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new AppCallClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current AppCall app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): AppCallComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a some_value()uint64 method call against the AppCall contract - */ - someValue(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.someValue(params))) - return this - }, - /** - * Add a clear state call to the AppCall contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as AppCallComposer - } -} -export type AppCallComposer = { - /** - * Calls the some_value()uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - someValue(params?: CallParams): AppCallComposer<[...TReturns, AppCallReturns['some_value()uint64'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the AppCall smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): AppCallComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): AppCallComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type AppCallComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/AppExpectingEffects.ts b/examples/p-py/projects/p-py-frontend/src/contracts/AppExpectingEffects.ts deleted file mode 100644 index 1a953ef..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/AppExpectingEffects.ts +++ /dev/null @@ -1,630 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"AppExpectingEffects","structs":{},"methods":[{"name":"create_group","args":[{"type":"acfg","name":"asset_create"},{"type":"appl","name":"app_create"}],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"log_group","args":[{"type":"appl","name":"app_call"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[159],"errorMessage":"application log value is not the result of an ABI return"},{"pc":[96],"errorMessage":"expected app created"},{"pc":[81],"errorMessage":"expected asset created"},{"pc":[105],"errorMessage":"expected correct app id"},{"pc":[90],"errorMessage":"expected correct asset id"},{"pc":[139],"errorMessage":"expected correct method called"},{"pc":[145],"errorMessage":"expected logs"},{"pc":[65],"errorMessage":"transaction type is acfg"},{"pc":[75,126],"errorMessage":"transaction type is appl"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBBcHBFeHBlY3RpbmdFZmZlY3RzKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg2ZDNhMDQzOSAweDYyYTBlZjYyIC8vIG1ldGhvZCAiY3JlYXRlX2dyb3VwKGFjZmcsYXBwbCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19ncm91cChhcHBsKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGVfZ3JvdXAgbG9nX2dyb3VwCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyZWF0ZWRBcHBBc3NldC5jb250cmFjdC5BcHBFeHBlY3RpbmdFZmZlY3RzLmNyZWF0ZV9ncm91cFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZV9ncm91cDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFjZmcKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjExCiAgICAvLyBhc3NlcnQgYXNzZXRfY3JlYXRlLmNyZWF0ZWRfYXNzZXQuaWQsICJleHBlY3RlZCBhc3NldCBjcmVhdGVkIgogICAgZGlnIDEKICAgIGd0eG5zIENyZWF0ZWRBc3NldElECiAgICBkdXAKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCBjcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjEzCiAgICAvLyBvcC5nYWlkKGFzc2V0X2NyZWF0ZS5ncm91cF9pbmRleCkgPT0gYXNzZXRfY3JlYXRlLmNyZWF0ZWRfYXNzZXQuaWQKICAgIHVuY292ZXIgMgogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgZ2FpZHMKICAgIGRpZyAxCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToxMi0xNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5nYWlkKGFzc2V0X2NyZWF0ZS5ncm91cF9pbmRleCkgPT0gYXNzZXRfY3JlYXRlLmNyZWF0ZWRfYXNzZXQuaWQKICAgIC8vICksICJleHBlY3RlZCBjb3JyZWN0IGFzc2V0IGlkIgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgYXNzZXQgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MTUKICAgIC8vIGFzc2VydCBhcHBfY3JlYXRlLmNyZWF0ZWRfYXBwLmlkLCAiZXhwZWN0ZWQgYXBwIGNyZWF0ZWQiCiAgICBkaWcgMQogICAgZ3R4bnMgQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcCBjcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjE3CiAgICAvLyBvcC5nYWlkKGFwcF9jcmVhdGUuZ3JvdXBfaW5kZXgpID09IGFwcF9jcmVhdGUuY3JlYXRlZF9hcHAuaWQKICAgIHVuY292ZXIgMgogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgZ2FpZHMKICAgIGRpZyAxCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToxNi0xOAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5nYWlkKGFwcF9jcmVhdGUuZ3JvdXBfaW5kZXgpID09IGFwcF9jcmVhdGUuY3JlYXRlZF9hcHAuaWQKICAgIC8vICksICJleHBlY3RlZCBjb3JyZWN0IGFwcCBpZCIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGFwcCBpZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcmVhdGVkQXBwQXNzZXQuY29udHJhY3QuQXBwRXhwZWN0aW5nRWZmZWN0cy5sb2dfZ3JvdXBbcm91dGluZ10oKSAtPiB2b2lkOgpsb2dfZ3JvdXA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgYXBwX2NhbGwuYXBwX2FyZ3MoMCkgPT0gYXJjNC5hcmM0X3NpZ25hdHVyZSgKICAgIGR1cAogICAgcHVzaGludCAwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToyNC0yNgogICAgLy8gYXNzZXJ0IGFwcF9jYWxsLmFwcF9hcmdzKDApID09IGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgInNvbWVfdmFsdWUoKXVpbnQ2NCIKICAgIC8vICksICJleHBlY3RlZCBjb3JyZWN0IG1ldGhvZCBjYWxsZWQiCiAgICBwdXNoYnl0ZXMgMHhkMzQ3OWU2NSAvLyBtZXRob2QgInNvbWVfdmFsdWUoKXVpbnQ2NCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBtZXRob2QgY2FsbGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjI3CiAgICAvLyBhc3NlcnQgYXBwX2NhbGwubnVtX2xvZ3MgPT0gMSwgImV4cGVjdGVkIGxvZ3MiCiAgICBkdXAKICAgIGd0eG5zIE51bUxvZ3MKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxvZ3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MjkKICAgIC8vIGFyYzQuVUludDY0LmZyb21fbG9nKGFwcF9jYWxsLmxhc3RfbG9nKQogICAgZHVwCiAgICBndHhucyBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjMwCiAgICAvLyA9PSAoYXBwX2NhbGwuZ3JvdXBfaW5kZXggKyAxKSAqIEdsb2JhbC5ncm91cF9zaXplCiAgICBzd2FwCiAgICBndHhucyBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgKgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToyOS0zMAogICAgLy8gYXJjNC5VSW50NjQuZnJvbV9sb2coYXBwX2NhbGwubGFzdF9sb2cpCiAgICAvLyA9PSAoYXBwX2NhbGwuZ3JvdXBfaW5kZXggKyAxKSAqIEdsb2JhbC5ncm91cF9zaXplCiAgICBpdG9iCiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MjgtMzEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgYXJjNC5VSW50NjQuZnJvbV9sb2coYXBwX2NhbGwubGFzdF9sb2cpCiAgICAvLyAgICAgPT0gKGFwcF9jYWxsLmdyb3VwX2luZGV4ICsgMSkgKiBHbG9iYWwuZ3JvdXBfc2l6ZQogICAgLy8gKQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQYmAQQVH3x1MRtBAB0xGRREMRhEggIEbToEOQRioO9iNhoAjgIACQBIADEZFDEYFBBDMRaBAglJOBCBAxJEMRYiCUk4ECMSREsBODxJRE8COBY9SwESREsBOD1JRE8COBY9SwESREwWTBZQKExQsCJDMRYiCUk4ECMSREmBAMIagATTR55lEkRJODsiEkRJOD5JVwQATFcABCgSREw4FiIIMgQLFqhEIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the AppExpectingEffects contract - */ -export type AppExpectingEffectsArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'create_group(acfg,appl)(uint64,uint64)': { - assetCreate?: AppMethodCallTransactionArgument - appCreate: AppMethodCallTransactionArgument - } - 'log_group(appl)void': { - appCall: AppMethodCallTransactionArgument - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'create_group(acfg,appl)(uint64,uint64)': [assetCreate: AppMethodCallTransactionArgument | undefined, appCreate: AppMethodCallTransactionArgument] - 'log_group(appl)void': [appCall: AppMethodCallTransactionArgument] - } -} - -/** - * The return type for each method - */ -export type AppExpectingEffectsReturns = { - 'create_group(acfg,appl)(uint64,uint64)': [bigint, bigint] - 'log_group(appl)void': void -} - -/** - * Defines the types of available calls and state of the AppExpectingEffects smart contract. - */ -export type AppExpectingEffectsTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'create_group(acfg,appl)(uint64,uint64)' | 'create_group', { - argsObj: AppExpectingEffectsArgs['obj']['create_group(acfg,appl)(uint64,uint64)'] - argsTuple: AppExpectingEffectsArgs['tuple']['create_group(acfg,appl)(uint64,uint64)'] - returns: AppExpectingEffectsReturns['create_group(acfg,appl)(uint64,uint64)'] - }> - & Record<'log_group(appl)void' | 'log_group', { - argsObj: AppExpectingEffectsArgs['obj']['log_group(appl)void'] - argsTuple: AppExpectingEffectsArgs['tuple']['log_group(appl)void'] - returns: AppExpectingEffectsReturns['log_group(appl)void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type AppExpectingEffectsSignatures = keyof AppExpectingEffectsTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type AppExpectingEffectsNonVoidMethodSignatures = keyof AppExpectingEffectsTypes['methods'] extends infer T ? T extends keyof AppExpectingEffectsTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the AppExpectingEffects smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = AppExpectingEffectsTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the AppExpectingEffects smart contract to the method's return type - */ -export type MethodReturn = AppExpectingEffectsTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type AppExpectingEffectsCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type AppExpectingEffectsDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: AppExpectingEffectsCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the AppExpectingEffects smart contract - */ -export abstract class AppExpectingEffectsParamsFactory { - /** - * Constructs a no op call for the create_group(acfg,appl)(uint64,uint64) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static createGroup(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'create_group(acfg,appl)(uint64,uint64)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.assetCreate, params.args.appCreate], - } - } - /** - * Constructs a no op call for the log_group(appl)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static logGroup(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'log_group(appl)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.appCall], - } - } -} - -/** - * A factory to create and deploy one or more instance of the AppExpectingEffects smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class AppExpectingEffectsFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `AppExpectingEffectsFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new AppExpectingEffectsClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new AppExpectingEffectsClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the AppExpectingEffects smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: AppExpectingEffectsDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new AppExpectingEffectsClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the AppExpectingEffects smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the AppExpectingEffects smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the AppExpectingEffects smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new AppExpectingEffectsClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the AppExpectingEffects smart contract - */ -export class AppExpectingEffectsClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `AppExpectingEffectsClient` - * - * @param appClient An `AppClient` instance which has been created with the AppExpectingEffects app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `AppExpectingEffectsClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `AppExpectingEffectsClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new AppExpectingEffectsClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `AppExpectingEffectsClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new AppExpectingEffectsClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the AppExpectingEffects smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the AppExpectingEffects smart contract using the `create_group(acfg,appl)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - createGroup: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(AppExpectingEffectsParamsFactory.createGroup(params)) - }, - - /** - * Makes a call to the AppExpectingEffects smart contract using the `log_group(appl)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - logGroup: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(AppExpectingEffectsParamsFactory.logGroup(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the AppExpectingEffects smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the AppExpectingEffects smart contract using the `create_group(acfg,appl)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - createGroup: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(AppExpectingEffectsParamsFactory.createGroup(params)) - }, - - /** - * Makes a call to the AppExpectingEffects smart contract using the `log_group(appl)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - logGroup: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(AppExpectingEffectsParamsFactory.logGroup(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the AppExpectingEffects smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the AppExpectingEffects smart contract using the `create_group(acfg,appl)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - createGroup: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(AppExpectingEffectsParamsFactory.createGroup(params)) - return {...result, return: result.return as unknown as (undefined | AppExpectingEffectsReturns['create_group(acfg,appl)(uint64,uint64)'])} - }, - - /** - * Makes a call to the AppExpectingEffects smart contract using the `log_group(appl)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - logGroup: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(AppExpectingEffectsParamsFactory.logGroup(params)) - return {...result, return: result.return as unknown as (undefined | AppExpectingEffectsReturns['log_group(appl)void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new AppExpectingEffectsClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current AppExpectingEffects app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): AppExpectingEffectsComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a create_group(acfg,appl)(uint64,uint64) method call against the AppExpectingEffects contract - */ - createGroup(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createGroup(params))) - return this - }, - /** - * Add a log_group(appl)void method call against the AppExpectingEffects contract - */ - logGroup(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.logGroup(params))) - return this - }, - /** - * Add a clear state call to the AppExpectingEffects contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as AppExpectingEffectsComposer - } -} -export type AppExpectingEffectsComposer = { - /** - * Calls the create_group(acfg,appl)(uint64,uint64) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - createGroup(params?: CallParams): AppExpectingEffectsComposer<[...TReturns, AppExpectingEffectsReturns['create_group(acfg,appl)(uint64,uint64)'] | undefined]> - - /** - * Calls the log_group(appl)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - logGroup(params?: CallParams): AppExpectingEffectsComposer<[...TReturns, AppExpectingEffectsReturns['log_group(appl)void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the AppExpectingEffects smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): AppExpectingEffectsComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): AppExpectingEffectsComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type AppExpectingEffectsComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/Arc4InnerTxnsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/Arc4InnerTxnsContract.ts deleted file mode 100644 index afe3303..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/Arc4InnerTxnsContract.ts +++ /dev/null @@ -1,556 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"Arc4InnerTxnsContract","structs":{},"methods":[{"name":"opt_in_dummy_asset","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0SW5uZXJUeG5zL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIEFyYzRJbm5lclR4bnNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANQogICAgcHVzaGJ5dGVzIDB4YWIzOWM1NWEgLy8gbWV0aG9kICJvcHRfaW5fZHVtbXlfYXNzZXQodWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX29wdF9pbl9kdW1teV9hc3NldF9yb3V0ZUAzCiAgICBlcnIKCm1haW5fb3B0X2luX2R1bW15X2Fzc2V0X3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIG9wdF9pbl9kdW1teV9hc3NldAoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNElubmVyVHhucy5jb250cmFjdC5BcmM0SW5uZXJUeG5zQ29udHJhY3Qub3B0X2luX2R1bW15X2Fzc2V0W3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luX2R1bW15X2Fzc2V0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRJbm5lclR4bnMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo3LTExCiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0SW5uZXJUeG5zL2NvbnRyYWN0LnB5OjkKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRJbm5lclR4bnMvY29udHJhY3QucHk6Ny04CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo3LTExCiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgASrOcVaNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEM2GgEXsTIKshSyEYEEshCBALIBs4EBQw==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the Arc4InnerTxnsContract contract - */ -export type Arc4InnerTxnsContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'opt_in_dummy_asset(uint64)void': { - asset: bigint | number - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'opt_in_dummy_asset(uint64)void': [asset: bigint | number] - } -} - -/** - * The return type for each method - */ -export type Arc4InnerTxnsContractReturns = { - 'opt_in_dummy_asset(uint64)void': void -} - -/** - * Defines the types of available calls and state of the Arc4InnerTxnsContract smart contract. - */ -export type Arc4InnerTxnsContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'opt_in_dummy_asset(uint64)void' | 'opt_in_dummy_asset', { - argsObj: Arc4InnerTxnsContractArgs['obj']['opt_in_dummy_asset(uint64)void'] - argsTuple: Arc4InnerTxnsContractArgs['tuple']['opt_in_dummy_asset(uint64)void'] - returns: Arc4InnerTxnsContractReturns['opt_in_dummy_asset(uint64)void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type Arc4InnerTxnsContractSignatures = keyof Arc4InnerTxnsContractTypes['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the Arc4InnerTxnsContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = Arc4InnerTxnsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the Arc4InnerTxnsContract smart contract to the method's return type - */ -export type MethodReturn = Arc4InnerTxnsContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type Arc4InnerTxnsContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type Arc4InnerTxnsContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: Arc4InnerTxnsContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the Arc4InnerTxnsContract smart contract - */ -export abstract class Arc4InnerTxnsContractParamsFactory { - /** - * Constructs a no op call for the opt_in_dummy_asset(uint64)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static optInDummyAsset(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'opt_in_dummy_asset(uint64)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.asset], - } - } -} - -/** - * A factory to create and deploy one or more instance of the Arc4InnerTxnsContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class Arc4InnerTxnsContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `Arc4InnerTxnsContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new Arc4InnerTxnsContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new Arc4InnerTxnsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the Arc4InnerTxnsContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: Arc4InnerTxnsContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new Arc4InnerTxnsContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Arc4InnerTxnsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Arc4InnerTxnsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Arc4InnerTxnsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new Arc4InnerTxnsContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the Arc4InnerTxnsContract smart contract - */ -export class Arc4InnerTxnsContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `Arc4InnerTxnsContractClient` - * - * @param appClient An `AppClient` instance which has been created with the Arc4InnerTxnsContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `Arc4InnerTxnsContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `Arc4InnerTxnsContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new Arc4InnerTxnsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `Arc4InnerTxnsContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new Arc4InnerTxnsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the Arc4InnerTxnsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the Arc4InnerTxnsContract smart contract using the `opt_in_dummy_asset(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - optInDummyAsset: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4InnerTxnsContractParamsFactory.optInDummyAsset(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the Arc4InnerTxnsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the Arc4InnerTxnsContract smart contract using the `opt_in_dummy_asset(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - optInDummyAsset: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4InnerTxnsContractParamsFactory.optInDummyAsset(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the Arc4InnerTxnsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the Arc4InnerTxnsContract smart contract using the `opt_in_dummy_asset(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - optInDummyAsset: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4InnerTxnsContractParamsFactory.optInDummyAsset(params)) - return {...result, return: result.return as unknown as (undefined | Arc4InnerTxnsContractReturns['opt_in_dummy_asset(uint64)void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new Arc4InnerTxnsContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current Arc4InnerTxnsContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): Arc4InnerTxnsContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a opt_in_dummy_asset(uint64)void method call against the Arc4InnerTxnsContract contract - */ - optInDummyAsset(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optInDummyAsset(params))) - return this - }, - /** - * Add a clear state call to the Arc4InnerTxnsContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as Arc4InnerTxnsContractComposer - } -} -export type Arc4InnerTxnsContractComposer = { - /** - * Calls the opt_in_dummy_asset(uint64)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - optInDummyAsset(params?: CallParams): Arc4InnerTxnsContractComposer<[...TReturns, Arc4InnerTxnsContractReturns['opt_in_dummy_asset(uint64)void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the Arc4InnerTxnsContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): Arc4InnerTxnsContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): Arc4InnerTxnsContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type Arc4InnerTxnsContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/Arc4PrimitiveOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/Arc4PrimitiveOpsContract.ts deleted file mode 100644 index 355f633..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/Arc4PrimitiveOpsContract.ts +++ /dev/null @@ -1,3982 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"Arc4PrimitiveOpsContract","structs":{},"methods":[{"name":"verify_uintn_uintn_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_init","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint32"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_init","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint256"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint32"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint256"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint32"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint256"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_as_uint64","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_as_biguint","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint512"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn64_as_uint64","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn64_as_biguint","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint512"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ufixednxm_bytes","args":[{"type":"ufixed32x8","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bigufixednxm_bytes","args":[{"type":"ufixed256x16","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ufixednxm_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"ufixed32x8"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bigufixednxm_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"ufixed256x16"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ufixednxm_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"ufixed32x8"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bigufixednxm_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"ufixed256x16"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_init","args":[{"type":"string","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_add","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_eq","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_bytes","args":[{"type":"string","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bool_bytes","args":[{"type":"bool","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bool_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bool_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_emit","args":[{"type":"string","name":"a"},{"type":"uint512","name":"b"},{"type":"uint64","name":"c"},{"type":"byte[]","name":"d"},{"type":"uint64","name":"e"},{"type":"bool","name":"f"},{"type":"byte[]","name":"g"},{"type":"string","name":"h"},{"type":"uint64","name":"m"},{"type":"uint256","name":"n"},{"type":"ufixed32x8","name":"o"},{"type":"ufixed256x16","name":"p"},{"type":"bool","name":"q"},{"type":"byte[]","name":"r"},{"type":"byte[]","name":"s"},{"type":"byte[]","name":"t"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[{"name":"SwappedArc4","args":[{"type":"uint64","name":"m"},{"type":"uint256","name":"n"},{"type":"ufixed32x8","name":"o"},{"type":"ufixed256x16","name":"p"},{"type":"bool","name":"q"},{"type":"uint8[3]","name":"r"},{"type":"uint16[]","name":"s"},{"type":"(uint32,uint64,string)","name":"t"}]},{"name":"Swapped","args":[{"type":"string","name":"field1"},{"type":"uint512","name":"field2"},{"type":"uint64","name":"field3"},{"type":"byte[]","name":"field4"},{"type":"uint64","name":"field5"},{"type":"bool","name":"field6"},{"type":"byte[]","name":"field7"},{"type":"string","name":"field8"},{"type":"uint64","name":"field9"},{"type":"uint256","name":"field10"},{"type":"ufixed32x8","name":"field11"},{"type":"ufixed256x16","name":"field12"},{"type":"bool","name":"field13"},{"type":"uint8[3]","name":"field14"},{"type":"uint16[]","name":"field15"},{"type":"(uint32,uint64,string)","name":"field16"}]}],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[1579,1599,1788,1808,1933,1982],"errorMessage":"application log value is not the result of an ABI return"},{"pc":[1855],"errorMessage":"max array length exceeded"},{"pc":[411,424,457,468,503,514,549,562,595,608,641,652,687,698,733,746,779,792,825,836,871,882,917,930,963,976,1009,1020,1055,1066,1101,1114,1147,1160,1193,1204,1239,1250,1285,1298,1331,1344,1377,1388,1423,1434,1469,1482,1509,1531,1617,1626,1650,1659,1679,1699,1707],"errorMessage":"overflow"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDggNjQgMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4MDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjYKICAgIC8vIGNsYXNzIEFyYzRQcmltaXRpdmVPcHNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANTcKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDk2ZjE0MTE2IDB4ZWQ2NjYwOTYgMHgyY2EwMzUyYiAweDg1OTA3ZDQwIDB4MmNiZWM0NWIgMHgwNzY2NmZkOSAweDM3MGJhYmQzIDB4MmI2YjNlZjAgMHgzMzlkYTk3YyAweDc4OThlZDk3IDB4MWYxMzBjZWMgMHhjNzQ4NjY0ZSAweDdhNDYwY2IxIDB4ZGNhYjFmMDEgMHg5N2Q5MDY0ZCAweGNlMDZjMmEwIDB4ZGNkYmNlZTAgMHg3N2E0YjY4ZCAweDRmNTQwNjI2IDB4MDk1YWVkNDEgMHhlM2I3ZTkxOCAweDU1MzM3MDA4IDB4OWJiMWNkNjYgMHg4MTQ4NGQ5ZCAweDlhMDNkZjEwIDB4ZDNmMGU0NGIgMHg5ODJkYjIzMyAweGFmZmJkZjBlIDB4Mjg4YWY3NmUgMHg4YmQ4NGEwNCAweDMwMmI4YTBhIDB4MzM3YWUyMGIgMHg2ZTI1OTI3MCAweDc5ZTM1Zjc3IDB4MGYxNTc0ZmUgMHhiMmNiMTNiZSAweGQwNTllZWE3IDB4NGNjNGMxNTcgMHgzZDE3YWM2ZSAweGY3ZjNkNWZjIDB4ZjhjOGY4ZDUgMHg0M2Y3MTYyYSAweDQyZTA5MDc1IDB4ZDk1NmY1NzUgMHg2YzAxNjBkZiAweGE4OTAxNTBiIDB4MGIyZjRjM2YgMHg5ZGI5ZDMyNyAweGU0ZDk1MGExIDB4YjYwNWU4MGMgLy8gbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5faW5pdChieXRlW10pdWludDMyIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5faW5pdChieXRlW10pdWludDI1NiIsIG1ldGhvZCAidmVyaWZ5X3VpbnRuX2Zyb21fYnl0ZXMoYnl0ZVtdKXVpbnQzMiIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRuX2Zyb21fYnl0ZXMoYnl0ZVtdKXVpbnQyNTYiLCBtZXRob2QgInZlcmlmeV91aW50bl9mcm9tX2xvZyhieXRlW10pdWludDMyIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fZnJvbV9sb2coYnl0ZVtdKXVpbnQyNTYiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl9hc191aW50NjQoYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRuX2FzX2JpZ3VpbnQoYnl0ZVtdKXVpbnQ1MTIiLCBtZXRob2QgInZlcmlmeV91aW50bjY0X2FzX3VpbnQ2NChieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludG42NF9hc19iaWd1aW50KGJ5dGVbXSl1aW50NTEyIiwgbWV0aG9kICJ2ZXJpZnlfdWZpeGVkbnhtX2J5dGVzKHVmaXhlZDMyeDgpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWZpeGVkbnhtX2J5dGVzKHVmaXhlZDI1NngxNilieXRlW10iLCBtZXRob2QgInZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlcyhieXRlW10pdWZpeGVkMzJ4OCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VmaXhlZG54bV9mcm9tX2J5dGVzKGJ5dGVbXSl1Zml4ZWQyNTZ4MTYiLCBtZXRob2QgInZlcmlmeV91Zml4ZWRueG1fZnJvbV9sb2coYnl0ZVtdKXVmaXhlZDMyeDgiLCBtZXRob2QgInZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9sb2coYnl0ZVtdKXVmaXhlZDI1NngxNiIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19pbml0KHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfYWRkKHN0cmluZyxzdHJpbmcpc3RyaW5nIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2VxKHN0cmluZyxzdHJpbmcpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19ieXRlcyhzdHJpbmcpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2Zyb21fYnl0ZXMoYnl0ZVtdKXN0cmluZyIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19mcm9tX2xvZyhieXRlW10pc3RyaW5nIiwgbWV0aG9kICJ2ZXJpZnlfYm9vbF9ieXRlcyhib29sKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Jvb2xfZnJvbV9ieXRlcyhieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2Jvb2xfZnJvbV9sb2coYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9lbWl0KHN0cmluZyx1aW50NTEyLHVpbnQ2NCxieXRlW10sdWludDY0LGJvb2wsYnl0ZVtdLHN0cmluZyx1aW50NjQsdWludDI1Nix1Zml4ZWQzMng4LHVmaXhlZDI1NngxNixib29sLGJ5dGVbXSxieXRlW10sYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfdWludG5fdWludG5fZXEgdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2VxIHZlcmlmeV91aW50bl9iaWd1aW50bl9lcSB2ZXJpZnlfYmlndWludG5fYmlndWludG5fZXEgdmVyaWZ5X3VpbnRuX3VpbnRuX25lIHZlcmlmeV9iaWd1aW50bl91aW50bl9uZSB2ZXJpZnlfdWludG5fYmlndWludG5fbmUgdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX25lIHZlcmlmeV91aW50bl91aW50bl9sdCB2ZXJpZnlfYmlndWludG5fdWludG5fbHQgdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX2x0IHZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9sdCB2ZXJpZnlfdWludG5fdWludG5fbGUgdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2xlIHZlcmlmeV91aW50bl9iaWd1aW50bl9sZSB2ZXJpZnlfYmlndWludG5fYmlndWludG5fbGUgdmVyaWZ5X3VpbnRuX3VpbnRuX2d0IHZlcmlmeV9iaWd1aW50bl91aW50bl9ndCB2ZXJpZnlfdWludG5fYmlndWludG5fZ3QgdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX2d0IHZlcmlmeV91aW50bl91aW50bl9nZSB2ZXJpZnlfYmlndWludG5fdWludG5fZ2UgdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX2dlIHZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9nZSB2ZXJpZnlfdWludG5faW5pdCB2ZXJpZnlfYmlndWludG5faW5pdCB2ZXJpZnlfdWludG5fZnJvbV9ieXRlcyB2ZXJpZnlfYmlndWludG5fZnJvbV9ieXRlcyB2ZXJpZnlfdWludG5fZnJvbV9sb2cgdmVyaWZ5X2JpZ3VpbnRuX2Zyb21fbG9nIHZlcmlmeV9iaWd1aW50bl9hc191aW50NjQgdmVyaWZ5X2JpZ3VpbnRuX2FzX2JpZ3VpbnQgdmVyaWZ5X3VpbnRuNjRfYXNfdWludDY0IHZlcmlmeV91aW50bjY0X2FzX2JpZ3VpbnQgdmVyaWZ5X3VmaXhlZG54bV9ieXRlcyB2ZXJpZnlfYmlndWZpeGVkbnhtX2J5dGVzIHZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlcyB2ZXJpZnlfYmlndWZpeGVkbnhtX2Zyb21fYnl0ZXMgdmVyaWZ5X3VmaXhlZG54bV9mcm9tX2xvZyB2ZXJpZnlfYmlndWZpeGVkbnhtX2Zyb21fbG9nIHZlcmlmeV9zdHJpbmdfaW5pdCB2ZXJpZnlfc3RyaW5nX2FkZCB2ZXJpZnlfc3RyaW5nX2VxIHZlcmlmeV9zdHJpbmdfYnl0ZXMgdmVyaWZ5X3N0cmluZ19mcm9tX2J5dGVzIHZlcmlmeV9zdHJpbmdfZnJvbV9sb2cgdmVyaWZ5X2Jvb2xfYnl0ZXMgdmVyaWZ5X2Jvb2xfZnJvbV9ieXRlcyB2ZXJpZnlfYm9vbF9mcm9tX2xvZyB2ZXJpZnlfZW1pdAogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU3OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX3VpbnRuX2VxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX3VpbnRuX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTEKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpID09IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl91aW50bl9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl91aW50bl9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID09IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPT0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOQogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID09IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSAhPSBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBifAogICAgZGlnIDIKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgIT0gYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSAhPSBhcmM0LlVJbnQ1MTIoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjUzCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgIT0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGIhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fbHQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpIDwgYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBjb3ZlciAyCiAgICBifAogICAgYjwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2x0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgPCBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9sdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9sdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPCBhcmM0LlVJbnQ1MTIoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiPAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fbHQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzcKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA8IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODMKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpIDw9IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fdWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fdWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA8PSBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fYmlndWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fYmlndWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpIDw9IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgPD0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fZ3Rbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPiBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBifAogICAgZGlnIDIKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2d0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2d0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTMKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA+IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9ndFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9ndDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTE5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSA+IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fZ3Rbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID4gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPj0gYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBjb3ZlciAyCiAgICBifAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fdWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fdWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID49IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fYmlndWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fYmlndWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPj0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID49IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPj0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX2luaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTU0CiAgICAvLyByZXR1cm4gYXJjNC5VSW50MzIoYV9iaWd1aW50KQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgcHVzaGludCA0CiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2luaXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5faW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQyNTYoYV9iaWd1aW50KQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHB1c2hpbnQgMzIKICAgIGJ6ZXJvCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fZnJvbV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9mcm9tX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2Zyb21fYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9mcm9tX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDMyLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl9mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl9mcm9tX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gcmV0dXJuIGFyYzQuVUludDI1Ni5mcm9tX2xvZyhhKQogICAgZHVwCiAgICBleHRyYWN0IDYgMAogICAgc3dhcAogICAgZXh0cmFjdCAyIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBsb2cgdmFsdWUgaXMgbm90IHRoZSByZXN1bHQgb2YgYW4gQUJJIHJldHVybgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYXNfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX2FzX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxODAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQyNTYoYV9iaWd1aW50KS5hc191aW50NjQoKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHB1c2hpbnQgMzIKICAgIGJ6ZXJvCiAgICBifAogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAtCiAgICBpbnRjXzEgLy8gOAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZXh0cmFjdDMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2FzX2JpZ3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYXNfYmlndWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxODUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQyNTYoYV9iaWd1aW50KS5hc19iaWd1aW50KCkKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBwdXNoaW50IDMyCiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIGJ8CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bjY0X2FzX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bjY0X2FzX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuNjRfYXNfYmlndWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bjY0X2FzX2JpZ3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KS5hc19iaWd1aW50KCkKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgYnwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VmaXhlZG54bV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91Zml4ZWRueG1fYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWZpeGVkbnhtX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VmaXhlZG54bV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91Zml4ZWRueG1fZnJvbV9sb2dbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWZpeGVkbnhtX2Zyb21fbG9nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI1CiAgICAvLyByZXR1cm4gYXJjNC5VRml4ZWROeE1bdHlwaW5nLkxpdGVyYWxbMzJdLCB0eXBpbmcuTGl0ZXJhbFs4XV0uZnJvbV9sb2coYSkKICAgIGR1cAogICAgZXh0cmFjdCA2IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMiA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gbG9nIHZhbHVlIGlzIG5vdCB0aGUgcmVzdWx0IG9mIGFuIEFCSSByZXR1cm4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VmaXhlZG54bV9mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzEKICAgIC8vIHJldHVybiBhcmM0LkJpZ1VGaXhlZE54TVt0eXBpbmcuTGl0ZXJhbFsyNTZdLCB0eXBpbmcuTGl0ZXJhbFsxNl1dLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjM1CiAgICAvLyByZXN1bHQgPSBhcmM0LlN0cmluZyhTdHJpbmcoIkhlbGxvLCAiKSArIGEpCiAgICBwdXNoYnl0ZXMgIkhlbGxvLCAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2FkZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfYWRkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0MAogICAgLy8gcmVzdWx0ID0gYSArIGIKICAgIGV4dHJhY3QgMiAwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfZXFbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQ1CiAgICAvLyByZXR1cm4gYSA9PSBiCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2Zyb21fYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2Zyb21fYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2Zyb21fbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N0cmluZ19mcm9tX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gcmV0dXJuIGFyYzQuU3RyaW5nLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ib29sX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jvb2xfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYm9vbF9mcm9tX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jvb2xfZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ib29sX2Zyb21fbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jvb2xfZnJvbV9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNzAKICAgIC8vIHJldHVybiBhcmM0LkJvb2wuZnJvbV9sb2coYSkKICAgIGR1cAogICAgZXh0cmFjdCA2IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMiA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gbG9nIHZhbHVlIGlzIG5vdCB0aGUgcmVzdWx0IG9mIGFuIEFCSSByZXR1cm4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2VtaXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZW1pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50MTYKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZHVwCiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk2CiAgICAvLyBhcmM0LmVtaXQoU3dhcHBlZEFyYzQobSwgbiwgbywgcCwgcSwgYXJjNF9yLCBhcmM0X3MsIGFyYzRfdCkpCiAgICBkaWcgNwogICAgZGlnIDcKICAgIGNvbmNhdAogICAgZGlnIDYKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDA1NAogICAgY29uY2F0CiAgICBkaWcgMgogICAgbGVuCiAgICBwdXNoaW50IDg0CiAgICBkaWcgMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHg2NmJiMDMzMyAvLyBtZXRob2QgIlN3YXBwZWRBcmM0KHVpbnQ2NCx1aW50MjU2LHVmaXhlZDMyeDgsdWZpeGVkMjU2eDE2LGJvb2wsdWludDhbM10sdWludDE2W10sKHVpbnQzMix1aW50NjQsc3RyaW5nKSkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk3LTMxNQogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgICJTd2FwcGVkIiwKICAgIC8vICAgICBhLAogICAgLy8gICAgIGIsCiAgICAvLyAgICAgYywKICAgIC8vICAgICBkLmNvcHkoKSwKICAgIC8vICAgICBlLAogICAgLy8gICAgIGYsCiAgICAvLyAgICAgZy5jb3B5KCksCiAgICAvLyAgICAgaCwKICAgIC8vICAgICBtLAogICAgLy8gICAgIG4sCiAgICAvLyAgICAgbywKICAgIC8vICAgICBwLAogICAgLy8gICAgIHEsCiAgICAvLyAgICAgYXJjNF9yLmNvcHkoKSwKICAgIC8vICAgICBhcmM0X3MuY29weSgpLAogICAgLy8gICAgIGFyYzRfdCwKICAgIC8vICkKICAgIGRpZyAxNgogICAgbGVuCiAgICBwdXNoaW50IDE3MwogICAgKwogICAgcHVzaGJ5dGVzIDB4MDBhZAogICAgdW5jb3ZlciAxNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDE2CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBkaWcgMTUKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDE0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIGRpZyAxMgogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMTEKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweGVjMzMxOWJiIC8vIG1ldGhvZCAiU3dhcHBlZChzdHJpbmcsdWludDUxMix1aW50NjQsYnl0ZVtdLHVpbnQ2NCxib29sLGJ5dGVbXSxzdHJpbmcsdWludDY0LHVpbnQyNTYsdWZpeGVkMzJ4OCx1Zml4ZWQyNTZ4MTYsYm9vbCx1aW50OFszXSx1aW50MTZbXSwodWludDMyLHVpbnQ2NCxzdHJpbmcpKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxNi0zMzQKICAgIC8vIGFyYzQuZW1pdCgKICAgIC8vICAgICAiU3dhcHBlZChzdHJpbmcsdWludDUxMix1aW50NjQsYnl0ZVtdLHVpbnQ2NCxib29sLGJ5dGVbXSxzdHJpbmcsdWludDY0LHVpbnQyNTYsdWZpeGVkMzJ4OCx1Zml4ZWQyNTZ4MTYsYm9vbCx1aW50OFszXSx1aW50MTZbXSwodWludDMyLHVpbnQ2NCxzdHJpbmcpKSIsCiAgICAvLyAgICAgYSwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGMsCiAgICAvLyAgICAgZC5jb3B5KCksCiAgICAvLyAgICAgZSwKICAgIC8vICAgICBmLAogICAgLy8gICAgIGcuY29weSgpLAogICAgLy8gICAgIGgsCiAgICAvLyAgICAgbSwKICAgIC8vICAgICBuLAogICAgLy8gICAgIG8sCiAgICAvLyAgICAgcCwKICAgIC8vICAgICBxLAogICAgLy8gICAgIGFyYzRfci5jb3B5KCksCiAgICAvLyAgICAgYXJjNF9zLmNvcHkoKSwKICAgIC8vICAgICBhcmM0X3QsCiAgICAvLyApCiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAQhAACYCBBUffHUBADEbQQFtMRkURDEYRIIyBJbxQRYE7WZglgQsoDUrBIWQfUAELL7EWwQHZm/ZBDcLq9MEK2s+8AQznal8BHiY7ZcEHxMM7ATHSGZOBHpGDLEE3KsfAQSX2QZNBM4GwqAE3NvO4AR3pLaNBE9UBiYECVrtQQTjt+kYBFUzcAgEm7HNZgSBSE2dBJoD3xAE0/DkSwSYLbIzBK/73w4EKIr3bgSL2EoEBDArigoEM3riCwRuJZJwBHnjX3cEDxV0/gSyyxO+BNBZ7qcETMTBVwQ9F6xuBPfz1fwE+Mj41QRD9xYqBELgkHUE2Vb1dQRsAWDfBKiQFQsECy9MPwSdudMnBOTZUKEEtgXoDDYaAI4yAAkANwBlAJMAwQDvAR0BSwF5AacB1QIDAjECXwKNArsC6QMXA0UDcwOhA88D/QQrBFkEbwSFBJEEnQSxBMUE5gUEBRgFNAVFBVYFYgVuBYIFlgW1BdAF4gXzBf8GEwYkBjAGRAAxGRQxGBQQQzYaAVcCADYaAlcCAEsBFSMORCOvTwJLAatLAhUjDkROAquoKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08Cq0sBFSMORCOvTwKrqCklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAqtLARUkDkQkr08Cq6gpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwJLAatLAhUkDkROAquoKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08CSwGrSwIVIw5ETgKrqSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAqtLARUjDkQjr08Cq6kpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwKrSwEVJA5EJK9PAqupKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08CSwGrSwIVJA5ETgKrqSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAksBq0sCFSMORE4Cq6QpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwKrSwEVIw5EI69PAqukKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08Cq0sBFSQORCSvTwKrpCklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAksBq0sCFSQORE4Cq6QpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwJLAatLAhUjDkROAqumKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08Cq0sBFSMORCOvTwKrpiklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAqtLARUkDkQkr08Cq6YpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwJLAatLAhUkDkROAqumKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08CSwGrSwIVIw5ETgKrpSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAqtLARUjDkQjr08Cq6UpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwKrSwEVJA5EJK9PAqulKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08CSwGrSwIVJA5ETgKrpSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAksBq0sCFSMORE4Cq6cpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwKrSwEVIw5EI69PAqunKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08Cq0sBFSQORCSvTwKrpyklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAksBq0sCFSQORE4Cq6cpJU8CVChMULAiQzYaAVcCAEkVgQQORIEEr6soTFCwIkM2GgFXAgBJFYEgDkSBIK+rKExQsCJDNhoBVwIAKExQsCJDNhoBVwIAKExQsCJDNhoBSVcGAExXAgQoEkQoTFCwIkM2GgFJVwYATFcCBCgSRChMULAiQzYaAVcCAEkVgSAORIEgr6tJkyQOREkVIwkjWChMULAiQzYaAVcCAEkVgSAORIEgr6tJFSQORCSvqyhMULAiQzYaAVcCAEkVIw5EI6+rKExQsCJDNhoBVwIASRUjDkQjr6tJFSQORCSvqyhMULAiQzYaAUkVFlcGAkxQKExQsCJDNhoBSRUWVwYCTFAoTFCwIkM2GgFXAgAoTFCwIkM2GgFXAgAoTFCwIkM2GgFJVwYATFcCBCgSRChMULAiQzYaAUlXBgBMVwIEKBJEKExQsCJDNhoBVwIAgAdIZWxsbywgTFBJFRZXBgJMUChMULAiQzYaATYaAlcCAFBJVwIAFRZXBgJcAChMULAiQzYaATYaAhIpJU8CVChMULAiQzYaAUkVFlcGAkxQKExQsCJDNhoBVwIAKExQsCJDNhoBSVcGAExXAgQoEkQoTFCwIkM2GgFJFRZXBgJMUChMULAiQzYaAVcCAChMULAiQzYaAUlXBgBMVwIEKBJEKExQsCJDNhoBNhoCNhoDNhoENhoFNhoGNhoHNhoINhoJNhoKNhoLNhoMNhoNNhoOVwIANhoPSSVZSwGBAllSVwIANhoPSYECWUsBFVJXAgBLB0sHUEsGUEsFUEsEUEsDUIACAFRQSwIVgVRLAQgWVwYCTwJMUEsDUEsCUIAEZrsDM0xQsEsQFYGtAQiAAgCtTxFQTxBQSwEWVwYCUEsPFU8CCExPDlBPDVBLARZXBgJQSwwVTwIISRZXBgJPAkxQSwsVTwIITE8KUE8JUE8IUE8HUE8GUE8FUEsBFlcGAlBMTwIIFlcGAlBPBlBPBVBPBFBPA1BPAlBMUIAE7DMZu0xQSbCwIkM=","clear":"C4EBQw=="},"events":[{"name":"SwappedArc4","args":[{"type":"uint64","name":"m"},{"type":"uint256","name":"n"},{"type":"ufixed32x8","name":"o"},{"type":"ufixed256x16","name":"p"},{"type":"bool","name":"q"},{"type":"uint8[3]","name":"r"},{"type":"uint16[]","name":"s"},{"type":"(uint32,uint64,string)","name":"t"}]},{"name":"Swapped","args":[{"type":"string","name":"field1"},{"type":"uint512","name":"field2"},{"type":"uint64","name":"field3"},{"type":"byte[]","name":"field4"},{"type":"uint64","name":"field5"},{"type":"bool","name":"field6"},{"type":"byte[]","name":"field7"},{"type":"string","name":"field8"},{"type":"uint64","name":"field9"},{"type":"uint256","name":"field10"},{"type":"ufixed32x8","name":"field11"},{"type":"ufixed256x16","name":"field12"},{"type":"bool","name":"field13"},{"type":"uint8[3]","name":"field14"},{"type":"uint16[]","name":"field15"},{"type":"(uint32,uint64,string)","name":"field16"}]}],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the Arc4PrimitiveOpsContract contract - */ -export type Arc4PrimitiveOpsContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify_uintn_uintn_eq(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_uintn_eq(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_biguintn_eq(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_biguintn_eq(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_uintn_ne(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_uintn_ne(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_biguintn_ne(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_biguintn_ne(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_uintn_lt(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_uintn_lt(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_biguintn_lt(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_biguintn_lt(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_uintn_le(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_uintn_le(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_biguintn_le(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_biguintn_le(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_uintn_gt(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_uintn_gt(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_biguintn_gt(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_biguintn_gt(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_uintn_ge(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_uintn_ge(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_biguintn_ge(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_biguintn_ge(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_init(byte[])uint32': { - a: Uint8Array - } - 'verify_biguintn_init(byte[])uint256': { - a: Uint8Array - } - 'verify_uintn_from_bytes(byte[])uint32': { - a: Uint8Array - } - 'verify_biguintn_from_bytes(byte[])uint256': { - a: Uint8Array - } - 'verify_uintn_from_log(byte[])uint32': { - a: Uint8Array - } - 'verify_biguintn_from_log(byte[])uint256': { - a: Uint8Array - } - 'verify_biguintn_as_uint64(byte[])uint64': { - a: Uint8Array - } - 'verify_biguintn_as_biguint(byte[])uint512': { - a: Uint8Array - } - 'verify_uintn64_as_uint64(byte[])uint64': { - a: Uint8Array - } - 'verify_uintn64_as_biguint(byte[])uint512': { - a: Uint8Array - } - 'verify_ufixednxm_bytes(ufixed32x8)byte[]': { - a: number - } - 'verify_bigufixednxm_bytes(ufixed256x16)byte[]': { - a: number - } - 'verify_ufixednxm_from_bytes(byte[])ufixed32x8': { - a: Uint8Array - } - 'verify_bigufixednxm_from_bytes(byte[])ufixed256x16': { - a: Uint8Array - } - 'verify_ufixednxm_from_log(byte[])ufixed32x8': { - a: Uint8Array - } - 'verify_bigufixednxm_from_log(byte[])ufixed256x16': { - a: Uint8Array - } - 'verify_string_init(string)string': { - a: string - } - 'verify_string_add(string,string)string': { - a: string - b: string - } - 'verify_string_eq(string,string)bool': { - a: string - b: string - } - 'verify_string_bytes(string)byte[]': { - a: string - } - 'verify_string_from_bytes(byte[])string': { - a: Uint8Array - } - 'verify_string_from_log(byte[])string': { - a: Uint8Array - } - 'verify_bool_bytes(bool)byte[]': { - a: boolean - } - 'verify_bool_from_bytes(byte[])bool': { - a: Uint8Array - } - 'verify_bool_from_log(byte[])bool': { - a: Uint8Array - } - 'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void': { - a: string - b: bigint | number - c: bigint | number - d: Uint8Array - e: bigint | number - f: boolean - g: Uint8Array - h: string - m: bigint | number - n: bigint | number - o: number - p: number - q: boolean - r: Uint8Array - s: Uint8Array - t: Uint8Array - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify_uintn_uintn_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_uintn_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_biguintn_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_biguintn_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_uintn_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_uintn_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_biguintn_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_biguintn_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_uintn_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_uintn_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_biguintn_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_biguintn_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_uintn_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_uintn_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_biguintn_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_biguintn_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_uintn_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_uintn_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_biguintn_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_biguintn_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_uintn_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_uintn_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_biguintn_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_biguintn_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_init(byte[])uint32': [a: Uint8Array] - 'verify_biguintn_init(byte[])uint256': [a: Uint8Array] - 'verify_uintn_from_bytes(byte[])uint32': [a: Uint8Array] - 'verify_biguintn_from_bytes(byte[])uint256': [a: Uint8Array] - 'verify_uintn_from_log(byte[])uint32': [a: Uint8Array] - 'verify_biguintn_from_log(byte[])uint256': [a: Uint8Array] - 'verify_biguintn_as_uint64(byte[])uint64': [a: Uint8Array] - 'verify_biguintn_as_biguint(byte[])uint512': [a: Uint8Array] - 'verify_uintn64_as_uint64(byte[])uint64': [a: Uint8Array] - 'verify_uintn64_as_biguint(byte[])uint512': [a: Uint8Array] - 'verify_ufixednxm_bytes(ufixed32x8)byte[]': [a: number] - 'verify_bigufixednxm_bytes(ufixed256x16)byte[]': [a: number] - 'verify_ufixednxm_from_bytes(byte[])ufixed32x8': [a: Uint8Array] - 'verify_bigufixednxm_from_bytes(byte[])ufixed256x16': [a: Uint8Array] - 'verify_ufixednxm_from_log(byte[])ufixed32x8': [a: Uint8Array] - 'verify_bigufixednxm_from_log(byte[])ufixed256x16': [a: Uint8Array] - 'verify_string_init(string)string': [a: string] - 'verify_string_add(string,string)string': [a: string, b: string] - 'verify_string_eq(string,string)bool': [a: string, b: string] - 'verify_string_bytes(string)byte[]': [a: string] - 'verify_string_from_bytes(byte[])string': [a: Uint8Array] - 'verify_string_from_log(byte[])string': [a: Uint8Array] - 'verify_bool_bytes(bool)byte[]': [a: boolean] - 'verify_bool_from_bytes(byte[])bool': [a: Uint8Array] - 'verify_bool_from_log(byte[])bool': [a: Uint8Array] - 'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void': [a: string, b: bigint | number, c: bigint | number, d: Uint8Array, e: bigint | number, f: boolean, g: Uint8Array, h: string, m: bigint | number, n: bigint | number, o: number, p: number, q: boolean, r: Uint8Array, s: Uint8Array, t: Uint8Array] - } -} - -/** - * The return type for each method - */ -export type Arc4PrimitiveOpsContractReturns = { - 'verify_uintn_uintn_eq(byte[],byte[])bool': boolean - 'verify_biguintn_uintn_eq(byte[],byte[])bool': boolean - 'verify_uintn_biguintn_eq(byte[],byte[])bool': boolean - 'verify_biguintn_biguintn_eq(byte[],byte[])bool': boolean - 'verify_uintn_uintn_ne(byte[],byte[])bool': boolean - 'verify_biguintn_uintn_ne(byte[],byte[])bool': boolean - 'verify_uintn_biguintn_ne(byte[],byte[])bool': boolean - 'verify_biguintn_biguintn_ne(byte[],byte[])bool': boolean - 'verify_uintn_uintn_lt(byte[],byte[])bool': boolean - 'verify_biguintn_uintn_lt(byte[],byte[])bool': boolean - 'verify_uintn_biguintn_lt(byte[],byte[])bool': boolean - 'verify_biguintn_biguintn_lt(byte[],byte[])bool': boolean - 'verify_uintn_uintn_le(byte[],byte[])bool': boolean - 'verify_biguintn_uintn_le(byte[],byte[])bool': boolean - 'verify_uintn_biguintn_le(byte[],byte[])bool': boolean - 'verify_biguintn_biguintn_le(byte[],byte[])bool': boolean - 'verify_uintn_uintn_gt(byte[],byte[])bool': boolean - 'verify_biguintn_uintn_gt(byte[],byte[])bool': boolean - 'verify_uintn_biguintn_gt(byte[],byte[])bool': boolean - 'verify_biguintn_biguintn_gt(byte[],byte[])bool': boolean - 'verify_uintn_uintn_ge(byte[],byte[])bool': boolean - 'verify_biguintn_uintn_ge(byte[],byte[])bool': boolean - 'verify_uintn_biguintn_ge(byte[],byte[])bool': boolean - 'verify_biguintn_biguintn_ge(byte[],byte[])bool': boolean - 'verify_uintn_init(byte[])uint32': number - 'verify_biguintn_init(byte[])uint256': bigint - 'verify_uintn_from_bytes(byte[])uint32': number - 'verify_biguintn_from_bytes(byte[])uint256': bigint - 'verify_uintn_from_log(byte[])uint32': number - 'verify_biguintn_from_log(byte[])uint256': bigint - 'verify_biguintn_as_uint64(byte[])uint64': bigint - 'verify_biguintn_as_biguint(byte[])uint512': bigint - 'verify_uintn64_as_uint64(byte[])uint64': bigint - 'verify_uintn64_as_biguint(byte[])uint512': bigint - 'verify_ufixednxm_bytes(ufixed32x8)byte[]': Uint8Array - 'verify_bigufixednxm_bytes(ufixed256x16)byte[]': Uint8Array - 'verify_ufixednxm_from_bytes(byte[])ufixed32x8': number - 'verify_bigufixednxm_from_bytes(byte[])ufixed256x16': number - 'verify_ufixednxm_from_log(byte[])ufixed32x8': number - 'verify_bigufixednxm_from_log(byte[])ufixed256x16': number - 'verify_string_init(string)string': string - 'verify_string_add(string,string)string': string - 'verify_string_eq(string,string)bool': boolean - 'verify_string_bytes(string)byte[]': Uint8Array - 'verify_string_from_bytes(byte[])string': string - 'verify_string_from_log(byte[])string': string - 'verify_bool_bytes(bool)byte[]': Uint8Array - 'verify_bool_from_bytes(byte[])bool': boolean - 'verify_bool_from_log(byte[])bool': boolean - 'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void': void -} - -/** - * Defines the types of available calls and state of the Arc4PrimitiveOpsContract smart contract. - */ -export type Arc4PrimitiveOpsContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify_uintn_uintn_eq(byte[],byte[])bool' | 'verify_uintn_uintn_eq', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_eq(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_eq(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_eq(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_uintn_eq(byte[],byte[])bool' | 'verify_biguintn_uintn_eq', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_eq(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_eq(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_eq(byte[],byte[])bool'] - }> - & Record<'verify_uintn_biguintn_eq(byte[],byte[])bool' | 'verify_uintn_biguintn_eq', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_eq(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_eq(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_eq(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_biguintn_eq(byte[],byte[])bool' | 'verify_biguintn_biguintn_eq', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_eq(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_eq(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_eq(byte[],byte[])bool'] - }> - & Record<'verify_uintn_uintn_ne(byte[],byte[])bool' | 'verify_uintn_uintn_ne', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_ne(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_ne(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ne(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_uintn_ne(byte[],byte[])bool' | 'verify_biguintn_uintn_ne', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_ne(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_ne(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ne(byte[],byte[])bool'] - }> - & Record<'verify_uintn_biguintn_ne(byte[],byte[])bool' | 'verify_uintn_biguintn_ne', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_ne(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_ne(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ne(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_biguintn_ne(byte[],byte[])bool' | 'verify_biguintn_biguintn_ne', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_ne(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_ne(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ne(byte[],byte[])bool'] - }> - & Record<'verify_uintn_uintn_lt(byte[],byte[])bool' | 'verify_uintn_uintn_lt', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_lt(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_lt(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_lt(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_uintn_lt(byte[],byte[])bool' | 'verify_biguintn_uintn_lt', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_lt(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_lt(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_lt(byte[],byte[])bool'] - }> - & Record<'verify_uintn_biguintn_lt(byte[],byte[])bool' | 'verify_uintn_biguintn_lt', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_lt(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_lt(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_lt(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_biguintn_lt(byte[],byte[])bool' | 'verify_biguintn_biguintn_lt', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_lt(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_lt(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_lt(byte[],byte[])bool'] - }> - & Record<'verify_uintn_uintn_le(byte[],byte[])bool' | 'verify_uintn_uintn_le', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_le(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_le(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_le(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_uintn_le(byte[],byte[])bool' | 'verify_biguintn_uintn_le', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_le(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_le(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_le(byte[],byte[])bool'] - }> - & Record<'verify_uintn_biguintn_le(byte[],byte[])bool' | 'verify_uintn_biguintn_le', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_le(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_le(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_le(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_biguintn_le(byte[],byte[])bool' | 'verify_biguintn_biguintn_le', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_le(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_le(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_le(byte[],byte[])bool'] - }> - & Record<'verify_uintn_uintn_gt(byte[],byte[])bool' | 'verify_uintn_uintn_gt', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_gt(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_gt(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_gt(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_uintn_gt(byte[],byte[])bool' | 'verify_biguintn_uintn_gt', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_gt(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_gt(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_gt(byte[],byte[])bool'] - }> - & Record<'verify_uintn_biguintn_gt(byte[],byte[])bool' | 'verify_uintn_biguintn_gt', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_gt(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_gt(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_gt(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_biguintn_gt(byte[],byte[])bool' | 'verify_biguintn_biguintn_gt', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_gt(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_gt(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_gt(byte[],byte[])bool'] - }> - & Record<'verify_uintn_uintn_ge(byte[],byte[])bool' | 'verify_uintn_uintn_ge', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_ge(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_ge(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ge(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_uintn_ge(byte[],byte[])bool' | 'verify_biguintn_uintn_ge', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_ge(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_ge(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ge(byte[],byte[])bool'] - }> - & Record<'verify_uintn_biguintn_ge(byte[],byte[])bool' | 'verify_uintn_biguintn_ge', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_ge(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_ge(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ge(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_biguintn_ge(byte[],byte[])bool' | 'verify_biguintn_biguintn_ge', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_ge(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_ge(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ge(byte[],byte[])bool'] - }> - & Record<'verify_uintn_init(byte[])uint32' | 'verify_uintn_init', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_init(byte[])uint32'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_init(byte[])uint32'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_init(byte[])uint32'] - }> - & Record<'verify_biguintn_init(byte[])uint256' | 'verify_biguintn_init', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_init(byte[])uint256'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_init(byte[])uint256'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_init(byte[])uint256'] - }> - & Record<'verify_uintn_from_bytes(byte[])uint32' | 'verify_uintn_from_bytes', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_from_bytes(byte[])uint32'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_from_bytes(byte[])uint32'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_from_bytes(byte[])uint32'] - }> - & Record<'verify_biguintn_from_bytes(byte[])uint256' | 'verify_biguintn_from_bytes', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_from_bytes(byte[])uint256'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_from_bytes(byte[])uint256'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_from_bytes(byte[])uint256'] - }> - & Record<'verify_uintn_from_log(byte[])uint32' | 'verify_uintn_from_log', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_from_log(byte[])uint32'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_from_log(byte[])uint32'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_from_log(byte[])uint32'] - }> - & Record<'verify_biguintn_from_log(byte[])uint256' | 'verify_biguintn_from_log', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_from_log(byte[])uint256'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_from_log(byte[])uint256'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_from_log(byte[])uint256'] - }> - & Record<'verify_biguintn_as_uint64(byte[])uint64' | 'verify_biguintn_as_uint64', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_as_uint64(byte[])uint64'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_as_uint64(byte[])uint64'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_as_uint64(byte[])uint64'] - }> - & Record<'verify_biguintn_as_biguint(byte[])uint512' | 'verify_biguintn_as_biguint', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_as_biguint(byte[])uint512'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_as_biguint(byte[])uint512'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_as_biguint(byte[])uint512'] - }> - & Record<'verify_uintn64_as_uint64(byte[])uint64' | 'verify_uintn64_as_uint64', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn64_as_uint64(byte[])uint64'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn64_as_uint64(byte[])uint64'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn64_as_uint64(byte[])uint64'] - }> - & Record<'verify_uintn64_as_biguint(byte[])uint512' | 'verify_uintn64_as_biguint', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn64_as_biguint(byte[])uint512'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn64_as_biguint(byte[])uint512'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn64_as_biguint(byte[])uint512'] - }> - & Record<'verify_ufixednxm_bytes(ufixed32x8)byte[]' | 'verify_ufixednxm_bytes', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_ufixednxm_bytes(ufixed32x8)byte[]'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_ufixednxm_bytes(ufixed32x8)byte[]'] - returns: Arc4PrimitiveOpsContractReturns['verify_ufixednxm_bytes(ufixed32x8)byte[]'] - }> - & Record<'verify_bigufixednxm_bytes(ufixed256x16)byte[]' | 'verify_bigufixednxm_bytes', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bigufixednxm_bytes(ufixed256x16)byte[]'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bigufixednxm_bytes(ufixed256x16)byte[]'] - returns: Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_bytes(ufixed256x16)byte[]'] - }> - & Record<'verify_ufixednxm_from_bytes(byte[])ufixed32x8' | 'verify_ufixednxm_from_bytes', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_ufixednxm_from_bytes(byte[])ufixed32x8'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_ufixednxm_from_bytes(byte[])ufixed32x8'] - returns: Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_bytes(byte[])ufixed32x8'] - }> - & Record<'verify_bigufixednxm_from_bytes(byte[])ufixed256x16' | 'verify_bigufixednxm_from_bytes', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'] - returns: Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'] - }> - & Record<'verify_ufixednxm_from_log(byte[])ufixed32x8' | 'verify_ufixednxm_from_log', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_ufixednxm_from_log(byte[])ufixed32x8'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_ufixednxm_from_log(byte[])ufixed32x8'] - returns: Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_log(byte[])ufixed32x8'] - }> - & Record<'verify_bigufixednxm_from_log(byte[])ufixed256x16' | 'verify_bigufixednxm_from_log', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bigufixednxm_from_log(byte[])ufixed256x16'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bigufixednxm_from_log(byte[])ufixed256x16'] - returns: Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_log(byte[])ufixed256x16'] - }> - & Record<'verify_string_init(string)string' | 'verify_string_init', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_init(string)string'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_init(string)string'] - returns: Arc4PrimitiveOpsContractReturns['verify_string_init(string)string'] - }> - & Record<'verify_string_add(string,string)string' | 'verify_string_add', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_add(string,string)string'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_add(string,string)string'] - returns: Arc4PrimitiveOpsContractReturns['verify_string_add(string,string)string'] - }> - & Record<'verify_string_eq(string,string)bool' | 'verify_string_eq', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_eq(string,string)bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_eq(string,string)bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_string_eq(string,string)bool'] - }> - & Record<'verify_string_bytes(string)byte[]' | 'verify_string_bytes', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_bytes(string)byte[]'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_bytes(string)byte[]'] - returns: Arc4PrimitiveOpsContractReturns['verify_string_bytes(string)byte[]'] - }> - & Record<'verify_string_from_bytes(byte[])string' | 'verify_string_from_bytes', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_from_bytes(byte[])string'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_from_bytes(byte[])string'] - returns: Arc4PrimitiveOpsContractReturns['verify_string_from_bytes(byte[])string'] - }> - & Record<'verify_string_from_log(byte[])string' | 'verify_string_from_log', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_from_log(byte[])string'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_from_log(byte[])string'] - returns: Arc4PrimitiveOpsContractReturns['verify_string_from_log(byte[])string'] - }> - & Record<'verify_bool_bytes(bool)byte[]' | 'verify_bool_bytes', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bool_bytes(bool)byte[]'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bool_bytes(bool)byte[]'] - returns: Arc4PrimitiveOpsContractReturns['verify_bool_bytes(bool)byte[]'] - }> - & Record<'verify_bool_from_bytes(byte[])bool' | 'verify_bool_from_bytes', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bool_from_bytes(byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bool_from_bytes(byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_bool_from_bytes(byte[])bool'] - }> - & Record<'verify_bool_from_log(byte[])bool' | 'verify_bool_from_log', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bool_from_log(byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bool_from_log(byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_bool_from_log(byte[])bool'] - }> - & Record<'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void' | 'verify_emit', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'] - returns: Arc4PrimitiveOpsContractReturns['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type Arc4PrimitiveOpsContractSignatures = keyof Arc4PrimitiveOpsContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type Arc4PrimitiveOpsContractNonVoidMethodSignatures = keyof Arc4PrimitiveOpsContractTypes['methods'] extends infer T ? T extends keyof Arc4PrimitiveOpsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the Arc4PrimitiveOpsContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = Arc4PrimitiveOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the Arc4PrimitiveOpsContract smart contract to the method's return type - */ -export type MethodReturn = Arc4PrimitiveOpsContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type Arc4PrimitiveOpsContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type Arc4PrimitiveOpsContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: Arc4PrimitiveOpsContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the Arc4PrimitiveOpsContract smart contract - */ -export abstract class Arc4PrimitiveOpsContractParamsFactory { - /** - * Constructs a no op call for the verify_uintn_uintn_eq(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnUintnEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_uintn_eq(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_uintn_eq(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnUintnEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_uintn_eq(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_biguintn_eq(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnBiguintnEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_biguintn_eq(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_biguintn_eq(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnBiguintnEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_biguintn_eq(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_uintn_ne(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnUintnNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_uintn_ne(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_uintn_ne(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnUintnNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_uintn_ne(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_biguintn_ne(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnBiguintnNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_biguintn_ne(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_biguintn_ne(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnBiguintnNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_biguintn_ne(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_uintn_lt(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnUintnLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_uintn_lt(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_uintn_lt(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnUintnLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_uintn_lt(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_biguintn_lt(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnBiguintnLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_biguintn_lt(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_biguintn_lt(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnBiguintnLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_biguintn_lt(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_uintn_le(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnUintnLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_uintn_le(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_uintn_le(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnUintnLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_uintn_le(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_biguintn_le(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnBiguintnLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_biguintn_le(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_biguintn_le(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnBiguintnLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_biguintn_le(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_uintn_gt(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnUintnGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_uintn_gt(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_uintn_gt(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnUintnGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_uintn_gt(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_biguintn_gt(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnBiguintnGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_biguintn_gt(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_biguintn_gt(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnBiguintnGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_biguintn_gt(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_uintn_ge(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnUintnGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_uintn_ge(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_uintn_ge(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnUintnGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_uintn_ge(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_biguintn_ge(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnBiguintnGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_biguintn_ge(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_biguintn_ge(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnBiguintnGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_biguintn_ge(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_init(byte[])uint32 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_init(byte[])uint32' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_biguintn_init(byte[])uint256 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_init(byte[])uint256' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_uintn_from_bytes(byte[])uint32 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_from_bytes(byte[])uint32' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_biguintn_from_bytes(byte[])uint256 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_from_bytes(byte[])uint256' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_uintn_from_log(byte[])uint32 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_from_log(byte[])uint32' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_biguintn_from_log(byte[])uint256 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_from_log(byte[])uint256' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_biguintn_as_uint64(byte[])uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnAsUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_as_uint64(byte[])uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_biguintn_as_biguint(byte[])uint512 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnAsBiguint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_as_biguint(byte[])uint512' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_uintn64_as_uint64(byte[])uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintn64AsUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn64_as_uint64(byte[])uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_uintn64_as_biguint(byte[])uint512 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintn64AsBiguint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn64_as_biguint(byte[])uint512' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_ufixednxm_bytes(ufixed32x8)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUfixednxmBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_ufixednxm_bytes(ufixed32x8)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_bigufixednxm_bytes(ufixed256x16)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBigufixednxmBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bigufixednxm_bytes(ufixed256x16)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_ufixednxm_from_bytes(byte[])ufixed32x8 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUfixednxmFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_ufixednxm_from_bytes(byte[])ufixed32x8' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_bigufixednxm_from_bytes(byte[])ufixed256x16 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBigufixednxmFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bigufixednxm_from_bytes(byte[])ufixed256x16' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_ufixednxm_from_log(byte[])ufixed32x8 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUfixednxmFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_ufixednxm_from_log(byte[])ufixed32x8' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_bigufixednxm_from_log(byte[])ufixed256x16 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBigufixednxmFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bigufixednxm_from_log(byte[])ufixed256x16' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_string_init(string)string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyStringInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_string_init(string)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_string_add(string,string)string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyStringAdd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_string_add(string,string)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_string_eq(string,string)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyStringEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_string_eq(string,string)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_string_bytes(string)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyStringBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_string_bytes(string)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_string_from_bytes(byte[])string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyStringFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_string_from_bytes(byte[])string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_string_from_log(byte[])string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyStringFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_string_from_log(byte[])string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_bool_bytes(bool)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBoolBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bool_bytes(bool)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_bool_from_bytes(byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBoolFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bool_from_bytes(byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_bool_from_log(byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBoolFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bool_from_log(byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyEmit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d, params.args.e, params.args.f, params.args.g, params.args.h, params.args.m, params.args.n, params.args.o, params.args.p, params.args.q, params.args.r, params.args.s, params.args.t], - } - } -} - -/** - * A factory to create and deploy one or more instance of the Arc4PrimitiveOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class Arc4PrimitiveOpsContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `Arc4PrimitiveOpsContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new Arc4PrimitiveOpsContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new Arc4PrimitiveOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the Arc4PrimitiveOpsContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: Arc4PrimitiveOpsContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new Arc4PrimitiveOpsContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Arc4PrimitiveOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Arc4PrimitiveOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Arc4PrimitiveOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new Arc4PrimitiveOpsContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the Arc4PrimitiveOpsContract smart contract - */ -export class Arc4PrimitiveOpsContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `Arc4PrimitiveOpsContractClient` - * - * @param appClient An `AppClient` instance which has been created with the Arc4PrimitiveOpsContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `Arc4PrimitiveOpsContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `Arc4PrimitiveOpsContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new Arc4PrimitiveOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `Arc4PrimitiveOpsContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new Arc4PrimitiveOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the Arc4PrimitiveOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnUintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnEq(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnUintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnEq(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnBiguintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnEq(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnBiguintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnEq(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnUintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnNe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnUintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnNe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnBiguintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnNe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnBiguintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnNe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnUintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnUintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnBiguintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnBiguintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnUintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnUintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnBiguintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnBiguintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnUintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnUintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnBiguintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnBiguintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnUintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnUintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnBiguintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnBiguintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_init(byte[])uint32` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnInit(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_init(byte[])uint256` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnInit(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_bytes(byte[])uint32` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_bytes(byte[])uint256` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_log(byte[])uint32` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_log(byte[])uint256` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_uint64(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnAsUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsUint64(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_biguint(byte[])uint512` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnAsBiguint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsBiguint(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_uint64(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintn64AsUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsUint64(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_biguint(byte[])uint512` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintn64AsBiguint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsBiguint(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_bytes(ufixed32x8)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUfixednxmBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_bytes(ufixed256x16)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBigufixednxmBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_bytes(byte[])ufixed32x8` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUfixednxmFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_bytes(byte[])ufixed256x16` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBigufixednxmFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_log(byte[])ufixed32x8` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUfixednxmFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_log(byte[])ufixed256x16` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBigufixednxmFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyStringInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringInit(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_add(string,string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyStringAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringAdd(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_eq(string,string)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyStringEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringEq(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_bytes(string)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyStringBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_bytes(byte[])string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyStringFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_log(byte[])string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyStringFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_bytes(bool)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBoolBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_bytes(byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBoolFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_log(byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBoolFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyEmit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyEmit(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the Arc4PrimitiveOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnUintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnEq(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnUintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnEq(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnBiguintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnEq(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnBiguintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnEq(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnUintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnNe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnUintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnNe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnBiguintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnNe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnBiguintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnNe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnUintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnUintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnBiguintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnBiguintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnUintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnUintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnBiguintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnBiguintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnUintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnUintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnBiguintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnBiguintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnUintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnUintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnBiguintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnBiguintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_init(byte[])uint32` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnInit(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_init(byte[])uint256` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnInit(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_bytes(byte[])uint32` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_bytes(byte[])uint256` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_log(byte[])uint32` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_log(byte[])uint256` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_uint64(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnAsUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsUint64(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_biguint(byte[])uint512` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnAsBiguint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsBiguint(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_uint64(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintn64AsUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsUint64(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_biguint(byte[])uint512` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintn64AsBiguint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsBiguint(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_bytes(ufixed32x8)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUfixednxmBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_bytes(ufixed256x16)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBigufixednxmBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_bytes(byte[])ufixed32x8` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUfixednxmFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_bytes(byte[])ufixed256x16` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBigufixednxmFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_log(byte[])ufixed32x8` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUfixednxmFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_log(byte[])ufixed256x16` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBigufixednxmFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyStringInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringInit(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_add(string,string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyStringAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringAdd(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_eq(string,string)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyStringEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringEq(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_bytes(string)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyStringBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_bytes(byte[])string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyStringFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_log(byte[])string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyStringFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_bytes(bool)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBoolBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_bytes(byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBoolFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_log(byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBoolFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyEmit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyEmit(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the Arc4PrimitiveOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnUintnEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnEq(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_eq(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnUintnEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnEq(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_eq(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnBiguintnEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnEq(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_eq(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnBiguintnEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnEq(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_eq(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnUintnNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnNe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ne(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnUintnNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnNe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ne(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnBiguintnNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnNe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ne(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnBiguintnNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnNe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ne(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnUintnLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLt(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_lt(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnUintnLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLt(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_lt(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnBiguintnLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLt(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_lt(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnBiguintnLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLt(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_lt(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnUintnLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_le(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnUintnLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_le(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnBiguintnLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_le(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnBiguintnLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_le(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnUintnGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGt(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_gt(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnUintnGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGt(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_gt(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnBiguintnGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGt(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_gt(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnBiguintnGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGt(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_gt(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnUintnGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ge(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnUintnGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ge(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnBiguintnGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ge(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnBiguintnGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ge(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_init(byte[])uint32` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnInit(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_init(byte[])uint32'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_init(byte[])uint256` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnInit(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_init(byte[])uint256'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_bytes(byte[])uint32` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromBytes(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_from_bytes(byte[])uint32'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_bytes(byte[])uint256` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromBytes(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_from_bytes(byte[])uint256'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_log(byte[])uint32` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromLog(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_from_log(byte[])uint32'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_log(byte[])uint256` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromLog(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_from_log(byte[])uint256'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_uint64(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnAsUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsUint64(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_as_uint64(byte[])uint64'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_biguint(byte[])uint512` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnAsBiguint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsBiguint(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_as_biguint(byte[])uint512'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_uint64(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintn64AsUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsUint64(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn64_as_uint64(byte[])uint64'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_biguint(byte[])uint512` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintn64AsBiguint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsBiguint(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn64_as_biguint(byte[])uint512'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_bytes(ufixed32x8)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUfixednxmBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmBytes(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_ufixednxm_bytes(ufixed32x8)byte[]'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_bytes(ufixed256x16)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBigufixednxmBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmBytes(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_bytes(ufixed256x16)byte[]'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_bytes(byte[])ufixed32x8` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUfixednxmFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromBytes(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_bytes(byte[])ufixed32x8'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_bytes(byte[])ufixed256x16` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBigufixednxmFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromBytes(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_log(byte[])ufixed32x8` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUfixednxmFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromLog(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_log(byte[])ufixed32x8'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_log(byte[])ufixed256x16` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBigufixednxmFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromLog(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_log(byte[])ufixed256x16'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyStringInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringInit(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_init(string)string'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_add(string,string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyStringAdd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringAdd(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_add(string,string)string'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_eq(string,string)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyStringEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringEq(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_eq(string,string)bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_bytes(string)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyStringBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringBytes(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_bytes(string)byte[]'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_bytes(byte[])string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyStringFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromBytes(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_from_bytes(byte[])string'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_log(byte[])string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyStringFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromLog(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_from_log(byte[])string'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_bytes(bool)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBoolBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolBytes(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bool_bytes(bool)byte[]'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_bytes(byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBoolFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromBytes(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bool_from_bytes(byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_log(byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBoolFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromLog(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bool_from_log(byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyEmit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyEmit(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new Arc4PrimitiveOpsContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current Arc4PrimitiveOpsContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): Arc4PrimitiveOpsContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_uintn_uintn_eq(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnUintnEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnEq(params))) - return this - }, - /** - * Add a verify_biguintn_uintn_eq(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnUintnEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnEq(params))) - return this - }, - /** - * Add a verify_uintn_biguintn_eq(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnBiguintnEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnEq(params))) - return this - }, - /** - * Add a verify_biguintn_biguintn_eq(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnBiguintnEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnEq(params))) - return this - }, - /** - * Add a verify_uintn_uintn_ne(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnUintnNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnNe(params))) - return this - }, - /** - * Add a verify_biguintn_uintn_ne(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnUintnNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnNe(params))) - return this - }, - /** - * Add a verify_uintn_biguintn_ne(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnBiguintnNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnNe(params))) - return this - }, - /** - * Add a verify_biguintn_biguintn_ne(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnBiguintnNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnNe(params))) - return this - }, - /** - * Add a verify_uintn_uintn_lt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnUintnLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnLt(params))) - return this - }, - /** - * Add a verify_biguintn_uintn_lt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnUintnLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnLt(params))) - return this - }, - /** - * Add a verify_uintn_biguintn_lt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnBiguintnLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnLt(params))) - return this - }, - /** - * Add a verify_biguintn_biguintn_lt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnBiguintnLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnLt(params))) - return this - }, - /** - * Add a verify_uintn_uintn_le(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnUintnLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnLe(params))) - return this - }, - /** - * Add a verify_biguintn_uintn_le(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnUintnLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnLe(params))) - return this - }, - /** - * Add a verify_uintn_biguintn_le(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnBiguintnLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnLe(params))) - return this - }, - /** - * Add a verify_biguintn_biguintn_le(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnBiguintnLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnLe(params))) - return this - }, - /** - * Add a verify_uintn_uintn_gt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnUintnGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnGt(params))) - return this - }, - /** - * Add a verify_biguintn_uintn_gt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnUintnGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnGt(params))) - return this - }, - /** - * Add a verify_uintn_biguintn_gt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnBiguintnGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnGt(params))) - return this - }, - /** - * Add a verify_biguintn_biguintn_gt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnBiguintnGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnGt(params))) - return this - }, - /** - * Add a verify_uintn_uintn_ge(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnUintnGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnGe(params))) - return this - }, - /** - * Add a verify_biguintn_uintn_ge(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnUintnGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnGe(params))) - return this - }, - /** - * Add a verify_uintn_biguintn_ge(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnBiguintnGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnGe(params))) - return this - }, - /** - * Add a verify_biguintn_biguintn_ge(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnBiguintnGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnGe(params))) - return this - }, - /** - * Add a verify_uintn_init(byte[])uint32 method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnInit(params))) - return this - }, - /** - * Add a verify_biguintn_init(byte[])uint256 method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnInit(params))) - return this - }, - /** - * Add a verify_uintn_from_bytes(byte[])uint32 method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnFromBytes(params))) - return this - }, - /** - * Add a verify_biguintn_from_bytes(byte[])uint256 method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnFromBytes(params))) - return this - }, - /** - * Add a verify_uintn_from_log(byte[])uint32 method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnFromLog(params))) - return this - }, - /** - * Add a verify_biguintn_from_log(byte[])uint256 method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnFromLog(params))) - return this - }, - /** - * Add a verify_biguintn_as_uint64(byte[])uint64 method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnAsUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnAsUint64(params))) - return this - }, - /** - * Add a verify_biguintn_as_biguint(byte[])uint512 method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnAsBiguint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnAsBiguint(params))) - return this - }, - /** - * Add a verify_uintn64_as_uint64(byte[])uint64 method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintn64AsUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintn64AsUint64(params))) - return this - }, - /** - * Add a verify_uintn64_as_biguint(byte[])uint512 method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintn64AsBiguint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintn64AsBiguint(params))) - return this - }, - /** - * Add a verify_ufixednxm_bytes(ufixed32x8)byte[] method call against the Arc4PrimitiveOpsContract contract - */ - verifyUfixednxmBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUfixednxmBytes(params))) - return this - }, - /** - * Add a verify_bigufixednxm_bytes(ufixed256x16)byte[] method call against the Arc4PrimitiveOpsContract contract - */ - verifyBigufixednxmBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBigufixednxmBytes(params))) - return this - }, - /** - * Add a verify_ufixednxm_from_bytes(byte[])ufixed32x8 method call against the Arc4PrimitiveOpsContract contract - */ - verifyUfixednxmFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUfixednxmFromBytes(params))) - return this - }, - /** - * Add a verify_bigufixednxm_from_bytes(byte[])ufixed256x16 method call against the Arc4PrimitiveOpsContract contract - */ - verifyBigufixednxmFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBigufixednxmFromBytes(params))) - return this - }, - /** - * Add a verify_ufixednxm_from_log(byte[])ufixed32x8 method call against the Arc4PrimitiveOpsContract contract - */ - verifyUfixednxmFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUfixednxmFromLog(params))) - return this - }, - /** - * Add a verify_bigufixednxm_from_log(byte[])ufixed256x16 method call against the Arc4PrimitiveOpsContract contract - */ - verifyBigufixednxmFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBigufixednxmFromLog(params))) - return this - }, - /** - * Add a verify_string_init(string)string method call against the Arc4PrimitiveOpsContract contract - */ - verifyStringInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringInit(params))) - return this - }, - /** - * Add a verify_string_add(string,string)string method call against the Arc4PrimitiveOpsContract contract - */ - verifyStringAdd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringAdd(params))) - return this - }, - /** - * Add a verify_string_eq(string,string)bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyStringEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringEq(params))) - return this - }, - /** - * Add a verify_string_bytes(string)byte[] method call against the Arc4PrimitiveOpsContract contract - */ - verifyStringBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringBytes(params))) - return this - }, - /** - * Add a verify_string_from_bytes(byte[])string method call against the Arc4PrimitiveOpsContract contract - */ - verifyStringFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringFromBytes(params))) - return this - }, - /** - * Add a verify_string_from_log(byte[])string method call against the Arc4PrimitiveOpsContract contract - */ - verifyStringFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringFromLog(params))) - return this - }, - /** - * Add a verify_bool_bytes(bool)byte[] method call against the Arc4PrimitiveOpsContract contract - */ - verifyBoolBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBoolBytes(params))) - return this - }, - /** - * Add a verify_bool_from_bytes(byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBoolFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBoolFromBytes(params))) - return this - }, - /** - * Add a verify_bool_from_log(byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBoolFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBoolFromLog(params))) - return this - }, - /** - * Add a verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void method call against the Arc4PrimitiveOpsContract contract - */ - verifyEmit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEmit(params))) - return this - }, - /** - * Add a clear state call to the Arc4PrimitiveOpsContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as Arc4PrimitiveOpsContractComposer - } -} -export type Arc4PrimitiveOpsContractComposer = { - /** - * Calls the verify_uintn_uintn_eq(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnUintnEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_eq(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_uintn_eq(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnUintnEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_eq(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_biguintn_eq(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnBiguintnEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_eq(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_biguintn_eq(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnBiguintnEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_eq(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_uintn_ne(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnUintnNe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ne(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_uintn_ne(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnUintnNe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ne(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_biguintn_ne(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnBiguintnNe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ne(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_biguintn_ne(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnBiguintnNe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ne(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_uintn_lt(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnUintnLt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_lt(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_uintn_lt(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnUintnLt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_lt(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_biguintn_lt(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnBiguintnLt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_lt(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_biguintn_lt(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnBiguintnLt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_lt(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_uintn_le(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnUintnLe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_le(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_uintn_le(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnUintnLe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_le(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_biguintn_le(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnBiguintnLe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_le(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_biguintn_le(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnBiguintnLe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_le(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_uintn_gt(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnUintnGt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_gt(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_uintn_gt(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnUintnGt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_gt(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_biguintn_gt(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnBiguintnGt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_gt(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_biguintn_gt(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnBiguintnGt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_gt(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_uintn_ge(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnUintnGe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ge(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_uintn_ge(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnUintnGe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ge(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_biguintn_ge(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnBiguintnGe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ge(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_biguintn_ge(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnBiguintnGe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ge(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_init(byte[])uint32 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnInit(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_init(byte[])uint32'] | undefined]> - - /** - * Calls the verify_biguintn_init(byte[])uint256 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnInit(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_init(byte[])uint256'] | undefined]> - - /** - * Calls the verify_uintn_from_bytes(byte[])uint32 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_from_bytes(byte[])uint32'] | undefined]> - - /** - * Calls the verify_biguintn_from_bytes(byte[])uint256 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_from_bytes(byte[])uint256'] | undefined]> - - /** - * Calls the verify_uintn_from_log(byte[])uint32 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_from_log(byte[])uint32'] | undefined]> - - /** - * Calls the verify_biguintn_from_log(byte[])uint256 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_from_log(byte[])uint256'] | undefined]> - - /** - * Calls the verify_biguintn_as_uint64(byte[])uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnAsUint64(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_as_uint64(byte[])uint64'] | undefined]> - - /** - * Calls the verify_biguintn_as_biguint(byte[])uint512 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnAsBiguint(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_as_biguint(byte[])uint512'] | undefined]> - - /** - * Calls the verify_uintn64_as_uint64(byte[])uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintn64AsUint64(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn64_as_uint64(byte[])uint64'] | undefined]> - - /** - * Calls the verify_uintn64_as_biguint(byte[])uint512 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintn64AsBiguint(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn64_as_biguint(byte[])uint512'] | undefined]> - - /** - * Calls the verify_ufixednxm_bytes(ufixed32x8)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUfixednxmBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_ufixednxm_bytes(ufixed32x8)byte[]'] | undefined]> - - /** - * Calls the verify_bigufixednxm_bytes(ufixed256x16)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBigufixednxmBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_bytes(ufixed256x16)byte[]'] | undefined]> - - /** - * Calls the verify_ufixednxm_from_bytes(byte[])ufixed32x8 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUfixednxmFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_bytes(byte[])ufixed32x8'] | undefined]> - - /** - * Calls the verify_bigufixednxm_from_bytes(byte[])ufixed256x16 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBigufixednxmFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'] | undefined]> - - /** - * Calls the verify_ufixednxm_from_log(byte[])ufixed32x8 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUfixednxmFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_log(byte[])ufixed32x8'] | undefined]> - - /** - * Calls the verify_bigufixednxm_from_log(byte[])ufixed256x16 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBigufixednxmFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_log(byte[])ufixed256x16'] | undefined]> - - /** - * Calls the verify_string_init(string)string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyStringInit(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_init(string)string'] | undefined]> - - /** - * Calls the verify_string_add(string,string)string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyStringAdd(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_add(string,string)string'] | undefined]> - - /** - * Calls the verify_string_eq(string,string)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyStringEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_eq(string,string)bool'] | undefined]> - - /** - * Calls the verify_string_bytes(string)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyStringBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_bytes(string)byte[]'] | undefined]> - - /** - * Calls the verify_string_from_bytes(byte[])string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyStringFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_from_bytes(byte[])string'] | undefined]> - - /** - * Calls the verify_string_from_log(byte[])string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyStringFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_from_log(byte[])string'] | undefined]> - - /** - * Calls the verify_bool_bytes(bool)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBoolBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bool_bytes(bool)byte[]'] | undefined]> - - /** - * Calls the verify_bool_from_bytes(byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBoolFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bool_from_bytes(byte[])bool'] | undefined]> - - /** - * Calls the verify_bool_from_log(byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBoolFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bool_from_log(byte[])bool'] | undefined]> - - /** - * Calls the verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyEmit(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the Arc4PrimitiveOpsContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): Arc4PrimitiveOpsContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type Arc4PrimitiveOpsContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/BoxContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/BoxContract.ts deleted file mode 100644 index 146a2d5..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/BoxContract.ts +++ /dev/null @@ -1,2352 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"BoxContract","structs":{"InnerStruct":[{"name":"c","type":"uint64"},{"name":"arrArr","type":"uint64[][]"},{"name":"d","type":"uint64"}],"LargeStruct":[{"name":"a","type":"byte[1024]"},{"name":"b","type":"byte[1024]"},{"name":"c","type":"byte[1024]"},{"name":"d","type":"byte[1024]"},{"name":"e","type":"uint64"},{"name":"f","type":"byte[1024]"},{"name":"g","type":"byte[1024]"},{"name":"h","type":"uint64"}],"NestedStruct":[{"name":"a","type":"uint64"},{"name":"inner","type":"InnerStruct"},{"name":"woah","type":"(uint64,uint64[][],uint64)[]"},{"name":"b","type":"uint64"}]},"methods":[{"name":"store_enums","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"read_enums","args":[],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_boxes","args":[{"type":"uint64","name":"a"},{"type":"byte[]","name":"b"},{"type":"string","name":"c"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"boxes_exist","args":[],"returns":{"type":"(bool,bool,bool,bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"check_keys","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"read_boxes","args":[],"returns":{"type":"(uint64,byte[],string,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"indirect_extract_and_replace","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"delete_boxes","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"slice_box","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"arc4_box","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"create_many_ints","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_many_ints","args":[{"type":"uint64","name":"index"},{"type":"uint64","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"sum_many_ints","args":[],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_box_ref","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_nested_struct","args":[{"type":"(uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64)","struct":"NestedStruct","name":"struct"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"nested_write","args":[{"type":"uint64","name":"index"},{"type":"uint64","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"nested_read","args":[{"type":"uint64","name":"i1"},{"type":"uint64","name":"i2"},{"type":"uint64","name":"i3"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"create_bools","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_bool","args":[{"type":"uint64","name":"index"},{"type":"bool","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"sum_bools","args":[{"type":"uint64","name":"stop_at_total"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_test","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_set","args":[{"type":"uint64","name":"key"},{"type":"string","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_get","args":[{"type":"uint64","name":"key"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_del","args":[{"type":"uint64","name":"key"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_exists","args":[{"type":"uint64","name":"key"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{"oca":{"keyType":"AVMString","valueType":"uint64","key":"b2Nh"},"txn":{"keyType":"AVMString","valueType":"uint64","key":"dHhu"},"box_a":{"keyType":"AVMString","valueType":"uint64","key":"Ym94X2E="},"box_b":{"keyType":"AVMString","valueType":"byte[]","key":"Yg=="},"box_c":{"keyType":"AVMBytes","valueType":"string","key":"Qk9YX0M="},"box_d":{"keyType":"AVMString","valueType":"AVMBytes","key":"Ym94X2Q="},"many_ints":{"keyType":"AVMString","valueType":"uint64[513]","key":"bWFueV9pbnRz"},"box_ref":{"keyType":"AVMString","valueType":"AVMBytes","key":"Ym94X3JlZg=="},"box_large":{"keyType":"AVMString","valueType":"LargeStruct","key":"Ym94X2xhcmdl"},"too_many_bools":{"keyType":"AVMString","valueType":"bool[33000]","key":"dG9vX21hbnlfYm9vbHM="}}},"maps":{"global":{},"local":{},"box":{"box_map":{"keyType":"uint64","valueType":"AVMString","prefix":""}}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[842],"errorMessage":"check Box exists"},{"pc":[486],"errorMessage":"check self.box_a exists"},{"pc":[851],"errorMessage":"check self.box_b exists"},{"pc":[514,857],"errorMessage":"check self.box_c exists"},{"pc":[1932],"errorMessage":"check self.box_map entry exists"},{"pc":[1178],"errorMessage":"check self.many_ints exists"},{"pc":[378],"errorMessage":"check self.oca exists"},{"pc":[1795],"errorMessage":"check self.too_many_bools exists"},{"pc":[390],"errorMessage":"check self.txn exists"},{"pc":[1773],"errorMessage":"index access is out of bounds"},{"pc":[1398,1425,1492,1517,1539,1587,1614,1660,1685,1710],"errorMessage":"index out of bounds"},{"pc":[1228],"errorMessage":"no data"},{"pc":[1329],"errorMessage":"struct.a is truthy"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDIgMCA4IDQwOTYgNDA5OCA0MTM4CiAgICBieXRlY2Jsb2NrICJib3giIDB4NDI0ZjU4NWY0MyAiYmxvYiIgImJveF9sYXJnZSIgMHgxNTFmN2M3NSAiYm94X2EiICJib3hfZCIgImIiICJ0b29fbWFueV9ib29scyIgIm1hbnlfaW50cyIgIjAiIDB4MDAwMjM0MzIgMHg2ODY1NmM2YzZmIDB4NmY2MzYxIDB4NzQ3ODZlIDB4MDY4MTAxICJib3hfcmVmIiAiZGVmYXVsdCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo1OQogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDM0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhmMjZjNmQ0MiAweGVmMTg2Y2Y3IDB4N2QzNzI5NmUgMHhmMTNkZDkzNyAweDMzMzI1ZDNkIDB4YTYxNzQ4MTIgMHhmYWJjYjg4NSAweGQ1NjZjNjMyIDB4MDRlZjQ5NzEgMHgyM2VjYjMyYyAweDAxOTk0MDhkIDB4NzcyMDU5Y2EgMHgwMTI2M2RmNiAweGVlZjc1ODE2IDB4OTk2NDk3YWUgMHg2Y2VjNzJmZiAweDZmOWQxMDc1IDB4NTllZjM3NjAgMHhhYTY2NmI5NiAweGRmYmRkNjM2IDB4YjUzMjkxM2EgMHhjMjlmMTY2OSAweDljODg4YzA5IDB4ZTZmNjg1MDYgMHg4ZWUyYzM2NCAvLyBtZXRob2QgInN0b3JlX2VudW1zKCl2b2lkIiwgbWV0aG9kICJyZWFkX2VudW1zKCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInNldF9ib3hlcyh1aW50NjQsYnl0ZVtdLHN0cmluZyl2b2lkIiwgbWV0aG9kICJib3hlc19leGlzdCgpKGJvb2wsYm9vbCxib29sLGJvb2wpIiwgbWV0aG9kICJjaGVja19rZXlzKCl2b2lkIiwgbWV0aG9kICJyZWFkX2JveGVzKCkodWludDY0LGJ5dGVbXSxzdHJpbmcsdWludDY0KSIsIG1ldGhvZCAiaW5kaXJlY3RfZXh0cmFjdF9hbmRfcmVwbGFjZSgpdm9pZCIsIG1ldGhvZCAiZGVsZXRlX2JveGVzKCl2b2lkIiwgbWV0aG9kICJzbGljZV9ib3goKXZvaWQiLCBtZXRob2QgImFyYzRfYm94KCl2b2lkIiwgbWV0aG9kICJjcmVhdGVfbWFueV9pbnRzKCl2b2lkIiwgbWV0aG9kICJzZXRfbWFueV9pbnRzKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAic3VtX21hbnlfaW50cygpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2JveF9yZWYoKXZvaWQiLCBtZXRob2QgInNldF9uZXN0ZWRfc3RydWN0KCh1aW50NjQsKHVpbnQ2NCx1aW50NjRbXVtdLHVpbnQ2NCksKHVpbnQ2NCx1aW50NjRbXVtdLHVpbnQ2NClbXSx1aW50NjQpKXZvaWQiLCBtZXRob2QgIm5lc3RlZF93cml0ZSh1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgIm5lc3RlZF9yZWFkKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiY3JlYXRlX2Jvb2xzKCl2b2lkIiwgbWV0aG9kICJzZXRfYm9vbCh1aW50NjQsYm9vbCl2b2lkIiwgbWV0aG9kICJzdW1fYm9vbHModWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiYm94X21hcF90ZXN0KCl2b2lkIiwgbWV0aG9kICJib3hfbWFwX3NldCh1aW50NjQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImJveF9tYXBfZ2V0KHVpbnQ2NClzdHJpbmciLCBtZXRob2QgImJveF9tYXBfZGVsKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJib3hfbWFwX2V4aXN0cyh1aW50NjQpYm9vbCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHN0b3JlX2VudW1zIHJlYWRfZW51bXMgc2V0X2JveGVzIGJveGVzX2V4aXN0IG1haW5fY2hlY2tfa2V5c19yb3V0ZUAxMCByZWFkX2JveGVzIGluZGlyZWN0X2V4dHJhY3RfYW5kX3JlcGxhY2UgZGVsZXRlX2JveGVzIHNsaWNlX2JveCBtYWluX2FyYzRfYm94X3JvdXRlQDE1IG1haW5fY3JlYXRlX21hbnlfaW50c19yb3V0ZUAxNiBzZXRfbWFueV9pbnRzIHN1bV9tYW55X2ludHMgdGVzdF9ib3hfcmVmIHNldF9uZXN0ZWRfc3RydWN0IG5lc3RlZF93cml0ZSBuZXN0ZWRfcmVhZCBtYWluX2NyZWF0ZV9ib29sc19yb3V0ZUAyMyBzZXRfYm9vbCBzdW1fYm9vbHMgYm94X21hcF90ZXN0IGJveF9tYXBfc2V0IGJveF9tYXBfZ2V0IGJveF9tYXBfZGVsIGJveF9tYXBfZXhpc3RzCiAgICBlcnIKCm1haW5fY3JlYXRlX2Jvb2xzX3JvdXRlQDIzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI4MQogICAgLy8gc2VsZi50b29fbWFueV9ib29scy5jcmVhdGUoKQogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICBwdXNoaW50IDQxMjUKICAgIGJveF9jcmVhdGUKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NyZWF0ZV9tYW55X2ludHNfcm91dGVAMTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTgxCiAgICAvLyBzZWxmLm1hbnlfaW50cy5jcmVhdGUoKQogICAgYnl0ZWMgOSAvLyAibWFueV9pbnRzIgogICAgcHVzaGludCA0MTA0CiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzRfYm94X3JvdXRlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE3MS0xNzIKICAgIC8vIGJveF9kID0gQm94KFN0YXRpY0ludHMsIGtleT1CeXRlcyhiImQiKSkKICAgIC8vIGJveF9kLnZhbHVlID0gU3RhdGljSW50cyhhcmM0LlVJbnQ4KDApLCBhcmM0LlVJbnQ4KDEpLCBhcmM0LlVJbnQ4KDIpLCBhcmM0LlVJbnQ4KDMpKQogICAgcHVzaGJ5dGVzcyAweDY0IDB4MDAwMTAyMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNzIKICAgIC8vIGJveF9kLnZhbHVlID0gU3RhdGljSW50cyhhcmM0LlVJbnQ4KDApLCBhcmM0LlVJbnQ4KDEpLCBhcmM0LlVJbnQ4KDIpLCBhcmM0LlVJbnQ4KDMpKQogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoZWNrX2tleXNfcm91dGVAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMzQ6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdG9yZV9lbnVtc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnN0b3JlX2VudW1zOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBzZWxmLm9jYS52YWx1ZSA9IE9uQ29tcGxldGVBY3Rpb24uT3B0SW4KICAgIGludGNfMCAvLyBPcHRJbgogICAgaXRvYgogICAgYnl0ZWMgMTMgLy8gIm9jYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3NgogICAgLy8gc2VsZi50eG4udmFsdWUgPSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXRvYgogICAgYnl0ZWMgMTQgLy8gInR4biIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QucmVhZF9lbnVtc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlYWRfZW51bXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODAKICAgIC8vIGFzc2VydCBvcC5Cb3guZ2V0KGIib2NhIilbMF0gPT0gb3AuaXRvYihzZWxmLm9jYS52YWx1ZSkKICAgIGJ5dGVjIDEzIC8vIDB4NmY2MzYxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vY2EgZXhpc3RzCiAgICBkdXAKICAgIGJ0b2kKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODEKICAgIC8vIGFzc2VydCBvcC5Cb3guZ2V0KGIidHhuIilbMF0gPT0gb3AuaXRvYihzZWxmLnR4bi52YWx1ZSkKICAgIGJ5dGVjIDE0IC8vIDB4NzQ3ODZlCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50eG4gZXhpc3RzCiAgICBkdXAKICAgIGJ0b2kKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODMKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKChhcmM0LlVJbnQ2NChzZWxmLm9jYS52YWx1ZSksIGFyYzQuVUludDY0KHNlbGYudHhuLnZhbHVlKSkpCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3Quc2V0X2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2JveGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4NwogICAgLy8gc2VsZi5ib3hfYS52YWx1ZSA9IGEKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgYnl0ZWMgNSAvLyAiYm94X2EiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODgKICAgIC8vIHNlbGYuYm94X2IudmFsdWUgPSBiLmNvcHkoKQogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODkKICAgIC8vIHNlbGYuYm94X2MudmFsdWUgPSBjCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5MAogICAgLy8gc2VsZi5ib3hfZC52YWx1ZSA9IGIubmF0aXZlCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyA2IC8vICJib3hfZCIKICAgIGRpZyAxCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6OTEKICAgIC8vIHNlbGYuYm94X2xhcmdlLmNyZWF0ZSgpCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBwdXNoaW50IDYxNjAKICAgIGJveF9jcmVhdGUKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjkyCiAgICAvLyBzZWxmLmJveF9sYXJnZS52YWx1ZS5lID0gVUludDY0KDQyKQogICAgcHVzaGludCA0MgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgaW50YyA0IC8vIDQwOTYKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5MwogICAgLy8gc2VsZi5ib3hfbGFyZ2UucmVwbGFjZShzaXplX29mKEJ5dGVzMTAyNCkgKiA0LCBhcmM0LlVJbnQ2NCg0MikuYnl0ZXMpCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBpbnRjIDQgLy8gNDA5NgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAyYQogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5OAogICAgLy8gc2VsZi5ib3hfYS52YWx1ZSArPSAzCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9hIGV4aXN0cwogICAgYnRvaQogICAgcHVzaGludCAzCiAgICArCiAgICBpdG9iCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMDAtMTAxCiAgICAvLyAjIHRlc3QgLmxlbmd0aAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2EubGVuZ3RoID09IDgKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2IubGVuZ3RoID09IGIuYnl0ZXMubGVuZ3RoCiAgICBieXRlYyA3IC8vICJiIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkaWcgMwogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTAzCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy5sZW5ndGggPT0gYy5ieXRlcy5sZW5ndGgKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYyBleGlzdHMKICAgIGRpZyAyCiAgICBsZW4KICAgIGR1cDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMDQKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLmxlbmd0aCA9PSBiLm5hdGl2ZS5sZW5ndGgKICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkaWcgMwogICAgbGVuCiAgICBkdXAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTA2LTEwNwogICAgLy8gIyB0ZXN0IC52YWx1ZS5ieXRlcwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbMF0gPT0gYy5ieXRlc1swXQogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGludGNfMiAvLyAwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyA2CiAgICBleHRyYWN0IDAgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwOAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbLTFdID09IGMuYnl0ZXNbLTFdCiAgICBkaWcgMwogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZGlnIDcKICAgIHN3YXAKICAgIGludGNfMCAvLyAxCiAgICBleHRyYWN0MwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbOi0xXSA9PSBjLmJ5dGVzWzotMV0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgNAogICAgPAogICAgZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDEKICAgIGRpZyA0CiAgICA+PQogICAgaW50Y18wIC8vIDEKICAgIGRpZyA1CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHN3YXAKICAgIC0KICAgIGRpZyA3CiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTEwCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy52YWx1ZS5ieXRlc1s6Ml0gPT0gYy5ieXRlc1s6Ml0KICAgIGludGNfMSAvLyAyCiAgICBkaWcgNAogICAgPAogICAgdW5jb3ZlciA0CiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18xIC8vIDIKICAgIGRpZyA0CiAgICA+PQogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgNQogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExMi0xMTMKICAgIC8vICMgdGVzdCAudmFsdWUgd2l0aCBCeXRlcyB0eXBlCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVswXSA9PSBiLm5hdGl2ZVswXQogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICB1bmNvdmVyIDQKICAgIGV4dHJhY3QgMiAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTE0CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVstMV0gPT0gYi5uYXRpdmVbLTFdCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgc3dhcAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGRpZyA0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgZXh0cmFjdDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMTUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWzotMV0gPT0gYi5uYXRpdmVbOi0xXQogICAgaW50Y18wIC8vIDEKICAgIGRpZyAyCiAgICA8CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMgogICAgc3dhcAogICAgLQogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDEKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18wIC8vIDEKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDIKICAgIHN3YXAKICAgIC0KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVs6NV0gPT0gYi5uYXRpdmVbOjVdCiAgICBwdXNoaW50IDUKICAgIGRpZyAyCiAgICA8CiAgICBkaWcgMgogICAgcHVzaGludCA1CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgcHVzaGludCA1CiAgICBkaWcgMgogICAgPj0KICAgIHB1c2hpbnQgNQogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgNAogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExNwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2QudmFsdWVbOiBVSW50NjQoMildID09IGIubmF0aXZlWzogVUludDY0KDIpXQogICAgaW50Y18xIC8vIDIKICAgIGRpZyAyCiAgICA8CiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18xIC8vIDIKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExOQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2xhcmdlLmxlbmd0aCA9PSBzaXplX29mKExhcmdlU3RydWN0KQogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgYm94X2xlbgogICAgcG9wCiAgICBwdXNoaW50IDYxNjAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmJveGVzX2V4aXN0W3JvdXRpbmddKCkgLT4gdm9pZDoKYm94ZXNfZXhpc3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTIzCiAgICAvLyByZXR1cm4gYm9vbChzZWxmLmJveF9hKSwgYm9vbChzZWxmLmJveF9iKSwgYm9vbChzZWxmLmJveF9jKSwgYm9vbChzZWxmLmJveF9sYXJnZSkKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieXRlYyA3IC8vICJiIgogICAgYm94X2xlbgogICAgY292ZXIgMgogICAgcG9wCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2xlbgogICAgY292ZXIgMwogICAgcG9wCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBib3hfbGVuCiAgICBjb3ZlciA0CiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMwogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QucmVhZF9ib3hlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlYWRfYm94ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM1CiAgICAvLyBnZXRfYm94X3ZhbHVlX3BsdXNfMShzZWxmLmJveF9hKSAtIDEsCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozNDUKICAgIC8vIHJldHVybiBib3gudmFsdWUgKyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMzUKICAgIC8vIGdldF9ib3hfdmFsdWVfcGx1c18xKHNlbGYuYm94X2EpIC0gMSwKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM2CiAgICAvLyBzZWxmLmJveF9iLnZhbHVlLm5hdGl2ZSwKICAgIGJ5dGVjIDcgLy8gImIiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYiBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM3CiAgICAvLyBzZWxmLmJveF9jLnZhbHVlLAogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9jIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEzOAogICAgLy8gc2VsZi5ib3hfbGFyZ2UudmFsdWUuZSwKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIGludGMgNCAvLyA0MDk2CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMTQKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCAyMAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmluZGlyZWN0X2V4dHJhY3RfYW5kX3JlcGxhY2Vbcm91dGluZ10oKSAtPiB2b2lkOgppbmRpcmVjdF9leHRyYWN0X2FuZF9yZXBsYWNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0MwogICAgLy8gbGFyZ2UgPSBzZWxmLmJveF9sYXJnZS52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyBsYXJnZSA9IHNlbGYuYm94X2xhcmdlLnZhbHVlLmNvcHkoKQogICAgLy8gbGFyZ2UuZSArPSAxCiAgICBpbnRjIDQgLy8gNDA5NgogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTQ0CiAgICAvLyBsYXJnZS5lICs9IDEKICAgIGJ0b2kKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTQ1CiAgICAvLyBzZWxmLmJveF9sYXJnZS52YWx1ZSA9IGxhcmdlLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0My0xNDUKICAgIC8vIGxhcmdlID0gc2VsZi5ib3hfbGFyZ2UudmFsdWUuY29weSgpCiAgICAvLyBsYXJnZS5lICs9IDEKICAgIC8vIHNlbGYuYm94X2xhcmdlLnZhbHVlID0gbGFyZ2UuY29weSgpCiAgICBpbnRjIDQgLy8gNDA5NgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuZGVsZXRlX2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZGVsZXRlX2JveGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0OQogICAgLy8gZGVsIHNlbGYuYm94X2EudmFsdWUKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTUwCiAgICAvLyBkZWwgc2VsZi5ib3hfYi52YWx1ZQogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE1MQogICAgLy8gZGVsIHNlbGYuYm94X2MudmFsdWUKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTIKICAgIC8vIGFzc2VydCBzZWxmLmJveF9hLmdldChkZWZhdWx0PVVJbnQ2NCg0MikpID09IDQyCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIHB1c2hpbnQgNDIKICAgIGRpZyAxCiAgICBkaWcgMwogICAgc2VsZWN0CiAgICBwdXNoaW50IDQyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTUzCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYi5nZXQoZGVmYXVsdD1hcmM0LkR5bmFtaWNCeXRlcyhiIjQyIikpLm5hdGl2ZSA9PSBiIjQyIgogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9nZXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMjM0MzIKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAweDM0MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTQKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLmdldChkZWZhdWx0PWFyYzQuU3RyaW5nKCI0MiIpKSA9PSAiNDIiCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2dldAogICAgYnl0ZWMgMTEgLy8gMHgwMDAyMzQzMgogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlYyAxMSAvLyAweDAwMDIzNDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTU2CiAgICAvLyBhc3NlcnQgbm90IGFfZXhpc3RzCiAgICBzd2FwCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTcKICAgIC8vIGFzc2VydCBhID09IDAKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE1OAogICAgLy8gZGVsIHNlbGYuYm94X2xhcmdlLnZhbHVlCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zbGljZV9ib3hbcm91dGluZ10oKSAtPiB2b2lkOgpzbGljZV9ib3g6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYyCiAgICAvLyBib3hfMCA9IEJveChCeXRlcywga2V5PVN0cmluZygiMCIpKQogICAgYnl0ZWMgMTAgLy8gIjAiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYzCiAgICAvLyBib3hfMC52YWx1ZSA9IEJ5dGVzKGIiVGVzdGluZyB0ZXN0aW5nIDEyMyIpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjIKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyAxMCAvLyAiMCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjMKICAgIC8vIGJveF8wLnZhbHVlID0gQnl0ZXMoYiJUZXN0aW5nIHRlc3RpbmcgMTIzIikKICAgIHB1c2hieXRlcyAweDU0NjU3Mzc0Njk2ZTY3MjA3NDY1NzM3NDY5NmU2NzIwMzEzMjMzCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYyCiAgICAvLyBib3hfMCA9IEJveChCeXRlcywga2V5PVN0cmluZygiMCIpKQogICAgYnl0ZWMgMTAgLy8gIjAiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTY0CiAgICAvLyBhc3NlcnQgYm94XzAudmFsdWVbMDo3XSA9PSBiIlRlc3RpbmciCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGR1cAogICAgaW50Y18yIC8vIDAKICAgIGRpZyAyCiAgICBzZWxlY3QKICAgIHB1c2hpbnQgNwogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDEKICAgIC0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjIKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyAxMCAvLyAiMCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjQKICAgIC8vIGFzc2VydCBib3hfMC52YWx1ZVswOjddID09IGIiVGVzdGluZyIKICAgIGNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBwdXNoYnl0ZXMgMHg1NDY1NzM3NDY5NmU2NwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2NgogICAgLy8gc2VsZi5ib3hfYy52YWx1ZSA9IGFyYzQuU3RyaW5nKCJIZWxsbyIpCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgcHVzaGJ5dGVzIDB4MDAwNTQ4NjU2YzZjNmYKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjcKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLnZhbHVlLmJ5dGVzWzI6MTBdID09IGIiSGVsbG8iCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzEgLy8gMgogICAgZGlnIDEKICAgIDwKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHB1c2hpbnQgMTAKICAgIGRpZyAyCiAgICA8CiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgMTAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMQogICAgLQogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBwdXNoYnl0ZXMgMHg0ODY1NmM2YzZmCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3Quc2V0X21hbnlfaW50c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9tYW55X2ludHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE4NQogICAgLy8gc2VsZi5tYW55X2ludHMudmFsdWVbaW5kZXhdID0gdmFsdWUKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBieXRlYyA5IC8vICJtYW55X2ludHMiCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdW1fbWFueV9pbnRzW3JvdXRpbmddKCkgLT4gdm9pZDoKc3VtX21hbnlfaW50czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCgpzdW1fbWFueV9pbnRzX3doaWxlX3RvcEA3OgogICAgcHVzaGludCAxMDUxMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogc3VtX21hbnlfaW50c19hZnRlcl93aGlsZUAxMgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDE1IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMTUgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGludGNfMiAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgc3VtX21hbnlfaW50c193aGlsZV90b3BANwoKc3VtX21hbnlfaW50c19hZnRlcl93aGlsZUAxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTAKICAgIC8vIHRvdGFsID0gVUludDY0KDApCiAgICBpbnRjXzIgLy8gMAogICAgYnVyeSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTkxCiAgICAvLyBmb3IgdmFsIGluIHNlbGYubWFueV9pbnRzLnZhbHVlOgogICAgYnl0ZWMgOSAvLyAibWFueV9pbnRzIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYW55X2ludHMgZXhpc3RzCiAgICBpbnRjXzIgLy8gMAogICAgYnVyeSAyCgpzdW1fbWFueV9pbnRzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTEKICAgIC8vIGZvciB2YWwgaW4gc2VsZi5tYW55X2ludHMudmFsdWU6CiAgICBkaWcgMQogICAgcHVzaGludCA1MTMKICAgIDwKICAgIGJ6IHN1bV9tYW55X2ludHNfYWZ0ZXJfZm9yQDUKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBieXRlYyA5IC8vICJtYW55X2ludHMiCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTIKICAgIC8vIHRvdGFsID0gdG90YWwgKyB2YWwKICAgIGRpZyAyCiAgICArCiAgICBidXJ5IDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDIKICAgIGIgc3VtX21hbnlfaW50c19mb3JfaGVhZGVyQDIKCnN1bV9tYW55X2ludHNfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnRlc3RfYm94X3JlZltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYm94X3JlZjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTctMTk4CiAgICAvLyAjIGluaXQgcmVmLCB3aXRoIHZhbGlkIGtleSB0eXBlcwogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PSJibG9iIikKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTk5CiAgICAvLyBhc3NlcnQgbm90IGJveF9yZWYsICJubyBkYXRhIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gbm8gZGF0YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDctMjA4CiAgICAvLyAjIGNyZWF0ZQogICAgLy8gYXNzZXJ0IGJveF9yZWYuY3JlYXRlKHNpemU9VUludDY0KDMyKSkKICAgIHB1c2hpbnQgMzIKICAgIGJveF9jcmVhdGUKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxMS0yMTIKICAgIC8vICMgbWFuaXB1bGF0ZSBkYXRhCiAgICAvLyBzZW5kZXJfYnl0ZXMgPSBUeG4uc2VuZGVyLmJ5dGVzCiAgICB0eG4gU2VuZGVyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjEzCiAgICAvLyBhcHBfYWRkcmVzcyA9IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MuYnl0ZXMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxNQogICAgLy8gYm94X3JlZi5yZXBsYWNlKDAsIHNlbmRlcl9ieXRlcykKICAgIGludGNfMiAvLyAwCiAgICBkaWcgMwogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE2CiAgICAvLyBib3hfcmVmLnJlc2l6ZSg4MDAwKQogICAgcHVzaGludCA4MDAwCiAgICBib3hfcmVzaXplCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxNwogICAgLy8gYm94X3JlZi5zcGxpY2UoMCwgMCwgYXBwX2FkZHJlc3MpCiAgICBpbnRjXzIgLy8gMAogICAgZHVwCiAgICBkaWcgMwogICAgYm94X3NwbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTgKICAgIC8vIGJveF9yZWYucmVwbGFjZSg2NCwgdmFsdWVfMykKICAgIHB1c2hpbnQgNjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTQKICAgIC8vIHZhbHVlXzMgPSBCeXRlcyhiImhlbGxvIikKICAgIGJ5dGVjIDEyIC8vIDB4Njg2NTZjNmM2ZgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxOAogICAgLy8gYm94X3JlZi5yZXBsYWNlKDY0LCB2YWx1ZV8zKQogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE5CiAgICAvLyBwcmVmaXggPSBib3hfcmVmLmV4dHJhY3QoMCwgMzIgKiAyICsgdmFsdWVfMy5sZW5ndGgpCiAgICBpbnRjXzIgLy8gMAogICAgcHVzaGludCA2OQogICAgYm94X2V4dHJhY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMjAKICAgIC8vIGFzc2VydCBwcmVmaXggPT0gYXBwX2FkZHJlc3MgKyBzZW5kZXJfYnl0ZXMgKyB2YWx1ZV8zCiAgICBkaWcgMQogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxNAogICAgLy8gdmFsdWVfMyA9IEJ5dGVzKGIiaGVsbG8iKQogICAgYnl0ZWMgMTIgLy8gMHg2ODY1NmM2YzZmCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjIwCiAgICAvLyBhc3NlcnQgcHJlZml4ID09IGFwcF9hZGRyZXNzICsgc2VuZGVyX2J5dGVzICsgdmFsdWVfMwogICAgY29uY2F0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyMi0yMjMKICAgIC8vICMgZGVsZXRlCiAgICAvLyBkZWwgYm94X3JlZi52YWx1ZQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyNi0yMjcKICAgIC8vICMgcXVlcnkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBib3hfcmVmLm1heWJlKCkKICAgIGJveF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMjgKICAgIC8vIGFzc2VydCBub3QgZXhpc3RzCiAgICBkdXAKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyOQogICAgLy8gYXNzZXJ0IHZhbHVlID09IGIiIgogICAgZGlnIDEKICAgIHB1c2hieXRlcyAweAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzMAogICAgLy8gYXNzZXJ0IGJveF9yZWYuZ2V0KGRlZmF1bHQ9c2VuZGVyX2J5dGVzKSA9PSBzZW5kZXJfYnl0ZXMKICAgIGRpZyAzCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjMyLTIzMwogICAgLy8gIyB1cGRhdGUKICAgIC8vIGJveF9yZWYudmFsdWUgPSBzZW5kZXJfYnl0ZXMgKyBhcHBfYWRkcmVzcwogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzMi0yMzMKICAgIC8vICMgdXBkYXRlCiAgICAvLyBib3hfcmVmLnZhbHVlID0gc2VuZGVyX2J5dGVzICsgYXBwX2FkZHJlc3MKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMzItMjMzCiAgICAvLyAjIHVwZGF0ZQogICAgLy8gYm94X3JlZi52YWx1ZSA9IHNlbmRlcl9ieXRlcyArIGFwcF9hZGRyZXNzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzNAogICAgLy8gYXNzZXJ0IGJveF9yZWYsICJCbG9iIGV4aXN0cyIKICAgIGJveF9sZW4KICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzNQogICAgLy8gYXNzZXJ0IGJveF9yZWYubGVuZ3RoID09IDY0CiAgICBwdXNoaW50IDY0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjM4LTIzOQogICAgLy8gIyBpbnN0YW5jZSBib3ggcmVmCiAgICAvLyBzZWxmLmJveF9yZWYuY3JlYXRlKHNpemU9VUludDY0KDMyKSkKICAgIGJ5dGVjIDE2IC8vICJib3hfcmVmIgogICAgcHVzaGludCAzMgogICAgYm94X2NyZWF0ZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQxCiAgICAvLyBkZWwgc2VsZi5ib3hfcmVmLnZhbHVlCiAgICBieXRlYyAxNiAvLyAiYm94X3JlZiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnNldF9uZXN0ZWRfc3RydWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X25lc3RlZF9zdHJ1Y3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0NgogICAgLy8gYXNzZXJ0IHN0cnVjdC5hLCAic3RydWN0LmEgaXMgdHJ1dGh5IgogICAgaW50Y18yIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBhc3NlcnQgLy8gc3RydWN0LmEgaXMgdHJ1dGh5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ3CiAgICAvLyBzdHJ1Y3RfYnl0ZXMgPSBUeG4uYXBwbGljYXRpb25fYXJncygxKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0OAogICAgLy8gc3RydWN0X3NpemUgPSBzdHJ1Y3RfYnl0ZXMubGVuZ3RoCiAgICBkdXAKICAgIGxlbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0OQogICAgLy8gdGFpbF9vZmZzZXQgPSBVSW50NjQoNDA5NiArIDIpCiAgICBpbnRjIDUgLy8gNDA5OAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1MC0yNTEKICAgIC8vICMgaW5pdGlhbGl6ZSBib3ggdG8gemVybwogICAgLy8gYm94LmNyZWF0ZShzaXplPXRhaWxfb2Zmc2V0ICsgc3RydWN0X3NpemUpCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ1CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTAtMjUxCiAgICAvLyAjIGluaXRpYWxpemUgYm94IHRvIHplcm8KICAgIC8vIGJveC5jcmVhdGUoc2l6ZT10YWlsX29mZnNldCArIHN0cnVjdF9zaXplKQogICAgc3dhcAogICAgYm94X2NyZWF0ZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ1CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTItMjUzCiAgICAvLyAjIHNldCBjb3JyZWN0IG9mZnNldCBmb3IgZHluYW1pYyBwb3J0aW9uCiAgICAvLyBib3gucmVwbGFjZSh0YWlsX29mZnNldCAtIDIsIGFyYzQuVUludDE2KHRhaWxfb2Zmc2V0KS5ieXRlcykKICAgIGludGMgNCAvLyA0MDk2CiAgICBwdXNoYnl0ZXMgMHgxMDAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0NQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ5CiAgICAvLyB0YWlsX29mZnNldCA9IFVJbnQ2NCg0MDk2ICsgMikKICAgIGludGMgNSAvLyA0MDk4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU0LTI1NQogICAgLy8gIyBzZXQgZHluYW1pYyBkYXRhCiAgICAvLyBib3gucmVwbGFjZSh0YWlsX29mZnNldCwgc3RydWN0X2J5dGVzKQogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QubmVzdGVkX3dyaXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKbmVzdGVkX3dyaXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYwCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmEgPSB2YWx1ZQogICAgaW50YyA1IC8vIDQwOTgKICAgIHVuY292ZXIgMwogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjEKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuYiA9IHZhbHVlICsgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYxCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmIgPSB2YWx1ZSArIDEKICAgIHB1c2hpbnQgNDExMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MgogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MgogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDIKICAgIHB1c2hpbnQgNDEzNgogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMwogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICBkaWcgMwogICAgKgogICAgaW50YyA2IC8vIDQxMzgKICAgIGRpZyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGMgNiAvLyA0MTM4CiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNQogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkaWcgNAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYzCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmlubmVyLmMgPSB2YWx1ZSArIDMKICAgIGRpZyAyCiAgICBwdXNoaW50IDMKICAgICsKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MwogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5jID0gdmFsdWUgKyAzCiAgICBwdXNoaW50IDQxMTgKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjQKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuZCA9IHZhbHVlICsgNAogICAgZGlnIDIKICAgIHB1c2hpbnQgNAogICAgKwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY0CiAgICAvLyBib3gudmFsdWUubmVzdGVkLmlubmVyLmQgPSB2YWx1ZSArIDQKICAgIHB1c2hpbnQgNDEyOAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA1CiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjUKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQud29haFtpbmRleF0uYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyA1CiAgICBwdXNoaW50IDQxMDgKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA1IC8vIDQwOTgKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyA1CiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGR1cAogICAgZGlnIDQKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgKwogICAgcHVzaGludCAxOAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDUKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZHVwCiAgICB1bmNvdmVyIDQKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgdW5jb3ZlciA0CiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgICsKICAgIHVuY292ZXIgMgogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QubmVzdGVkX3JlYWRbcm91dGluZ10oKSAtPiB2b2lkOgpuZXN0ZWRfcmVhZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzAKICAgIC8vIGEgPSBib3gudmFsdWUubmVzdGVkLmEKICAgIGludGMgNSAvLyA0MDk4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MQogICAgLy8gYiA9IGJveC52YWx1ZS5uZXN0ZWQuYgogICAgcHVzaGludCA0MTEwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBwdXNoaW50IDQxMzYKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDUKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgZGlnIDUKICAgICoKICAgIGludGMgNiAvLyA0MTM4CiAgICBkaWcgMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjcyCiAgICAvLyBhcnJfYXJyID0gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2kxXVtpMl0KICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA2IC8vIDQxMzgKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNgogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkaWcgNQogICAgaW50Y18zIC8vIDgKICAgICoKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MwogICAgLy8gYyA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYwogICAgcHVzaGludCA0MTE4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3NAogICAgLy8gZCA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuZAogICAgcHVzaGludCA0MTI4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3NQogICAgLy8gd29haF9hcnJfYXJyID0gYm94LnZhbHVlLm5lc3RlZC53b2FoW2kxXS5hcnJfYXJyW2kyXVtpM10KICAgIHB1c2hpbnQgNDEwOAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjIDUgLy8gNDA5OAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgdW5jb3ZlciAxMAogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkdXAKICAgIHVuY292ZXIgNQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICArCiAgICBwdXNoaW50IDE4CiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgOAogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciA4CiAgICAqCiAgICBkaWcgMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNwogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICB1bmNvdmVyIDYKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzcKICAgIC8vIHJldHVybiBhICsgYiArIGFycl9hcnIgKyBjICsgZCArIHdvYWhfYXJyX2FycgogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDUKICAgICsKICAgIHVuY292ZXIgNAogICAgKwogICAgdW5jb3ZlciAzCiAgICArCiAgICB1bmNvdmVyIDIKICAgICsKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnNldF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGludGNfMiAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyODUKICAgIC8vIHNlbGYudG9vX21hbnlfYm9vbHMudmFsdWVbaW5kZXhdID0gdmFsdWUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgJQogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICBkaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGJ5dGVjIDggLy8gInRvb19tYW55X2Jvb2xzIgogICAgY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdW1fYm9vbHNbcm91dGluZ10oKSAtPiB2b2lkOgpzdW1fYm9vbHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI4OQogICAgLy8gdG90YWwgPSBVSW50NjQoKQogICAgaW50Y18yIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyOTAKICAgIC8vIGZvciB2YWx1ZSBpbiBzZWxmLnRvb19tYW55X2Jvb2xzLnZhbHVlOgogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvb19tYW55X2Jvb2xzIGV4aXN0cwogICAgaW50Y18yIC8vIDAKCnN1bV9ib29sc19mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjkwCiAgICAvLyBmb3IgdmFsdWUgaW4gc2VsZi50b29fbWFueV9ib29scy52YWx1ZToKICAgIGR1cAogICAgcHVzaGludCAzMzAwMAogICAgPAogICAgYnogc3VtX2Jvb2xzX2FmdGVyX2ZvckA5CiAgICBkdXBuIDIKICAgIGludGNfMyAvLyA4CiAgICAvCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgJQogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgc3dhcAogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjkxCiAgICAvLyBpZiB2YWx1ZToKICAgIGJ6IHN1bV9ib29sc19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyOTIKICAgIC8vIHRvdGFsICs9IDEKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSAyCgpzdW1fYm9vbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI5MwogICAgLy8gaWYgdG90YWwgPT0gc3RvcF9hdF90b3RhbDoKICAgIGRpZyAxCiAgICBkaWcgMwogICAgPT0KICAgIGJueiBzdW1fYm9vbHNfYWZ0ZXJfZm9yQDkKICAgIGR1cAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBzdW1fYm9vbHNfZm9yX2hlYWRlckAyCgpzdW1fYm9vbHNfYWZ0ZXJfZm9yQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGl0b2IKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF90ZXN0W3JvdXRpbmddKCkgLT4gdm9pZDoKYm94X21hcF90ZXN0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI5OQogICAgLy8ga2V5XzAgPSBVSW50NjQoMCkKICAgIGludGNfMiAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAyCiAgICAvLyBzZWxmLmJveF9tYXBba2V5XzBdID0gdmFsdWUKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDEKICAgIC8vIHZhbHVlID0gU3RyaW5nKCJIbW1tbW0iKQogICAgcHVzaGJ5dGVzICJIbW1tbW0iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAyCiAgICAvLyBzZWxmLmJveF9tYXBba2V5XzBdID0gdmFsdWUKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9tYXBba2V5XzBdLmJ5dGVzLmxlbmd0aCA9PSB2YWx1ZS5ieXRlcy5sZW5ndGgKICAgIGJveF9sZW4KICAgIHBvcAogICAgcHVzaGludCA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAwCiAgICAvLyBrZXlfMSA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDkKICAgIC8vIGFzc2VydCBzZWxmLmJveF9tYXAuZ2V0KGtleV8xLCBkZWZhdWx0PVN0cmluZygiZGVmYXVsdCIpKSA9PSBTdHJpbmcoImRlZmF1bHQiKQogICAgaXRvYgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBieXRlYyAxNyAvLyAiZGVmYXVsdCIKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgMTcgLy8gImRlZmF1bHQiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzEwCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gc2VsZi5ib3hfbWFwLm1heWJlKGtleV8xKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMTEKICAgIC8vIGFzc2VydCBub3QgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMTcKICAgIC8vIHRtcF9ib3hfbWFwW2tleV8xXSA9IFN0cmluZygiaGVsbG8iKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGR1cAogICAgYnl0ZWMgMTIgLy8gImhlbGxvIgogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMxOQogICAgLy8gZGVsIHRtcF9ib3hfbWFwW2tleV8xXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9zZXRbcm91dGluZ10oKSAtPiB2b2lkOgpib3hfbWFwX3NldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjMKICAgIC8vIHNlbGYuYm94X21hcFtrZXldID0gdmFsdWUKICAgIHN3YXAKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9nZXRbcm91dGluZ10oKSAtPiB2b2lkOgpib3hfbWFwX2dldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyNwogICAgLy8gcmV0dXJuIHNlbGYuYm94X21hcFtrZXldCiAgICBpdG9iCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfbWFwIGVudHJ5IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX2RlbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJveF9tYXBfZGVsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzMxCiAgICAvLyBkZWwgc2VsZi5ib3hfbWFwW2tleV0KICAgIGl0b2IKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmJveF9tYXBfZXhpc3RzW3JvdXRpbmddKCkgLT4gdm9pZDoKYm94X21hcF9leGlzdHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMzUKICAgIC8vIHJldHVybiBrZXkgaW4gc2VsZi5ib3hfbWFwCiAgICBpdG9iCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAHAQIACIAggiCqICYSA2JveAVCT1hfQwRibG9iCWJveF9sYXJnZQQVH3x1BWJveF9hBWJveF9kAWIOdG9vX21hbnlfYm9vbHMJbWFueV9pbnRzATAEAAI0MgVoZWxsbwNvY2EDdHhuAwaBAQdib3hfcmVmB2RlZmF1bHQxG0EA3jEZFEQxGESCGQTybG1CBO8YbPcEfTcpbgTxPdk3BDMyXT0EphdIEgT6vLiFBNVmxjIEBO9JcQQj7LMsBAGZQI0EdyBZygQBJj32BO73WBYEmWSXrgRs7HL/BG+dEHUEWe83YASqZmuWBN+91jYEtTKROgTCnxZpBJyIjAkE5vaFBgSO4sNkNhoAjhkAKQA4AFgB2AAfAggCTgJfAqAAEwAKAx0DLwOIA+0EDwTRAAEFkwW6BgEGNAZHBl0GZgAnCIGdILlIIkMnCYGIILlIIkOCAgFkBAABAgO/IkMiQzEZFDEYFBBDIhYnDUy/gQYWJw5MvyJDJw2+REkXFkxLARJEJw6+REkXFkxLARJEUCcETFCwIkM2GgEXNhoCNhoDTwIWJwVMvycHvEgnB0sCvym8SClLAb9LAVcCACcGvEgnBksBvyuBkDC5SIEqFishBE8CuyshBIAIAAAAAAAAACq7JwW+RBeBAwgWJwVMvycFvUglEkQnB71ISwMVEkQpvURLAhVKEkQnBr1ISwMVShJEKSQiuksGVwABEkRLAyIJKUwiuksDIglLB0wiWBJEIksEDEsEIk8CTUsETAkpJE8CuiJLBA8iSwVPAk1LBEwJSwckTwJSEkQjSwQMTwQjTwJNKSRPArojSwQPI08FTwJNTwUkTwJSEkQnBiQiuk8EVwIBEkRLASIJJwZMIrpLASIJSwRMIlgSRCJLAgxLAiJPAk1LAkwJJwYkTwK6IksCDyJLA08CTUsCTAlLBCRPAlISRIEFSwIMSwKBBU8CTScGJE8CuoEFSwIPgQVLA08CTUsEJE8CUhJEI0sCDE8CI08CTScGJE8CuiNLAg8jTwNPAk1PAiRPAlISRCu9SIGQMBJEIkMnBb1FAScHvU4CSCm9TgNIK71OBEiAAQAkTwJUIk8CVCNPAlSBA08CVCcETFCwIkMnBb5EFyIIIgknB75EVwIAKb5EKyEEJboXTwMWSwMVFlcGAk8EUEyAAgAUUEsBFYEUCBZXBgJQTwIWUExQTFAnBExQsCJDKyEEJboXIggWKyEETwK7IkMnBbxIJwe8SCm8SCcFvkwXgSpLAUsDTYEqEkQnB74nC04CTVcCAIACNDISRCm+JwtOAk0nCxJETBREFEQrvEgiQycKvEgnCoATVGVzdGluZyB0ZXN0aW5nIDEyM78nCr1ISSRLAk2BB0sCDE8CgQdPAk1LAQknCk4CuoAHVGVzdGluZxJEKbxIKYAHAAVIZWxsb78pvUgjSwEMSwEjTwJNgQpLAgxPAoEKTwJNSwEJKU4CuoAFSGVsbG8SRCJDNhoBFzYaAkwlCycJTE8CuyJDgABJgY5SMgwNQQAYsYEGshCBBbIZJw+yHicPsh8ksgGzQv/fJEUBJwm9RQFEJEUCSwGBgQQMQQAXSwFJJQsnCUwluhdLAghFAiIIRQJC/+BJFicETFCwIkMqvUUBFEQqgSC5RDEAMgoqJEsDuyqBwD7TKiRJSwPSKoFAJwy7KiSBRbpLAUsDUCcMUBJEKrxIKr5JFERLAYAAEkRLA04CTUsCEkRQKrxIKky/Kr1IgUASRCcQgSC5SCcQvEgiQzYaASRbRDYaAUkVIQUIKEy5SCghBIACEAK7KCEFTwK7IkM2GgEXNhoCSRcoIQVPA7tJIggWKIGOIE8Cu0kjCBYogaggI7oXSwMNRCNLAwshBksBCChMI7oXIQYIKEsBI7oXSwUNRCMISwQlC0xLAQgoTE8Eu0sCgQMIFiiBliBPArtLAoEECBYogaAgTwK7TwKBBQgWKIGMICO6FyEFCChLASO6F0sFDUQjCElLBAgoTCO6FwiBEggoSwEjuhdLBQ1EIwhJTwQIKEwjuhcIKEsBI7oXTwQNRCMITwIIKExPArsiQzYaARc2GgIXNhoDFyghBSW6FyiBjiAluhcogaggI7oXSwUNRCNLBQshBksBCChMI7oXIQYIKEsBI7oXSwYNRCMISwUlCwgoTCW6FyiBliAluhcogaAgJboXKIGMICO6FyEFCChLASO6F08KDUQjCElPBQgoTCO6FwiBEggoSwEjuhdLCA1EIwgjTwgLSwEIKEwjuhcIKEsBI7oXSwcNRCMITwYlCwgoTCW6F08FTwUITwQITwMITwIICBYnBExQsCJDNhoBFzYaAiRTSwElCk8CJRgnCEsCIrpLASUMRExPA1QnCE4CuyJDNhoBFyQnCL1FAUQkSYHogQIMQQAoRwIlCkwlGCcITwIiukxTQQAGSwEiCEUCSwFLAxJAAAhJIghFAUL/z0sBFicETFCwIkMkFkm8SEmABkhtbW1tbb+9SIEGEkQiFkm+JxFOAk0nERJESb1FARRESbxISScMv7xIIkM2GgEXNhoCVwIATBZJvEhMvyJDNhoBFxa+REkVFlcGAkxQJwRMULAiQzYaARcWvEgiQzYaARcWvUUBgAEAJE8CVCcETFCwIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -// Type definitions for ARC-56 structs - -export type InnerStruct = { - c: bigint, - arrArr: bigint[][], - d: bigint -} - - -/** - * Converts the ABI tuple representation of a InnerStruct to the struct representation - */ -export function InnerStructFromTuple(abiTuple: [bigint, bigint[][], bigint]) { - const abiStructType = ABIStructType.fromStruct('InnerStruct', APP_SPEC.structs) - return getStructValueFromTupleValue(abiStructType, abiTuple) as InnerStruct -} - -export type LargeStruct = { - a: Uint8Array, - b: Uint8Array, - c: Uint8Array, - d: Uint8Array, - e: bigint, - f: Uint8Array, - g: Uint8Array, - h: bigint -} - - -/** - * Converts the ABI tuple representation of a LargeStruct to the struct representation - */ -export function LargeStructFromTuple(abiTuple: [Uint8Array, Uint8Array, Uint8Array, Uint8Array, bigint, Uint8Array, Uint8Array, bigint]) { - const abiStructType = ABIStructType.fromStruct('LargeStruct', APP_SPEC.structs) - return getStructValueFromTupleValue(abiStructType, abiTuple) as LargeStruct -} - -export type NestedStruct = { - a: bigint, - inner: InnerStruct, - woah: [bigint, bigint[][], bigint][], - b: bigint -} - - -/** - * Converts the ABI tuple representation of a NestedStruct to the struct representation - */ -export function NestedStructFromTuple(abiTuple: [bigint, InnerStruct, [bigint, bigint[][], bigint][], bigint]) { - const abiStructType = ABIStructType.fromStruct('NestedStruct', APP_SPEC.structs) - return getStructValueFromTupleValue(abiStructType, abiTuple) as NestedStruct -} - -/** - * The argument types for the BoxContract contract - */ -export type BoxContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'store_enums()void': Record - 'read_enums()(uint64,uint64)': Record - 'set_boxes(uint64,byte[],string)void': { - a: bigint | number - b: Uint8Array - c: string - } - 'boxes_exist()(bool,bool,bool,bool)': Record - 'check_keys()void': Record - 'read_boxes()(uint64,byte[],string,uint64)': Record - 'indirect_extract_and_replace()void': Record - 'delete_boxes()void': Record - 'slice_box()void': Record - 'arc4_box()void': Record - 'create_many_ints()void': Record - 'set_many_ints(uint64,uint64)void': { - index: bigint | number - value: bigint | number - } - 'sum_many_ints()uint64': Record - 'test_box_ref()void': Record - 'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void': { - struct: NestedStruct - } - 'nested_write(uint64,uint64)void': { - index: bigint | number - value: bigint | number - } - 'nested_read(uint64,uint64,uint64)uint64': { - i1: bigint | number - i2: bigint | number - i3: bigint | number - } - 'create_bools()void': Record - 'set_bool(uint64,bool)void': { - index: bigint | number - value: boolean - } - 'sum_bools(uint64)uint64': { - stopAtTotal: bigint | number - } - 'box_map_test()void': Record - 'box_map_set(uint64,string)void': { - key: bigint | number - value: string - } - 'box_map_get(uint64)string': { - key: bigint | number - } - 'box_map_del(uint64)void': { - key: bigint | number - } - 'box_map_exists(uint64)bool': { - key: bigint | number - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'store_enums()void': [] - 'read_enums()(uint64,uint64)': [] - 'set_boxes(uint64,byte[],string)void': [a: bigint | number, b: Uint8Array, c: string] - 'boxes_exist()(bool,bool,bool,bool)': [] - 'check_keys()void': [] - 'read_boxes()(uint64,byte[],string,uint64)': [] - 'indirect_extract_and_replace()void': [] - 'delete_boxes()void': [] - 'slice_box()void': [] - 'arc4_box()void': [] - 'create_many_ints()void': [] - 'set_many_ints(uint64,uint64)void': [index: bigint | number, value: bigint | number] - 'sum_many_ints()uint64': [] - 'test_box_ref()void': [] - 'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void': [struct: NestedStruct] - 'nested_write(uint64,uint64)void': [index: bigint | number, value: bigint | number] - 'nested_read(uint64,uint64,uint64)uint64': [i1: bigint | number, i2: bigint | number, i3: bigint | number] - 'create_bools()void': [] - 'set_bool(uint64,bool)void': [index: bigint | number, value: boolean] - 'sum_bools(uint64)uint64': [stopAtTotal: bigint | number] - 'box_map_test()void': [] - 'box_map_set(uint64,string)void': [key: bigint | number, value: string] - 'box_map_get(uint64)string': [key: bigint | number] - 'box_map_del(uint64)void': [key: bigint | number] - 'box_map_exists(uint64)bool': [key: bigint | number] - } -} - -/** - * The return type for each method - */ -export type BoxContractReturns = { - 'store_enums()void': void - 'read_enums()(uint64,uint64)': [bigint, bigint] - 'set_boxes(uint64,byte[],string)void': void - 'boxes_exist()(bool,bool,bool,bool)': [boolean, boolean, boolean, boolean] - 'check_keys()void': void - 'read_boxes()(uint64,byte[],string,uint64)': [bigint, Uint8Array, string, bigint] - 'indirect_extract_and_replace()void': void - 'delete_boxes()void': void - 'slice_box()void': void - 'arc4_box()void': void - 'create_many_ints()void': void - 'set_many_ints(uint64,uint64)void': void - 'sum_many_ints()uint64': bigint - 'test_box_ref()void': void - 'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void': void - 'nested_write(uint64,uint64)void': void - 'nested_read(uint64,uint64,uint64)uint64': bigint - 'create_bools()void': void - 'set_bool(uint64,bool)void': void - 'sum_bools(uint64)uint64': bigint - 'box_map_test()void': void - 'box_map_set(uint64,string)void': void - 'box_map_get(uint64)string': string - 'box_map_del(uint64)void': void - 'box_map_exists(uint64)bool': boolean -} - -/** - * Defines the types of available calls and state of the BoxContract smart contract. - */ -export type BoxContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'store_enums()void' | 'store_enums', { - argsObj: BoxContractArgs['obj']['store_enums()void'] - argsTuple: BoxContractArgs['tuple']['store_enums()void'] - returns: BoxContractReturns['store_enums()void'] - }> - & Record<'read_enums()(uint64,uint64)' | 'read_enums', { - argsObj: BoxContractArgs['obj']['read_enums()(uint64,uint64)'] - argsTuple: BoxContractArgs['tuple']['read_enums()(uint64,uint64)'] - returns: BoxContractReturns['read_enums()(uint64,uint64)'] - }> - & Record<'set_boxes(uint64,byte[],string)void' | 'set_boxes', { - argsObj: BoxContractArgs['obj']['set_boxes(uint64,byte[],string)void'] - argsTuple: BoxContractArgs['tuple']['set_boxes(uint64,byte[],string)void'] - returns: BoxContractReturns['set_boxes(uint64,byte[],string)void'] - }> - & Record<'boxes_exist()(bool,bool,bool,bool)' | 'boxes_exist', { - argsObj: BoxContractArgs['obj']['boxes_exist()(bool,bool,bool,bool)'] - argsTuple: BoxContractArgs['tuple']['boxes_exist()(bool,bool,bool,bool)'] - returns: BoxContractReturns['boxes_exist()(bool,bool,bool,bool)'] - }> - & Record<'check_keys()void' | 'check_keys', { - argsObj: BoxContractArgs['obj']['check_keys()void'] - argsTuple: BoxContractArgs['tuple']['check_keys()void'] - returns: BoxContractReturns['check_keys()void'] - }> - & Record<'read_boxes()(uint64,byte[],string,uint64)' | 'read_boxes', { - argsObj: BoxContractArgs['obj']['read_boxes()(uint64,byte[],string,uint64)'] - argsTuple: BoxContractArgs['tuple']['read_boxes()(uint64,byte[],string,uint64)'] - returns: BoxContractReturns['read_boxes()(uint64,byte[],string,uint64)'] - }> - & Record<'indirect_extract_and_replace()void' | 'indirect_extract_and_replace', { - argsObj: BoxContractArgs['obj']['indirect_extract_and_replace()void'] - argsTuple: BoxContractArgs['tuple']['indirect_extract_and_replace()void'] - returns: BoxContractReturns['indirect_extract_and_replace()void'] - }> - & Record<'delete_boxes()void' | 'delete_boxes', { - argsObj: BoxContractArgs['obj']['delete_boxes()void'] - argsTuple: BoxContractArgs['tuple']['delete_boxes()void'] - returns: BoxContractReturns['delete_boxes()void'] - }> - & Record<'slice_box()void' | 'slice_box', { - argsObj: BoxContractArgs['obj']['slice_box()void'] - argsTuple: BoxContractArgs['tuple']['slice_box()void'] - returns: BoxContractReturns['slice_box()void'] - }> - & Record<'arc4_box()void' | 'arc4_box', { - argsObj: BoxContractArgs['obj']['arc4_box()void'] - argsTuple: BoxContractArgs['tuple']['arc4_box()void'] - returns: BoxContractReturns['arc4_box()void'] - }> - & Record<'create_many_ints()void' | 'create_many_ints', { - argsObj: BoxContractArgs['obj']['create_many_ints()void'] - argsTuple: BoxContractArgs['tuple']['create_many_ints()void'] - returns: BoxContractReturns['create_many_ints()void'] - }> - & Record<'set_many_ints(uint64,uint64)void' | 'set_many_ints', { - argsObj: BoxContractArgs['obj']['set_many_ints(uint64,uint64)void'] - argsTuple: BoxContractArgs['tuple']['set_many_ints(uint64,uint64)void'] - returns: BoxContractReturns['set_many_ints(uint64,uint64)void'] - }> - & Record<'sum_many_ints()uint64' | 'sum_many_ints', { - argsObj: BoxContractArgs['obj']['sum_many_ints()uint64'] - argsTuple: BoxContractArgs['tuple']['sum_many_ints()uint64'] - returns: BoxContractReturns['sum_many_ints()uint64'] - }> - & Record<'test_box_ref()void' | 'test_box_ref', { - argsObj: BoxContractArgs['obj']['test_box_ref()void'] - argsTuple: BoxContractArgs['tuple']['test_box_ref()void'] - returns: BoxContractReturns['test_box_ref()void'] - }> - & Record<'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void' | 'set_nested_struct', { - argsObj: BoxContractArgs['obj']['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'] - argsTuple: BoxContractArgs['tuple']['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'] - returns: BoxContractReturns['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'] - }> - & Record<'nested_write(uint64,uint64)void' | 'nested_write', { - argsObj: BoxContractArgs['obj']['nested_write(uint64,uint64)void'] - argsTuple: BoxContractArgs['tuple']['nested_write(uint64,uint64)void'] - returns: BoxContractReturns['nested_write(uint64,uint64)void'] - }> - & Record<'nested_read(uint64,uint64,uint64)uint64' | 'nested_read', { - argsObj: BoxContractArgs['obj']['nested_read(uint64,uint64,uint64)uint64'] - argsTuple: BoxContractArgs['tuple']['nested_read(uint64,uint64,uint64)uint64'] - returns: BoxContractReturns['nested_read(uint64,uint64,uint64)uint64'] - }> - & Record<'create_bools()void' | 'create_bools', { - argsObj: BoxContractArgs['obj']['create_bools()void'] - argsTuple: BoxContractArgs['tuple']['create_bools()void'] - returns: BoxContractReturns['create_bools()void'] - }> - & Record<'set_bool(uint64,bool)void' | 'set_bool', { - argsObj: BoxContractArgs['obj']['set_bool(uint64,bool)void'] - argsTuple: BoxContractArgs['tuple']['set_bool(uint64,bool)void'] - returns: BoxContractReturns['set_bool(uint64,bool)void'] - }> - & Record<'sum_bools(uint64)uint64' | 'sum_bools', { - argsObj: BoxContractArgs['obj']['sum_bools(uint64)uint64'] - argsTuple: BoxContractArgs['tuple']['sum_bools(uint64)uint64'] - returns: BoxContractReturns['sum_bools(uint64)uint64'] - }> - & Record<'box_map_test()void' | 'box_map_test', { - argsObj: BoxContractArgs['obj']['box_map_test()void'] - argsTuple: BoxContractArgs['tuple']['box_map_test()void'] - returns: BoxContractReturns['box_map_test()void'] - }> - & Record<'box_map_set(uint64,string)void' | 'box_map_set', { - argsObj: BoxContractArgs['obj']['box_map_set(uint64,string)void'] - argsTuple: BoxContractArgs['tuple']['box_map_set(uint64,string)void'] - returns: BoxContractReturns['box_map_set(uint64,string)void'] - }> - & Record<'box_map_get(uint64)string' | 'box_map_get', { - argsObj: BoxContractArgs['obj']['box_map_get(uint64)string'] - argsTuple: BoxContractArgs['tuple']['box_map_get(uint64)string'] - returns: BoxContractReturns['box_map_get(uint64)string'] - }> - & Record<'box_map_del(uint64)void' | 'box_map_del', { - argsObj: BoxContractArgs['obj']['box_map_del(uint64)void'] - argsTuple: BoxContractArgs['tuple']['box_map_del(uint64)void'] - returns: BoxContractReturns['box_map_del(uint64)void'] - }> - & Record<'box_map_exists(uint64)bool' | 'box_map_exists', { - argsObj: BoxContractArgs['obj']['box_map_exists(uint64)bool'] - argsTuple: BoxContractArgs['tuple']['box_map_exists(uint64)bool'] - returns: BoxContractReturns['box_map_exists(uint64)bool'] - }> - /** - * Defines the shape of the state of the application. - */ - state: { - box: { - keys: { - oca: bigint - txn: bigint - boxA: bigint - boxB: Uint8Array - boxC: string - boxD: BinaryState - manyInts: [bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint] - boxRef: BinaryState - boxLarge: LargeStruct - tooManyBools: [boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean] - } - maps: { - boxMap: Map - } - } - } -} - -/** - * Defines the possible abi call signatures. - */ -export type BoxContractSignatures = keyof BoxContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type BoxContractNonVoidMethodSignatures = keyof BoxContractTypes['methods'] extends infer T ? T extends keyof BoxContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the BoxContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = BoxContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the BoxContract smart contract to the method's return type - */ -export type MethodReturn = BoxContractTypes['methods'][TSignature]['returns'] - -/** - * Defines the shape of the keyed box state of the application. - */ -export type BoxKeysState = BoxContractTypes['state']['box']['keys'] - - -/** - * Defines supported create method params for this smart contract - */ -export type BoxContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type BoxContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: BoxContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the BoxContract smart contract - */ -export abstract class BoxContractParamsFactory { - /** - * Constructs a no op call for the store_enums()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static storeEnums(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'store_enums()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the read_enums()(uint64,uint64) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static readEnums(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'read_enums()(uint64,uint64)' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the set_boxes(uint64,byte[],string)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_boxes(uint64,byte[],string)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the boxes_exist()(bool,bool,bool,bool) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static boxesExist(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'boxes_exist()(bool,bool,bool,bool)' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the check_keys()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static checkKeys(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'check_keys()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the read_boxes()(uint64,byte[],string,uint64) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static readBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'read_boxes()(uint64,byte[],string,uint64)' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the indirect_extract_and_replace()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static indirectExtractAndReplace(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'indirect_extract_and_replace()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the delete_boxes()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static deleteBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'delete_boxes()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the slice_box()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static sliceBox(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'slice_box()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the arc4_box()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static arc4Box(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'arc4_box()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the create_many_ints()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static createManyInts(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'create_many_ints()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the set_many_ints(uint64,uint64)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setManyInts(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_many_ints(uint64,uint64)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.index, params.args.value], - } - } - /** - * Constructs a no op call for the sum_many_ints()uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static sumManyInts(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'sum_many_ints()uint64' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_box_ref()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testBoxRef(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_box_ref()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setNestedStruct(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.struct], - } - } - /** - * Constructs a no op call for the nested_write(uint64,uint64)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static nestedWrite(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'nested_write(uint64,uint64)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.index, params.args.value], - } - } - /** - * Constructs a no op call for the nested_read(uint64,uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static nestedRead(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'nested_read(uint64,uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.i1, params.args.i2, params.args.i3], - } - } - /** - * Constructs a no op call for the create_bools()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static createBools(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'create_bools()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the set_bool(uint64,bool)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setBool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_bool(uint64,bool)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.index, params.args.value], - } - } - /** - * Constructs a no op call for the sum_bools(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static sumBools(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'sum_bools(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.stopAtTotal], - } - } - /** - * Constructs a no op call for the box_map_test()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static boxMapTest(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'box_map_test()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the box_map_set(uint64,string)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static boxMapSet(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'box_map_set(uint64,string)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.key, params.args.value], - } - } - /** - * Constructs a no op call for the box_map_get(uint64)string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static boxMapGet(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'box_map_get(uint64)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.key], - } - } - /** - * Constructs a no op call for the box_map_del(uint64)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static boxMapDel(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'box_map_del(uint64)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.key], - } - } - /** - * Constructs a no op call for the box_map_exists(uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static boxMapExists(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'box_map_exists(uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.key], - } - } -} - -/** - * A factory to create and deploy one or more instance of the BoxContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class BoxContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `BoxContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new BoxContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new BoxContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the BoxContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: BoxContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new BoxContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the BoxContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the BoxContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the BoxContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new BoxContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the BoxContract smart contract - */ -export class BoxContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `BoxContractClient` - * - * @param appClient An `AppClient` instance which has been created with the BoxContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `BoxContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `BoxContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new BoxContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `BoxContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new BoxContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the BoxContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the BoxContract smart contract using the `store_enums()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - storeEnums: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.storeEnums(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `read_enums()(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - readEnums: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.readEnums(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_boxes(uint64,byte[],string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(BoxContractParamsFactory.setBoxes(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `boxes_exist()(bool,bool,bool,bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - boxesExist: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.boxesExist(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `check_keys()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - checkKeys: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.checkKeys(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `read_boxes()(uint64,byte[],string,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - readBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.readBoxes(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `indirect_extract_and_replace()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - indirectExtractAndReplace: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.indirectExtractAndReplace(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `delete_boxes()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - deleteBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.deleteBoxes(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `slice_box()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - sliceBox: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.sliceBox(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `arc4_box()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - arc4Box: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.arc4Box(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `create_many_ints()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - createManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.createManyInts(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_many_ints(uint64,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(BoxContractParamsFactory.setManyInts(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `sum_many_ints()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - sumManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.sumManyInts(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `test_box_ref()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testBoxRef: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.testBoxRef(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setNestedStruct: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(BoxContractParamsFactory.setNestedStruct(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `nested_write(uint64,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - nestedWrite: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(BoxContractParamsFactory.nestedWrite(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `nested_read(uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - nestedRead: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(BoxContractParamsFactory.nestedRead(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `create_bools()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - createBools: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.createBools(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_bool(uint64,bool)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setBool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(BoxContractParamsFactory.setBool(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `sum_bools(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - sumBools: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(BoxContractParamsFactory.sumBools(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_test()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - boxMapTest: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.boxMapTest(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_set(uint64,string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - boxMapSet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(BoxContractParamsFactory.boxMapSet(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_get(uint64)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - boxMapGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(BoxContractParamsFactory.boxMapGet(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_del(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - boxMapDel: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(BoxContractParamsFactory.boxMapDel(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_exists(uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - boxMapExists: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(BoxContractParamsFactory.boxMapExists(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the BoxContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the BoxContract smart contract using the `store_enums()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - storeEnums: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.storeEnums(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `read_enums()(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - readEnums: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.readEnums(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_boxes(uint64,byte[],string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.setBoxes(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `boxes_exist()(bool,bool,bool,bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - boxesExist: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.boxesExist(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `check_keys()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - checkKeys: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.checkKeys(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `read_boxes()(uint64,byte[],string,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - readBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.readBoxes(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `indirect_extract_and_replace()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - indirectExtractAndReplace: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.indirectExtractAndReplace(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `delete_boxes()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - deleteBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.deleteBoxes(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `slice_box()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - sliceBox: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.sliceBox(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `arc4_box()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - arc4Box: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.arc4Box(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `create_many_ints()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - createManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.createManyInts(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_many_ints(uint64,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.setManyInts(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `sum_many_ints()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - sumManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.sumManyInts(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `test_box_ref()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testBoxRef: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.testBoxRef(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setNestedStruct: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.setNestedStruct(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `nested_write(uint64,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - nestedWrite: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.nestedWrite(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `nested_read(uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - nestedRead: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.nestedRead(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `create_bools()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - createBools: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.createBools(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_bool(uint64,bool)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setBool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.setBool(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `sum_bools(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - sumBools: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.sumBools(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_test()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - boxMapTest: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapTest(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_set(uint64,string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - boxMapSet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapSet(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_get(uint64)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - boxMapGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapGet(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_del(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - boxMapDel: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapDel(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_exists(uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - boxMapExists: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapExists(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the BoxContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the BoxContract smart contract using the `store_enums()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - storeEnums: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.storeEnums(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['store_enums()void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `read_enums()(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - readEnums: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.readEnums(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['read_enums()(uint64,uint64)'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_boxes(uint64,byte[],string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.setBoxes(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['set_boxes(uint64,byte[],string)void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `boxes_exist()(bool,bool,bool,bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - boxesExist: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.boxesExist(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['boxes_exist()(bool,bool,bool,bool)'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `check_keys()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - checkKeys: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.checkKeys(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['check_keys()void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `read_boxes()(uint64,byte[],string,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - readBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.readBoxes(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['read_boxes()(uint64,byte[],string,uint64)'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `indirect_extract_and_replace()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - indirectExtractAndReplace: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.indirectExtractAndReplace(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['indirect_extract_and_replace()void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `delete_boxes()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - deleteBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.deleteBoxes(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['delete_boxes()void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `slice_box()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - sliceBox: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.sliceBox(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['slice_box()void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `arc4_box()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - arc4Box: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.arc4Box(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['arc4_box()void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `create_many_ints()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - createManyInts: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.createManyInts(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['create_many_ints()void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_many_ints(uint64,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setManyInts: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.setManyInts(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['set_many_ints(uint64,uint64)void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `sum_many_ints()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - sumManyInts: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.sumManyInts(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['sum_many_ints()uint64'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `test_box_ref()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testBoxRef: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.testBoxRef(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['test_box_ref()void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setNestedStruct: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.setNestedStruct(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `nested_write(uint64,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - nestedWrite: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.nestedWrite(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['nested_write(uint64,uint64)void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `nested_read(uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - nestedRead: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.nestedRead(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['nested_read(uint64,uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `create_bools()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - createBools: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.createBools(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['create_bools()void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_bool(uint64,bool)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setBool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.setBool(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['set_bool(uint64,bool)void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `sum_bools(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - sumBools: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.sumBools(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['sum_bools(uint64)uint64'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_test()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - boxMapTest: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapTest(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_test()void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_set(uint64,string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - boxMapSet: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapSet(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_set(uint64,string)void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_get(uint64)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - boxMapGet: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapGet(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_get(uint64)string'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_del(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - boxMapDel: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapDel(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_del(uint64)void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_exists(uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - boxMapExists: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapExists(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_exists(uint64)bool'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new BoxContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current BoxContract app - */ - state = { - /** - * Methods to access box state for the current BoxContract app - */ - box: { - /** - * Get all current keyed values from box state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.box.getAll() - return { - oca: result.oca, - txn: result.txn, - boxA: result.box_a, - boxB: result.box_b, - boxC: result.box_c, - boxD: new BinaryStateValue(result.box_d), - manyInts: result.many_ints, - boxRef: new BinaryStateValue(result.box_ref), - boxLarge: result.box_large, - tooManyBools: result.too_many_bools, - } - }, - /** - * Get the current value of the oca key in box state - */ - oca: async (): Promise => { return (await this.appClient.state.box.getValue("oca")) as bigint | undefined }, - /** - * Get the current value of the txn key in box state - */ - txn: async (): Promise => { return (await this.appClient.state.box.getValue("txn")) as bigint | undefined }, - /** - * Get the current value of the box_a key in box state - */ - boxA: async (): Promise => { return (await this.appClient.state.box.getValue("box_a")) as bigint | undefined }, - /** - * Get the current value of the box_b key in box state - */ - boxB: async (): Promise => { return (await this.appClient.state.box.getValue("box_b")) as Uint8Array | undefined }, - /** - * Get the current value of the box_c key in box state - */ - boxC: async (): Promise => { return (await this.appClient.state.box.getValue("box_c")) as string | undefined }, - /** - * Get the current value of the box_d key in box state - */ - boxD: async (): Promise => { return new BinaryStateValue((await this.appClient.state.box.getValue("box_d")) as Uint8Array | undefined) }, - /** - * Get the current value of the many_ints key in box state - */ - manyInts: async (): Promise<[bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint] | undefined> => { return (await this.appClient.state.box.getValue("many_ints")) as [bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint] | undefined }, - /** - * Get the current value of the box_ref key in box state - */ - boxRef: async (): Promise => { return new BinaryStateValue((await this.appClient.state.box.getValue("box_ref")) as Uint8Array | undefined) }, - /** - * Get the current value of the box_large key in box state - */ - boxLarge: async (): Promise => { return (await this.appClient.state.box.getValue("box_large")) as LargeStruct | undefined }, - /** - * Get the current value of the too_many_bools key in box state - */ - tooManyBools: async (): Promise<[boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean] | undefined> => { return (await this.appClient.state.box.getValue("too_many_bools")) as [boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean] | undefined }, - /** - * Get values from the box_map map in box state - */ - boxMap: { - /** - * Get all current values of the box_map map in box state - */ - getMap: async (): Promise> => { return (await this.appClient.state.box.getMap("box_map")) as Map }, - /** - * Get a current value of the box_map map by key from box state - */ - value: async (key: bigint | number): Promise => { return await this.appClient.state.box.getMapValue("box_map", key) as string | undefined }, - }, - }, - } - - public newGroup(composerConfig?: TransactionComposerConfig): BoxContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a store_enums()void method call against the BoxContract contract - */ - storeEnums(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.storeEnums(params))) - return this - }, - /** - * Add a read_enums()(uint64,uint64) method call against the BoxContract contract - */ - readEnums(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.readEnums(params))) - return this - }, - /** - * Add a set_boxes(uint64,byte[],string)void method call against the BoxContract contract - */ - setBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setBoxes(params))) - return this - }, - /** - * Add a boxes_exist()(bool,bool,bool,bool) method call against the BoxContract contract - */ - boxesExist(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxesExist(params))) - return this - }, - /** - * Add a check_keys()void method call against the BoxContract contract - */ - checkKeys(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.checkKeys(params))) - return this - }, - /** - * Add a read_boxes()(uint64,byte[],string,uint64) method call against the BoxContract contract - */ - readBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.readBoxes(params))) - return this - }, - /** - * Add a indirect_extract_and_replace()void method call against the BoxContract contract - */ - indirectExtractAndReplace(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.indirectExtractAndReplace(params))) - return this - }, - /** - * Add a delete_boxes()void method call against the BoxContract contract - */ - deleteBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deleteBoxes(params))) - return this - }, - /** - * Add a slice_box()void method call against the BoxContract contract - */ - sliceBox(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sliceBox(params))) - return this - }, - /** - * Add a arc4_box()void method call against the BoxContract contract - */ - arc4Box(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.arc4Box(params))) - return this - }, - /** - * Add a create_many_ints()void method call against the BoxContract contract - */ - createManyInts(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createManyInts(params))) - return this - }, - /** - * Add a set_many_ints(uint64,uint64)void method call against the BoxContract contract - */ - setManyInts(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setManyInts(params))) - return this - }, - /** - * Add a sum_many_ints()uint64 method call against the BoxContract contract - */ - sumManyInts(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sumManyInts(params))) - return this - }, - /** - * Add a test_box_ref()void method call against the BoxContract contract - */ - testBoxRef(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBoxRef(params))) - return this - }, - /** - * Add a set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void method call against the BoxContract contract - */ - setNestedStruct(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setNestedStruct(params))) - return this - }, - /** - * Add a nested_write(uint64,uint64)void method call against the BoxContract contract - */ - nestedWrite(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.nestedWrite(params))) - return this - }, - /** - * Add a nested_read(uint64,uint64,uint64)uint64 method call against the BoxContract contract - */ - nestedRead(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.nestedRead(params))) - return this - }, - /** - * Add a create_bools()void method call against the BoxContract contract - */ - createBools(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createBools(params))) - return this - }, - /** - * Add a set_bool(uint64,bool)void method call against the BoxContract contract - */ - setBool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setBool(params))) - return this - }, - /** - * Add a sum_bools(uint64)uint64 method call against the BoxContract contract - */ - sumBools(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sumBools(params))) - return this - }, - /** - * Add a box_map_test()void method call against the BoxContract contract - */ - boxMapTest(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapTest(params))) - return this - }, - /** - * Add a box_map_set(uint64,string)void method call against the BoxContract contract - */ - boxMapSet(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapSet(params))) - return this - }, - /** - * Add a box_map_get(uint64)string method call against the BoxContract contract - */ - boxMapGet(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapGet(params))) - return this - }, - /** - * Add a box_map_del(uint64)void method call against the BoxContract contract - */ - boxMapDel(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapDel(params))) - return this - }, - /** - * Add a box_map_exists(uint64)bool method call against the BoxContract contract - */ - boxMapExists(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapExists(params))) - return this - }, - /** - * Add a clear state call to the BoxContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as BoxContractComposer - } -} -export type BoxContractComposer = { - /** - * Calls the store_enums()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - storeEnums(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['store_enums()void'] | undefined]> - - /** - * Calls the read_enums()(uint64,uint64) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - readEnums(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['read_enums()(uint64,uint64)'] | undefined]> - - /** - * Calls the set_boxes(uint64,byte[],string)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setBoxes(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['set_boxes(uint64,byte[],string)void'] | undefined]> - - /** - * Calls the boxes_exist()(bool,bool,bool,bool) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - boxesExist(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['boxes_exist()(bool,bool,bool,bool)'] | undefined]> - - /** - * Calls the check_keys()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - checkKeys(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['check_keys()void'] | undefined]> - - /** - * Calls the read_boxes()(uint64,byte[],string,uint64) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - readBoxes(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['read_boxes()(uint64,byte[],string,uint64)'] | undefined]> - - /** - * Calls the indirect_extract_and_replace()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - indirectExtractAndReplace(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['indirect_extract_and_replace()void'] | undefined]> - - /** - * Calls the delete_boxes()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - deleteBoxes(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['delete_boxes()void'] | undefined]> - - /** - * Calls the slice_box()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - sliceBox(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['slice_box()void'] | undefined]> - - /** - * Calls the arc4_box()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - arc4Box(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['arc4_box()void'] | undefined]> - - /** - * Calls the create_many_ints()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - createManyInts(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['create_many_ints()void'] | undefined]> - - /** - * Calls the set_many_ints(uint64,uint64)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setManyInts(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['set_many_ints(uint64,uint64)void'] | undefined]> - - /** - * Calls the sum_many_ints()uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - sumManyInts(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['sum_many_ints()uint64'] | undefined]> - - /** - * Calls the test_box_ref()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testBoxRef(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['test_box_ref()void'] | undefined]> - - /** - * Calls the set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setNestedStruct(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'] | undefined]> - - /** - * Calls the nested_write(uint64,uint64)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - nestedWrite(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['nested_write(uint64,uint64)void'] | undefined]> - - /** - * Calls the nested_read(uint64,uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - nestedRead(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['nested_read(uint64,uint64,uint64)uint64'] | undefined]> - - /** - * Calls the create_bools()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - createBools(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['create_bools()void'] | undefined]> - - /** - * Calls the set_bool(uint64,bool)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setBool(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['set_bool(uint64,bool)void'] | undefined]> - - /** - * Calls the sum_bools(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - sumBools(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['sum_bools(uint64)uint64'] | undefined]> - - /** - * Calls the box_map_test()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - boxMapTest(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_test()void'] | undefined]> - - /** - * Calls the box_map_set(uint64,string)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - boxMapSet(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_set(uint64,string)void'] | undefined]> - - /** - * Calls the box_map_get(uint64)string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - boxMapGet(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_get(uint64)string'] | undefined]> - - /** - * Calls the box_map_del(uint64)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - boxMapDel(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_del(uint64)void'] | undefined]> - - /** - * Calls the box_map_exists(uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - boxMapExists(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_exists(uint64)bool'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the BoxContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): BoxContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): BoxContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type BoxContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/Contract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/Contract.ts deleted file mode 100644 index aa62d61..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/Contract.ts +++ /dev/null @@ -1,621 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"Contract","structs":{},"methods":[{"name":"test_falcon_verify","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reject_version","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[138,226],"errorMessage":"application exists"},{"pc":[140],"errorMessage":"should be version 0"},{"pc":[229],"errorMessage":"should be version 1"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYgMAogICAgYnl0ZWNibG9jayBiYXNlNjQoRElFQlF3PT0pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQ29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMik6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhiZTU2NDk5YyAweGFjOGFhYjQyIC8vIG1ldGhvZCAidGVzdF9mYWxjb25fdmVyaWZ5KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X3JlamVjdF92ZXJzaW9uKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF9mYWxjb25fdmVyaWZ5IHRlc3RfcmVqZWN0X3ZlcnNpb24KICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQVZNMTIuY29udHJhY3QuQ29udHJhY3QudGVzdF9mYWxjb25fdmVyaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9mYWxjb25fdmVyaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjcKICAgIC8vIGFzc2VydCBub3Qgb3AuZmFsY29uX3ZlcmlmeShiIiIsIGIiIiwgb3AuYnplcm8oMTc5MykpCiAgICBwdXNoaW50IDE3OTMKICAgIGJ6ZXJvCiAgICBwdXNoYnl0ZXMgMHgKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBmYWxjb25fdmVyaWZ5CiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQVZNMTIuY29udHJhY3QuQ29udHJhY3QudGVzdF9yZWplY3RfdmVyc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfcmVqZWN0X3ZlcnNpb246CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTEKICAgIC8vIGFwcF92MF90eG4gPSBhcmM0LmFyYzRfY3JlYXRlKENvbnRyYWN0VjApCiAgICBpdHhuX2JlZ2luCiAgICBieXRlY18wIC8vIGJhc2U2NChESUVCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgcHVzaGJ5dGVzIGJhc2U2NChEREViUVFBYWdBU2c2Qmh5TmhvQWpnRUFBUUF4R1lFRUVqRVlFRVJDQUFneEdSUXhHQlFRUXpGRWdRRVNSSUVCUXc9PSkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTMKICAgIC8vIGFzc2VydCBhcHAudmVyc2lvbiA9PSAwLCAic2hvdWxkIGJlIHZlcnNpb24gMCIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwVmVyc2lvbgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIHNob3VsZCBiZSB2ZXJzaW9uIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToxNS0xNwogICAgLy8gYXJjNC5hcmM0X3VwZGF0ZSgKICAgIC8vICAgICBDb250cmFjdFYwLnVwZGF0ZSwgYXBwX2lkPWFwcCwgcmVqZWN0X3ZlcnNpb249MSwgY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdChDb250cmFjdFYxKQogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBDb250cmFjdFYwLnVwZGF0ZSwgYXBwX2lkPWFwcCwgcmVqZWN0X3ZlcnNpb249MSwgY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdChDb250cmFjdFYxKQogICAgYnl0ZWNfMCAvLyBiYXNlNjQoRElFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIHB1c2hieXRlcyBiYXNlNjQoRERFYlFRQWFnQVFrTjQwOE5ob0FqZ0VBQVFBeEdZRUZFakVZRUVSQ0FBZ3hHUlF4R0JRUVF6RkVnUUlTUklFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTUtMTcKICAgIC8vIGFyYzQuYXJjNF91cGRhdGUoCiAgICAvLyAgICAgQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIC8vICkKICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToxNgogICAgLy8gQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIGludGNfMCAvLyAxCiAgICBpdHhuX2ZpZWxkIFJlamVjdFZlcnNpb24KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTUtMTcKICAgIC8vIGFyYzQuYXJjNF91cGRhdGUoCiAgICAvLyAgICAgQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweGEwZTgxODcyIC8vIG1ldGhvZCAidXBkYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTgKICAgIC8vIGFzc2VydCBhcHAudmVyc2lvbiA9PSAxLCAic2hvdWxkIGJlIHZlcnNpb24gMSIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwVmVyc2lvbgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gc2hvdWxkIGJlIHZlcnNpb24gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjIwLTI5CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oCiAgICAvLyAgICAgICAgIGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgICAgICAgICBDb250cmFjdFYxLmRlbGV0ZSwKICAgIC8vICAgICAgICAgKSwKICAgIC8vICAgICApLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gICAgIHJlamVjdF92ZXJzaW9uPTIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjgKICAgIC8vIHJlamVjdF92ZXJzaW9uPTIsCiAgICBwdXNoaW50IDIKICAgIGl0eG5fZmllbGQgUmVqZWN0VmVyc2lvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjYKICAgIC8vIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToyMi0yNAogICAgLy8gYXJjNC5hcmM0X3NpZ25hdHVyZSgKICAgIC8vICAgICBDb250cmFjdFYxLmRlbGV0ZSwKICAgIC8vICksCiAgICBwdXNoYnl0ZXMgMHgyNDM3OGQzYyAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMiAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjIwLTI5CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oCiAgICAvLyAgICAgICAgIGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgICAgICAgICBDb250cmFjdFYxLmRlbGV0ZSwKICAgIC8vICAgICAgICAgKSwKICAgIC8vICAgICApLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gICAgIHJlamVjdF92ZXJzaW9uPTIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"DCADAQYAJgEEDIEBQzEbQQAdMRkURDEYRIICBL5WSZwErIqrQjYaAI4CAAkAFwAxGRQxGBQQQ4GBDq+AAElPAoUURCJDsSiyQoAxDDEbQQAagASg6BhyNhoAjgEAAQAxGYEEEjEYEERCAAgxGRQxGBQQQzFEgQESRIEBQ7JAI7IQJLIBs7Q9SXIJRBREsSiyQoAxDDEbQQAagAQkN408NhoAjgEAAQAxGYEFEjEYEERCAAgxGRQxGBQQQzFEgQISRIEBQ7JAgQSyGSKyREmyGIAEoOgYcrIaI7IQJLIBs0lyCUQiEkSxgQKyRLIYgQWyGYAEJDeNPLIaI7IQJLIBsyJD","clear":"DIEBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the Contract contract - */ -export type ContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'test_falcon_verify()void': Record - 'test_reject_version()void': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'test_falcon_verify()void': [] - 'test_reject_version()void': [] - } -} - -/** - * The return type for each method - */ -export type ContractReturns = { - 'test_falcon_verify()void': void - 'test_reject_version()void': void -} - -/** - * Defines the types of available calls and state of the Contract smart contract. - */ -export type ContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'test_falcon_verify()void' | 'test_falcon_verify', { - argsObj: ContractArgs['obj']['test_falcon_verify()void'] - argsTuple: ContractArgs['tuple']['test_falcon_verify()void'] - returns: ContractReturns['test_falcon_verify()void'] - }> - & Record<'test_reject_version()void' | 'test_reject_version', { - argsObj: ContractArgs['obj']['test_reject_version()void'] - argsTuple: ContractArgs['tuple']['test_reject_version()void'] - returns: ContractReturns['test_reject_version()void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type ContractSignatures = keyof ContractTypes['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the Contract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = ContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the Contract smart contract to the method's return type - */ -export type MethodReturn = ContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type ContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type ContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: ContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the Contract smart contract - */ -export abstract class ContractParamsFactory { - /** - * Constructs a no op call for the test_falcon_verify()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testFalconVerify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_falcon_verify()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_reject_version()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testRejectVersion(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_reject_version()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } -} - -/** - * A factory to create and deploy one or more instance of the Contract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class ContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `ContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new ContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new ContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the Contract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: ContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new ContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Contract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Contract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Contract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new ContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the Contract smart contract - */ -export class ContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `ContractClient` - * - * @param appClient An `AppClient` instance which has been created with the Contract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `ContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `ContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new ContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `ContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new ContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the Contract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the Contract smart contract using the `test_falcon_verify()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testFalconVerify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ContractParamsFactory.testFalconVerify(params)) - }, - - /** - * Makes a call to the Contract smart contract using the `test_reject_version()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testRejectVersion: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ContractParamsFactory.testRejectVersion(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the Contract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the Contract smart contract using the `test_falcon_verify()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testFalconVerify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ContractParamsFactory.testFalconVerify(params)) - }, - - /** - * Makes a call to the Contract smart contract using the `test_reject_version()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testRejectVersion: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ContractParamsFactory.testRejectVersion(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the Contract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the Contract smart contract using the `test_falcon_verify()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testFalconVerify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ContractParamsFactory.testFalconVerify(params)) - return {...result, return: result.return as unknown as (undefined | ContractReturns['test_falcon_verify()void'])} - }, - - /** - * Makes a call to the Contract smart contract using the `test_reject_version()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testRejectVersion: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ContractParamsFactory.testRejectVersion(params)) - return {...result, return: result.return as unknown as (undefined | ContractReturns['test_reject_version()void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new ContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current Contract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): ContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a test_falcon_verify()void method call against the Contract contract - */ - testFalconVerify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testFalconVerify(params))) - return this - }, - /** - * Add a test_reject_version()void method call against the Contract contract - */ - testRejectVersion(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testRejectVersion(params))) - return this - }, - /** - * Add a clear state call to the Contract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as ContractComposer - } -} -export type ContractComposer = { - /** - * Calls the test_falcon_verify()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testFalconVerify(params?: CallParams): ContractComposer<[...TReturns, ContractReturns['test_falcon_verify()void'] | undefined]> - - /** - * Calls the test_reject_version()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testRejectVersion(params?: CallParams): ContractComposer<[...TReturns, ContractReturns['test_reject_version()void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the Contract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): ContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): ContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type ContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ContractV0.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ContractV0.ts deleted file mode 100644 index 4c42a4d..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/ContractV0.ts +++ /dev/null @@ -1,621 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"ContractV0","structs":{},"methods":[{"name":"update","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["UpdateApplication"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[45],"errorMessage":"can only update if caller expects this to be currently be v0"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTozMgogICAgLy8gY2xhc3MgQ29udHJhY3RWMChBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTEyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweGEwZTgxODcyIC8vIG1ldGhvZCAidXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl91cGRhdGVfcm91dGVAMwogICAgZXJyCgptYWluX3VwZGF0ZV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz0oIlVwZGF0ZUFwcGxpY2F0aW9uIiwpKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgdXBkYXRlCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BVk0xMi5jb250cmFjdC5Db250cmFjdFYwLnVwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTozNgogICAgLy8gVHhuLnJlamVjdF92ZXJzaW9uID09IDEKICAgIHR4biBSZWplY3RWZXJzaW9uCiAgICBwdXNoaW50IDEKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MzUtMzcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnJlamVjdF92ZXJzaW9uID09IDEKICAgIC8vICksICJjYW4gb25seSB1cGRhdGUgaWYgY2FsbGVyIGV4cGVjdHMgdGhpcyB0byBiZSBjdXJyZW50bHkgYmUgdjAiCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgdXBkYXRlIGlmIGNhbGxlciBleHBlY3RzIHRoaXMgdG8gYmUgY3VycmVudGx5IGJlIHYwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPSgiVXBkYXRlQXBwbGljYXRpb24iLCkpCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"DDEbQQAagASg6BhyNhoAjgEAAQAxGYEEEjEYEERCAAgxGRQxGBQQQzFEgQESRIEBQw==","clear":"DIEBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the ContractV0 contract - */ -export type ContractV0Args = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'update()void': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'update()void': [] - } -} - -/** - * The return type for each method - */ -export type ContractV0Returns = { - 'update()void': void -} - -/** - * Defines the types of available calls and state of the ContractV0 smart contract. - */ -export type ContractV0Types = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'update()void' | 'update', { - argsObj: ContractV0Args['obj']['update()void'] - argsTuple: ContractV0Args['tuple']['update()void'] - returns: ContractV0Returns['update()void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type ContractV0Signatures = keyof ContractV0Types['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the ContractV0 smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = ContractV0Types['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the ContractV0 smart contract to the method's return type - */ -export type MethodReturn = ContractV0Types['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type ContractV0CreateCallParams = - | Expand -/** - * Defines supported update method params for this smart contract - */ -export type ContractV0UpdateCallParams = - | Expand & {method: 'update'}> - | Expand & {method: 'update()void'}> -/** - * Defines arguments required for the deploy method. - */ -export type ContractV0DeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: ContractV0CreateCallParams - /** - * Update transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - updateParams?: ContractV0UpdateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the ContractV0 smart contract - */ -export abstract class ContractV0ParamsFactory { - /** - * Gets available update ABI call param factories - */ - static get update() { - return { - _resolveByMethod(params: TParams) { - switch(params.method) { - case 'update': - case 'update()void': - return ContractV0ParamsFactory.update.update(params) - } - throw new Error(`Unknown ' + verb + ' method`) - }, - - /** - * Constructs update ABI call params for the ContractV0 smart contract using the update()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - update(params: CallParams & AppClientCompilationParams): AppClientMethodCallParams & AppClientCompilationParams { - return { - ...params, - method: 'update()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - }, - } - } - -} - -/** - * A factory to create and deploy one or more instance of the ContractV0 smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class ContractV0Factory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `ContractV0Factory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new ContractV0Client(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new ContractV0Client(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the ContractV0 smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: ContractV0DeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - updateParams: params.updateParams?.method ? ContractV0ParamsFactory.update._resolveByMethod(params.updateParams) : params.updateParams ? params.updateParams as (ContractV0UpdateCallParams & { args: Uint8Array[] }) : undefined, - }) - return { result: result.result, appClient: new ContractV0Client(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ContractV0 smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - /** - * Gets available deployUpdate methods - */ - deployUpdate: { - /** - * Updates an existing instance of the ContractV0 smart contract using the update()void ABI method. - * - * @param params The params for the smart contract call - * @returns The deployUpdate params - */ - update: (params: CallParams & AppClientCompilationParams = {args: []}) => { - return this.appFactory.params.deployUpdate(ContractV0ParamsFactory.update.update(params)) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ContractV0 smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ContractV0 smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new ContractV0Client(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the ContractV0 smart contract - */ -export class ContractV0Client { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `ContractV0Client` - * - * @param appClient An `AppClient` instance which has been created with the ContractV0 app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `ContractV0Client` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `ContractV0Client` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new ContractV0Client(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `ContractV0Client` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new ContractV0Client(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available update methods - */ - update: { - /** - * Updates an existing instance of the ContractV0 smart contract using the `update()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The update params - */ - update: (params: CallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.UpdateApplication } = {args: []}) => { - return this.appClient.params.update(ContractV0ParamsFactory.update.update(params)) - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the ContractV0 smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available update methods - */ - update: { - /** - * Updates an existing instance of the ContractV0 smart contract using the `update()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The update transaction - */ - update: (params: CallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.UpdateApplication } = {args: []}) => { - return this.appClient.createTransaction.update(ContractV0ParamsFactory.update.update(params)) - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the ContractV0 smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available update methods - */ - update: { - /** - * Updates an existing instance of the ContractV0 smart contract using the `update()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The update result - */ - update: async (params: CallParams & AppClientCompilationParams & SendParams & { onComplete?: OnApplicationComplete.UpdateApplication } = {args: []}) => { - const result = await this.appClient.send.update(ContractV0ParamsFactory.update.update(params)) - return {...result, return: result.return as unknown as (undefined | ContractV0Returns['update()void'])} - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the ContractV0 smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new ContractV0Client(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current ContractV0 app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): ContractV0Composer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - get update() { - return { - update: (params: CallParams & AppClientCompilationParams) => { - promiseChain = promiseChain.then(async () => composer.addAppUpdateMethodCall(await client.params.update.update(params))) - return this - }, - } - }, - /** - * Add a clear state call to the ContractV0 contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as ContractV0Composer - } -} -export type ContractV0Composer = { - /** - * Gets available update methods - */ - readonly update: { - /** - * Updates an existing instance of the ContractV0 smart contract using the update()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - update(params?: CallParams): ContractV0Composer<[...TReturns, ContractV0Returns['update()void'] | undefined]> - } - - /** - * Makes a clear_state call to an existing instance of the ContractV0 smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): ContractV0Composer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): ContractV0Composer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type ContractV0ComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ContractV1.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ContractV1.ts deleted file mode 100644 index 7f5e963..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/ContractV1.ts +++ /dev/null @@ -1,621 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"ContractV1","structs":{},"methods":[{"name":"delete","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["DeleteApplication"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[45],"errorMessage":"can only update if caller expects this to be currently be v1"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo0MAogICAgLy8gY2xhc3MgQ29udHJhY3RWMShBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTEyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweDI0Mzc4ZDNjIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9kZWxldGVfcm91dGVAMwogICAgZXJyCgptYWluX2RlbGV0ZV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz0oIkRlbGV0ZUFwcGxpY2F0aW9uIiwpKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgZGVsZXRlCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BVk0xMi5jb250cmFjdC5Db250cmFjdFYxLmRlbGV0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlbGV0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo0NAogICAgLy8gVHhuLnJlamVjdF92ZXJzaW9uID09IDIKICAgIHR4biBSZWplY3RWZXJzaW9uCiAgICBwdXNoaW50IDIKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NDMtNDUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnJlamVjdF92ZXJzaW9uID09IDIKICAgIC8vICksICJjYW4gb25seSB1cGRhdGUgaWYgY2FsbGVyIGV4cGVjdHMgdGhpcyB0byBiZSBjdXJyZW50bHkgYmUgdjEiCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgdXBkYXRlIGlmIGNhbGxlciBleHBlY3RzIHRoaXMgdG8gYmUgY3VycmVudGx5IGJlIHYxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPSgiRGVsZXRlQXBwbGljYXRpb24iLCkpCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"DDEbQQAagAQkN408NhoAjgEAAQAxGYEFEjEYEERCAAgxGRQxGBQQQzFEgQISRIEBQw==","clear":"DIEBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the ContractV1 contract - */ -export type ContractV1Args = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'delete()void': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'delete()void': [] - } -} - -/** - * The return type for each method - */ -export type ContractV1Returns = { - 'delete()void': void -} - -/** - * Defines the types of available calls and state of the ContractV1 smart contract. - */ -export type ContractV1Types = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'delete()void' | 'delete', { - argsObj: ContractV1Args['obj']['delete()void'] - argsTuple: ContractV1Args['tuple']['delete()void'] - returns: ContractV1Returns['delete()void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type ContractV1Signatures = keyof ContractV1Types['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the ContractV1 smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = ContractV1Types['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the ContractV1 smart contract to the method's return type - */ -export type MethodReturn = ContractV1Types['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type ContractV1CreateCallParams = - | Expand -/** - * Defines supported delete method params for this smart contract - */ -export type ContractV1DeleteCallParams = - | Expand & {method: 'delete'}> - | Expand & {method: 'delete()void'}> -/** - * Defines arguments required for the deploy method. - */ -export type ContractV1DeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: ContractV1CreateCallParams - /** - * Delete transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - deleteParams?: ContractV1DeleteCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the ContractV1 smart contract - */ -export abstract class ContractV1ParamsFactory { - /** - * Gets available delete ABI call param factories - */ - static get delete() { - return { - _resolveByMethod(params: TParams) { - switch(params.method) { - case 'delete': - case 'delete()void': - return ContractV1ParamsFactory.delete.delete(params) - } - throw new Error(`Unknown ' + verb + ' method`) - }, - - /** - * Constructs delete ABI call params for the ContractV1 smart contract using the delete()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - delete(params: CallParams): AppClientMethodCallParams { - return { - ...params, - method: 'delete()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - }, - } - } - -} - -/** - * A factory to create and deploy one or more instance of the ContractV1 smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class ContractV1Factory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `ContractV1Factory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new ContractV1Client(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new ContractV1Client(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the ContractV1 smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: ContractV1DeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - deleteParams: params.deleteParams?.method ? ContractV1ParamsFactory.delete._resolveByMethod(params.deleteParams) : params.deleteParams ? params.deleteParams as (ContractV1DeleteCallParams & { args: Uint8Array[] }) : undefined, - }) - return { result: result.result, appClient: new ContractV1Client(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ContractV1 smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - /** - * Gets available deployDelete methods - */ - deployDelete: { - /** - * Deletes an existing instance of the ContractV1 smart contract using the delete()void ABI method. - * - * @param params The params for the smart contract call - * @returns The deployDelete params - */ - delete: (params: CallParams = {args: []}) => { - return this.appFactory.params.deployDelete(ContractV1ParamsFactory.delete.delete(params)) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ContractV1 smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ContractV1 smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new ContractV1Client(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the ContractV1 smart contract - */ -export class ContractV1Client { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `ContractV1Client` - * - * @param appClient An `AppClient` instance which has been created with the ContractV1 app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `ContractV1Client` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `ContractV1Client` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new ContractV1Client(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `ContractV1Client` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new ContractV1Client(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available delete methods - */ - delete: { - /** - * Deletes an existing instance of the ContractV1 smart contract using the `delete()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The delete params - */ - delete: (params: CallParams & { onComplete?: OnApplicationComplete.DeleteApplication } = {args: []}) => { - return this.appClient.params.delete(ContractV1ParamsFactory.delete.delete(params)) - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the ContractV1 smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available delete methods - */ - delete: { - /** - * Deletes an existing instance of the ContractV1 smart contract using the `delete()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The delete transaction - */ - delete: (params: CallParams & { onComplete?: OnApplicationComplete.DeleteApplication } = {args: []}) => { - return this.appClient.createTransaction.delete(ContractV1ParamsFactory.delete.delete(params)) - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the ContractV1 smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available delete methods - */ - delete: { - /** - * Deletes an existing instance of the ContractV1 smart contract using the `delete()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The delete result - */ - delete: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.DeleteApplication } = {args: []}) => { - const result = await this.appClient.send.delete(ContractV1ParamsFactory.delete.delete(params)) - return {...result, return: result.return as unknown as (undefined | ContractV1Returns['delete()void'])} - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the ContractV1 smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new ContractV1Client(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current ContractV1 app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): ContractV1Composer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - get delete() { - return { - delete: (params: CallParams) => { - promiseChain = promiseChain.then(async () => composer.addAppDeleteMethodCall(await client.params.delete.delete(params))) - return this - }, - } - }, - /** - * Add a clear state call to the ContractV1 contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as ContractV1Composer - } -} -export type ContractV1Composer = { - /** - * Gets available delete methods - */ - readonly delete: { - /** - * Deletes an existing instance of the ContractV1 smart contract using the delete()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - delete(params?: CallParams): ContractV1Composer<[...TReturns, ContractV1Returns['delete()void'] | undefined]> - } - - /** - * Makes a clear_state call to an existing instance of the ContractV1 smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): ContractV1Composer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): ContractV1Composer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type ContractV1ComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/CryptoOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/CryptoOpsContract.ts deleted file mode 100644 index d63f44a..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/CryptoOpsContract.ts +++ /dev/null @@ -1,1422 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"CryptoOpsContract","structs":{},"methods":[{"name":"verify_sha256","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_sha3_256","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_keccak_256","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_sha512_256","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ed25519verify","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ed25519verify_bare","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_verify_k1","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"},{"type":"byte[]","name":"e"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_verify_r1","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"},{"type":"byte[]","name":"e"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_recover_k1","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"}],"returns":{"type":"(byte[],byte[])"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_recover_r1","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"}],"returns":{"type":"(byte[],byte[])"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"desc":"Must fail, AVM does not support Secp256r1 for recover","events":[],"recommendations":{}},{"name":"verify_ecdsa_decompress_k1","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"(byte[],byte[])"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_decompress_r1","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"(byte[],byte[])"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_vrf_verify","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"(byte[],bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMzAwMCA0CiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHgwMCAweDE1MWY3Yzc1MDAyMCAweDAwMDQgMHgwNjgxMDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQ3J5cHRvT3BzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDIwCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHgzNDU2YzRjMyAweGU4NDQyYjg0IDB4NjVmNTY3YWEgMHgyNTg0NTViMSAweDM1YWYwZjM4IDB4NjU4MmM5OTcgMHg2Mjk4ZmZiYiAweDM4ODViNTRmIDB4MjE2NGUwYmYgMHg3NTViNzlhNSAweGYwNmJiMDc3IDB4MTMzZjhjY2MgMHgyZjdjNjhhOSAvLyBtZXRob2QgInZlcmlmeV9zaGEyNTYoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9zaGEzXzI1NihieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2tlY2Nha18yNTYoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9zaGE1MTJfMjU2KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZWQyNTUxOXZlcmlmeShieXRlW10sYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfZWQyNTUxOXZlcmlmeV9iYXJlKGJ5dGVbXSxieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9lY2RzYV92ZXJpZnlfazEoYnl0ZVtdLGJ5dGVbXSxieXRlW10sYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfZWNkc2FfdmVyaWZ5X3IxKGJ5dGVbXSxieXRlW10sYnl0ZVtdLGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX3JlY292ZXJfazEoYnl0ZVtdLHVpbnQ2NCxieXRlW10sYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX3JlY292ZXJfcjEoYnl0ZVtdLHVpbnQ2NCxieXRlW10sYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX2RlY29tcHJlc3NfazEoYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX2RlY29tcHJlc3NfcjEoYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X3ZyZl92ZXJpZnkoYnl0ZVtdLGJ5dGVbXSxieXRlW10pKGJ5dGVbXSxib29sKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9zaGEyNTYgdmVyaWZ5X3NoYTNfMjU2IHZlcmlmeV9rZWNjYWtfMjU2IHZlcmlmeV9zaGE1MTJfMjU2IHZlcmlmeV9lZDI1NTE5dmVyaWZ5IHZlcmlmeV9lZDI1NTE5dmVyaWZ5X2JhcmUgdmVyaWZ5X2VjZHNhX3ZlcmlmeV9rMSB2ZXJpZnlfZWNkc2FfdmVyaWZ5X3IxIHZlcmlmeV9lY2RzYV9yZWNvdmVyX2sxIHZlcmlmeV9lY2RzYV9yZWNvdmVyX3IxIHZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX2sxIHZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX3IxIHZlcmlmeV92cmZfdmVyaWZ5CiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMjA6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyA0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3aXRjaCBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMyBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANAoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICBpdHhuX3N1Ym1pdAogICAgYiBlbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxCgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANDoKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMzoKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2OgogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfc2hhMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NoYTI1NjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjcKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjgKICAgIC8vIHJlc3VsdCA9IG9wLnNoYTI1NihhKQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUwMDIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcnlwdG9PcHMuY29udHJhY3QuQ3J5cHRvT3BzQ29udHJhY3QudmVyaWZ5X3NoYTNfMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NoYTNfMjU2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBhID0gb3AuYnplcm8ocGFkX3NpemUpICsgYQogICAgYnplcm8KICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxNAogICAgLy8gcmVzdWx0ID0gb3Auc2hhM18yNTYoYSkKICAgIHNoYTNfMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3J5cHRvT3BzLmNvbnRyYWN0LkNyeXB0b09wc0NvbnRyYWN0LnZlcmlmeV9rZWNjYWtfMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2tlY2Nha18yNTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MTkKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyByZXN1bHQgPSBvcC5rZWNjYWsyNTYoYSkKICAgIGtlY2NhazI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfc2hhNTEyXzI1Nltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zaGE1MTJfMjU2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhID0gb3AuYnplcm8ocGFkX3NpemUpICsgYQogICAgYnplcm8KICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyNgogICAgLy8gcmVzdWx0ID0gb3Auc2hhNTEyXzI1NihhKQogICAgc2hhNTEyXzI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWQyNTUxOXZlcmlmeVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lZDI1NTE5dmVyaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzEKICAgIC8vIGVuc3VyZV9idWRnZXQoMTkwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgMTkwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozMgogICAgLy8gcmVzdWx0ID0gb3AuZWQyNTUxOXZlcmlmeShhLCBiLCBjKQogICAgZWQyNTUxOXZlcmlmeQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozMwogICAgLy8gcmV0dXJuIGFyYzQuQm9vbChyZXN1bHQpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3J5cHRvT3BzLmNvbnRyYWN0LkNyeXB0b09wc0NvbnRyYWN0LnZlcmlmeV9lZDI1NTE5dmVyaWZ5X2JhcmVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZWQyNTUxOXZlcmlmeV9iYXJlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzcKICAgIC8vIGVuc3VyZV9idWRnZXQoMTkwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgMTkwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozOAogICAgLy8gcmVzdWx0ID0gb3AuZWQyNTUxOXZlcmlmeV9iYXJlKGEsIGIsIGMpCiAgICBlZDI1NTE5dmVyaWZ5X2JhcmUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzkKICAgIC8vIHJldHVybiBhcmM0LkJvb2wocmVzdWx0KQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfdmVyaWZ5X2sxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2VjZHNhX3ZlcmlmeV9rMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDMKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyByZXN1bHRfazEgPSBvcC5lY2RzYV92ZXJpZnkob3AuRUNEU0EuU2VjcDI1NmsxLCBhLCBiLCBjLCBkLCBlKQogICAgZWNkc2FfdmVyaWZ5IFNlY3AyNTZrMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfdmVyaWZ5X3IxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2VjZHNhX3ZlcmlmeV9yMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDkKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjUwCiAgICAvLyByZXN1bHRfcjEgPSBvcC5lY2RzYV92ZXJpZnkob3AuRUNEU0EuU2VjcDI1NnIxLCBhLCBiLCBjLCBkLCBlKQogICAgZWNkc2FfdmVyaWZ5IFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfcmVjb3Zlcl9rMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9yZWNvdmVyX2sxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NTcKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjU4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfcmVjb3ZlcihvcC5FQ0RTQS5TZWNwMjU2azEsIGEsIGIsIGMsIGQpCiAgICBlY2RzYV9wa19yZWNvdmVyIFNlY3AyNTZrMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfcmVjb3Zlcl9yMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9yZWNvdmVyX3IxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NjcKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjY4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfcmVjb3ZlcihvcC5FQ0RTQS5TZWNwMjU2cjEsIGEsIGIsIGMsIGQpCiAgICBlY2RzYV9wa19yZWNvdmVyIFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19rMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX2sxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmVfYnVkZ2V0KDcwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNzAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjczCiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfZGVjb21wcmVzcyhvcC5FQ0RTQS5TZWNwMjU2azEsIGEpCiAgICBlY2RzYV9wa19kZWNvbXByZXNzIFNlY3AyNTZrMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19yMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX3IxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBlbnN1cmVfYnVkZ2V0KDcwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNzAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfZGVjb21wcmVzcyhvcC5FQ0RTQS5TZWNwMjU2cjEsIGEpCiAgICBlY2RzYV9wa19kZWNvbXByZXNzIFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfdnJmX3ZlcmlmeVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV92cmZfdmVyaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6ODIKICAgIC8vIGVuc3VyZV9idWRnZXQoNTcwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNTcwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo4MwogICAgLy8gcmVzdWx0ID0gb3AudnJmX3ZlcmlmeShvcC5WcmZWZXJpZnkuVnJmQWxnb3JhbmQsIGEsIGIsIGMpCiAgICB2cmZfdmVyaWZ5IFZyZkFsZ29yYW5kCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAAG4FwQmBQQVH3x1AQAGFR98dQAgAgAEAwaBATEbQQBqMRkURDEYRIINBDRWxMME6EQrhARl9WeqBCWEVbEENa8POARlgsmXBGKY/7sEOIW1TwQhZOC/BHVbeaUE8GuwdwQTP4zMBC98aKk2GgCODQBEAFgAbACAAJQAuQDeAQ4BPgGGAc4CCAJCADEZFDEYFBBDigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScEsh4nBLIfi/+NAgALAASzQv/bMgCyAUL/9SKyAUL/74k2GgFXAgA2GgIXr0xQASpMULAjQzYaAVcCADYaAhevTFCYKkxQsCNDNhoBVwIANhoCF69MUAIqTFCwI0M2GgFXAgA2GgIXr0xQAypMULAjQzYaAVcCADYaAlcCADYaA1cCAIHsDiKI/1wEKSJPAlQoTFCwI0M2GgFXAgA2GgJXAgA2GgNXAgCB7A4iiP83hCkiTwJUKExQsCNDNhoBVwIANhoCVwIANhoDVwIANhoEVwIANhoFVwIAJCKI/wgFACkiTwJUKExQsCNDNhoBVwIANhoCVwIANhoDVwIANhoEVwIANhoFVwIAJCKI/tgFASkiTwJUKExQsCNDNhoBVwIANhoCFzYaA1cCADYaBFcCACQiiP6wBwBLARUWVwYCTwJQSRUlCEsCFRZXBgJPA1BMFlcGAitMUE8CUExQKExQsCNDNhoBVwIANhoCFzYaA1cCADYaBFcCACQiiP5oBwFLARUWVwYCTwJQSRUlCEsCFRZXBgJPA1BMFlcGAitMUE8CUExQKExQsCNDNhoBVwIAgbwFIoj+LgYASwEVFlcGAk8CUEkVJQhLAhUWVwYCTwNQTBZXBgIrTFBPAlBMUChMULAjQzYaAVcCAIG8BSKI/fQGAUsBFRZXBgJPAlBJFSUISwIVFlcGAk8DUEwWVwYCK0xQTwJQTFAoTFCwI0M2GgFXAgA2GgJXAgA2GgNXAgCBxCwiiP2u0ABLARUWVwYCTwJQKSJPA1SAAgADTFBMUChMULAjQw==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the CryptoOpsContract contract - */ -export type CryptoOpsContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify_sha256(byte[],uint64)byte[]': { - a: Uint8Array - padSize: bigint | number - } - 'verify_sha3_256(byte[],uint64)byte[]': { - a: Uint8Array - padSize: bigint | number - } - 'verify_keccak_256(byte[],uint64)byte[]': { - a: Uint8Array - padSize: bigint | number - } - 'verify_sha512_256(byte[],uint64)byte[]': { - a: Uint8Array - padSize: bigint | number - } - 'verify_ed25519verify(byte[],byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - c: Uint8Array - } - 'verify_ed25519verify_bare(byte[],byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - c: Uint8Array - } - 'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - c: Uint8Array - d: Uint8Array - e: Uint8Array - } - 'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - c: Uint8Array - d: Uint8Array - e: Uint8Array - } - 'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])': { - a: Uint8Array - b: bigint | number - c: Uint8Array - d: Uint8Array - } - 'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])': { - a: Uint8Array - b: bigint | number - c: Uint8Array - d: Uint8Array - } - 'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])': { - a: Uint8Array - } - 'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])': { - a: Uint8Array - } - 'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)': { - a: Uint8Array - b: Uint8Array - c: Uint8Array - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify_sha256(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] - 'verify_sha3_256(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] - 'verify_keccak_256(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] - 'verify_sha512_256(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] - 'verify_ed25519verify(byte[],byte[],byte[])bool': [a: Uint8Array, b: Uint8Array, c: Uint8Array] - 'verify_ed25519verify_bare(byte[],byte[],byte[])bool': [a: Uint8Array, b: Uint8Array, c: Uint8Array] - 'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool': [a: Uint8Array, b: Uint8Array, c: Uint8Array, d: Uint8Array, e: Uint8Array] - 'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool': [a: Uint8Array, b: Uint8Array, c: Uint8Array, d: Uint8Array, e: Uint8Array] - 'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])': [a: Uint8Array, b: bigint | number, c: Uint8Array, d: Uint8Array] - 'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])': [a: Uint8Array, b: bigint | number, c: Uint8Array, d: Uint8Array] - 'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])': [a: Uint8Array] - 'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])': [a: Uint8Array] - 'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)': [a: Uint8Array, b: Uint8Array, c: Uint8Array] - } -} - -/** - * The return type for each method - */ -export type CryptoOpsContractReturns = { - 'verify_sha256(byte[],uint64)byte[]': Uint8Array - 'verify_sha3_256(byte[],uint64)byte[]': Uint8Array - 'verify_keccak_256(byte[],uint64)byte[]': Uint8Array - 'verify_sha512_256(byte[],uint64)byte[]': Uint8Array - 'verify_ed25519verify(byte[],byte[],byte[])bool': boolean - 'verify_ed25519verify_bare(byte[],byte[],byte[])bool': boolean - 'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool': boolean - 'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool': boolean - 'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])': [Uint8Array, Uint8Array] - 'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])': [Uint8Array, Uint8Array] - 'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])': [Uint8Array, Uint8Array] - 'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])': [Uint8Array, Uint8Array] - 'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)': [Uint8Array, boolean] -} - -/** - * Defines the types of available calls and state of the CryptoOpsContract smart contract. - */ -export type CryptoOpsContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify_sha256(byte[],uint64)byte[]' | 'verify_sha256', { - argsObj: CryptoOpsContractArgs['obj']['verify_sha256(byte[],uint64)byte[]'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_sha256(byte[],uint64)byte[]'] - returns: CryptoOpsContractReturns['verify_sha256(byte[],uint64)byte[]'] - }> - & Record<'verify_sha3_256(byte[],uint64)byte[]' | 'verify_sha3_256', { - argsObj: CryptoOpsContractArgs['obj']['verify_sha3_256(byte[],uint64)byte[]'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_sha3_256(byte[],uint64)byte[]'] - returns: CryptoOpsContractReturns['verify_sha3_256(byte[],uint64)byte[]'] - }> - & Record<'verify_keccak_256(byte[],uint64)byte[]' | 'verify_keccak_256', { - argsObj: CryptoOpsContractArgs['obj']['verify_keccak_256(byte[],uint64)byte[]'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_keccak_256(byte[],uint64)byte[]'] - returns: CryptoOpsContractReturns['verify_keccak_256(byte[],uint64)byte[]'] - }> - & Record<'verify_sha512_256(byte[],uint64)byte[]' | 'verify_sha512_256', { - argsObj: CryptoOpsContractArgs['obj']['verify_sha512_256(byte[],uint64)byte[]'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_sha512_256(byte[],uint64)byte[]'] - returns: CryptoOpsContractReturns['verify_sha512_256(byte[],uint64)byte[]'] - }> - & Record<'verify_ed25519verify(byte[],byte[],byte[])bool' | 'verify_ed25519verify', { - argsObj: CryptoOpsContractArgs['obj']['verify_ed25519verify(byte[],byte[],byte[])bool'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_ed25519verify(byte[],byte[],byte[])bool'] - returns: CryptoOpsContractReturns['verify_ed25519verify(byte[],byte[],byte[])bool'] - }> - & Record<'verify_ed25519verify_bare(byte[],byte[],byte[])bool' | 'verify_ed25519verify_bare', { - argsObj: CryptoOpsContractArgs['obj']['verify_ed25519verify_bare(byte[],byte[],byte[])bool'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_ed25519verify_bare(byte[],byte[],byte[])bool'] - returns: CryptoOpsContractReturns['verify_ed25519verify_bare(byte[],byte[],byte[])bool'] - }> - & Record<'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool' | 'verify_ecdsa_verify_k1', { - argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'] - returns: CryptoOpsContractReturns['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'] - }> - & Record<'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool' | 'verify_ecdsa_verify_r1', { - argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'] - returns: CryptoOpsContractReturns['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'] - }> - & Record<'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])' | 'verify_ecdsa_recover_k1', { - argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'] - returns: CryptoOpsContractReturns['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'] - }> - & Record<'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])' | 'verify_ecdsa_recover_r1', { - argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'] - returns: CryptoOpsContractReturns['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'] - }> - & Record<'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])' | 'verify_ecdsa_decompress_k1', { - argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'] - returns: CryptoOpsContractReturns['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'] - }> - & Record<'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])' | 'verify_ecdsa_decompress_r1', { - argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'] - returns: CryptoOpsContractReturns['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'] - }> - & Record<'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)' | 'verify_vrf_verify', { - argsObj: CryptoOpsContractArgs['obj']['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'] - returns: CryptoOpsContractReturns['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type CryptoOpsContractSignatures = keyof CryptoOpsContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type CryptoOpsContractNonVoidMethodSignatures = keyof CryptoOpsContractTypes['methods'] extends infer T ? T extends keyof CryptoOpsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the CryptoOpsContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = CryptoOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the CryptoOpsContract smart contract to the method's return type - */ -export type MethodReturn = CryptoOpsContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type CryptoOpsContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type CryptoOpsContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: CryptoOpsContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the CryptoOpsContract smart contract - */ -export abstract class CryptoOpsContractParamsFactory { - /** - * Constructs a no op call for the verify_sha256(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifySha256(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_sha256(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], - } - } - /** - * Constructs a no op call for the verify_sha3_256(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifySha3_256(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_sha3_256(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], - } - } - /** - * Constructs a no op call for the verify_keccak_256(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyKeccak_256(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_keccak_256(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], - } - } - /** - * Constructs a no op call for the verify_sha512_256(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifySha512_256(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_sha512_256(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], - } - } - /** - * Constructs a no op call for the verify_ed25519verify(byte[],byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyEd25519verify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_ed25519verify(byte[],byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_ed25519verify_bare(byte[],byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyEd25519verifyBare(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_ed25519verify_bare(byte[],byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyEcdsaVerifyK1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d, params.args.e], - } - } - /** - * Constructs a no op call for the verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyEcdsaVerifyR1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d, params.args.e], - } - } - /** - * Constructs a no op call for the verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[]) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyEcdsaRecoverK1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d], - } - } - /** - * Constructs a no op call for the verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[]) ABI method - * - * Must fail, AVM does not support Secp256r1 for recover - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyEcdsaRecoverR1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d], - } - } - /** - * Constructs a no op call for the verify_ecdsa_decompress_k1(byte[])(byte[],byte[]) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyEcdsaDecompressK1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_ecdsa_decompress_r1(byte[])(byte[],byte[]) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyEcdsaDecompressR1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_vrf_verify(byte[],byte[],byte[])(byte[],bool) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyVrfVerify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } -} - -/** - * A factory to create and deploy one or more instance of the CryptoOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class CryptoOpsContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `CryptoOpsContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new CryptoOpsContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new CryptoOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the CryptoOpsContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: CryptoOpsContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new CryptoOpsContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the CryptoOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the CryptoOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the CryptoOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new CryptoOpsContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the CryptoOpsContract smart contract - */ -export class CryptoOpsContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `CryptoOpsContractClient` - * - * @param appClient An `AppClient` instance which has been created with the CryptoOpsContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `CryptoOpsContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `CryptoOpsContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new CryptoOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `CryptoOpsContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new CryptoOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the CryptoOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_sha256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifySha256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifySha256(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_sha3_256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifySha3_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifySha3_256(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_keccak_256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyKeccak_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyKeccak_256(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_sha512_256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifySha512_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifySha512_256(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify(byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyEd25519verify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEd25519verify(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify_bare(byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyEd25519verifyBare: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEd25519verifyBare(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyEcdsaVerifyK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyK1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyEcdsaVerifyR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyR1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyEcdsaRecoverK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverK1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. - * - * Must fail, AVM does not support Secp256r1 for recover - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyEcdsaRecoverR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverR1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_k1(byte[])(byte[],byte[])` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyEcdsaDecompressK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressK1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_r1(byte[])(byte[],byte[])` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyEcdsaDecompressR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressR1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyVrfVerify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyVrfVerify(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the CryptoOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_sha256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifySha256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifySha256(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_sha3_256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifySha3_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifySha3_256(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_keccak_256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyKeccak_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyKeccak_256(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_sha512_256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifySha512_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifySha512_256(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify(byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyEd25519verify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEd25519verify(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify_bare(byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyEd25519verifyBare: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEd25519verifyBare(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyEcdsaVerifyK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyK1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyEcdsaVerifyR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyR1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyEcdsaRecoverK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverK1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. - * - * Must fail, AVM does not support Secp256r1 for recover - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyEcdsaRecoverR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverR1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_k1(byte[])(byte[],byte[])` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyEcdsaDecompressK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressK1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_r1(byte[])(byte[],byte[])` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyEcdsaDecompressR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressR1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyVrfVerify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyVrfVerify(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the CryptoOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_sha256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifySha256: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifySha256(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_sha256(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_sha3_256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifySha3_256: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifySha3_256(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_sha3_256(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_keccak_256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyKeccak_256: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyKeccak_256(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_keccak_256(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_sha512_256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifySha512_256: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifySha512_256(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_sha512_256(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify(byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyEd25519verify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEd25519verify(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ed25519verify(byte[],byte[],byte[])bool'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify_bare(byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyEd25519verifyBare: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEd25519verifyBare(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ed25519verify_bare(byte[],byte[],byte[])bool'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyEcdsaVerifyK1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyK1(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyEcdsaVerifyR1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyR1(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyEcdsaRecoverK1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverK1(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. - * - * Must fail, AVM does not support Secp256r1 for recover - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyEcdsaRecoverR1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverR1(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_k1(byte[])(byte[],byte[])` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyEcdsaDecompressK1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressK1(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_r1(byte[])(byte[],byte[])` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyEcdsaDecompressR1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressR1(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyVrfVerify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyVrfVerify(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new CryptoOpsContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current CryptoOpsContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): CryptoOpsContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_sha256(byte[],uint64)byte[] method call against the CryptoOpsContract contract - */ - verifySha256(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySha256(params))) - return this - }, - /** - * Add a verify_sha3_256(byte[],uint64)byte[] method call against the CryptoOpsContract contract - */ - verifySha3_256(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySha3_256(params))) - return this - }, - /** - * Add a verify_keccak_256(byte[],uint64)byte[] method call against the CryptoOpsContract contract - */ - verifyKeccak_256(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyKeccak_256(params))) - return this - }, - /** - * Add a verify_sha512_256(byte[],uint64)byte[] method call against the CryptoOpsContract contract - */ - verifySha512_256(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySha512_256(params))) - return this - }, - /** - * Add a verify_ed25519verify(byte[],byte[],byte[])bool method call against the CryptoOpsContract contract - */ - verifyEd25519verify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEd25519verify(params))) - return this - }, - /** - * Add a verify_ed25519verify_bare(byte[],byte[],byte[])bool method call against the CryptoOpsContract contract - */ - verifyEd25519verifyBare(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEd25519verifyBare(params))) - return this - }, - /** - * Add a verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool method call against the CryptoOpsContract contract - */ - verifyEcdsaVerifyK1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaVerifyK1(params))) - return this - }, - /** - * Add a verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool method call against the CryptoOpsContract contract - */ - verifyEcdsaVerifyR1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaVerifyR1(params))) - return this - }, - /** - * Add a verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[]) method call against the CryptoOpsContract contract - */ - verifyEcdsaRecoverK1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaRecoverK1(params))) - return this - }, - /** - * Add a verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[]) method call against the CryptoOpsContract contract - */ - verifyEcdsaRecoverR1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaRecoverR1(params))) - return this - }, - /** - * Add a verify_ecdsa_decompress_k1(byte[])(byte[],byte[]) method call against the CryptoOpsContract contract - */ - verifyEcdsaDecompressK1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaDecompressK1(params))) - return this - }, - /** - * Add a verify_ecdsa_decompress_r1(byte[])(byte[],byte[]) method call against the CryptoOpsContract contract - */ - verifyEcdsaDecompressR1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaDecompressR1(params))) - return this - }, - /** - * Add a verify_vrf_verify(byte[],byte[],byte[])(byte[],bool) method call against the CryptoOpsContract contract - */ - verifyVrfVerify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyVrfVerify(params))) - return this - }, - /** - * Add a clear state call to the CryptoOpsContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as CryptoOpsContractComposer - } -} -export type CryptoOpsContractComposer = { - /** - * Calls the verify_sha256(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifySha256(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_sha256(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_sha3_256(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifySha3_256(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_sha3_256(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_keccak_256(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyKeccak_256(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_keccak_256(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_sha512_256(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifySha512_256(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_sha512_256(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_ed25519verify(byte[],byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyEd25519verify(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ed25519verify(byte[],byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_ed25519verify_bare(byte[],byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyEd25519verifyBare(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ed25519verify_bare(byte[],byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyEcdsaVerifyK1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyEcdsaVerifyR1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[]) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyEcdsaRecoverK1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'] | undefined]> - - /** - * Calls the verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[]) ABI method. - * - * Must fail, AVM does not support Secp256r1 for recover - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyEcdsaRecoverR1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'] | undefined]> - - /** - * Calls the verify_ecdsa_decompress_k1(byte[])(byte[],byte[]) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyEcdsaDecompressK1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'] | undefined]> - - /** - * Calls the verify_ecdsa_decompress_r1(byte[])(byte[],byte[]) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyEcdsaDecompressR1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'] | undefined]> - - /** - * Calls the verify_vrf_verify(byte[],byte[],byte[])(byte[],bool) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyVrfVerify(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the CryptoOpsContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): CryptoOpsContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): CryptoOpsContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type CryptoOpsContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/DynamicArrayInitContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/DynamicArrayInitContract.ts deleted file mode 100644 index 3ed4087..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/DynamicArrayInitContract.ts +++ /dev/null @@ -1,755 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"DynamicArrayInitContract","structs":{},"methods":[{"name":"test_immutable_array_init","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_immutable_array_init_without_type_generic","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reference_array_init","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reference_array_init_without_type_generic","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDggMyAwCiAgICBieXRlY2Jsb2NrIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0ODAKICAgIC8vIGNsYXNzIER5bmFtaWNBcnJheUluaXRDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4ODQzNGJhMmEgMHg2M2FhYmJhMCAweGRiYWYwMzRlIDB4YTlkMTQ1NTQgLy8gbWV0aG9kICJ0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdCB0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljIHRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXQgdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDExOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5EeW5hbWljQXJyYXlJbml0Q29udHJhY3QudGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0ODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuRHluYW1pY0FycmF5SW5pdENvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkR5bmFtaWNBcnJheUluaXRDb250cmFjdC50ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNwogICAgLy8gYTEgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzMAogICAgLy8gYXNzZXJ0IGExLmxlbmd0aCA9PSBhMi5sZW5ndGgKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgLwogICAgaW50Y18yIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzMQogICAgLy8gYXNzZXJ0IGExWzBdID09IGEyWzBdCiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzMgogICAgLy8gYXNzZXJ0IGExWzFdID09IGEyWzFdCiAgICBkdXAKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzMKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhMlsyXQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzNwogICAgLy8gYXNzZXJ0IGExWzBdID09IGEzWzBdCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzgKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhM1sxXQogICAgZHVwCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTM5CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTNbMl0KICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQyCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGE0Lmxlbmd0aAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQzCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTRbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ0CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTRbMV0KICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0NQogICAgLy8gYXNzZXJ0IGExWzJdID09IGE0WzJdCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5EeW5hbWljQXJyYXlJbml0Q29udHJhY3QudGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpY1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NDkKICAgIC8vIGExID0gUmVmZXJlbmNlQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUyCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGEyLmxlbmd0aAogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUzCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTJbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU0CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTJbMV0KICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1NQogICAgLy8gYXNzZXJ0IGExWzJdID09IGEyWzJdCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU5CiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTNbMF0KICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU2MAogICAgLy8gYXNzZXJ0IGExWzFdID09IGEzWzFdCiAgICBkdXAKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjEKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhM1syXQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjQKICAgIC8vIGFzc2VydCBhMS5sZW5ndGggPT0gYTQubGVuZ3RoCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIGludGNfMiAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjUKICAgIC8vIGFzc2VydCBhMVswXSA9PSBhNFswXQogICAgZHVwCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjYKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhNFsxXQogICAgZHVwCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY3CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTRbMl0KICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAQgDACYBGAAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAzEbQQArMRkURDEYRIIEBIQ0uioEY6q7oATbrwNOBKnRRVQ2GgCOBAAJAAsADQBZADEZFDEYFBBDIkMiQyhHAhUjCiQSREklWyISREkjW4ECEkSBEFskEkRHAiVbIhJESSNbgQISRIEQWyQSREkVIwokEkRJJVsiEkRJI1uBAhJEgRBbJBJEIkMoRwIVIwokEkRJJVsiEkRJI1uBAhJEgRBbJBJERwIlWyISREkjW4ECEkSBEFskEkRJFSMKJBJESSVbIhJESSNbgQISRIEQWyQSRCJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the DynamicArrayInitContract contract - */ -export type DynamicArrayInitContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'test_immutable_array_init()void': Record - 'test_immutable_array_init_without_type_generic()void': Record - 'test_reference_array_init()void': Record - 'test_reference_array_init_without_type_generic()void': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'test_immutable_array_init()void': [] - 'test_immutable_array_init_without_type_generic()void': [] - 'test_reference_array_init()void': [] - 'test_reference_array_init_without_type_generic()void': [] - } -} - -/** - * The return type for each method - */ -export type DynamicArrayInitContractReturns = { - 'test_immutable_array_init()void': void - 'test_immutable_array_init_without_type_generic()void': void - 'test_reference_array_init()void': void - 'test_reference_array_init_without_type_generic()void': void -} - -/** - * Defines the types of available calls and state of the DynamicArrayInitContract smart contract. - */ -export type DynamicArrayInitContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'test_immutable_array_init()void' | 'test_immutable_array_init', { - argsObj: DynamicArrayInitContractArgs['obj']['test_immutable_array_init()void'] - argsTuple: DynamicArrayInitContractArgs['tuple']['test_immutable_array_init()void'] - returns: DynamicArrayInitContractReturns['test_immutable_array_init()void'] - }> - & Record<'test_immutable_array_init_without_type_generic()void' | 'test_immutable_array_init_without_type_generic', { - argsObj: DynamicArrayInitContractArgs['obj']['test_immutable_array_init_without_type_generic()void'] - argsTuple: DynamicArrayInitContractArgs['tuple']['test_immutable_array_init_without_type_generic()void'] - returns: DynamicArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'] - }> - & Record<'test_reference_array_init()void' | 'test_reference_array_init', { - argsObj: DynamicArrayInitContractArgs['obj']['test_reference_array_init()void'] - argsTuple: DynamicArrayInitContractArgs['tuple']['test_reference_array_init()void'] - returns: DynamicArrayInitContractReturns['test_reference_array_init()void'] - }> - & Record<'test_reference_array_init_without_type_generic()void' | 'test_reference_array_init_without_type_generic', { - argsObj: DynamicArrayInitContractArgs['obj']['test_reference_array_init_without_type_generic()void'] - argsTuple: DynamicArrayInitContractArgs['tuple']['test_reference_array_init_without_type_generic()void'] - returns: DynamicArrayInitContractReturns['test_reference_array_init_without_type_generic()void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type DynamicArrayInitContractSignatures = keyof DynamicArrayInitContractTypes['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the DynamicArrayInitContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = DynamicArrayInitContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the DynamicArrayInitContract smart contract to the method's return type - */ -export type MethodReturn = DynamicArrayInitContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type DynamicArrayInitContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type DynamicArrayInitContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: DynamicArrayInitContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the DynamicArrayInitContract smart contract - */ -export abstract class DynamicArrayInitContractParamsFactory { - /** - * Constructs a no op call for the test_immutable_array_init()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testImmutableArrayInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_immutable_array_init()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_immutable_array_init_without_type_generic()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testImmutableArrayInitWithoutTypeGeneric(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_immutable_array_init_without_type_generic()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_reference_array_init()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testReferenceArrayInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_reference_array_init()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_reference_array_init_without_type_generic()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testReferenceArrayInitWithoutTypeGeneric(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_reference_array_init_without_type_generic()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } -} - -/** - * A factory to create and deploy one or more instance of the DynamicArrayInitContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class DynamicArrayInitContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `DynamicArrayInitContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new DynamicArrayInitContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new DynamicArrayInitContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the DynamicArrayInitContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: DynamicArrayInitContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new DynamicArrayInitContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the DynamicArrayInitContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the DynamicArrayInitContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the DynamicArrayInitContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new DynamicArrayInitContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the DynamicArrayInitContract smart contract - */ -export class DynamicArrayInitContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `DynamicArrayInitContractClient` - * - * @param appClient An `AppClient` instance which has been created with the DynamicArrayInitContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `DynamicArrayInitContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `DynamicArrayInitContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new DynamicArrayInitContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `DynamicArrayInitContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new DynamicArrayInitContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the DynamicArrayInitContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testImmutableArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInit(params)) - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testImmutableArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testReferenceArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInit(params)) - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testReferenceArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the DynamicArrayInitContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testImmutableArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInit(params)) - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testImmutableArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testReferenceArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInit(params)) - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testReferenceArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the DynamicArrayInitContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testImmutableArrayInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInit(params)) - return {...result, return: result.return as unknown as (undefined | DynamicArrayInitContractReturns['test_immutable_array_init()void'])} - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testImmutableArrayInitWithoutTypeGeneric: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) - return {...result, return: result.return as unknown as (undefined | DynamicArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'])} - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testReferenceArrayInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInit(params)) - return {...result, return: result.return as unknown as (undefined | DynamicArrayInitContractReturns['test_reference_array_init()void'])} - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testReferenceArrayInitWithoutTypeGeneric: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) - return {...result, return: result.return as unknown as (undefined | DynamicArrayInitContractReturns['test_reference_array_init_without_type_generic()void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new DynamicArrayInitContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current DynamicArrayInitContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): DynamicArrayInitContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a test_immutable_array_init()void method call against the DynamicArrayInitContract contract - */ - testImmutableArrayInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArrayInit(params))) - return this - }, - /** - * Add a test_immutable_array_init_without_type_generic()void method call against the DynamicArrayInitContract contract - */ - testImmutableArrayInitWithoutTypeGeneric(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArrayInitWithoutTypeGeneric(params))) - return this - }, - /** - * Add a test_reference_array_init()void method call against the DynamicArrayInitContract contract - */ - testReferenceArrayInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testReferenceArrayInit(params))) - return this - }, - /** - * Add a test_reference_array_init_without_type_generic()void method call against the DynamicArrayInitContract contract - */ - testReferenceArrayInitWithoutTypeGeneric(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testReferenceArrayInitWithoutTypeGeneric(params))) - return this - }, - /** - * Add a clear state call to the DynamicArrayInitContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as DynamicArrayInitContractComposer - } -} -export type DynamicArrayInitContractComposer = { - /** - * Calls the test_immutable_array_init()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testImmutableArrayInit(params?: CallParams): DynamicArrayInitContractComposer<[...TReturns, DynamicArrayInitContractReturns['test_immutable_array_init()void'] | undefined]> - - /** - * Calls the test_immutable_array_init_without_type_generic()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testImmutableArrayInitWithoutTypeGeneric(params?: CallParams): DynamicArrayInitContractComposer<[...TReturns, DynamicArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'] | undefined]> - - /** - * Calls the test_reference_array_init()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testReferenceArrayInit(params?: CallParams): DynamicArrayInitContractComposer<[...TReturns, DynamicArrayInitContractReturns['test_reference_array_init()void'] | undefined]> - - /** - * Calls the test_reference_array_init_without_type_generic()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testReferenceArrayInitWithoutTypeGeneric(params?: CallParams): DynamicArrayInitContractComposer<[...TReturns, DynamicArrayInitContractReturns['test_reference_array_init_without_type_generic()void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the DynamicArrayInitContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): DynamicArrayInitContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): DynamicArrayInitContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type DynamicArrayInitContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/DynamicItxnGroup.ts b/examples/p-py/projects/p-py-frontend/src/contracts/DynamicItxnGroup.ts deleted file mode 100644 index 8c63c52..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/DynamicItxnGroup.ts +++ /dev/null @@ -1,629 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"DynamicItxnGroup","structs":{},"methods":[{"name":"test_firstly","args":[{"type":"address[]","name":"addresses"},{"type":"pay","name":"funds"},{"type":"uint64","name":"verifier"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_looply","args":[{"type":"address[]","name":"addresses"},{"type":"pay","name":"funds"},{"type":"uint64","name":"verifier"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[85,217],"errorMessage":"Funds must be sent to app"},{"pc":[141,250],"errorMessage":"index access is out of bounds"},{"pc":[89,220],"errorMessage":"invalid array length header"},{"pc":[94,225],"errorMessage":"must provide some accounts"},{"pc":[72,204],"errorMessage":"transaction type is pay"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgNgogICAgYnl0ZWNibG9jayAweDY1YTlhZWNjICJhYmMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBjbGFzcyBEeW5hbWljSXR4bkdyb3VwKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHgxNzM5MTc4NCAweDNmMTBhZWE3IC8vIG1ldGhvZCAidGVzdF9maXJzdGx5KGFkZHJlc3NbXSxwYXksdWludDY0KXZvaWQiLCBtZXRob2QgInRlc3RfbG9vcGx5KGFkZHJlc3NbXSxwYXksdWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB0ZXN0X2ZpcnN0bHkgdGVzdF9sb29wbHkKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuZHluYW1pY19pdHhuX2dyb3VwLmNvbnRyYWN0LkR5bmFtaWNJdHhuR3JvdXAudGVzdF9maXJzdGx5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9maXJzdGx5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MTgKICAgIC8vIGFzc2VydCBmdW5kcy5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLCAiRnVuZHMgbXVzdCBiZSBzZW50IHRvIGFwcCIKICAgIGR1cAogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEZ1bmRzIG11c3QgYmUgc2VudCB0byBhcHAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MjAKICAgIC8vIGFzc2VydCBhZGRyZXNzZXMubGVuZ3RoLCAibXVzdCBwcm92aWRlIHNvbWUgYWNjb3VudHMiCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBhc3NlcnQgLy8gbXVzdCBwcm92aWRlIHNvbWUgYWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MjIKICAgIC8vIHNoYXJlID0gZnVuZHMuYW1vdW50IC8vIGFkZHJlc3Nlcy5sZW5ndGgKICAgIHN3YXAKICAgIGd0eG5zIEFtb3VudAogICAgc3dhcAogICAgLwogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBpdHhuLlBheW1lbnQoYW1vdW50PXNoYXJlLCByZWNlaXZlcj1hZGRyZXNzZXNbMF0ubmF0aXZlKS5zdGFnZShiZWdpbl9ncm91cD1UcnVlKQogICAgaXR4bl9iZWdpbgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBleHRyYWN0IDIgMzIKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpbnRjXzAgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MjYKICAgIC8vIGZvciBpIGluIHVyYW5nZSgxLCBhZGRyZXNzZXMubGVuZ3RoKToKICAgIGludGNfMCAvLyAxCgp0ZXN0X2ZpcnN0bHlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weToyNgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGFkZHJlc3Nlcy5sZW5ndGgpOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogdGVzdF9maXJzdGx5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBhZGRyID0gYWRkcmVzc2VzW2ldCiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAzMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBpdHhuLlBheW1lbnQoYW1vdW50PXNoYXJlLCByZWNlaXZlcj1hZGRyLm5hdGl2ZSkuc3RhZ2UoKQogICAgaXR4bl9uZXh0CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBkaWcgMwogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGludGNfMCAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weToyNgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGFkZHJlc3Nlcy5sZW5ndGgpOgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2ZpcnN0bHlfZm9yX2hlYWRlckAyCgp0ZXN0X2ZpcnN0bHlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjMwLTMyCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9dmVyaWZpZXIuaWQsIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJ2ZXJpZnkoKXZvaWQiKSwpCiAgICAvLyApLnN0YWdlKCkKICAgIGl0eG5fbmV4dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTozMQogICAgLy8gYXBwX2lkPXZlcmlmaWVyLmlkLCBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgidmVyaWZ5KCl2b2lkIiksKQogICAgYnl0ZWNfMCAvLyBtZXRob2QgInZlcmlmeSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MzQKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoYXNzZXRfbmFtZT0iYWJjIikuc3RhZ2UoKQogICAgaXR4bl9uZXh0CiAgICBieXRlY18xIC8vICJhYmMiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TmFtZQogICAgcHVzaGludCAzIC8vIGFjZmcKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTozNgogICAgLy8gaXR4bi5zdWJtaXRfc3RhZ2VkKCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuZHluYW1pY19pdHhuX2dyb3VwLmNvbnRyYWN0LkR5bmFtaWNJdHhuR3JvdXAudGVzdF9sb29wbHlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2xvb3BseToKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBhc3NlcnQgZnVuZHMucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywgIkZ1bmRzIG11c3QgYmUgc2VudCB0byBhcHAiCiAgICBkdXAKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBGdW5kcyBtdXN0IGJlIHNlbnQgdG8gYXBwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBhc3NlcnQgYWRkcmVzc2VzLmxlbmd0aCwgIm11c3QgcHJvdmlkZSBzb21lIGFjY291bnRzIgogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBhc3NlcnQgLy8gbXVzdCBwcm92aWRlIHNvbWUgYWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NDkKICAgIC8vIHNoYXJlID0gZnVuZHMuYW1vdW50IC8vIGFkZHJlc3Nlcy5sZW5ndGgKICAgIHN3YXAKICAgIGd0eG5zIEFtb3VudAogICAgc3dhcAogICAgLwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTo1MQogICAgLy8gaXNfZmlyc3QgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgaW50Y18xIC8vIDAKCnRlc3RfbG9vcGx5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NTIKICAgIC8vIGZvciBhZGRyIGluIGFkZHJlc3NlczoKICAgIGR1cAogICAgZGlnIDQKICAgIDwKICAgIGJ6IHRlc3RfbG9vcGx5X2FmdGVyX2ZvckA4CiAgICBkaWcgNQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMzIKICAgICoKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidXJ5IDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NTQKICAgIC8vIG15X3R4bi5zdGFnZShiZWdpbl9ncm91cD1pc19maXJzdCkKICAgIGRpZyAxCiAgICBieiB0ZXN0X2xvb3BseV9pdHhuX25leHRANQogICAgaXR4bl9iZWdpbgoKdGVzdF9sb29wbHlfYWZ0ZXJfaXR4bl9iZWdpbl9uZXh0QDY6CiAgICBkaWcgNgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZGlnIDIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBteV90eG4gPSBpdHhuLlBheW1lbnQoYW1vdW50PXNoYXJlLCByZWNlaXZlcj1hZGRyLm5hdGl2ZSkKICAgIGludGNfMCAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTo1NQogICAgLy8gaXNfZmlyc3QgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGJ1cnkgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfbG9vcGx5X2Zvcl9oZWFkZXJAMgoKdGVzdF9sb29wbHlfaXR4bl9uZXh0QDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBteV90eG4uc3RhZ2UoYmVnaW5fZ3JvdXA9aXNfZmlyc3QpCiAgICBpdHhuX25leHQKICAgIGIgdGVzdF9sb29wbHlfYWZ0ZXJfaXR4bl9iZWdpbl9uZXh0QDYKCnRlc3RfbG9vcGx5X2FmdGVyX2ZvckA4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTo1Ny01OQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPXZlcmlmaWVyLmlkLCBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgidmVyaWZ5KCl2b2lkIiksKQogICAgLy8gKS5zdGFnZSgpCiAgICBpdHhuX25leHQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NTgKICAgIC8vIGFwcF9pZD12ZXJpZmllci5pZCwgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoInZlcmlmeSgpdm9pZCIpLCkKICAgIGJ5dGVjXzAgLy8gbWV0aG9kICJ2ZXJpZnkoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTo1NwogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKGFzc2V0X25hbWU9ImFiYyIpLnN0YWdlKCkKICAgIGl0eG5fbmV4dAogICAgYnl0ZWNfMSAvLyAiYWJjIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIHB1c2hpbnQgMyAvLyBhY2ZnCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NjMKICAgIC8vIGl0eG4uc3VibWl0X3N0YWdlZCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTozOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAQAgBiYCBGWprswDYWJjMRtBAB0xGRREMRhEggIEFzkXhAQ/EK6nNhoAjgIACQCLADEZFDEYFBBDNhoBMRYiCUk4ECISRDYaAhdOAkk4BzIKEkRLASNZSU4DSURMOAhMCklOArFLAVcCAE4CTFcCILIHsggishAjsgEiSUsEDEEAHUcCJAtLA0wkWLayB0sDsggishAjsgEiCEUBQv/ctiiyGksEshglshAjsgG2KbImgQOyECOyAbMiQyM2GgFJMRYiCUk4ECISRDYaAhdOAkk4BzIKEkRMI1lJTgJJREw4CEwKIiNJSwQMQQAwSwVXAgBLASQLJFhFB0sBQQAasUsGsgdLArIIIrIQI7IBI0UCSSIIRQFC/822Qv/jtiiyGksEshglshAjsgG2KbImgQOyECOyAbMiQw==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the DynamicItxnGroup contract - */ -export type DynamicItxnGroupArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'test_firstly(address[],pay,uint64)void': { - addresses: string[] - funds: AppMethodCallTransactionArgument - verifier: bigint | number - } - 'test_looply(address[],pay,uint64)void': { - addresses: string[] - funds: AppMethodCallTransactionArgument - verifier: bigint | number - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'test_firstly(address[],pay,uint64)void': [addresses: string[], funds: AppMethodCallTransactionArgument, verifier: bigint | number] - 'test_looply(address[],pay,uint64)void': [addresses: string[], funds: AppMethodCallTransactionArgument, verifier: bigint | number] - } -} - -/** - * The return type for each method - */ -export type DynamicItxnGroupReturns = { - 'test_firstly(address[],pay,uint64)void': void - 'test_looply(address[],pay,uint64)void': void -} - -/** - * Defines the types of available calls and state of the DynamicItxnGroup smart contract. - */ -export type DynamicItxnGroupTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'test_firstly(address[],pay,uint64)void' | 'test_firstly', { - argsObj: DynamicItxnGroupArgs['obj']['test_firstly(address[],pay,uint64)void'] - argsTuple: DynamicItxnGroupArgs['tuple']['test_firstly(address[],pay,uint64)void'] - returns: DynamicItxnGroupReturns['test_firstly(address[],pay,uint64)void'] - }> - & Record<'test_looply(address[],pay,uint64)void' | 'test_looply', { - argsObj: DynamicItxnGroupArgs['obj']['test_looply(address[],pay,uint64)void'] - argsTuple: DynamicItxnGroupArgs['tuple']['test_looply(address[],pay,uint64)void'] - returns: DynamicItxnGroupReturns['test_looply(address[],pay,uint64)void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type DynamicItxnGroupSignatures = keyof DynamicItxnGroupTypes['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the DynamicItxnGroup smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = DynamicItxnGroupTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the DynamicItxnGroup smart contract to the method's return type - */ -export type MethodReturn = DynamicItxnGroupTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type DynamicItxnGroupCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type DynamicItxnGroupDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: DynamicItxnGroupCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the DynamicItxnGroup smart contract - */ -export abstract class DynamicItxnGroupParamsFactory { - /** - * Constructs a no op call for the test_firstly(address[],pay,uint64)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testFirstly(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_firstly(address[],pay,uint64)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.addresses, params.args.funds, params.args.verifier], - } - } - /** - * Constructs a no op call for the test_looply(address[],pay,uint64)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testLooply(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_looply(address[],pay,uint64)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.addresses, params.args.funds, params.args.verifier], - } - } -} - -/** - * A factory to create and deploy one or more instance of the DynamicItxnGroup smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class DynamicItxnGroupFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `DynamicItxnGroupFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new DynamicItxnGroupClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new DynamicItxnGroupClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the DynamicItxnGroup smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: DynamicItxnGroupDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new DynamicItxnGroupClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the DynamicItxnGroup smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the DynamicItxnGroup smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the DynamicItxnGroup smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new DynamicItxnGroupClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the DynamicItxnGroup smart contract - */ -export class DynamicItxnGroupClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `DynamicItxnGroupClient` - * - * @param appClient An `AppClient` instance which has been created with the DynamicItxnGroup app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `DynamicItxnGroupClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `DynamicItxnGroupClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new DynamicItxnGroupClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `DynamicItxnGroupClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new DynamicItxnGroupClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the DynamicItxnGroup smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the DynamicItxnGroup smart contract using the `test_firstly(address[],pay,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testFirstly: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(DynamicItxnGroupParamsFactory.testFirstly(params)) - }, - - /** - * Makes a call to the DynamicItxnGroup smart contract using the `test_looply(address[],pay,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testLooply: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(DynamicItxnGroupParamsFactory.testLooply(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the DynamicItxnGroup smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the DynamicItxnGroup smart contract using the `test_firstly(address[],pay,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testFirstly: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(DynamicItxnGroupParamsFactory.testFirstly(params)) - }, - - /** - * Makes a call to the DynamicItxnGroup smart contract using the `test_looply(address[],pay,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testLooply: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(DynamicItxnGroupParamsFactory.testLooply(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the DynamicItxnGroup smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the DynamicItxnGroup smart contract using the `test_firstly(address[],pay,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testFirstly: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(DynamicItxnGroupParamsFactory.testFirstly(params)) - return {...result, return: result.return as unknown as (undefined | DynamicItxnGroupReturns['test_firstly(address[],pay,uint64)void'])} - }, - - /** - * Makes a call to the DynamicItxnGroup smart contract using the `test_looply(address[],pay,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testLooply: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(DynamicItxnGroupParamsFactory.testLooply(params)) - return {...result, return: result.return as unknown as (undefined | DynamicItxnGroupReturns['test_looply(address[],pay,uint64)void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new DynamicItxnGroupClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current DynamicItxnGroup app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): DynamicItxnGroupComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a test_firstly(address[],pay,uint64)void method call against the DynamicItxnGroup contract - */ - testFirstly(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testFirstly(params))) - return this - }, - /** - * Add a test_looply(address[],pay,uint64)void method call against the DynamicItxnGroup contract - */ - testLooply(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testLooply(params))) - return this - }, - /** - * Add a clear state call to the DynamicItxnGroup contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as DynamicItxnGroupComposer - } -} -export type DynamicItxnGroupComposer = { - /** - * Calls the test_firstly(address[],pay,uint64)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testFirstly(params?: CallParams): DynamicItxnGroupComposer<[...TReturns, DynamicItxnGroupReturns['test_firstly(address[],pay,uint64)void'] | undefined]> - - /** - * Calls the test_looply(address[],pay,uint64)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testLooply(params?: CallParams): DynamicItxnGroupComposer<[...TReturns, DynamicItxnGroupReturns['test_looply(address[],pay,uint64)void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the DynamicItxnGroup smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): DynamicItxnGroupComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): DynamicItxnGroupComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type DynamicItxnGroupComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateContract.ts deleted file mode 100644 index 0d69d22..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateContract.ts +++ /dev/null @@ -1,2649 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"GlobalStateContract","structs":{},"methods":[{"name":"get_implicit_key_arc4_uint","args":[],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_string","args":[],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_byte","args":[],"returns":{"type":"byte"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_bool","args":[],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_address","args":[],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_uint128","args":[],"returns":{"type":"uint128"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_dynamic_bytes","args":[],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_tuple","args":[],"returns":{"type":"(uint64,byte[],bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_uint","args":[],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_string","args":[],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_byte","args":[],"returns":{"type":"byte"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_bool","args":[],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_address","args":[],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_uint128","args":[],"returns":{"type":"uint128"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_dynamic_bytes","args":[],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_uint","args":[{"type":"uint64","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_string","args":[{"type":"string","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_byte","args":[{"type":"byte","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_bool","args":[{"type":"bool","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_address","args":[{"type":"address","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_uint128","args":[{"type":"uint128","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_dynamic_bytes","args":[{"type":"byte[]","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_tuple","args":[{"type":"(uint64,byte[],bool)","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_uint","args":[{"type":"uint64","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_string","args":[{"type":"string","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_byte","args":[{"type":"byte","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_bool","args":[{"type":"bool","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_address","args":[{"type":"address","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_uint128","args":[{"type":"uint128","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_dynamic_bytes","args":[{"type":"byte[]","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":15},"local":{"ints":0,"bytes":0}},"keys":{"global":{"implicit_key_arc4_uint":{"keyType":"AVMString","valueType":"uint64","key":"aW1wbGljaXRfa2V5X2FyYzRfdWludA=="},"implicit_key_arc4_string":{"keyType":"AVMString","valueType":"string","key":"aW1wbGljaXRfa2V5X2FyYzRfc3RyaW5n"},"implicit_key_arc4_byte":{"keyType":"AVMString","valueType":"byte","key":"aW1wbGljaXRfa2V5X2FyYzRfYnl0ZQ=="},"implicit_key_arc4_bool":{"keyType":"AVMString","valueType":"bool","key":"aW1wbGljaXRfa2V5X2FyYzRfYm9vbA=="},"implicit_key_arc4_address":{"keyType":"AVMString","valueType":"address","key":"aW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcw=="},"implicit_key_arc4_uint128":{"keyType":"AVMString","valueType":"uint128","key":"aW1wbGljaXRfa2V5X2FyYzRfdWludDEyOA=="},"implicit_key_arc4_dynamic_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"aW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcw=="},"implicit_key_tuple":{"keyType":"AVMString","valueType":"(uint64,byte[],bool)","key":"aW1wbGljaXRfa2V5X3R1cGxl"},"arc4_uint":{"keyType":"AVMString","valueType":"uint64","key":"ZXhwbGljaXRfa2V5X2FyYzRfdWludA=="},"arc4_string":{"keyType":"AVMString","valueType":"string","key":"ZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5n"},"arc4_byte":{"keyType":"AVMString","valueType":"byte","key":"ZXhwbGljaXRfa2V5X2FyYzRfYnl0ZQ=="},"arc4_bool":{"keyType":"AVMString","valueType":"bool","key":"ZXhwbGljaXRfa2V5X2FyYzRfYm9vbA=="},"arc4_address":{"keyType":"AVMString","valueType":"address","key":"ZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcw=="},"arc4_uint128":{"keyType":"AVMString","valueType":"uint128","key":"ZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOA=="},"arc4_dynamic_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"ZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcw=="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[906],"errorMessage":"check self.arc4_address exists"},{"pc":[895],"errorMessage":"check self.arc4_bool exists"},{"pc":[884],"errorMessage":"check self.arc4_byte exists"},{"pc":[928],"errorMessage":"check self.arc4_dynamic_bytes exists"},{"pc":[873],"errorMessage":"check self.arc4_string exists"},{"pc":[862],"errorMessage":"check self.arc4_uint exists"},{"pc":[917],"errorMessage":"check self.arc4_uint128 exists"},{"pc":[818],"errorMessage":"check self.implicit_key_arc4_address exists"},{"pc":[807],"errorMessage":"check self.implicit_key_arc4_bool exists"},{"pc":[796],"errorMessage":"check self.implicit_key_arc4_byte exists"},{"pc":[840],"errorMessage":"check self.implicit_key_arc4_dynamic_bytes exists"},{"pc":[786],"errorMessage":"check self.implicit_key_arc4_string exists"},{"pc":[776],"errorMessage":"check self.implicit_key_arc4_uint exists"},{"pc":[829],"errorMessage":"check self.implicit_key_arc4_uint128 exists"},{"pc":[851],"errorMessage":"check self.implicit_key_tuple exists"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIgImltcGxpY2l0X2tleV9hcmM0X3N0cmluZyIgImltcGxpY2l0X2tleV9hcmM0X2J5dGUiICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIiAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAiaW1wbGljaXRfa2V5X3R1cGxlIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIgImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIgImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIiAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAweDAwMDAwMDAwMDAwMDA1MzkgMHgwMDA1NDg2NTZjNmM2ZiAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE1LTUxNgogICAgLy8gIyBJbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQgPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQ2NCgxMzM3KSkKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlYyAxNiAvLyAweDAwMDAwMDAwMDAwMDA1MzkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE3CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyA9IEdsb2JhbFN0YXRlKGFyYzQuU3RyaW5nKCJIZWxsbyIpKQogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYnl0ZWMgMTcgLy8gMHgwMDA1NDg2NTZjNmM2ZgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSA9IEdsb2JhbFN0YXRlKGFyYzQuQnl0ZSgwKSkKICAgIGJ5dGVjXzMgLy8gImltcGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTkKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbCA9IEdsb2JhbFN0YXRlKGFyYzQuQm9vbChUcnVlKSkKICAgIGJ5dGVjIDQgLy8gImltcGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjAKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyA9IEdsb2JhbFN0YXRlKGFyYzQuQWRkcmVzcyhHbG9iYWwuY3JlYXRvcl9hZGRyZXNzKSkKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTIxCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQxMjgoMioqMTAwKSkKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBieXRlYyAxOCAvLyAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyMgogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzID0gR2xvYmFsU3RhdGUoYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikpCiAgICBieXRlYyA3IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYnl0ZWMgMTkgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV90dXBsZSA9IEdsb2JhbFN0YXRlKChVSW50NjQoMTApLCBCeXRlcyhiInRlc3QiKSwgRmFsc2UpKQogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwYTAwMGIwMDAwMDQ3NDY1NzM3NAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjUtNTI2CiAgICAvLyAjIEV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIHNlbGYuYXJjNF91aW50ID0gR2xvYmFsU3RhdGUoYXJjNC5VSW50NjQoMTMzNyksIGtleT0iZXhwbGljaXRfa2V5X2FyYzRfdWludCIpCiAgICBieXRlYyA5IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYnl0ZWMgMTYgLy8gMHgwMDAwMDAwMDAwMDAwNTM5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyNwogICAgLy8gc2VsZi5hcmM0X3N0cmluZyA9IEdsb2JhbFN0YXRlKGFyYzQuU3RyaW5nKCJIZWxsbyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIpCiAgICBieXRlYyAxMCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUxNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcgPSBHbG9iYWxTdGF0ZShhcmM0LlN0cmluZygiSGVsbG8iKSkKICAgIGJ5dGVjIDE3IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjcKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmcgPSBHbG9iYWxTdGF0ZShhcmM0LlN0cmluZygiSGVsbG8iKSwga2V5PSJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjgKICAgIC8vIHNlbGYuYXJjNF9ieXRlID0gR2xvYmFsU3RhdGUoYXJjNC5CeXRlKDApLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiKQogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjkKICAgIC8vIHNlbGYuYXJjNF9ib29sID0gR2xvYmFsU3RhdGUoYXJjNC5Cb29sKFRydWUpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiKQogICAgYnl0ZWMgMTIgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2wgPSBHbG9iYWxTdGF0ZShhcmM0LkJvb2woVHJ1ZSkpCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyOQogICAgLy8gc2VsZi5hcmM0X2Jvb2wgPSBHbG9iYWxTdGF0ZShhcmM0LkJvb2woVHJ1ZSksIGtleT0iZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIpCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMQogICAgLy8gYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMC01MzIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMwogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjggPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQxMjgoMioqMTAwKSwga2V5PSJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IikKICAgIGJ5dGVjIDE0IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYnl0ZWMgMTggLy8gMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzUKICAgIC8vIGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICBieXRlYyAxNSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjIKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyA9IEdsb2JhbFN0YXRlKGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpKQogICAgYnl0ZWMgMTkgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzQtNTM2CiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyA9IEdsb2JhbFN0YXRlKAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTEzCiAgICAvLyBjbGFzcyBHbG9iYWxTdGF0ZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzOQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4MWNjOTY2ZWUgMHgyMzY3Y2Q0YiAweDY5MTI4ZTkwIDB4NjhkNTkwZTIgMHg0NGVmMDY4MSAweDFjZDI5NGVjIDB4YWFjOGVjYjEgMHgxNjZjNmFmZCAweDNjYzNiYjdiIDB4OWE2OTQ2YWQgMHhkZWQ3NTAzMyAweDY2Mjc5ZTkzIDB4MDk2ZTkyN2IgMHg5NzUzMWZiYyAweDZlYTNmOTk2IDB4YTdmNGY0MDIgMHhhYWRkY2M0YyAweDVlYzMxMTZkIDB4MjBmNTZlZWUgMHgxYzE0OWE0MyAweGE1NzVhYzdkIDB4ODdmMDg2OWIgMHg0NjFhZmM2ZCAweDA0ODExNmVhIDB4MzBlMzRhOTMgMHhkMmU2NDZlZiAweGU2NzRhMjcwIDB4YTg3ZTU0MGQgMHg3MjBhM2NhMCAweDI1NzcwOGY3IC8vIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQoKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZygpc3RyaW5nIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSgpYnl0ZSIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woKWJvb2wiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKClhZGRyZXNzIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCgpdWludDEyOCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMoKWJ5dGVbXSIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV90dXBsZSgpKHVpbnQ2NCxieXRlW10sYm9vbCkiLCBtZXRob2QgImdldF9hcmM0X3VpbnQoKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2FyYzRfc3RyaW5nKClzdHJpbmciLCBtZXRob2QgImdldF9hcmM0X2J5dGUoKWJ5dGUiLCBtZXRob2QgImdldF9hcmM0X2Jvb2woKWJvb2wiLCBtZXRob2QgImdldF9hcmM0X2FkZHJlc3MoKWFkZHJlc3MiLCBtZXRob2QgImdldF9hcmM0X3VpbnQxMjgoKXVpbnQxMjgiLCBtZXRob2QgImdldF9hcmM0X2R5bmFtaWNfYnl0ZXMoKWJ5dGVbXSIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQodWludDY0KXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcoc3RyaW5nKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKGJ5dGUpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woYm9vbCl2b2lkIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyhhZGRyZXNzKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4KHVpbnQxMjgpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMoYnl0ZVtdKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfdHVwbGUoKHVpbnQ2NCxieXRlW10sYm9vbCkpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfdWludCh1aW50NjQpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfc3RyaW5nKHN0cmluZyl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9ieXRlKGJ5dGUpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfYm9vbChib29sKXZvaWQiLCBtZXRob2QgInNldF9hcmM0X2FkZHJlc3MoYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF91aW50MTI4KHVpbnQxMjgpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfZHluYW1pY19ieXRlcyhieXRlW10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50IGdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGUgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2wgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMgZ2V0X2ltcGxpY2l0X2tleV90dXBsZSBnZXRfYXJjNF91aW50IGdldF9hcmM0X3N0cmluZyBnZXRfYXJjNF9ieXRlIGdldF9hcmM0X2Jvb2wgZ2V0X2FyYzRfYWRkcmVzcyBnZXRfYXJjNF91aW50MTI4IGdldF9hcmM0X2R5bmFtaWNfYnl0ZXMgc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQgc2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBzZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSBzZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCBzZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCBzZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBzZXRfaW1wbGljaXRfa2V5X3R1cGxlIHNldF9hcmM0X3VpbnQgc2V0X2FyYzRfc3RyaW5nIHNldF9hcmM0X2J5dGUgc2V0X2FyYzRfYm9vbCBzZXRfYXJjNF9hZGRyZXNzIHNldF9hcmM0X3VpbnQxMjggc2V0X2FyYzRfZHluYW1pY19ieXRlcwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDM5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0MQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludCBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzgtNTM5CiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0NQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NDkKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTUzCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1NwogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NjEKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTY1CiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NjkKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV90dXBsZS52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDggLy8gImltcGxpY2l0X2tleV90dXBsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGUgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU3NAogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50LnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X3VpbnQgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTcxLTU3MgogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgZXhwbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTc4CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3N0cmluZy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9zdHJpbmcgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4MgogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9ieXRlLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ieXRlIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1ODYKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYm9vbC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfYm9vbCBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTkwCiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2FkZHJlc3MudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X2FkZHJlc3MgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5NAogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50MTI4LnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF91aW50MTI4IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OTgKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfZHluYW1pY19ieXRlcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDMKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludC52YWx1ZSA9IHZhbHVlCiAgICBieXRlY18xIC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwMC02MDEKICAgIC8vICMgU2V0dGVyIG1ldGhvZHMgZm9yIGltcGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjAzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDAtNjAxCiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDcKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjExCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWNfMyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjExCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTUKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyA0IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTUKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxOQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxOQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4W3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgNiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjcKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcy52YWx1ZSA9IHZhbHVlLmNvcHkoKQogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI3CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMudmFsdWUgPSB2YWx1ZS5jb3B5KCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfdHVwbGVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzMQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzEKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gc2VsZi5hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzMtNjM0CiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gc2VsZi5hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzMtNjM0CiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X3N0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDAKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmcudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTAgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQwCiAgICAvLyBzZWxmLmFyYzRfc3RyaW5nLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NAogICAgLy8gc2VsZi5hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NAogICAgLy8gc2VsZi5hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfYm9vbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ4CiAgICAvLyBzZWxmLmFyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyAxMiAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ4CiAgICAvLyBzZWxmLmFyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2FyYzRfYWRkcmVzczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjIDEzIC8vICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfZHluYW1pY19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjYwCiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlcy52YWx1ZSA9IHZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMTUgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY2MAogICAgLy8gc2VsZi5hcmM0X2R5bmFtaWNfYnl0ZXMudmFsdWUgPSB2YWx1ZS5jb3B5KCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmFAQVH3x1FmltcGxpY2l0X2tleV9hcmM0X3VpbnQYaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nFmltcGxpY2l0X2tleV9hcmM0X2J5dGUWaW1wbGljaXRfa2V5X2FyYzRfYm9vbBlpbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzGWltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcxJpbXBsaWNpdF9rZXlfdHVwbGUWZXhwbGljaXRfa2V5X2FyYzRfdWludBhleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmcWZXhwbGljaXRfa2V5X2FyYzRfYnl0ZRZleHBsaWNpdF9rZXlfYXJjNF9ib29sGWV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MZZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOB9leHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzCAAAAAAAAAU5BwAFSGVsbG8QAAAAEAAAAAAAAAAAAAAAAA8ADWR5bmFtaWMgYnl0ZXMxGEAAXSknEGcqJxFnK4ABAGcnBIABgGcnBTIJZycGJxJnJwcnE2cnCIARAAAAAAAAAAoACwAABHRlc3RnJwknEGcnCicRZycLgAEAZycMgAGAZycNMglnJw4nEmcnDycTZzEbQQDhMRkURDEYRIIeBBzJZu4EI2fNSwRpEo6QBGjVkOIERO8GgQQc0pTsBKrI7LEEFmxq/QQ8w7t7BJppRq0E3tdQMwRmJ56TBAluknsEl1MfvARuo/mWBKf09AIEqt3MTARewxFtBCD1bu4EHBSaQwSldax9BIfwhpsERhr8bQQEgRbqBDDjSpME0uZG7wTmdKJwBKh+VA0Ecgo8oAQldwj3NhoAjh4ACQATAB0AJwAyAD0ASABTAF4AaQB0AH8AigCVAKAAqwCyALkAwADIANAA2ADgAOgA8AD4AQABCAEQARgAMRkUMRgUEEMjKWVEKExQsCJDIyplRChMULAiQyMrZUQoTFCwIkMjJwRlRChMULAiQyMnBWVEKExQsCJDIycGZUQoTFCwIkMjJwdlRChMULAiQyMnCGVEKExQsCJDIycJZUQoTFCwIkMjJwplRChMULAiQyMnC2VEKExQsCJDIycMZUQoTFCwIkMjJw1lRChMULAiQyMnDmVEKExQsCJDIycPZUQoTFCwIkMpNhoBZyJDKjYaAWciQys2GgFnIkMnBDYaAWciQycFNhoBZyJDJwY2GgFnIkMnBzYaAWciQycINhoBZyJDJwk2GgFnIkMnCjYaAWciQycLNhoBZyJDJww2GgFnIkMnDTYaAWciQycONhoBZyJDJw82GgFnIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the GlobalStateContract contract - */ -export type GlobalStateContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'get_implicit_key_arc4_uint()uint64': Record - 'get_implicit_key_arc4_string()string': Record - 'get_implicit_key_arc4_byte()byte': Record - 'get_implicit_key_arc4_bool()bool': Record - 'get_implicit_key_arc4_address()address': Record - 'get_implicit_key_arc4_uint128()uint128': Record - 'get_implicit_key_arc4_dynamic_bytes()byte[]': Record - 'get_implicit_key_tuple()(uint64,byte[],bool)': Record - 'get_arc4_uint()uint64': Record - 'get_arc4_string()string': Record - 'get_arc4_byte()byte': Record - 'get_arc4_bool()bool': Record - 'get_arc4_address()address': Record - 'get_arc4_uint128()uint128': Record - 'get_arc4_dynamic_bytes()byte[]': Record - 'set_implicit_key_arc4_uint(uint64)void': { - value: bigint | number - } - 'set_implicit_key_arc4_string(string)void': { - value: string - } - 'set_implicit_key_arc4_byte(byte)void': { - value: number - } - 'set_implicit_key_arc4_bool(bool)void': { - value: boolean - } - 'set_implicit_key_arc4_address(address)void': { - value: string - } - 'set_implicit_key_arc4_uint128(uint128)void': { - value: bigint | number - } - 'set_implicit_key_arc4_dynamic_bytes(byte[])void': { - value: Uint8Array - } - 'set_implicit_key_tuple((uint64,byte[],bool))void': { - value: [bigint | number, Uint8Array, boolean] - } - 'set_arc4_uint(uint64)void': { - value: bigint | number - } - 'set_arc4_string(string)void': { - value: string - } - 'set_arc4_byte(byte)void': { - value: number - } - 'set_arc4_bool(bool)void': { - value: boolean - } - 'set_arc4_address(address)void': { - value: string - } - 'set_arc4_uint128(uint128)void': { - value: bigint | number - } - 'set_arc4_dynamic_bytes(byte[])void': { - value: Uint8Array - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'get_implicit_key_arc4_uint()uint64': [] - 'get_implicit_key_arc4_string()string': [] - 'get_implicit_key_arc4_byte()byte': [] - 'get_implicit_key_arc4_bool()bool': [] - 'get_implicit_key_arc4_address()address': [] - 'get_implicit_key_arc4_uint128()uint128': [] - 'get_implicit_key_arc4_dynamic_bytes()byte[]': [] - 'get_implicit_key_tuple()(uint64,byte[],bool)': [] - 'get_arc4_uint()uint64': [] - 'get_arc4_string()string': [] - 'get_arc4_byte()byte': [] - 'get_arc4_bool()bool': [] - 'get_arc4_address()address': [] - 'get_arc4_uint128()uint128': [] - 'get_arc4_dynamic_bytes()byte[]': [] - 'set_implicit_key_arc4_uint(uint64)void': [value: bigint | number] - 'set_implicit_key_arc4_string(string)void': [value: string] - 'set_implicit_key_arc4_byte(byte)void': [value: number] - 'set_implicit_key_arc4_bool(bool)void': [value: boolean] - 'set_implicit_key_arc4_address(address)void': [value: string] - 'set_implicit_key_arc4_uint128(uint128)void': [value: bigint | number] - 'set_implicit_key_arc4_dynamic_bytes(byte[])void': [value: Uint8Array] - 'set_implicit_key_tuple((uint64,byte[],bool))void': [value: [bigint | number, Uint8Array, boolean]] - 'set_arc4_uint(uint64)void': [value: bigint | number] - 'set_arc4_string(string)void': [value: string] - 'set_arc4_byte(byte)void': [value: number] - 'set_arc4_bool(bool)void': [value: boolean] - 'set_arc4_address(address)void': [value: string] - 'set_arc4_uint128(uint128)void': [value: bigint | number] - 'set_arc4_dynamic_bytes(byte[])void': [value: Uint8Array] - } -} - -/** - * The return type for each method - */ -export type GlobalStateContractReturns = { - 'get_implicit_key_arc4_uint()uint64': bigint - 'get_implicit_key_arc4_string()string': string - 'get_implicit_key_arc4_byte()byte': number - 'get_implicit_key_arc4_bool()bool': boolean - 'get_implicit_key_arc4_address()address': string - 'get_implicit_key_arc4_uint128()uint128': bigint - 'get_implicit_key_arc4_dynamic_bytes()byte[]': Uint8Array - 'get_implicit_key_tuple()(uint64,byte[],bool)': [bigint, Uint8Array, boolean] - 'get_arc4_uint()uint64': bigint - 'get_arc4_string()string': string - 'get_arc4_byte()byte': number - 'get_arc4_bool()bool': boolean - 'get_arc4_address()address': string - 'get_arc4_uint128()uint128': bigint - 'get_arc4_dynamic_bytes()byte[]': Uint8Array - 'set_implicit_key_arc4_uint(uint64)void': void - 'set_implicit_key_arc4_string(string)void': void - 'set_implicit_key_arc4_byte(byte)void': void - 'set_implicit_key_arc4_bool(bool)void': void - 'set_implicit_key_arc4_address(address)void': void - 'set_implicit_key_arc4_uint128(uint128)void': void - 'set_implicit_key_arc4_dynamic_bytes(byte[])void': void - 'set_implicit_key_tuple((uint64,byte[],bool))void': void - 'set_arc4_uint(uint64)void': void - 'set_arc4_string(string)void': void - 'set_arc4_byte(byte)void': void - 'set_arc4_bool(bool)void': void - 'set_arc4_address(address)void': void - 'set_arc4_uint128(uint128)void': void - 'set_arc4_dynamic_bytes(byte[])void': void -} - -/** - * Defines the types of available calls and state of the GlobalStateContract smart contract. - */ -export type GlobalStateContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'get_implicit_key_arc4_uint()uint64' | 'get_implicit_key_arc4_uint', { - argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_uint()uint64'] - argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_uint()uint64'] - returns: GlobalStateContractReturns['get_implicit_key_arc4_uint()uint64'] - }> - & Record<'get_implicit_key_arc4_string()string' | 'get_implicit_key_arc4_string', { - argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_string()string'] - argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_string()string'] - returns: GlobalStateContractReturns['get_implicit_key_arc4_string()string'] - }> - & Record<'get_implicit_key_arc4_byte()byte' | 'get_implicit_key_arc4_byte', { - argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_byte()byte'] - argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_byte()byte'] - returns: GlobalStateContractReturns['get_implicit_key_arc4_byte()byte'] - }> - & Record<'get_implicit_key_arc4_bool()bool' | 'get_implicit_key_arc4_bool', { - argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_bool()bool'] - argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_bool()bool'] - returns: GlobalStateContractReturns['get_implicit_key_arc4_bool()bool'] - }> - & Record<'get_implicit_key_arc4_address()address' | 'get_implicit_key_arc4_address', { - argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_address()address'] - argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_address()address'] - returns: GlobalStateContractReturns['get_implicit_key_arc4_address()address'] - }> - & Record<'get_implicit_key_arc4_uint128()uint128' | 'get_implicit_key_arc4_uint128', { - argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_uint128()uint128'] - argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_uint128()uint128'] - returns: GlobalStateContractReturns['get_implicit_key_arc4_uint128()uint128'] - }> - & Record<'get_implicit_key_arc4_dynamic_bytes()byte[]' | 'get_implicit_key_arc4_dynamic_bytes', { - argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_dynamic_bytes()byte[]'] - argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_dynamic_bytes()byte[]'] - returns: GlobalStateContractReturns['get_implicit_key_arc4_dynamic_bytes()byte[]'] - }> - & Record<'get_implicit_key_tuple()(uint64,byte[],bool)' | 'get_implicit_key_tuple', { - argsObj: GlobalStateContractArgs['obj']['get_implicit_key_tuple()(uint64,byte[],bool)'] - argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_tuple()(uint64,byte[],bool)'] - returns: GlobalStateContractReturns['get_implicit_key_tuple()(uint64,byte[],bool)'] - }> - & Record<'get_arc4_uint()uint64' | 'get_arc4_uint', { - argsObj: GlobalStateContractArgs['obj']['get_arc4_uint()uint64'] - argsTuple: GlobalStateContractArgs['tuple']['get_arc4_uint()uint64'] - returns: GlobalStateContractReturns['get_arc4_uint()uint64'] - }> - & Record<'get_arc4_string()string' | 'get_arc4_string', { - argsObj: GlobalStateContractArgs['obj']['get_arc4_string()string'] - argsTuple: GlobalStateContractArgs['tuple']['get_arc4_string()string'] - returns: GlobalStateContractReturns['get_arc4_string()string'] - }> - & Record<'get_arc4_byte()byte' | 'get_arc4_byte', { - argsObj: GlobalStateContractArgs['obj']['get_arc4_byte()byte'] - argsTuple: GlobalStateContractArgs['tuple']['get_arc4_byte()byte'] - returns: GlobalStateContractReturns['get_arc4_byte()byte'] - }> - & Record<'get_arc4_bool()bool' | 'get_arc4_bool', { - argsObj: GlobalStateContractArgs['obj']['get_arc4_bool()bool'] - argsTuple: GlobalStateContractArgs['tuple']['get_arc4_bool()bool'] - returns: GlobalStateContractReturns['get_arc4_bool()bool'] - }> - & Record<'get_arc4_address()address' | 'get_arc4_address', { - argsObj: GlobalStateContractArgs['obj']['get_arc4_address()address'] - argsTuple: GlobalStateContractArgs['tuple']['get_arc4_address()address'] - returns: GlobalStateContractReturns['get_arc4_address()address'] - }> - & Record<'get_arc4_uint128()uint128' | 'get_arc4_uint128', { - argsObj: GlobalStateContractArgs['obj']['get_arc4_uint128()uint128'] - argsTuple: GlobalStateContractArgs['tuple']['get_arc4_uint128()uint128'] - returns: GlobalStateContractReturns['get_arc4_uint128()uint128'] - }> - & Record<'get_arc4_dynamic_bytes()byte[]' | 'get_arc4_dynamic_bytes', { - argsObj: GlobalStateContractArgs['obj']['get_arc4_dynamic_bytes()byte[]'] - argsTuple: GlobalStateContractArgs['tuple']['get_arc4_dynamic_bytes()byte[]'] - returns: GlobalStateContractReturns['get_arc4_dynamic_bytes()byte[]'] - }> - & Record<'set_implicit_key_arc4_uint(uint64)void' | 'set_implicit_key_arc4_uint', { - argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_uint(uint64)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_uint(uint64)void'] - returns: GlobalStateContractReturns['set_implicit_key_arc4_uint(uint64)void'] - }> - & Record<'set_implicit_key_arc4_string(string)void' | 'set_implicit_key_arc4_string', { - argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_string(string)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_string(string)void'] - returns: GlobalStateContractReturns['set_implicit_key_arc4_string(string)void'] - }> - & Record<'set_implicit_key_arc4_byte(byte)void' | 'set_implicit_key_arc4_byte', { - argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_byte(byte)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_byte(byte)void'] - returns: GlobalStateContractReturns['set_implicit_key_arc4_byte(byte)void'] - }> - & Record<'set_implicit_key_arc4_bool(bool)void' | 'set_implicit_key_arc4_bool', { - argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_bool(bool)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_bool(bool)void'] - returns: GlobalStateContractReturns['set_implicit_key_arc4_bool(bool)void'] - }> - & Record<'set_implicit_key_arc4_address(address)void' | 'set_implicit_key_arc4_address', { - argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_address(address)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_address(address)void'] - returns: GlobalStateContractReturns['set_implicit_key_arc4_address(address)void'] - }> - & Record<'set_implicit_key_arc4_uint128(uint128)void' | 'set_implicit_key_arc4_uint128', { - argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_uint128(uint128)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_uint128(uint128)void'] - returns: GlobalStateContractReturns['set_implicit_key_arc4_uint128(uint128)void'] - }> - & Record<'set_implicit_key_arc4_dynamic_bytes(byte[])void' | 'set_implicit_key_arc4_dynamic_bytes', { - argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_dynamic_bytes(byte[])void'] - argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_dynamic_bytes(byte[])void'] - returns: GlobalStateContractReturns['set_implicit_key_arc4_dynamic_bytes(byte[])void'] - }> - & Record<'set_implicit_key_tuple((uint64,byte[],bool))void' | 'set_implicit_key_tuple', { - argsObj: GlobalStateContractArgs['obj']['set_implicit_key_tuple((uint64,byte[],bool))void'] - argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_tuple((uint64,byte[],bool))void'] - returns: GlobalStateContractReturns['set_implicit_key_tuple((uint64,byte[],bool))void'] - }> - & Record<'set_arc4_uint(uint64)void' | 'set_arc4_uint', { - argsObj: GlobalStateContractArgs['obj']['set_arc4_uint(uint64)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_arc4_uint(uint64)void'] - returns: GlobalStateContractReturns['set_arc4_uint(uint64)void'] - }> - & Record<'set_arc4_string(string)void' | 'set_arc4_string', { - argsObj: GlobalStateContractArgs['obj']['set_arc4_string(string)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_arc4_string(string)void'] - returns: GlobalStateContractReturns['set_arc4_string(string)void'] - }> - & Record<'set_arc4_byte(byte)void' | 'set_arc4_byte', { - argsObj: GlobalStateContractArgs['obj']['set_arc4_byte(byte)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_arc4_byte(byte)void'] - returns: GlobalStateContractReturns['set_arc4_byte(byte)void'] - }> - & Record<'set_arc4_bool(bool)void' | 'set_arc4_bool', { - argsObj: GlobalStateContractArgs['obj']['set_arc4_bool(bool)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_arc4_bool(bool)void'] - returns: GlobalStateContractReturns['set_arc4_bool(bool)void'] - }> - & Record<'set_arc4_address(address)void' | 'set_arc4_address', { - argsObj: GlobalStateContractArgs['obj']['set_arc4_address(address)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_arc4_address(address)void'] - returns: GlobalStateContractReturns['set_arc4_address(address)void'] - }> - & Record<'set_arc4_uint128(uint128)void' | 'set_arc4_uint128', { - argsObj: GlobalStateContractArgs['obj']['set_arc4_uint128(uint128)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_arc4_uint128(uint128)void'] - returns: GlobalStateContractReturns['set_arc4_uint128(uint128)void'] - }> - & Record<'set_arc4_dynamic_bytes(byte[])void' | 'set_arc4_dynamic_bytes', { - argsObj: GlobalStateContractArgs['obj']['set_arc4_dynamic_bytes(byte[])void'] - argsTuple: GlobalStateContractArgs['tuple']['set_arc4_dynamic_bytes(byte[])void'] - returns: GlobalStateContractReturns['set_arc4_dynamic_bytes(byte[])void'] - }> - /** - * Defines the shape of the state of the application. - */ - state: { - global: { - keys: { - implicitKeyArc4Uint: bigint - implicitKeyArc4String: string - implicitKeyArc4Byte: number - implicitKeyArc4Bool: boolean - implicitKeyArc4Address: string - implicitKeyArc4Uint128: bigint - implicitKeyArc4DynamicBytes: Uint8Array - implicitKeyTuple: [bigint, Uint8Array, boolean] - arc4Uint: bigint - arc4String: string - arc4Byte: number - arc4Bool: boolean - arc4Address: string - arc4Uint128: bigint - arc4DynamicBytes: Uint8Array - } - maps: {} - } - } -} - -/** - * Defines the possible abi call signatures. - */ -export type GlobalStateContractSignatures = keyof GlobalStateContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type GlobalStateContractNonVoidMethodSignatures = keyof GlobalStateContractTypes['methods'] extends infer T ? T extends keyof GlobalStateContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the GlobalStateContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = GlobalStateContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the GlobalStateContract smart contract to the method's return type - */ -export type MethodReturn = GlobalStateContractTypes['methods'][TSignature]['returns'] - -/** - * Defines the shape of the keyed global state of the application. - */ -export type GlobalKeysState = GlobalStateContractTypes['state']['global']['keys'] - - -/** - * Defines supported create method params for this smart contract - */ -export type GlobalStateContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type GlobalStateContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: GlobalStateContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the GlobalStateContract smart contract - */ -export abstract class GlobalStateContractParamsFactory { - /** - * Constructs a no op call for the get_implicit_key_arc4_uint()uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_uint()uint64' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_string()string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_string()string' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_byte()byte ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_byte()byte' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_bool()bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_bool()bool' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_address()address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_address()address' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_uint128()uint128 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_uint128()uint128' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_dynamic_bytes()byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_dynamic_bytes()byte[]' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_implicit_key_tuple()(uint64,byte[],bool) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_tuple()(uint64,byte[],bool)' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_arc4_uint()uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_uint()uint64' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_arc4_string()string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_string()string' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_arc4_byte()byte ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_byte()byte' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_arc4_bool()bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_bool()bool' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_arc4_address()address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_address()address' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_arc4_uint128()uint128 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_uint128()uint128' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_arc4_dynamic_bytes()byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_dynamic_bytes()byte[]' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the set_implicit_key_arc4_uint(uint64)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setImplicitKeyArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_implicit_key_arc4_uint(uint64)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_implicit_key_arc4_string(string)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setImplicitKeyArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_implicit_key_arc4_string(string)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_implicit_key_arc4_byte(byte)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setImplicitKeyArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_implicit_key_arc4_byte(byte)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_implicit_key_arc4_bool(bool)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setImplicitKeyArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_implicit_key_arc4_bool(bool)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_implicit_key_arc4_address(address)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setImplicitKeyArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_implicit_key_arc4_address(address)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_implicit_key_arc4_uint128(uint128)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setImplicitKeyArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_implicit_key_arc4_uint128(uint128)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_implicit_key_arc4_dynamic_bytes(byte[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setImplicitKeyArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_implicit_key_arc4_dynamic_bytes(byte[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_implicit_key_tuple((uint64,byte[],bool))void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setImplicitKeyTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_implicit_key_tuple((uint64,byte[],bool))void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_arc4_uint(uint64)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_arc4_uint(uint64)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_arc4_string(string)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_arc4_string(string)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_arc4_byte(byte)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_arc4_byte(byte)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_arc4_bool(bool)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_arc4_bool(bool)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_arc4_address(address)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_arc4_address(address)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_arc4_uint128(uint128)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_arc4_uint128(uint128)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_arc4_dynamic_bytes(byte[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_arc4_dynamic_bytes(byte[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } -} - -/** - * A factory to create and deploy one or more instance of the GlobalStateContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class GlobalStateContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `GlobalStateContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new GlobalStateContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new GlobalStateContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the GlobalStateContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: GlobalStateContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new GlobalStateContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the GlobalStateContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the GlobalStateContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the GlobalStateContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new GlobalStateContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the GlobalStateContract smart contract - */ -export class GlobalStateContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `GlobalStateContractClient` - * - * @param appClient An `AppClient` instance which has been created with the GlobalStateContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `GlobalStateContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `GlobalStateContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new GlobalStateContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `GlobalStateContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new GlobalStateContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the GlobalStateContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_string()string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4String(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_byte()byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_bool()bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_address()address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Address(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint128()uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes()byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_tuple()(uint64,byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyTuple(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Uint(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_string()string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4String(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_byte()byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Byte(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_bool()bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Bool(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_address()address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Address(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint128()uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Uint128(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_dynamic_bytes()byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4DynamicBytes(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_string(string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4String(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_byte(byte)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Byte(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_bool(bool)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Bool(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_address(address)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Address(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint128(uint128)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint128(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_dynamic_bytes(byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4DynamicBytes(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_tuple((uint64,byte[],bool))void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyTuple(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Uint(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_string(string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4String(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_byte(byte)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Byte(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_bool(bool)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Bool(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_address(address)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Address(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint128(uint128)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Uint128(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_dynamic_bytes(byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4DynamicBytes(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the GlobalStateContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_string()string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4String(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_byte()byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_bool()bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_address()address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Address(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint128()uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes()byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_tuple()(uint64,byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyTuple(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Uint(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_string()string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4String(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_byte()byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Byte(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_bool()bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Bool(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_address()address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Address(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint128()uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Uint128(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_dynamic_bytes()byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4DynamicBytes(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_string(string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4String(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_byte(byte)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Byte(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_bool(bool)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Bool(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_address(address)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Address(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint128(uint128)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint128(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_dynamic_bytes(byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4DynamicBytes(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_tuple((uint64,byte[],bool))void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyTuple(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Uint(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_string(string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4String(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_byte(byte)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Byte(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_bool(bool)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Bool(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_address(address)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Address(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint128(uint128)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Uint128(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_dynamic_bytes(byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4DynamicBytes(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the GlobalStateContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_uint()uint64'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_string()string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4String(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_string()string'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_byte()byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_byte()byte'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_bool()bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_bool()bool'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_address()address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Address(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_address()address'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint128()uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_uint128()uint128'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes()byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_dynamic_bytes()byte[]'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_tuple()(uint64,byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyTuple(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_tuple()(uint64,byte[],bool)'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Uint(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_uint()uint64'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_string()string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4String(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_string()string'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_byte()byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Byte(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_byte()byte'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_bool()bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Bool(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_bool()bool'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_address()address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Address(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_address()address'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint128()uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Uint128(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_uint128()uint128'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_dynamic_bytes()byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4DynamicBytes(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_dynamic_bytes()byte[]'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setImplicitKeyArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_uint(uint64)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_string(string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setImplicitKeyArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4String(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_string(string)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_byte(byte)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setImplicitKeyArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Byte(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_byte(byte)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_bool(bool)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setImplicitKeyArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Bool(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_bool(bool)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_address(address)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setImplicitKeyArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Address(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_address(address)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint128(uint128)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setImplicitKeyArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint128(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_uint128(uint128)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_dynamic_bytes(byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setImplicitKeyArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4DynamicBytes(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_dynamic_bytes(byte[])void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_tuple((uint64,byte[],bool))void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setImplicitKeyTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyTuple(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_tuple((uint64,byte[],bool))void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Uint(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_uint(uint64)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_string(string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4String(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_string(string)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_byte(byte)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Byte(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_byte(byte)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_bool(bool)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Bool(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_bool(bool)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_address(address)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Address(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_address(address)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint128(uint128)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Uint128(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_uint128(uint128)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_dynamic_bytes(byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4DynamicBytes(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_dynamic_bytes(byte[])void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new GlobalStateContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current GlobalStateContract app - */ - state = { - /** - * Methods to access global state for the current GlobalStateContract app - */ - global: { - /** - * Get all current keyed values from global state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.global.getAll() - return { - implicitKeyArc4Uint: result.implicit_key_arc4_uint, - implicitKeyArc4String: result.implicit_key_arc4_string, - implicitKeyArc4Byte: result.implicit_key_arc4_byte, - implicitKeyArc4Bool: result.implicit_key_arc4_bool, - implicitKeyArc4Address: result.implicit_key_arc4_address, - implicitKeyArc4Uint128: result.implicit_key_arc4_uint128, - implicitKeyArc4DynamicBytes: result.implicit_key_arc4_dynamic_bytes, - implicitKeyTuple: result.implicit_key_tuple, - arc4Uint: result.arc4_uint, - arc4String: result.arc4_string, - arc4Byte: result.arc4_byte, - arc4Bool: result.arc4_bool, - arc4Address: result.arc4_address, - arc4Uint128: result.arc4_uint128, - arc4DynamicBytes: result.arc4_dynamic_bytes, - } - }, - /** - * Get the current value of the implicit_key_arc4_uint key in global state - */ - implicitKeyArc4Uint: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_uint")) as bigint | undefined }, - /** - * Get the current value of the implicit_key_arc4_string key in global state - */ - implicitKeyArc4String: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_string")) as string | undefined }, - /** - * Get the current value of the implicit_key_arc4_byte key in global state - */ - implicitKeyArc4Byte: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_byte")) as number | undefined }, - /** - * Get the current value of the implicit_key_arc4_bool key in global state - */ - implicitKeyArc4Bool: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_bool")) as boolean | undefined }, - /** - * Get the current value of the implicit_key_arc4_address key in global state - */ - implicitKeyArc4Address: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_address")) as string | undefined }, - /** - * Get the current value of the implicit_key_arc4_uint128 key in global state - */ - implicitKeyArc4Uint128: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_uint128")) as bigint | undefined }, - /** - * Get the current value of the implicit_key_arc4_dynamic_bytes key in global state - */ - implicitKeyArc4DynamicBytes: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_dynamic_bytes")) as Uint8Array | undefined }, - /** - * Get the current value of the implicit_key_tuple key in global state - */ - implicitKeyTuple: async (): Promise<[bigint, Uint8Array, boolean] | undefined> => { return (await this.appClient.state.global.getValue("implicit_key_tuple")) as [bigint, Uint8Array, boolean] | undefined }, - /** - * Get the current value of the arc4_uint key in global state - */ - arc4Uint: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_uint")) as bigint | undefined }, - /** - * Get the current value of the arc4_string key in global state - */ - arc4String: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_string")) as string | undefined }, - /** - * Get the current value of the arc4_byte key in global state - */ - arc4Byte: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_byte")) as number | undefined }, - /** - * Get the current value of the arc4_bool key in global state - */ - arc4Bool: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_bool")) as boolean | undefined }, - /** - * Get the current value of the arc4_address key in global state - */ - arc4Address: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_address")) as string | undefined }, - /** - * Get the current value of the arc4_uint128 key in global state - */ - arc4Uint128: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_uint128")) as bigint | undefined }, - /** - * Get the current value of the arc4_dynamic_bytes key in global state - */ - arc4DynamicBytes: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_dynamic_bytes")) as Uint8Array | undefined }, - }, - } - - public newGroup(composerConfig?: TransactionComposerConfig): GlobalStateContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a get_implicit_key_arc4_uint()uint64 method call against the GlobalStateContract contract - */ - getImplicitKeyArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Uint(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_string()string method call against the GlobalStateContract contract - */ - getImplicitKeyArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4String(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_byte()byte method call against the GlobalStateContract contract - */ - getImplicitKeyArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Byte(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_bool()bool method call against the GlobalStateContract contract - */ - getImplicitKeyArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Bool(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_address()address method call against the GlobalStateContract contract - */ - getImplicitKeyArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Address(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_uint128()uint128 method call against the GlobalStateContract contract - */ - getImplicitKeyArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Uint128(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_dynamic_bytes()byte[] method call against the GlobalStateContract contract - */ - getImplicitKeyArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4DynamicBytes(params))) - return this - }, - /** - * Add a get_implicit_key_tuple()(uint64,byte[],bool) method call against the GlobalStateContract contract - */ - getImplicitKeyTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyTuple(params))) - return this - }, - /** - * Add a get_arc4_uint()uint64 method call against the GlobalStateContract contract - */ - getArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Uint(params))) - return this - }, - /** - * Add a get_arc4_string()string method call against the GlobalStateContract contract - */ - getArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4String(params))) - return this - }, - /** - * Add a get_arc4_byte()byte method call against the GlobalStateContract contract - */ - getArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Byte(params))) - return this - }, - /** - * Add a get_arc4_bool()bool method call against the GlobalStateContract contract - */ - getArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Bool(params))) - return this - }, - /** - * Add a get_arc4_address()address method call against the GlobalStateContract contract - */ - getArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Address(params))) - return this - }, - /** - * Add a get_arc4_uint128()uint128 method call against the GlobalStateContract contract - */ - getArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Uint128(params))) - return this - }, - /** - * Add a get_arc4_dynamic_bytes()byte[] method call against the GlobalStateContract contract - */ - getArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4DynamicBytes(params))) - return this - }, - /** - * Add a set_implicit_key_arc4_uint(uint64)void method call against the GlobalStateContract contract - */ - setImplicitKeyArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Uint(params))) - return this - }, - /** - * Add a set_implicit_key_arc4_string(string)void method call against the GlobalStateContract contract - */ - setImplicitKeyArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4String(params))) - return this - }, - /** - * Add a set_implicit_key_arc4_byte(byte)void method call against the GlobalStateContract contract - */ - setImplicitKeyArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Byte(params))) - return this - }, - /** - * Add a set_implicit_key_arc4_bool(bool)void method call against the GlobalStateContract contract - */ - setImplicitKeyArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Bool(params))) - return this - }, - /** - * Add a set_implicit_key_arc4_address(address)void method call against the GlobalStateContract contract - */ - setImplicitKeyArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Address(params))) - return this - }, - /** - * Add a set_implicit_key_arc4_uint128(uint128)void method call against the GlobalStateContract contract - */ - setImplicitKeyArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Uint128(params))) - return this - }, - /** - * Add a set_implicit_key_arc4_dynamic_bytes(byte[])void method call against the GlobalStateContract contract - */ - setImplicitKeyArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4DynamicBytes(params))) - return this - }, - /** - * Add a set_implicit_key_tuple((uint64,byte[],bool))void method call against the GlobalStateContract contract - */ - setImplicitKeyTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyTuple(params))) - return this - }, - /** - * Add a set_arc4_uint(uint64)void method call against the GlobalStateContract contract - */ - setArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Uint(params))) - return this - }, - /** - * Add a set_arc4_string(string)void method call against the GlobalStateContract contract - */ - setArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4String(params))) - return this - }, - /** - * Add a set_arc4_byte(byte)void method call against the GlobalStateContract contract - */ - setArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Byte(params))) - return this - }, - /** - * Add a set_arc4_bool(bool)void method call against the GlobalStateContract contract - */ - setArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Bool(params))) - return this - }, - /** - * Add a set_arc4_address(address)void method call against the GlobalStateContract contract - */ - setArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Address(params))) - return this - }, - /** - * Add a set_arc4_uint128(uint128)void method call against the GlobalStateContract contract - */ - setArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Uint128(params))) - return this - }, - /** - * Add a set_arc4_dynamic_bytes(byte[])void method call against the GlobalStateContract contract - */ - setArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4DynamicBytes(params))) - return this - }, - /** - * Add a clear state call to the GlobalStateContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as GlobalStateContractComposer - } -} -export type GlobalStateContractComposer = { - /** - * Calls the get_implicit_key_arc4_uint()uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4Uint(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_uint()uint64'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_string()string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4String(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_string()string'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_byte()byte ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4Byte(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_byte()byte'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_bool()bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4Bool(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_bool()bool'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_address()address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4Address(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_address()address'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_uint128()uint128 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4Uint128(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_uint128()uint128'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_dynamic_bytes()byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4DynamicBytes(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_dynamic_bytes()byte[]'] | undefined]> - - /** - * Calls the get_implicit_key_tuple()(uint64,byte[],bool) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyTuple(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_tuple()(uint64,byte[],bool)'] | undefined]> - - /** - * Calls the get_arc4_uint()uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4Uint(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_uint()uint64'] | undefined]> - - /** - * Calls the get_arc4_string()string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4String(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_string()string'] | undefined]> - - /** - * Calls the get_arc4_byte()byte ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4Byte(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_byte()byte'] | undefined]> - - /** - * Calls the get_arc4_bool()bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4Bool(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_bool()bool'] | undefined]> - - /** - * Calls the get_arc4_address()address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4Address(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_address()address'] | undefined]> - - /** - * Calls the get_arc4_uint128()uint128 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4Uint128(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_uint128()uint128'] | undefined]> - - /** - * Calls the get_arc4_dynamic_bytes()byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4DynamicBytes(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_dynamic_bytes()byte[]'] | undefined]> - - /** - * Calls the set_implicit_key_arc4_uint(uint64)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setImplicitKeyArc4Uint(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_uint(uint64)void'] | undefined]> - - /** - * Calls the set_implicit_key_arc4_string(string)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setImplicitKeyArc4String(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_string(string)void'] | undefined]> - - /** - * Calls the set_implicit_key_arc4_byte(byte)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setImplicitKeyArc4Byte(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_byte(byte)void'] | undefined]> - - /** - * Calls the set_implicit_key_arc4_bool(bool)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setImplicitKeyArc4Bool(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_bool(bool)void'] | undefined]> - - /** - * Calls the set_implicit_key_arc4_address(address)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setImplicitKeyArc4Address(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_address(address)void'] | undefined]> - - /** - * Calls the set_implicit_key_arc4_uint128(uint128)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setImplicitKeyArc4Uint128(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_uint128(uint128)void'] | undefined]> - - /** - * Calls the set_implicit_key_arc4_dynamic_bytes(byte[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setImplicitKeyArc4DynamicBytes(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_dynamic_bytes(byte[])void'] | undefined]> - - /** - * Calls the set_implicit_key_tuple((uint64,byte[],bool))void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setImplicitKeyTuple(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_tuple((uint64,byte[],bool))void'] | undefined]> - - /** - * Calls the set_arc4_uint(uint64)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setArc4Uint(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_uint(uint64)void'] | undefined]> - - /** - * Calls the set_arc4_string(string)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setArc4String(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_string(string)void'] | undefined]> - - /** - * Calls the set_arc4_byte(byte)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setArc4Byte(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_byte(byte)void'] | undefined]> - - /** - * Calls the set_arc4_bool(bool)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setArc4Bool(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_bool(bool)void'] | undefined]> - - /** - * Calls the set_arc4_address(address)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setArc4Address(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_address(address)void'] | undefined]> - - /** - * Calls the set_arc4_uint128(uint128)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setArc4Uint128(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_uint128(uint128)void'] | undefined]> - - /** - * Calls the set_arc4_dynamic_bytes(byte[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setArc4DynamicBytes(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_dynamic_bytes(byte[])void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the GlobalStateContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): GlobalStateContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): GlobalStateContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type GlobalStateContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateValidator.ts b/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateValidator.ts deleted file mode 100644 index 483c414..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateValidator.ts +++ /dev/null @@ -1,557 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"GlobalStateValidator","structs":{},"methods":[{"name":"validate_g_args","args":[{"type":"uint64","name":"arg1"},{"type":"string","name":"arg2"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[72],"errorMessage":"transaction type is appl"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHhjMGViNWM2NwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIEdsb2JhbFN0YXRlVmFsaWRhdG9yKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBieXRlY18wIC8vIG1ldGhvZCAidmFsaWRhdGVfZ19hcmdzKHVpbnQ2NCxzdHJpbmcpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdmFsaWRhdGVfZ19hcmdzX3JvdXRlQDMKICAgIGVycgoKbWFpbl92YWxpZGF0ZV9nX2FyZ3Nfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIHZhbGlkYXRlX2dfYXJncwoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuR2xvYmFsU3RhdGVWYWxpZGF0b3IuY29udHJhY3QuR2xvYmFsU3RhdGVWYWxpZGF0b3IudmFsaWRhdGVfZ19hcmdzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmFsaWRhdGVfZ19hcmdzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjcKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygwKSA9PSBhcmM0LmFyYzRfc2lnbmF0dXJlKCJ2YWxpZGF0ZV9nX2FyZ3ModWludDY0LHN0cmluZyl2b2lkIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIGJ5dGVjXzAgLy8gbWV0aG9kICJ2YWxpZGF0ZV9nX2FyZ3ModWludDY0LHN0cmluZyl2b2lkIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjgKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygxKSA9PSBhcmcxLmJ5dGVzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjkKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygyKSA9PSBhcmcyLmJ5dGVzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6MTAKICAgIC8vIGFzc2VydCBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKFR4bi5ncm91cF9pbmRleCkuYXBwX2FyZ3MoMSkgPT0gYXJnMS5ieXRlcwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgcHVzaGludCAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weToxMQogICAgLy8gYXNzZXJ0IGd0eG4uVHJhbnNhY3Rpb24oVHhuLmdyb3VwX2luZGV4KS5hcHBfYXJncygxKSA9PSBhcmcxLmJ5dGVzCiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weToxMgogICAgLy8gYXNzZXJ0IG9wLkdUeG4uYXBwbGljYXRpb25fYXJncyhUeG4uZ3JvdXBfaW5kZXgsIDEpID09IGFyZzEuYnl0ZXMKICAgIHR4biBHcm91cEluZGV4CiAgICBndHhuc2EgQXBwbGljYXRpb25BcmdzIDEKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6MTMKICAgIC8vIGFzc2VydCBvcC5UeG4uYXBwbGljYXRpb25fYXJncygxKSA9PSBhcmcxLmJ5dGVzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyYBBMDrXGcxG0EAEyg2GgCOAQABADEZFDEYEERCAAgxGRQxGBQQQzYaATYaAjYaACgSRDYaAUsCEkQ2GgISRDEWSTgQgQYSRIEBwhpLARJEMRaBAcIaSwESRDEWORoBSwESRDYaARJEgQFD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the GlobalStateValidator contract - */ -export type GlobalStateValidatorArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'validate_g_args(uint64,string)void': { - arg1: bigint | number - arg2: string - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'validate_g_args(uint64,string)void': [arg1: bigint | number, arg2: string] - } -} - -/** - * The return type for each method - */ -export type GlobalStateValidatorReturns = { - 'validate_g_args(uint64,string)void': void -} - -/** - * Defines the types of available calls and state of the GlobalStateValidator smart contract. - */ -export type GlobalStateValidatorTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'validate_g_args(uint64,string)void' | 'validate_g_args', { - argsObj: GlobalStateValidatorArgs['obj']['validate_g_args(uint64,string)void'] - argsTuple: GlobalStateValidatorArgs['tuple']['validate_g_args(uint64,string)void'] - returns: GlobalStateValidatorReturns['validate_g_args(uint64,string)void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type GlobalStateValidatorSignatures = keyof GlobalStateValidatorTypes['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the GlobalStateValidator smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = GlobalStateValidatorTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the GlobalStateValidator smart contract to the method's return type - */ -export type MethodReturn = GlobalStateValidatorTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type GlobalStateValidatorCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type GlobalStateValidatorDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: GlobalStateValidatorCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the GlobalStateValidator smart contract - */ -export abstract class GlobalStateValidatorParamsFactory { - /** - * Constructs a no op call for the validate_g_args(uint64,string)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static validateGArgs(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'validate_g_args(uint64,string)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.arg1, params.args.arg2], - } - } -} - -/** - * A factory to create and deploy one or more instance of the GlobalStateValidator smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class GlobalStateValidatorFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `GlobalStateValidatorFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new GlobalStateValidatorClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new GlobalStateValidatorClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the GlobalStateValidator smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: GlobalStateValidatorDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new GlobalStateValidatorClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the GlobalStateValidator smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the GlobalStateValidator smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the GlobalStateValidator smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new GlobalStateValidatorClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the GlobalStateValidator smart contract - */ -export class GlobalStateValidatorClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `GlobalStateValidatorClient` - * - * @param appClient An `AppClient` instance which has been created with the GlobalStateValidator app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `GlobalStateValidatorClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `GlobalStateValidatorClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new GlobalStateValidatorClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `GlobalStateValidatorClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new GlobalStateValidatorClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the GlobalStateValidator smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the GlobalStateValidator smart contract using the `validate_g_args(uint64,string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - validateGArgs: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateValidatorParamsFactory.validateGArgs(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the GlobalStateValidator smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the GlobalStateValidator smart contract using the `validate_g_args(uint64,string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - validateGArgs: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateValidatorParamsFactory.validateGArgs(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the GlobalStateValidator smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the GlobalStateValidator smart contract using the `validate_g_args(uint64,string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - validateGArgs: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateValidatorParamsFactory.validateGArgs(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateValidatorReturns['validate_g_args(uint64,string)void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new GlobalStateValidatorClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current GlobalStateValidator app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): GlobalStateValidatorComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a validate_g_args(uint64,string)void method call against the GlobalStateValidator contract - */ - validateGArgs(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.validateGArgs(params))) - return this - }, - /** - * Add a clear state call to the GlobalStateValidator contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as GlobalStateValidatorComposer - } -} -export type GlobalStateValidatorComposer = { - /** - * Calls the validate_g_args(uint64,string)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - validateGArgs(params?: CallParams): GlobalStateValidatorComposer<[...TReturns, GlobalStateValidatorReturns['validate_g_args(uint64,string)void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the GlobalStateValidator smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): GlobalStateValidatorComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): GlobalStateValidatorComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type GlobalStateValidatorComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/HelloWorld.ts b/examples/p-py/projects/p-py-frontend/src/contracts/HelloWorld.ts deleted file mode 100644 index e60b7c5..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/HelloWorld.ts +++ /dev/null @@ -1,560 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"HelloWorld","structs":{},"methods":[{"name":"hello","args":[{"type":"string","name":"name"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[44],"errorMessage":"invalid array length header"},{"pc":[52],"errorMessage":"invalid number of bytes for arc4.dynamic_array"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5weTo1CiAgICAvLyBjbGFzcyBIZWxsb1dvcmxkKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2hlbGxvX3JvdXRlQDMKICAgIGVycgoKbWFpbl9oZWxsb19yb3V0ZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LnB5OjYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgaGVsbG8KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLmhlbGxvX3dvcmxkLmNvbnRyYWN0LkhlbGxvV29ybGQuaGVsbG9bcm91dGluZ10oKSAtPiB2b2lkOgpoZWxsbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5weTo2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgcHVzaGludCAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5weTo4CiAgICAvLyByZXR1cm4gIkhlbGxvLCAiICsgbmFtZQogICAgcHVzaGJ5dGVzICJIZWxsbywgIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QucHk6NgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgAQCvs4RNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEM2GgFJgQBZgQIISwEVEkRXAgCAB0hlbGxvLCBMUEkVFlcGAkxQgAQVH3x1TFCwgQFD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the HelloWorld contract - */ -export type HelloWorldArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'hello(string)string': { - name: string - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'hello(string)string': [name: string] - } -} - -/** - * The return type for each method - */ -export type HelloWorldReturns = { - 'hello(string)string': string -} - -/** - * Defines the types of available calls and state of the HelloWorld smart contract. - */ -export type HelloWorldTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'hello(string)string' | 'hello', { - argsObj: HelloWorldArgs['obj']['hello(string)string'] - argsTuple: HelloWorldArgs['tuple']['hello(string)string'] - returns: HelloWorldReturns['hello(string)string'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type HelloWorldSignatures = keyof HelloWorldTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type HelloWorldNonVoidMethodSignatures = keyof HelloWorldTypes['methods'] extends infer T ? T extends keyof HelloWorldTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the HelloWorld smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = HelloWorldTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the HelloWorld smart contract to the method's return type - */ -export type MethodReturn = HelloWorldTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type HelloWorldCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type HelloWorldDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: HelloWorldCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the HelloWorld smart contract - */ -export abstract class HelloWorldParamsFactory { - /** - * Constructs a no op call for the hello(string)string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static hello(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'hello(string)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.name], - } - } -} - -/** - * A factory to create and deploy one or more instance of the HelloWorld smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class HelloWorldFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `HelloWorldFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new HelloWorldClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new HelloWorldClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the HelloWorld smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: HelloWorldDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new HelloWorldClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the HelloWorld smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the HelloWorld smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the HelloWorld smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new HelloWorldClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the HelloWorld smart contract - */ -export class HelloWorldClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `HelloWorldClient` - * - * @param appClient An `AppClient` instance which has been created with the HelloWorld app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `HelloWorldClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `HelloWorldClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new HelloWorldClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `HelloWorldClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new HelloWorldClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the HelloWorld smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - hello: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(HelloWorldParamsFactory.hello(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the HelloWorld smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - hello: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(HelloWorldParamsFactory.hello(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the HelloWorld smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - hello: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(HelloWorldParamsFactory.hello(params)) - return {...result, return: result.return as unknown as (undefined | HelloWorldReturns['hello(string)string'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new HelloWorldClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current HelloWorld app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): HelloWorldComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a hello(string)string method call against the HelloWorld contract - */ - hello(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hello(params))) - return this - }, - /** - * Add a clear state call to the HelloWorld contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as HelloWorldComposer - } -} -export type HelloWorldComposer = { - /** - * Calls the hello(string)string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - hello(params?: CallParams): HelloWorldComposer<[...TReturns, HelloWorldReturns['hello(string)string'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the HelloWorld smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): HelloWorldComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): HelloWorldComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type HelloWorldComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ITxnOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ITxnOpsContract.ts deleted file mode 100644 index a3d8854..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/ITxnOpsContract.ts +++ /dev/null @@ -1,554 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"ITxnOpsContract","structs":{},"methods":[{"name":"verify_itxn_ops","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYgMTAwMAogICAgYnl0ZWNibG9jayAweDA2ODEwMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ4OAogICAgLy8gY2xhc3MgSVR4bk9wc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHg0ZTdjZDljYiAvLyBtZXRob2QgInZlcmlmeV9pdHhuX29wcygpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdmVyaWZ5X2l0eG5fb3BzX3JvdXRlQDMKICAgIGVycgoKbWFpbl92ZXJpZnlfaXR4bl9vcHNfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiB2ZXJpZnlfaXR4bl9vcHMKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LklUeG5PcHNDb250cmFjdC52ZXJpZnlfaXR4bl9vcHNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfaXR4bl9vcHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDkxCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5iZWdpbigpCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDkyCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfdHlwZV9lbnVtKGFsZ29weS5UcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTMKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9vbl9jb21wbGV0aW9uKGFsZ29weS5PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uKQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ5NAogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc2V0X2FwcHJvdmFsX3Byb2dyYW0oQnl0ZXMuZnJvbV9oZXgoIjA2ODEwMSIpKQogICAgYnl0ZWNfMCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTUtNDk2CiAgICAvLyAjIHBhZ2VzIGVzc2VudGlhbGx5IGFwcGVuZHMKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9hcHByb3ZhbF9wcm9ncmFtX3BhZ2VzKEJ5dGVzLmZyb21faGV4KCIwNjgxMDEiKSkKICAgIGJ5dGVjXzAgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTcKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9jbGVhcl9zdGF0ZV9wcm9ncmFtKEJ5dGVzLmZyb21faGV4KCIwNjgxMDEiKSkKICAgIGJ5dGVjXzAgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTgKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9mZWUoYWxnb3B5Lm9wLkdsb2JhbC5taW5fdHhuX2ZlZSkKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDk5CiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5uZXh0KCkKICAgIGl0eG5fbmV4dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwMAogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc2V0X3R5cGVfZW51bShhbGdvcHkuVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpCiAgICBpbnRjXzAgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTAxCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfcmVjZWl2ZXIoYWxnb3B5Lm9wLkdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MDIKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9hbW91bnQoYWxnb3B5LlVJbnQ2NCgxMDAwKSkKICAgIGludGNfMiAvLyAxMDAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwMwogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA1CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLklUeG4ucmVjZWl2ZXIoKSA9PSBhbGdvcHkub3AuR2xvYmFsLmNyZWF0b3JfYWRkcmVzcwogICAgaXR4biBSZWNlaXZlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA2CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLklUeG4uYW1vdW50KCkgPT0gYWxnb3B5LlVJbnQ2NCgxMDAwKQogICAgaXR4biBBbW91bnQKICAgIGludGNfMiAvLyAxMDAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA3CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLklUeG4udHlwZV9lbnVtKCkgPT0gYWxnb3B5LlRyYW5zYWN0aW9uVHlwZS5QYXltZW50CiAgICBpdHhuIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA5CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLkdJVHhuLnR5cGVfZW51bSgwKSA9PSBhbGdvcHkuVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgZ2l0eG4gMCBUeXBlRW51bQogICAgaW50Y18xIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTAKICAgIC8vIGFzc2VydCBhbGdvcHkub3AuR0lUeG4udHlwZV9lbnVtKDEpID09IGFsZ29weS5UcmFuc2FjdGlvblR5cGUuUGF5bWVudAogICAgZ2l0eG4gMSBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyADAQboByYBAwaBATEbQQAYgAROfNnLNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEOxI7IQgQWyGSiyHiiyQCiyHzIAsgG2IrIQMgmyBySyCLO0BzIJEkS0CCQSRLQQIhJEtwAQIxJEtwEQIhJEIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the ITxnOpsContract contract - */ -export type ITxnOpsContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify_itxn_ops()void': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify_itxn_ops()void': [] - } -} - -/** - * The return type for each method - */ -export type ITxnOpsContractReturns = { - 'verify_itxn_ops()void': void -} - -/** - * Defines the types of available calls and state of the ITxnOpsContract smart contract. - */ -export type ITxnOpsContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify_itxn_ops()void' | 'verify_itxn_ops', { - argsObj: ITxnOpsContractArgs['obj']['verify_itxn_ops()void'] - argsTuple: ITxnOpsContractArgs['tuple']['verify_itxn_ops()void'] - returns: ITxnOpsContractReturns['verify_itxn_ops()void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type ITxnOpsContractSignatures = keyof ITxnOpsContractTypes['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the ITxnOpsContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = ITxnOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the ITxnOpsContract smart contract to the method's return type - */ -export type MethodReturn = ITxnOpsContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type ITxnOpsContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type ITxnOpsContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: ITxnOpsContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the ITxnOpsContract smart contract - */ -export abstract class ITxnOpsContractParamsFactory { - /** - * Constructs a no op call for the verify_itxn_ops()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyItxnOps(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_itxn_ops()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } -} - -/** - * A factory to create and deploy one or more instance of the ITxnOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class ITxnOpsContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `ITxnOpsContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new ITxnOpsContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new ITxnOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the ITxnOpsContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: ITxnOpsContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new ITxnOpsContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ITxnOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ITxnOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ITxnOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new ITxnOpsContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the ITxnOpsContract smart contract - */ -export class ITxnOpsContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `ITxnOpsContractClient` - * - * @param appClient An `AppClient` instance which has been created with the ITxnOpsContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `ITxnOpsContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `ITxnOpsContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new ITxnOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `ITxnOpsContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new ITxnOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the ITxnOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the ITxnOpsContract smart contract using the `verify_itxn_ops()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyItxnOps: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ITxnOpsContractParamsFactory.verifyItxnOps(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the ITxnOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the ITxnOpsContract smart contract using the `verify_itxn_ops()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyItxnOps: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ITxnOpsContractParamsFactory.verifyItxnOps(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the ITxnOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the ITxnOpsContract smart contract using the `verify_itxn_ops()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyItxnOps: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ITxnOpsContractParamsFactory.verifyItxnOps(params)) - return {...result, return: result.return as unknown as (undefined | ITxnOpsContractReturns['verify_itxn_ops()void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new ITxnOpsContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current ITxnOpsContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): ITxnOpsContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_itxn_ops()void method call against the ITxnOpsContract contract - */ - verifyItxnOps(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyItxnOps(params))) - return this - }, - /** - * Add a clear state call to the ITxnOpsContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as ITxnOpsContractComposer - } -} -export type ITxnOpsContractComposer = { - /** - * Calls the verify_itxn_ops()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyItxnOps(params?: CallParams): ITxnOpsContractComposer<[...TReturns, ITxnOpsContractReturns['verify_itxn_ops()void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the ITxnOpsContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): ITxnOpsContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): ITxnOpsContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type ITxnOpsContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayContract.ts deleted file mode 100644 index ff91ca4..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayContract.ts +++ /dev/null @@ -1,2231 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"ImmutableArrayContract","structs":{},"methods":[{"name":"test_uint64_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_biguint_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_bool_array","args":[{"type":"uint64","name":"length"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_fixed_size_tuple_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_fixed_size_named_tuple_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_sized_tuple_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_sized_named_tuple_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_implicit_conversion_log","args":[{"type":"uint64[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_implicit_conversion_emit","args":[{"type":"uint64[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[{"name":"emit_test","args":[{"type":"uint64[]","name":"field1"}]}],"recommendations":{}},{"name":"test_nested_array","args":[{"type":"uint64","name":"arr_to_add"},{"type":"uint64[][]","name":"arr"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_bit_packed_tuples","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"sum_uints_and_lengths_and_trues","args":[{"type":"uint64[]","name":"arr1"},{"type":"bool[]","name":"arr2"},{"type":"(uint64,bool,bool)[]","name":"arr3"},{"type":"(uint64,string)[]","name":"arr4"}],"returns":{"type":"(uint64,uint64,uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_uint64_return","args":[{"type":"uint64","name":"append"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_bool_return","args":[{"type":"uint64","name":"append"}],"returns":{"type":"bool[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_tuple_return","args":[{"type":"uint64","name":"append"}],"returns":{"type":"(uint64,bool,bool)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_tuple_return","args":[{"type":"uint64","name":"append"}],"returns":{"type":"(uint64,string)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_convert_to_array_and_back","args":[{"type":"(uint64,bool,bool)[]","name":"arr"},{"type":"uint64","name":"append"}],"returns":{"type":"(uint64,bool,bool)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_concat_with_arc4_tuple","args":[{"type":"(uint64,uint64)","name":"arg"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_concat_with_native_tuple","args":[{"type":"(uint64,uint64)","name":"arg"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_concat_with_arc4_tuple","args":[{"type":"(string,string)","name":"arg"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_concat_with_native_tuple","args":[{"type":"(string,string)","name":"arg"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_concat_immutable_dynamic","args":[{"type":"(uint64,string)[]","name":"imm1"},{"type":"(uint64,string)[]","name":"imm2"}],"returns":{"type":"(uint64,string)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_immutable_arc4","args":[{"type":"(uint64,uint64)[]","name":"imm"}],"returns":{"type":"(uint64,uint64)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_imm_fixed_arr","args":[],"returns":{"type":"(uint64,uint64)[3]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":11},"local":{"ints":0,"bytes":0}},"keys":{"global":{"a":{"keyType":"AVMString","valueType":"uint64[]","key":"YQ=="},"g":{"keyType":"AVMString","valueType":"bool[]","key":"Zw=="},"c":{"keyType":"AVMString","valueType":"(uint64,uint64)[]","key":"Yw=="},"d":{"keyType":"AVMString","valueType":"(uint64,bool,bool)[]","key":"ZA=="},"e":{"keyType":"AVMString","valueType":"(uint64,byte[])[]","key":"ZQ=="},"f":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"Zg=="},"bool2":{"keyType":"AVMString","valueType":"(bool,bool)[]","key":"Ym9vbDI="},"bool7":{"keyType":"AVMString","valueType":"(uint64,bool,bool,bool,bool,bool,bool,bool,uint64)[]","key":"Ym9vbDc="},"bool8":{"keyType":"AVMString","valueType":"(uint64,bool,bool,bool,bool,bool,bool,bool,bool,uint64)[]","key":"Ym9vbDg="},"bool9":{"keyType":"AVMString","valueType":"(uint64,bool,bool,bool,bool,bool,bool,bool,bool,bool,uint64)[]","key":"Ym9vbDk="},"imm_fixed_arr":{"keyType":"AVMString","valueType":"(uint64,uint64)[3]","key":"aW1tX2ZpeGVkX2Fycg=="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[4104],"errorMessage":"check self.imm_fixed_arr exists"},{"pc":[2179,2487],"errorMessage":"expected 1, 0"},{"pc":[2094,2402],"errorMessage":"expected 1st element to be correct"},{"pc":[2099,2409],"errorMessage":"expected 2nd element to be correct"},{"pc":[2240,2549],"errorMessage":"expected 4, 3"},{"pc":[3988],"errorMessage":"expected arrays to be different"},{"pc":[4022],"errorMessage":"expected arrays to be the same"},{"pc":[1548],"errorMessage":"expected element 0 to be False"},{"pc":[1567],"errorMessage":"expected element 1 to be False"},{"pc":[1585],"errorMessage":"expected element 2 to be True"},{"pc":[4049],"errorMessage":"expected items on iteration to be the same"},{"pc":[1611],"errorMessage":"expected last element to be False"},{"pc":[3935],"errorMessage":"expected non empty array"},{"pc":[3363],"errorMessage":"expected string length to match index"},{"pc":[4099],"errorMessage":"expected sum to be 10"},{"pc":[4072],"errorMessage":"expected sum to be 15"},{"pc":[852,1156,1221,1289,1346,1456,1541,1560,1579,1602,1753,1817,2050,2131,2196,2358,2441,2504,3214,3307,3950,4007,4045,4091],"errorMessage":"index access is out of bounds"},{"pc":[968,1009,1065,1092,1132,1160,1204,1269,1326,1438,1525,1656,1715,1779,1906,2008,2114,2316,2424,2681,2722,3012,3021,3030,3039,3107,3144,3188,3269,3910,3933],"errorMessage":"invalid array length header"},{"pc":[923,996,1120,1194,1244,1314,1426,1692,1881,2622,2769,2833,2919,2958,2989,3438,3571,3745,3779,3814],"errorMessage":"max array length exceeded"},{"pc":[1307],"errorMessage":"overflow"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA4CiAgICBieXRlY2Jsb2NrIDB4IDB4MTUxZjdjNzUgMHgwMDAwIDB4MDAgMHgwMDAyIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYgMHgwMDBhIDB4NjI2OTY3NzU2OTZlNzQgMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIgMHgwMDAyMDAwNDAwMDcwMDAxNjEwMDAxNjIgImltbV9maXhlZF9hcnIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo5MwogICAgLy8gY2xhc3MgSW1tdXRhYmxlQXJyYXlDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NDRkNDJmOTkgMHhiN2VhYTYwYiAweDc0M2Q3MGVkIDB4MWM3ZTA0OTQgMHhhMmQ1ODYwYiAweGUwNWZjNTY0IDB4MWUwOTJiODMgMHgwMTMxMDI2MiAweGM4NjU0YTk4IDB4ODlkMTk2ZjggMHg2Y2I3Yzk5MSAweDk4OThiZjAyIDB4ZjZiNjFlZTggMHg2MGI4NmE3YiAweDczYWQyODNmIDB4NTI5ZGZhZTkgMHgyMDZkNTE0ZiAweGUwNjQ2NWUyIDB4ZWMwMzAwYTIgMHhlY2RmMTRhZiAweDUxMWFjYTY0IDB4Mjk4NTJlNGYgMHg2ZDRhYTM1OCAweGI3Y2I5NmJkIC8vIG1ldGhvZCAidGVzdF91aW50NjRfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfYmlndWludF9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9ib29sX2FycmF5KHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2ZpeGVkX3NpemVfdHVwbGVfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfZml4ZWRfc2l6ZV9uYW1lZF90dXBsZV9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9sb2codWludDY0W10pdm9pZCIsIG1ldGhvZCAidGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2VtaXQodWludDY0W10pdm9pZCIsIG1ldGhvZCAidGVzdF9uZXN0ZWRfYXJyYXkodWludDY0LHVpbnQ2NFtdW10pdWludDY0W10iLCBtZXRob2QgInRlc3RfYml0X3BhY2tlZF90dXBsZXMoKXZvaWQiLCBtZXRob2QgInN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXModWludDY0W10sYm9vbFtdLCh1aW50NjQsYm9vbCxib29sKVtdLCh1aW50NjQsc3RyaW5nKVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ0ZXN0X3VpbnQ2NF9yZXR1cm4odWludDY0KXVpbnQ2NFtdIiwgbWV0aG9kICJ0ZXN0X2Jvb2xfcmV0dXJuKHVpbnQ2NClib29sW10iLCBtZXRob2QgInRlc3RfdHVwbGVfcmV0dXJuKHVpbnQ2NCkodWludDY0LGJvb2wsYm9vbClbXSIsIG1ldGhvZCAidGVzdF9keW5hbWljX3R1cGxlX3JldHVybih1aW50NjQpKHVpbnQ2NCxzdHJpbmcpW10iLCBtZXRob2QgInRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFjaygodWludDY0LGJvb2wsYm9vbClbXSx1aW50NjQpKHVpbnQ2NCxib29sLGJvb2wpW10iLCBtZXRob2QgInRlc3RfY29uY2F0X3dpdGhfYXJjNF90dXBsZSgodWludDY0LHVpbnQ2NCkpdWludDY0W10iLCBtZXRob2QgInRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlKCh1aW50NjQsdWludDY0KSl1aW50NjRbXSIsIG1ldGhvZCAidGVzdF9keW5hbWljX2NvbmNhdF93aXRoX2FyYzRfdHVwbGUoKHN0cmluZyxzdHJpbmcpKXN0cmluZ1tdIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlKChzdHJpbmcsc3RyaW5nKSlzdHJpbmdbXSIsIG1ldGhvZCAidGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWMoKHVpbnQ2NCxzdHJpbmcpW10sKHVpbnQ2NCxzdHJpbmcpW10pKHVpbnQ2NCxzdHJpbmcpW10iLCBtZXRob2QgInRlc3RfaW1tdXRhYmxlX2FyYzQoKHVpbnQ2NCx1aW50NjQpW10pKHVpbnQ2NCx1aW50NjQpW10iLCBtZXRob2QgInRlc3RfaW1tX2ZpeGVkX2FycigpKHVpbnQ2NCx1aW50NjQpWzNdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF91aW50NjRfYXJyYXkgdGVzdF9iaWd1aW50X2FycmF5IHRlc3RfYm9vbF9hcnJheSB0ZXN0X2ZpeGVkX3NpemVfdHVwbGVfYXJyYXkgdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5IHRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheSB0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXkgdGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2xvZyB0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fZW1pdCB0ZXN0X25lc3RlZF9hcnJheSB0ZXN0X2JpdF9wYWNrZWRfdHVwbGVzIHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXMgdGVzdF91aW50NjRfcmV0dXJuIHRlc3RfYm9vbF9yZXR1cm4gdGVzdF90dXBsZV9yZXR1cm4gdGVzdF9keW5hbWljX3R1cGxlX3JldHVybiB0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2sgdGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlIHRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlIHRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9hcmM0X3R1cGxlIHRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9uYXRpdmVfdHVwbGUgdGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWMgdGVzdF9pbW11dGFibGVfYXJjNCB0ZXN0X2ltbV9maXhlZF9hcnIKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzMToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZShhcnJheTogYnl0ZXMsIGZpeGVkX2J5dGVfc2l6ZTogdWludDY0KSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemU6CiAgICBwcm90byAyIDIKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZHVwCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgZHVwMgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0MwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQoYXJyYXk6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDEgMgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgMwogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9idXJ5IDEKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMoYXJyYXk6IGJ5dGVzLCBuZXdfaXRlbXNfYnl0ZXM6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgcmVhZF9zdGVwOiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzOgogICAgcHJvdG8gNCAxCiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDIKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXBuIDIKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICByZXBsYWNlMiAwCiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBwdXNoaW50IDcKICAgICsKICAgIGludGNfMyAvLyA4CiAgICAvCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3CiAgICArCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX2lmX2Vsc2VAMgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyA1CiAgICAtCiAgICBiemVybwogICAgZnJhbWVfZGlnIDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIGZyYW1lX2RpZyAzCiAgICBwdXNoaW50IDE2CiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBmcmFtZV9idXJ5IDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfd2hpbGVfdG9wQDM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfYWZ0ZXJfd2hpbGVANQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBnZXRiaXQKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX3doaWxlX3RvcEAzCgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX3doaWxlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18wIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuc3VtX2ltbV9maXhlZChhcnI6IGJ5dGVzKSAtPiB1aW50NjQ6CnN1bV9pbW1fZml4ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzAtNTcxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHN1bV9pbW1fZml4ZWQoYXJyOiBOYXRpdmVTdHJ1Y3QzKSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3MgogICAgLy8gdG90YWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBkdXAKCnN1bV9pbW1fZml4ZWRfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTczCiAgICAvLyBmb3IgaXRlbSBpbiBhcnI6CiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGludCAzCiAgICA8CiAgICBieiBzdW1faW1tX2ZpeGVkX2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzMtNTc0CiAgICAvLyBmb3IgaXRlbSBpbiBhcnI6CiAgICAvLyAgICAgdG90YWwgKz0gaXRlbS5mb28KICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgcHVzaGludCAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzQKICAgIC8vIHRvdGFsICs9IGl0ZW0uZm9vCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3My01NzQKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIC8vICAgICB0b3RhbCArPSBpdGVtLmZvbwogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3NAogICAgLy8gdG90YWwgKz0gaXRlbS5mb28KICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTc1CiAgICAvLyB0b3RhbCArPSBpdGVtLmJhcgogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgc3VtX2ltbV9maXhlZF9mb3JfaGVhZGVyQDEKCnN1bV9pbW1fZml4ZWRfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzYKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUudGltZXMobjogdWludDY0KSAtPiBieXRlczoKdGltZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzktNTgwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHRpbWVzKG46IFVJbnQ2NCkgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODEKICAgIC8vIHJlc3VsdCA9IFN0cmluZygpCiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODIKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2Uobik6CiAgICBpbnRjXzAgLy8gMAoKdGltZXNfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTgyCiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKG4pOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMQogICAgPAogICAgYnogdGltZXNfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU4MwogICAgLy8gcmVzdWx0ICs9IFN0cmluZygiICIpCiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGJ5dGVzICIgIgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU4MgogICAgLy8gZm9yIF9pIGluIHVyYW5nZShuKToKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHRpbWVzX2Zvcl9oZWFkZXJAMQoKdGltZXNfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODQKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLmFkZF94KGFycjogYnl0ZXMsIHg6IHVpbnQ2NCkgLT4gYnl0ZXM6CmFkZF94OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg3LTU4OAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZGRfeChhcnI6IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0sIHg6IFVJbnQ2NCkgLT4gSW1tdXRhYmxlQXJyYXlbVUludDY0XToKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzAgLy8gMAoKYWRkX3hfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBieiBhZGRfeF9hZnRlcl9mb3JANAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTkwCiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKGkpCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIGFkZF94X2Zvcl9oZWFkZXJAMQoKYWRkX3hfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1OTEKICAgIC8vIHJldHVybiBhcnIKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X3VpbnQ2NF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfdWludDY0X2FycmF5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6OTkKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoVUludDY0KDQyKSkKICAgIHB1c2hieXRlcyAweDAwMDEwMDAwMDAwMDAwMDAwMDJhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDMKICAgIC8vIGFyciA9IGFkZF94KGFyciwgVUludDY0KDUpKQogICAgcHVzaGludCA1CiAgICBjYWxsc3ViIGFkZF94CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDQKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDUKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEwNwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChVSW50NjQoNDMpKQogICAgcHVzaGludCA0MwogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDgKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDcKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgNwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTA5CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSA0MwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQzCiAgICA9PQogICAgYXNzZXJ0CiAgICBpbnRjXzIgLy8gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEwCiAgICAvLyBhc3NlcnQgYXJyWzBdID09IDQyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0MgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTk2CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKHgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfdWludDY0X2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NgogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEyCiAgICAvLyBhcnIgPSBwb3BfeChhcnIsIFVJbnQ2NCgzKSkKICAgIHB1c2hpbnQgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTk2CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKHgpOgogICAgPAogICAgYnogdGVzdF91aW50NjRfYXJyYXlfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NwogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZQogICAgYnVyeSAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NgogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X3VpbnQ2NF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfdWludDY0X2FycmF5X2FmdGVyX2ZvckA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEzCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExNAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTE2CiAgICAvLyBhcnIgPSBhZGRfeChhcnIsIFVJbnQ2NCgxMCkpCiAgICBwdXNoaW50IDEwCiAgICBjYWxsc3ViIGFkZF94CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMTcKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExOAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gOQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgOQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTIwCiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKFVJbnQ2NCg0NCkpCiAgICBwdXNoaW50IDQ0CiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjEKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEyMgogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gNDQKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0NAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTI0CiAgICAvLyBhcnIgPSBhcnIucmVwbGFjZSgyLCBVSW50NjQoMjMpKQogICAgcHVzaGludCAyMwogICAgaXRvYgogICAgcmVwbGFjZTIgMTggLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjUKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDE1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjYKICAgIC8vIGFzc2VydCBhcnJbMl0gPT0gMjMKICAgIGR1cAogICAgcHVzaGludCAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMjMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEyOAogICAgLy8gc2VsZi5hID0gYXJyCiAgICBwdXNoYnl0ZXMgImEiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6OTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2JpZ3VpbnRfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2JpZ3VpbnRfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzUKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludChUeG4ubnVtX2FwcF9hcmdzIC0gMSkpCiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGl0b2IKICAgIHB1c2hpbnQgNjQKICAgIGJ6ZXJvCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzIKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W0JpZ1VJbnRdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzUKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludChUeG4ubnVtX2FwcF9hcmdzIC0gMSkpCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHB1c2hieXRlcyAweDAwMDEKICAgIHJlcGxhY2UyIDAKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM2CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM3CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSAwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNjQKICAgICoKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWNfMCAvLyAweAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKHgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYmlndWludF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MDMKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM5CiAgICAvLyBhcnIgPSBhZGRfeGIoYXJyLCBVSW50NjQoNSkpCiAgICBwdXNoaW50IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKHgpOgogICAgPAogICAgYnogdGVzdF9iaWd1aW50X2FycmF5X2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MDQKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludChpKSkKICAgIGR1cG4gMgogICAgaXRvYgogICAgZGlnIDQKICAgIGJ8CiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfYmlndWludF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfYmlndWludF9hcnJheV9hZnRlcl9mb3JANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0MAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNgogICAgZGlnIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDEKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA2NAogICAgKgogICAgcHVzaGludCA2NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwNAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0MwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChCaWdVSW50KDIqKjUxMiAtIDEpIC0gVHhuLm51bV9hcHBfYXJncykKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpdG9iCiAgICBieXRlYyA1IC8vIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIHN3YXAKICAgIGItCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZGlnIDUKICAgIGJ8CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDQKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA3CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDUKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDIqKjUxMiAtIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA2NAogICAgKgogICAgcHVzaGludCA2NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0NgogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAwCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDY0CiAgICBieXRlY18wIC8vIDB4CiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTQ4CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKEJpZ1VJbnQoMioqNTEyIC0gMSkpCiAgICBzd2FwCiAgICBieXRlYyA1IC8vIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDkKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE1MAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMioqNTEyIC0gMQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA2NAogICAgKgogICAgcHVzaGludCA2NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA1IC8vIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTEKICAgIC8vIGFzc2VydCBhcnJbMF0gPT0gMAogICAgZHVwCiAgICBleHRyYWN0IDIgNjQKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTMKICAgIC8vIEJveChJbW11dGFibGVBcnJheVtCaWdVSW50XSwga2V5PWIiYmlndWludCIpLnZhbHVlID0gYXJyCiAgICBieXRlYyA3IC8vIDB4NjI2OTY3NzU2OTZlNzQKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgNyAvLyAweDYyNjk2Nzc1Njk2ZTc0CiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2Jvb2xfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2Jvb2xfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTcKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W2Jvb2xdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjEKICAgIC8vIGZvciBpIGluIHVyYW5nZShsZW5ndGgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYm9vbF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjEKICAgIC8vIGZvciBpIGluIHVyYW5nZShsZW5ndGgpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjIKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoaSA9PSBUeG4ubnVtX2FwcF9hcmdzKQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGRpZyAxCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGludGNfMyAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTYxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UobGVuZ3RoKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9ib29sX2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTY0CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGgKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBidXJ5IDUKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE2NgogICAgLy8gaWYgbGVuZ3RoID4gMDoKICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE2NwogICAgLy8gYXNzZXJ0IG5vdCBhcnJbMF0sICJleHBlY3RlZCBlbGVtZW50IDAgdG8gYmUgRmFsc2UiCiAgICBkaWcgMwogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZWxlbWVudCAwIHRvIGJlIEZhbHNlCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTY4CiAgICAvLyBpZiBsZW5ndGggPiAxOgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjkKICAgIC8vIGFzc2VydCBub3QgYXJyWzFdLCAiZXhwZWN0ZWQgZWxlbWVudCAxIHRvIGJlIEZhbHNlIgogICAgaW50Y18xIC8vIDEKICAgIGRpZyA0CiAgICA8CiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBwdXNoaW50IDE3CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBleHBlY3RlZCBlbGVtZW50IDEgdG8gYmUgRmFsc2UKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzAKICAgIC8vIGlmIGxlbmd0aCA+IDI6CiAgICBkaWcgMgogICAgaW50Y18yIC8vIDIKICAgID4KICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzEKICAgIC8vIGFzc2VydCBhcnJbMl0sICJleHBlY3RlZCBlbGVtZW50IDIgdG8gYmUgVHJ1ZSIKICAgIGludGNfMiAvLyAyCiAgICBkaWcgNAogICAgPAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcHVzaGludCAxOAogICAgZ2V0Yml0CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZWxlbWVudCAyIHRvIGJlIFRydWUKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTcyCiAgICAvLyBpZiBsZW5ndGggPiAzOgogICAgZGlnIDIKICAgIHB1c2hpbnQgMwogICAgPgogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE3MwogICAgLy8gYXNzZXJ0IG5vdCBhcnJbbGVuZ3RoIC0gMV0sICJleHBlY3RlZCBsYXN0IGVsZW1lbnQgdG8gYmUgRmFsc2UiCiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGludCAxNgogICAgKwogICAgZGlnIDIKICAgIHN3YXAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxhc3QgZWxlbWVudCB0byBiZSBGYWxzZQoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzUKICAgIC8vIHNlbGYuZyA9IGFycgogICAgcHVzaGJ5dGVzICJnIgogICAgZGlnIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzYKICAgIC8vIGlmIGxlbmd0aDoKICAgIGRpZyAyCiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICBkaWcgMwogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBzZXRiaXQKICAgIHN3YXAKICAgIHB1c2hpbnQgNwogICAgKwogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGludGNfMiAvLyAyCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTc4CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGggLSAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICA9PQogICAgYXNzZXJ0Cgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4MgogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXlbdHVwbGVbVUludDY0LCBVSW50NjRdXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg1CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4NQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgIDwKICAgIGJ6IHRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg2CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKChpICsgMSwgaSArIDIpKQogICAgZHVwbiAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAzCiAgICBidXJ5IDEKICAgIGIgdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg4CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA1CiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4OQogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAoVUludDY0KDEpLCBVSW50NjQoMikpCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMTYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxOTAKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IChVSW50NjQoNSksIFVJbnQ2NCg2KSkKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIHN3YXAKICAgIHB1c2hpbnQgNgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5MgogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBwdXNoaW50IDE2CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemUKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTkzCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTk0CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IChVSW50NjQoMSksIFVJbnQ2NCgyKSkKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAxNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5NQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg0KSwgVUludDY0KDUpKQogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgcHVzaGludCA0CiAgICA9PQogICAgc3dhcAogICAgcHVzaGludCA1CiAgICA9PQogICAgJiYKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTk2CiAgICAvLyBzZWxmLmMgPSBhcnIKICAgIHB1c2hieXRlcyAiYyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDAKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W015VHVwbGVdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDMKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNQogICAgPAogICAgYnogdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDQKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlUdXBsZShmb289aSwgYmFyPWkgJSAyID09IDAsIGJhej1pICogMyAlIDIgPT0gMCkpCiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAyCiAgICAlCiAgICAhCiAgICBkaWcgMQogICAgcHVzaGludCAzCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDIKICAgIGl0b2IKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDYKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwNwogICAgLy8gZm9vLCBiYXIsIGJheiA9IGFyclswXQogICAgZHVwCiAgICBleHRyYWN0IDIgOQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBwdXNoaW50IDY0CiAgICBnZXRiaXQKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA2NQogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDgKICAgIC8vIGFzc2VydCBmb28gPT0gMAogICAgdW5jb3ZlciAyCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwOQogICAgLy8gYXNzZXJ0IGJhcgogICAgc3dhcAogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTAKICAgIC8vIGFzc2VydCBiYXoKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjExCiAgICAvLyBzZWxmLmQgPSBhcnIKICAgIHB1c2hieXRlcyAiZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxOTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTUKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W3R1cGxlW1VJbnQ2NCwgQnl0ZXNdXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjE4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIxOAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgIDwKICAgIGJ6IHRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjE5CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKChpICsgMSwgb3AuYnplcm8oaSkpKQogICAgZHVwbiAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgc3dhcAogICAgYnplcm8KICAgIGRpZyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGJ5dGVjIDYgLy8gMHgwMDBhCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMwogICAgYnVyeSAxCiAgICBiIHRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyMQogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGJ1cnkgNAogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjIKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEKCnRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjIKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA8CiAgICBieiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyMwogICAgLy8gYXNzZXJ0IGFycltpXVswXSA9PSBpICsgMSwgImV4cGVjdGVkIDFzdCBlbGVtZW50IHRvIGJlIGNvcnJlY3QiCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZGlnIDYKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMXN0IGVsZW1lbnQgdG8gYmUgY29ycmVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjI0CiAgICAvLyBhc3NlcnQgYXJyW2ldWzFdLmxlbmd0aCA9PSBpLCAiZXhwZWN0ZWQgMm5kIGVsZW1lbnQgdG8gYmUgY29ycmVjdCIKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDJuZCBlbGVtZW50IHRvIGJlIGNvcnJlY3QKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2Cgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjYKICAgIC8vIGFyciA9IGFyci5wb3AoKQogICAgZGlnIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyNwogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyOAogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAoVUludDY0KDEpLCBvcC5iemVybygwKSksICJleHBlY3RlZCAxLCAwIgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgaW50Y18wIC8vIDAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDEsIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyOQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg0KSwgb3AuYnplcm8oMykpLCAiZXhwZWN0ZWQgNCwgMyIKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDQKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIHB1c2hpbnQgMwogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgNCwgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjMwCiAgICAvLyBzZWxmLmUgPSBhcnIKICAgIHB1c2hieXRlcyAiZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzQKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W015RHluYW1pY1NpemVkVHVwbGVdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzcKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjM3CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNQogICAgPAogICAgYnogdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzgKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlEeW5hbWljU2l6ZWRUdXBsZShmb289aSArIDEsIGJhcj10aW1lcyhpKSkpCiAgICBkdXBuIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBjYWxsc3ViIHRpbWVzCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyA2IC8vIDB4MDAwYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDMKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDAKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBidXJ5IDQKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNQogICAgPAogICAgYnogdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDIKICAgIC8vIGFzc2VydCBhcnJbaV1bMF0gPT0gaSArIDEsICJleHBlY3RlZCAxc3QgZWxlbWVudCB0byBiZSBjb3JyZWN0IgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGRpZyA2CiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDUKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDFzdCBlbGVtZW50IHRvIGJlIGNvcnJlY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI0MwogICAgLy8gYXNzZXJ0IGFycltpXVsxXSA9PSB0aW1lcyhpKSwgImV4cGVjdGVkIDJuZCBlbGVtZW50IHRvIGJlIGNvcnJlY3QiCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgdGltZXMKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMm5kIGVsZW1lbnQgdG8gYmUgY29ycmVjdAogICAgYnVyeSAxCiAgICBiIHRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDYKCnRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheV9hZnRlcl9mb3JAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI0NQogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBkaWcgMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ2CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ3CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IE15RHluYW1pY1NpemVkVHVwbGUoVUludDY0KDEpLCBTdHJpbmcoKSksICJleHBlY3RlZCAxLCAwIgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAiIgogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMSwgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ4CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSBNeUR5bmFtaWNTaXplZFR1cGxlKFVJbnQ2NCg0KSwgU3RyaW5nKCIgICAiKSksICJleHBlY3RlZCA0LCAzIgogICAgZGlnIDEKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgNAogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA0CiAgICA9PQogICAgc3dhcAogICAgcHVzaGJ5dGVzICIgICAiCiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBleHBlY3RlZCA0LCAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDkKICAgIC8vIHNlbGYuZiA9IGFycgogICAgcHVzaGJ5dGVzICJmIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9sb2dbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fbG9nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjUzCiAgICAvLyBsb2coYXJyKQogICAgbG9nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fZW1pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9lbWl0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU3CiAgICAvLyBhcmM0LmVtaXQoImVtaXRfdGVzdCIsIGFycikKICAgIHB1c2hieXRlcyAweGZhNDBjMDUzMDAwMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU3CiAgICAvLyBhcmM0LmVtaXQoImVtaXRfdGVzdCIsIGFycikKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X25lc3RlZF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfbmVzdGVkX2FycmF5OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMgogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjMtMjY0CiAgICAvLyAjIGFkZCBuIG5ldyBhcnJheXMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcnJfdG9fYWRkKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjMtMjY0CiAgICAvLyAjIGFkZCBuIG5ldyBhcnJheXMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcnJfdG9fYWRkKToKICAgIGR1cAogICAgZGlnIDMKICAgIDwKICAgIGJ6IHRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjUKICAgIC8vIGV4dHJhX2FyciA9IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGJ1cnkgMTIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2NgogICAgLy8gZm9yIGogaW4gdXJhbmdlKGkpOgogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjY2CiAgICAvLyBmb3IgaiBpbiB1cmFuZ2UoaSk6CiAgICBkaWcgNAogICAgZGlnIDEKICAgIDwKICAgIGJ6IHRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckA3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjcKICAgIC8vIGV4dHJhX2FyciA9IGV4dHJhX2Fyci5hcHBlbmQoaikKICAgIGRpZyA0CiAgICBkdXAKICAgIGl0b2IKICAgIGRpZyAxMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2NgogICAgLy8gZm9yIGogaW4gdXJhbmdlKGkpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiB0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDQKCnRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjY4CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKGV4dHJhX2FycikKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBkaWcgMTQKICAgIGNvbmNhdAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjYzLTI2NAogICAgLy8gIyBhZGQgbiBuZXcgYXJyYXlzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXJyX3RvX2FkZCk6CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3MC0yNzEKICAgIC8vICMgc3VtIGlubmVyIGFycmF5cyBhbmQgcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgc3VtcwogICAgLy8gdG90YWxzID0gSW1tdXRhYmxlQXJyYXlbVUludDY0XSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYnVyeSAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjcyCiAgICAvLyBmb3IgaW5uZXJfYXJyIGluIGFycjoKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgYnVyeSA5CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA3Cgp0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDEwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjcyCiAgICAvLyBmb3IgaW5uZXJfYXJyIGluIGFycjoKICAgIGRpZyA2CiAgICBkaWcgOQogICAgPAogICAgYnogdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDEzCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA3CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBidXJ5IDEyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MTAKICAgIC8vIHRvdGFsID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYxMQogICAgLy8gZm9yIGkgaW4gYXJyOgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGJ1cnkgOAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgoKdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAxNToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYxMQogICAgLy8gZm9yIGkgaW4gYXJyOgogICAgZGlnIDUKICAgIGRpZyA4CiAgICA8CiAgICBieiB0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAMTcKICAgIGRpZyAxMAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjEyCiAgICAvLyB0b3RhbCArPSBpCiAgICBkaWcgNQogICAgKwogICAgYnVyeSA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA2CiAgICBiIHRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJAMTUKCnRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckAxNzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3MwogICAgLy8gdG90YWxzID0gdG90YWxzLmFwcGVuZChzdW1fYXJyKGlubmVyX2FycikpCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDEwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAxMAogICAgZGlnIDYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDcKICAgIGIgdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAxMAoKdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2JpdF9wYWNrZWRfdHVwbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9iaXRfcGFja2VkX3R1cGxlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3OQogICAgLy8gYXJyMiA9IEltbXV0YWJsZUFycmF5W1R3b0Jvb2xUdXBsZV0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4MC0yODIKICAgIC8vIGFycjcgPSBJbW11dGFibGVBcnJheVtTZXZlbkJvb2xUdXBsZV0oKQogICAgLy8gYXJyOCA9IEltbXV0YWJsZUFycmF5W0VpZ2h0Qm9vbFR1cGxlXSgpCiAgICAvLyBhcnI5ID0gSW1tdXRhYmxlQXJyYXlbTmluZUJvb2xUdXBsZV0oKQogICAgZHVwbiAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyODgKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2JpdF9wYWNrZWRfdHVwbGVzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4OAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgIDwKICAgIGJ6IHRlc3RfYml0X3BhY2tlZF90dXBsZXNfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4OQogICAgLy8gYXJyMiA9IGFycjIuYXBwZW5kKFR3b0Jvb2xUdXBsZShhPWkgPT0gMCwgYj1pID09IDEpKQogICAgZHVwbiAyCiAgICAhCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI5MwogICAgLy8gYmFyPWkgKyAxLAogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTYKICAgIC8vIGM9aSA9PSAyLAogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjk3CiAgICAvLyBkPWkgPT0gMywKICAgIGRpZyAzCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTgKICAgIC8vIGU9aSA9PSA0LAogICAgZGlnIDQKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI5OQogICAgLy8gZj1pID09IDUsCiAgICBkaWcgNQogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzAwCiAgICAvLyBnPWkgPT0gNiwKICAgIGRpZyA2CiAgICBwdXNoaW50IDYKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTAtMzAyCiAgICAvLyBhcnI3ID0gYXJyNy5hcHBlbmQoCiAgICAvLyAgICAgU2V2ZW5Cb29sVHVwbGUoCiAgICAvLyAgICAgICAgIGZvbz1pLAogICAgLy8gICAgICAgICBiYXI9aSArIDEsCiAgICAvLyAgICAgICAgIGE9aSA9PSAwLAogICAgLy8gICAgICAgICBiPWkgPT0gMSwKICAgIC8vICAgICAgICAgYz1pID09IDIsCiAgICAvLyAgICAgICAgIGQ9aSA9PSAzLAogICAgLy8gICAgICAgICBlPWkgPT0gNCwKICAgIC8vICAgICAgICAgZj1pID09IDUsCiAgICAvLyAgICAgICAgIGc9aSA9PSA2LAogICAgLy8gICAgICkKICAgIC8vICkKICAgIGRpZyA3CiAgICBpdG9iCiAgICB1bmNvdmVyIDcKICAgIGludGNfMiAvLyAyCiAgICB1bmNvdmVyIDcKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCA1CiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCA2CiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgZHVwMgogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDkKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMxNAogICAgLy8gaD1pID09IDcsCiAgICBkaWcgNAogICAgcHVzaGludCA3CiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzAzLTMxNgogICAgLy8gYXJyOCA9IGFycjguYXBwZW5kKAogICAgLy8gICAgIEVpZ2h0Qm9vbFR1cGxlKAogICAgLy8gICAgICAgICBmb289aSwKICAgIC8vICAgICAgICAgYmFyPWkgKyAxLAogICAgLy8gICAgICAgICBhPWkgPT0gMCwKICAgIC8vICAgICAgICAgYj1pID09IDEsCiAgICAvLyAgICAgICAgIGM9aSA9PSAyLAogICAgLy8gICAgICAgICBkPWkgPT0gMywKICAgIC8vICAgICAgICAgZT1pID09IDQsCiAgICAvLyAgICAgICAgIGY9aSA9PSA1LAogICAgLy8gICAgICAgICBnPWkgPT0gNiwKICAgIC8vICAgICAgICAgaD1pID09IDcsCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDcKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkaWcgNwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgNwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzI5CiAgICAvLyBpPWkgPT0gOCwKICAgIHVuY292ZXIgMwogICAgaW50Y18zIC8vIDgKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMTctMzMxCiAgICAvLyBhcnI5ID0gYXJyOS5hcHBlbmQoCiAgICAvLyAgICAgTmluZUJvb2xUdXBsZSgKICAgIC8vICAgICAgICAgZm9vPWksCiAgICAvLyAgICAgICAgIGJhcj1pICsgMSwKICAgIC8vICAgICAgICAgYT1pID09IDAsCiAgICAvLyAgICAgICAgIGI9aSA9PSAxLAogICAgLy8gICAgICAgICBjPWkgPT0gMiwKICAgIC8vICAgICAgICAgZD1pID09IDMsCiAgICAvLyAgICAgICAgIGU9aSA9PSA0LAogICAgLy8gICAgICAgICBmPWkgPT0gNSwKICAgIC8vICAgICAgICAgZz1pID09IDYsCiAgICAvLyAgICAgICAgIGg9aSA9PSA3LAogICAgLy8gICAgICAgICBpPWkgPT0gOCwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAzCiAgICBidXJ5IDEKICAgIGIgdGVzdF9iaXRfcGFja2VkX3R1cGxlc19mb3JfaGVhZGVyQDIKCnRlc3RfYml0X3BhY2tlZF90dXBsZXNfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzMKICAgIC8vIGFzc2VydCBhcnIyLmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzQKICAgIC8vIGFzc2VydCBhcnI3Lmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzUKICAgIC8vIGFzc2VydCBhcnI4Lmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzYKICAgIC8vIGFzc2VydCBhcnI5Lmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzcKICAgIC8vIHNlbGYuYm9vbDIgPSBhcnIyCiAgICBwdXNoYnl0ZXMgImJvb2wyIgogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzM4CiAgICAvLyBzZWxmLmJvb2w3ID0gYXJyNwogICAgcHVzaGJ5dGVzICJib29sNyIKICAgIHVuY292ZXIgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMzOQogICAgLy8gc2VsZi5ib29sOCA9IGFycjgKICAgIHB1c2hieXRlcyAiYm9vbDgiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNDAKICAgIC8vIHNlbGYuYm9vbDkgPSBhcnI5CiAgICBwdXNoYnl0ZXMgImJvb2w5IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzOgogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTAKICAgIC8vIHN1bTEgPSBzdW0yID0gc3VtMyA9IHN1bTQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUxCiAgICAvLyBmb3IgaSBpbiBhcnIxOgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMCAvLyAwCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MQogICAgLy8gZm9yIGkgaW4gYXJyMToKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDUKICAgIGRpZyA5CiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTIKICAgIC8vIHN1bTEgKz0gaQogICAgZGlnIDQKICAgICsKICAgIGJ1cnkgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMgoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MwogICAgLy8gZm9yIGIgaW4gYXJyMjoKICAgIGRpZyA4CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgYnVyeSAxNwogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUzCiAgICAvLyBmb3IgYiBpbiBhcnIyOgogICAgZGlnIDEyCiAgICBkaWcgMTcKICAgIDwKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDExCiAgICBkaWcgMTIKICAgIHB1c2hpbnQgMTYKICAgICsKICAgIGRpZyA5CiAgICBzd2FwCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1NAogICAgLy8gaWYgYjoKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTUKICAgIC8vIHN1bTIgKz0gMQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDQKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUA5OgogICAgZGlnIDEyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxMwogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJANgoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTYKICAgIC8vIGZvciB0dXAgaW4gYXJyMzoKICAgIGRpZyA3CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgYnVyeSAxNgogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTIKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckAxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1NgogICAgLy8gZm9yIHR1cCBpbiBhcnIzOgogICAgZGlnIDExCiAgICBkaWcgMTYKICAgIDwKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDE5CiAgICBkaWcgNwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxMgogICAgcHVzaGludCA5CiAgICAqCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBwdXNoaW50IDY0CiAgICBnZXRiaXQKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA2NQogICAgZ2V0Yml0CiAgICBidXJ5IDEzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTcKICAgIC8vIHN1bTMgKz0gdHVwLmZvbwogICAgZGlnIDYKICAgIHVuY292ZXIgMgogICAgKwogICAgYnVyeSA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTgKICAgIC8vIGlmIHR1cC5iYXI6CiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1OQogICAgLy8gc3VtMyArPSAxCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYwCiAgICAvLyBpZiB0dXAuYmF6OgogICAgZGlnIDEwCiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM2MQogICAgLy8gc3VtMyArPSAxCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9pZl9lbHNlQDE3OgogICAgZGlnIDExCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxMgogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMTIKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDE5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYyCiAgICAvLyBmb3IgaWR4LCBkeW5fdHVwIGluIHVlbnVtZXJhdGUoYXJyNCk6CiAgICBkaWcgNgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGJ1cnkgMTUKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMjA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjIKICAgIC8vIGZvciBpZHgsIGR5bl90dXAgaW4gdWVudW1lcmF0ZShhcnI0KToKICAgIGRpZyAxMwogICAgZGlnIDE1CiAgICA8CiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAyMwogICAgZGlnIDYKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMTQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkaWcgMTgKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYzCiAgICAvLyBzdW00ICs9IGR5bl90dXAuZm9vCiAgICBkaWcgOQogICAgdW5jb3ZlciAyCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjQKICAgIC8vIHN1bTQgKz0gZHluX3R1cC5iYXIuYnl0ZXMubGVuZ3RoCiAgICBzd2FwCiAgICBsZW4KICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICBidXJ5IDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM2NQogICAgLy8gYXNzZXJ0IGR5bl90dXAuYmFyLmJ5dGVzLmxlbmd0aCA9PSBpZHgsICJleHBlY3RlZCBzdHJpbmcgbGVuZ3RoIHRvIG1hdGNoIGluZGV4IgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHN0cmluZyBsZW5ndGggdG8gbWF0Y2ggaW5kZXgKICAgIGJ1cnkgMTQKICAgIGIgc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19mb3JfaGVhZGVyQDIwCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAyMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAyCiAgICBpdG9iCiAgICBkaWcgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNgogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X3VpbnQ2NF9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3VpbnQ2NF9yZXR1cm46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzEKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIHB1c2hieXRlcyAweDAwMDMwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF91aW50NjRfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X3VpbnQ2NF9yZXR1cm5fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChpKQogICAgZHVwbiAyCiAgICBpdG9iCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzcyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF91aW50NjRfcmV0dXJuX2Zvcl9oZWFkZXJAMgoKdGVzdF91aW50NjRfcmV0dXJuX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfYm9vbF9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2Jvb2xfcmV0dXJuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc4CiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheSgoVHJ1ZSwgRmFsc2UsIFRydWUsIEZhbHNlLCBUcnVlKSkKICAgIHB1c2hieXRlcyAweDAwMDVhOAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2Jvb2xfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3OQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2Jvb2xfcmV0dXJuX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODAKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoaSAlIDIgPT0gMCkKICAgIGR1cG4gMgogICAgaW50Y18yIC8vIDIKICAgICUKICAgICEKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGludGNfMyAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9ib29sX3JldHVybl9mb3JfaGVhZGVyQDIKCnRlc3RfYm9vbF9yZXR1cm5fYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF90dXBsZV9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3R1cGxlX3JldHVybjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NQogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXkoKE15VHVwbGUoVUludDY0KCksIFRydWUsIEZhbHNlKSwpKQogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDAwMDAwMDAwMDAwMDA4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzg2CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X3R1cGxlX3JldHVybl9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODYKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF90dXBsZV9yZXR1cm5fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChNeVR1cGxlKGZvbz1pLCBiYXI9aSAlIDIgPT0gMCwgYmF6PWkgJSAzID09IDApKQogICAgZHVwbiAyCiAgICBpbnRjXzIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDEKICAgIHB1c2hpbnQgMwogICAgJQogICAgIQogICAgZGlnIDIKICAgIGl0b2IKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfdHVwbGVfcmV0dXJuX2Zvcl9oZWFkZXJAMgoKdGVzdF90dXBsZV9yZXR1cm5fYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9keW5hbWljX3R1cGxlX3JldHVybltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZHluYW1pY190dXBsZV9yZXR1cm46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTIKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5KChNeUR5bmFtaWNTaXplZFR1cGxlKFVJbnQ2NCgpLCBTdHJpbmcoIkhlbGxvIikpLCkpCiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDBhMDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9keW5hbWljX3R1cGxlX3JldHVybl9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF9keW5hbWljX3R1cGxlX3JldHVybl9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzk0CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKE15RHluYW1pY1NpemVkVHVwbGUoaSwgdGltZXMoaSkpKQogICAgZHVwbiAyCiAgICBjYWxsc3ViIHRpbWVzCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyA2IC8vIDB4MDAwYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfZHluYW1pY190dXBsZV9yZXR1cm5fZm9yX2hlYWRlckAyCgp0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFja1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFjazoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwMgogICAgLy8gbXV0YWJsZS5leHRlbmQoYXJyKQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwNAogICAgLy8gbXV0YWJsZS5hcHBlbmQoTXlUdXBsZShmb289aSwgYmFyPWkgJSAyID09IDAsIGJhej1pICUgMyA9PSAwKSkKICAgIGR1cG4gMgogICAgaW50Y18yIC8vIDIKICAgICUKICAgICEKICAgIGRpZyAxCiAgICBwdXNoaW50IDMKICAgICUKICAgICEKICAgIGRpZyA0CiAgICBjb3ZlciAzCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgYnVyeSAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MDMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfZm9yX2hlYWRlckAyCgp0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDA1CiAgICAvLyByZXR1cm4gbXV0YWJsZS5mcmVlemUoKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOQogICAgLwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDExCiAgICAvLyBwcmVmaXggPSBJbW11dGFibGVBcnJheSgoYXJjNC5VSW50NjQoMSksIGFyYzQuVUludDY0KDIpKSkKICAgIGJ5dGVjIDggLy8gMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxMgogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZXh0cmFjdCA4IDgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQyMAogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxOQogICAgLy8gcHJlZml4ID0gSW1tdXRhYmxlQXJyYXkoKGFyYzQuVUludDY0KDEpLCBhcmM0LlVJbnQ2NCgyKSkpCiAgICBieXRlYyA4IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjAKICAgIC8vIHJlc3VsdCA9IHByZWZpeCArIGFyZwogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBwdXNoYnl0ZXMgMHgwMDA0CiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfYXJjNF90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9hcmM0X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDI4CiAgICAvLyByZXN1bHQgPSBwcmVmaXggKyBhcmcKICAgIGV4dHJhY3QgNCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjcKICAgIC8vIHByZWZpeCA9IEltbXV0YWJsZUFycmF5KChhcmM0LlN0cmluZygiYSIpLCBhcmM0LlN0cmluZygiYiIpKSkKICAgIGJ5dGVjIDkgLy8gMHgwMDAyMDAwNDAwMDcwMDAxNjEwMDAxNjIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQyOAogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDM2CiAgICAvLyByZXN1bHQgPSBwcmVmaXggKyBhcmcKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDM1CiAgICAvLyBwcmVmaXggPSBJbW11dGFibGVBcnJheSgoYXJjNC5TdHJpbmcoImEiKSwgYXJjNC5TdHJpbmcoImIiKSkpCiAgICBieXRlYyA5IC8vIDB4MDAwMjAwMDQwMDA3MDAwMTYxMDAwMTYyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MzYKICAgIC8vIHJlc3VsdCA9IHByZWZpeCArIGFyZwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2NvbmNhdF9pbW11dGFibGVfZHluYW1pYzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ0MwogICAgLy8gcmV0dXJuIGltbTEgKyBpbW0yCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgZXh0cmFjdCAyIDAKICAgIHVuY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FyYzRbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcmM0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ3CiAgICAvLyBhc3NlcnQgaW1tLCAiZXhwZWN0ZWQgbm9uIGVtcHR5IGFycmF5IgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgbm9uIGVtcHR5IGFycmF5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NDgKICAgIC8vIGltbSA9IGltbS5yZXBsYWNlKGltbS5sZW5ndGggLSAxLCBpbW1bMF0pCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAxNgogICAgc3dhcAogICAgcHVzaGludCAxNgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIHN3YXAKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9pbW1fZml4ZWRfYXJyW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9pbW1fZml4ZWRfYXJyOgogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDUzCiAgICAvLyBhcnIxID0gemVyb19ieXRlcyhOYXRpdmVTdHJ1Y3QzKQogICAgcHVzaGludCA0OAogICAgYnplcm8KICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU0CiAgICAvLyBzdHJ1Y3QxMiA9IE5hdGl2ZVN0cnVjdChUeG4ubnVtX2FwcF9hcmdzICsgMSwgVHhuLm51bV9hcHBfYXJncyArIDIpCiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ1NQogICAgLy8gYXJyMiA9IE5hdGl2ZVN0cnVjdDMoKHN0cnVjdDEyLCBzdHJ1Y3QxMiwgc3RydWN0MTIpKQogICAgZHVwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU3CiAgICAvLyBhc3NlcnQgYXJyMSAhPSBhcnIyLCAiZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIGRpZmZlcmVudCIKICAgICE9CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIGRpZmZlcmVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDYwCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2MAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDMpOgogICAgZHVwCiAgICBwdXNoaW50IDMKICAgIDwKICAgIGJ6IHRlc3RfaW1tX2ZpeGVkX2Fycl9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDYxCiAgICAvLyBhcnIxID0gYXJyMS5yZXBsYWNlKGksIHN0cnVjdDEyKQogICAgZHVwbiAyCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZGlnIDUKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnVyeSA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NjAKICAgIC8vIGZvciBpIGluIHVyYW5nZSgzKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJAMgoKdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDYzCiAgICAvLyBhc3NlcnQgYXJyMSA9PSBhcnIyLCAiZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIHRoZSBzYW1lIgogICAgZGlnIDMKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFycmF5cyB0byBiZSB0aGUgc2FtZQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2NQogICAgLy8gZm9yIHN0cnVjdF9pdCBpbiBhcnIxOgogICAgZGlnIDQKICAgIHB1c2hpbnQgMwogICAgPAogICAgYnogdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA5CiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgcHVzaGludCAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NjYKICAgIC8vIGFzc2VydCBzdHJ1Y3RfaXQgPT0gc3RydWN0MTIsICJleHBlY3RlZCBpdGVtcyBvbiBpdGVyYXRpb24gdG8gYmUgdGhlIHNhbWUiCiAgICBkaWcgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBpdGVtcyBvbiBpdGVyYXRpb24gdG8gYmUgdGhlIHNhbWUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDUKICAgIGIgdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJANgoKdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDY4CiAgICAvLyBzZWxmLmltbV9maXhlZF9hcnIgPSBhcnIxCiAgICBieXRlYyAxMCAvLyAiaW1tX2ZpeGVkX2FyciIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzIKICAgIC8vIGFzc2VydCBzdW1faW1tX2ZpeGVkKG11dF9hcnIuZnJlZXplKCkpID09IDE1LCAiZXhwZWN0ZWQgc3VtIHRvIGJlIDE1IgogICAgZHVwCiAgICBjYWxsc3ViIHN1bV9pbW1fZml4ZWQKICAgIHB1c2hpbnQgMTUKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgc3VtIHRvIGJlIDE1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzQKICAgIC8vIG11dF9hcnJbMF0gPSBOYXRpdmVTdHJ1Y3QoVUludDY0KCksIFVJbnQ2NCgpKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDAgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzUKICAgIC8vIGFzc2VydCBzdW1faW1tX2ZpeGVkKG11dF9hcnIuZnJlZXplKCkpID09IDEwLCAiZXhwZWN0ZWQgc3VtIHRvIGJlIDEwIgogICAgY2FsbHN1YiBzdW1faW1tX2ZpeGVkCiAgICBwdXNoaW50IDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHN1bSB0byBiZSAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDc3CiAgICAvLyByZXR1cm4gc2VsZi5pbW1fZml4ZWRfYXJyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImltbV9maXhlZF9hcnIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1tX2ZpeGVkX2FyciBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAAECCCYLAAQVH3x1AgAAAQACAAJA/////////////////////////////////////////////////////////////////////////////////////wIACgdiaWd1aW50EgACAAAAAAAAAAEAAAAAAAAAAgwAAgAEAAcAAWEAAWINaW1tX2ZpeGVkX2FycjEbQQC3MRkURDEYRIIYBETUL5kEt+qmCwR0PXDtBBx+BJQEotWGCwTgX8VkBB4JK4MEATECYgTIZUqYBInRlvgEbLfJkQSYmL8CBPa2HugEYLhqewRzrSg/BFKd+ukEIG1RTwTgZGXiBOwDAKIE7N8UrwRRGspkBCmFLk8EbUqjWAS3y5a9NhoAjhgCaQNQBHoFNQXlBkoHfAixCLcIxgmjCsEL8gw+DHEMww0jDXINiw2nDboN4w4MDikAMRkUMRgUEEOKAgKL/iJZIwkWVwYAi/5MXABJFYv/CUqL/1hPAiJPA1KJigECi/8iWSMJSSQLSYv/VwIASU4CSU8CWUlPAkkVTE4CUigiiwaLAQxBABuLAosGSU4CWSQJFlcGAosFTFCMBSQIjAZC/92LABZXBgKLBVCLASQIiwJMiwNSUIsEjACMAYmKBAEoRwKL/CJZRwKL/ghJFlcGAIv8TFwATgJMgQcIJQpJTwKBBwglCklOAgxBAAyLBosFCa+LBExQjAQijACLA4EQCEmMAov+CIwBiwKLAQxBACCL/YsASU4CU4sEiwJJTgNPAlSMBCMIjAKL/wiMAEL/2IsEjACJigMBi/0iWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJIosEiwIMQQAjiwNJFlcGAosBiwRJTgRPAl1JjAFLAVkkCAiMAyQIjARC/9WLAIsBUIwAiYoEAShJi/4kC4v8JAsiiwSLAwxBAByL/YsESU4CWYsCCBZXBgKLAUxQjAEkCIwEQv/ci/0VjAAijASLBIsCDEEAHIv/iwRJTgJZiwAIFlcGAosBTFCMASQIjARC/9yL/Iv+CBZXBgKLAVCL/YsDiwBSUIv/FYv/iwJPAlJQjACJigEBIkmLAYEDDEEAH4sBSYEQC4v/TIEQWEkiW4sACEwlWwiMACMIjAFC/9mJigEBKCKLAYv/DEEAEYsAgAEgUIwAiwEjCIwBQv/niYoCASKLAIv/DEEAHYsASRaL/kxQi/4iWSMIFlcGAlwAjP4jCIwAQv/bi/5MiYAKAAEAAAAAAAAAKoEFiP/CSSJZSYEGEkRJIwlLAlcCAEwlC1uBBBJEgSsWTwJMUEwjCBZXBgJcAEcCIllJgQcSRCMJSwFXAgBMJQtbgSsSRCRbgSoSRCJJgQMMQQARSwEliP07RQNISSMIRQFC/+hLAUkiWUmBBBJEIwlLAVcCAEwlC1skEkSBCoj/RkkiWUmBDhJESSMJSwJXAgBMJQtbgQkSRIEsFk8CTFBMIwgWVwYCXABJIllJgQ8SRCMJSwFXAgBMJQtbgSwSRIEXFlwSSSJZgQ8SREmBEluBFxJEgAFhTGcjQzEbIwkWgUCvSU4CqypMUIACAAFcAEcCIllJIxJEIwlMVwIATIFAC4FAWCioRCJJgQUMQQAgRwIWSwSrSwNJTwJQTCJZIwgWVwYCXABFAyMIRQFC/9lLAUkiWUmBBhJESSMJSwJXAgBMgUALgUBYgAEEqEQxGxYnBUyhSRWBQA5ESwWrTwJMUEwjCBZXBgJcAEkiWUmBBxJESSMJSwJXAgBMgUALgUBYgED////////////////////////////////////////////////////////////////////////////////////+qERLAVcCQCioREwnBVBMIwgWVwYCXABJIllJJRJEIwlLAVcCAEyBQAuBQFgnBahESVcCQCioRCcHvEgnB0y/I0MoNhoBFyoiSUsDDEEAHjEbSwFJTwISKyJPAlRLA0wjJYj78EUDIwhFAUL/20sBIllJRQVLA0lOAhJEQQAKSwNESwGBEFMUREsCIw1BAAwjSwQMREsBgRFTFERLAiQNQQALJEsEDERLAYESU0RLAoEDDUEAEksCIwlJSwUMRIEQCEsCTFMURIABZ0sCZ0sCQQAoSwMjCUkWVwYASwNMXABLAYEQCCJUTIEHCCUKJAgiTFIiWUsDIwkSRCNDKiJJgQUMQQAlRwIjCEwkCEsBFkwWUEsDSU8CUEwiWSMIFlcGAlwARQNFAUL/1EsBSSJZSYEFEkRLAVcCAEsCVwIQSSJbTCVbTCMSTCQSEERMIwmBEAuBEFhJIltMJVtMgQUSTIEGEhBEgRCI+mZFAUkiWUmBBBJESwFXAgBLAlcCEEkiW0wlW0wjEkwkEhBETCMJgRALgRBYSSJbTCVbTIEEEkyBBRIQRIABY0xnI0MqIkmBBQxBADRHAiQYFEsBgQMLJBgUSwIWKyJPBFQjTwNUUEsDSU8CUEwiWSMIFlcGAlwARQMjCEUBQv/FSwFJIlmBBRJESVcCCUkiW0sBgUBTTwKBQVNPAhRETEREgAFkTGcjQygqIkmBBQxBADVHAiMITK9LA0kiWUxXAgBLAxZLAxUWVwYCTwRQTCcGUExQJwRMUE4CI08DiPruRQNFAUL/xEsBIllJRQSBBRJEIkUBSYEFDEEAT0sBVwIASwFJTgIkC0sBTFlLAiMISwZLAQlLAxVLAiQLSwVMWU8CTU8DTwNPAlJJIltLASVZSwIVTwNOAlJXAgBMSwISRBVPAhJERQFC/6pLAYj5OUUBSSJZSYEEEkRLAVcCAEkiWUsCIwlLAhVLAyRZSwFMSwNNSwRPBE8CUkkiW0sBJVlLAhVPA04CUlcCAEwjEiKvTwISEERLASQLSwNMWU8CIwhPBEsBCUwkC0sETFlPA0xPAk1SSSJbSwElWUsCFU8DTgJSVwIATIEEEoEDr08CEhBEgAFlTGcjQygqIkmBBQxBADdHAiMITIj6j0sDSSJZTFcCAEsDFksDFRZXBgJPBFBMJwZQTFAnBExQTgIjTwOI+bpFA0UBQv/CSwEiWUlFBIEFEkQiRQFJgQUMQQBRSwFXAgBLAUlOAiQLSwFMWUsCIwhLBksBCUsDFUsCJAtLBUxZTwJNTwNPA08CUkkiW0sBJVlLAhVPA04CUlcCAExLAhJETwKI+gESREUBQv+oSwGI+ANFAUkiWUmBBBJESwFXAgBJIllLAiMJSwIVSwMkWUsBTEsDTUsETwRPAlJJIltLASVZSwIVTwNOAlJXAgBMIxJMKBIQREsBJAtLA0xZTwIjCE8ESwEJTCQLSwRMWU8DTE8CTVJJIltLASVZSwIVTwNOAlJXAgBMgQQSTIADICAgEhBEgAFmTGcjQzYaAbAjQ4AG+kDAUwACNhoBULAjQyJHAihHBTYaARc2GgIiSUsDDEEATCpFDCJFBUsESwEMQQAeSwRJFksNSU8CUEwiWSMIFlcGAlwARQ0jCEUFQv/aSwFJIllMVwIAJwRLDlBOAiNPA4j4U0UCSSMIRQFC/60qRQpLASJZRQkiRQdLBksJDEEAYUsBVwIASwckC0sBTFlKWSULJAhYSUUMIkUFIllFCCJFBksFSwgMQQAZSwpXAgBLBklOAiULW0sFCEUFIwhFBkL/30sDFksKSU8CUEwiWSMIFlcGAlwARQpLBiMIRQdC/5cpSwpQsCNDKkcDIkmBBQxBAMZHAhRLASMSKyJPA1QjTwJUSwZJTgJLAVBPAiJZIwgWVwYCXABFB0sBIwhLAiQSSwOBAxJLBIEEEksFgQUSSwaBBhJLBxZPByRPB1SBA08GVIEETwVUgQVPBFSBBk8DVEpQSwMWTEsBUEsJSU8CUEwiWSMIFlcGAlwARQlLBIEHEk8CgQdPAlRPAkxQSUsCUEsHSU8CUEwiWSMIFlcGAlwARQdPAyUSKyJPAlRQTFBLA0lPAlBMIlkjCBZXBgJcAEUDRQFC/zNLBEkiWYEFEkRLBEkiWYEFEkRLBEkiWYEFEkRLBEkiWYEFEkSABWJvb2wyTwRngAVib29sN08DZ4AFYm9vbDhPAmeABWJvb2w5TGcjQyhHBjYaATYaAjYaAzYaBCJHAzYaASJZIklLAgxBABlLCVcCAEsBSU4CJQtbSwQIRQQjCEUBQv/gSwgiWUURIkUNSwxLEQxBABtLDIEQCEsJTFNBAAZLAyMIRQRLDCMIRQ1C/91LByJZRRAiRQxLC0sQDEEAQEsHVwIASwyBCQuBCVhJIltLAYFAU08CgUFTRQ1LBk8CCEUGQQAGSwQjCEUFSwpBAAZLBCMIRQVLCyMIRQxC/7hLBiJZRQ8iRQ5LDUsPDEEAVksGVwIASw5JTgIkC0sBTFlLAiMISxJLAQlLAxVLAiQLSwVMWU8CTU8DTwNPAlJJIltLASVZSwIVTwNOAlJXAgBLCU8CCEwVTEsBCEUJTwISREUOQv+iSwIWSwQWUEsFFlBLBhZQKUxQsCNDNhoBF4AaAAMAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAMiSUsDDEEAHUcCFksDSU8CUEwiWSMIFlcGAlwARQMjCEUBQv/cKUsCULAjQzYaAReAAwAFqCJJSwMMQQAbRwIkGBQrIk8CVEsDTCMliPQsRQMjCEUBQv/eKUsCULAjQzYaAReACwABAAAAAAAAAACAIklLAwxBADJHAiQYFEsBgQMYFEsCFisiTwRUI08DVFBLA0lPAlBMIlkjCBZXBgJcAEUDIwhFAUL/xylLAlCwI0M2GgEXgBUAAQACAAAAAAAAAAAACgAFSGVsbG8iSUsDDEEANkcCiPUySwNJIllMVwIASwMWSwMVFlcGAk8EUEwnBlBMUCcETFBOAiNPA4j0XUUDIwhFAUL/wylLAlCwI0M2GgE2GgIXTFcCACJJSwMMQQApRwIkGBRLAYEDGBRLBE4DSwIWKyJPBFQjTwNUUE8CTFBFAyMIRQFC/9BLAUkVgQkKFlcGAkxQKUxQsCNDJwg2GgFQSVcCABUlChZXBgJcAClMULAjQzYaAUlXAAhMVwgIUCcITFCAAgAEXAApTFCwI0M2GgFXBAAnCUwkiPNSKUxQsCNDNhoBSSJZSwEkWUsCTwJLAlJLAhVPA08DTwJSUCcJTCSI8ykpTFCwI0M2GgE2GgJLASJZTwJXAgBLAlcCAE8DIllPA08DTwJPA4jzailMULAjQzYaAUkiWUlEIwlLAVcCEEyBEAskCExdKUxQsCNDKIEwr0kxGyMIMRskCEwWTBZQSU4CSUsBUExQSU4CE0QiSYEDDEEAFEcCgRALSwVMSwVdRQUjCEUBQv/lSwNLAhJEIkUFSwSBAwxBABdLBEmBEAtLBUyBEFhLBBJEIwhFBUL/4ScKSwRJTgJnSYjzV4EPEkSAEAAAAAAAAAAAAAAAAAAAAABcAIjzPIEKEkQiJwplRClMULAjQw==","clear":"C4EBQw=="},"events":[{"name":"emit_test","args":[{"type":"uint64[]","name":"field1"}]}],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the ImmutableArrayContract contract - */ -export type ImmutableArrayContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'test_uint64_array()void': Record - 'test_biguint_array()void': Record - 'test_bool_array(uint64)void': { - length: bigint | number - } - 'test_fixed_size_tuple_array()void': Record - 'test_fixed_size_named_tuple_array()void': Record - 'test_dynamic_sized_tuple_array()void': Record - 'test_dynamic_sized_named_tuple_array()void': Record - 'test_implicit_conversion_log(uint64[])void': { - arr: bigint[] | number[] - } - 'test_implicit_conversion_emit(uint64[])void': { - arr: bigint[] | number[] - } - 'test_nested_array(uint64,uint64[][])uint64[]': { - arrToAdd: bigint | number - arr: bigint[] | number[][] - } - 'test_bit_packed_tuples()void': Record - 'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)': { - arr1: bigint[] | number[] - arr2: boolean[] - arr3: [bigint | number, boolean, boolean][] - arr4: [bigint | number, string][] - } - 'test_uint64_return(uint64)uint64[]': { - append: bigint | number - } - 'test_bool_return(uint64)bool[]': { - append: bigint | number - } - 'test_tuple_return(uint64)(uint64,bool,bool)[]': { - append: bigint | number - } - 'test_dynamic_tuple_return(uint64)(uint64,string)[]': { - append: bigint | number - } - 'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]': { - arr: [bigint | number, boolean, boolean][] - append: bigint | number - } - 'test_concat_with_arc4_tuple((uint64,uint64))uint64[]': { - arg: [bigint | number, bigint | number] - } - 'test_concat_with_native_tuple((uint64,uint64))uint64[]': { - arg: [bigint | number, bigint | number] - } - 'test_dynamic_concat_with_arc4_tuple((string,string))string[]': { - arg: [string, string] - } - 'test_dynamic_concat_with_native_tuple((string,string))string[]': { - arg: [string, string] - } - 'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]': { - imm1: [bigint | number, string][] - imm2: [bigint | number, string][] - } - 'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]': { - imm: [bigint | number, bigint | number][] - } - 'test_imm_fixed_arr()(uint64,uint64)[3]': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'test_uint64_array()void': [] - 'test_biguint_array()void': [] - 'test_bool_array(uint64)void': [length: bigint | number] - 'test_fixed_size_tuple_array()void': [] - 'test_fixed_size_named_tuple_array()void': [] - 'test_dynamic_sized_tuple_array()void': [] - 'test_dynamic_sized_named_tuple_array()void': [] - 'test_implicit_conversion_log(uint64[])void': [arr: bigint[] | number[]] - 'test_implicit_conversion_emit(uint64[])void': [arr: bigint[] | number[]] - 'test_nested_array(uint64,uint64[][])uint64[]': [arrToAdd: bigint | number, arr: bigint[] | number[][]] - 'test_bit_packed_tuples()void': [] - 'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)': [arr1: bigint[] | number[], arr2: boolean[], arr3: [bigint | number, boolean, boolean][], arr4: [bigint | number, string][]] - 'test_uint64_return(uint64)uint64[]': [append: bigint | number] - 'test_bool_return(uint64)bool[]': [append: bigint | number] - 'test_tuple_return(uint64)(uint64,bool,bool)[]': [append: bigint | number] - 'test_dynamic_tuple_return(uint64)(uint64,string)[]': [append: bigint | number] - 'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]': [arr: [bigint | number, boolean, boolean][], append: bigint | number] - 'test_concat_with_arc4_tuple((uint64,uint64))uint64[]': [arg: [bigint | number, bigint | number]] - 'test_concat_with_native_tuple((uint64,uint64))uint64[]': [arg: [bigint | number, bigint | number]] - 'test_dynamic_concat_with_arc4_tuple((string,string))string[]': [arg: [string, string]] - 'test_dynamic_concat_with_native_tuple((string,string))string[]': [arg: [string, string]] - 'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]': [imm1: [bigint | number, string][], imm2: [bigint | number, string][]] - 'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]': [imm: [bigint | number, bigint | number][]] - 'test_imm_fixed_arr()(uint64,uint64)[3]': [] - } -} - -/** - * The return type for each method - */ -export type ImmutableArrayContractReturns = { - 'test_uint64_array()void': void - 'test_biguint_array()void': void - 'test_bool_array(uint64)void': void - 'test_fixed_size_tuple_array()void': void - 'test_fixed_size_named_tuple_array()void': void - 'test_dynamic_sized_tuple_array()void': void - 'test_dynamic_sized_named_tuple_array()void': void - 'test_implicit_conversion_log(uint64[])void': void - 'test_implicit_conversion_emit(uint64[])void': void - 'test_nested_array(uint64,uint64[][])uint64[]': bigint[] - 'test_bit_packed_tuples()void': void - 'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)': [bigint, bigint, bigint, bigint] - 'test_uint64_return(uint64)uint64[]': bigint[] - 'test_bool_return(uint64)bool[]': boolean[] - 'test_tuple_return(uint64)(uint64,bool,bool)[]': [bigint, boolean, boolean][] - 'test_dynamic_tuple_return(uint64)(uint64,string)[]': [bigint, string][] - 'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]': [bigint, boolean, boolean][] - 'test_concat_with_arc4_tuple((uint64,uint64))uint64[]': bigint[] - 'test_concat_with_native_tuple((uint64,uint64))uint64[]': bigint[] - 'test_dynamic_concat_with_arc4_tuple((string,string))string[]': string[] - 'test_dynamic_concat_with_native_tuple((string,string))string[]': string[] - 'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]': [bigint, string][] - 'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]': [bigint, bigint][] - 'test_imm_fixed_arr()(uint64,uint64)[3]': [[bigint, bigint], [bigint, bigint], [bigint, bigint]] -} - -/** - * Defines the types of available calls and state of the ImmutableArrayContract smart contract. - */ -export type ImmutableArrayContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'test_uint64_array()void' | 'test_uint64_array', { - argsObj: ImmutableArrayContractArgs['obj']['test_uint64_array()void'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_uint64_array()void'] - returns: ImmutableArrayContractReturns['test_uint64_array()void'] - }> - & Record<'test_biguint_array()void' | 'test_biguint_array', { - argsObj: ImmutableArrayContractArgs['obj']['test_biguint_array()void'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_biguint_array()void'] - returns: ImmutableArrayContractReturns['test_biguint_array()void'] - }> - & Record<'test_bool_array(uint64)void' | 'test_bool_array', { - argsObj: ImmutableArrayContractArgs['obj']['test_bool_array(uint64)void'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_bool_array(uint64)void'] - returns: ImmutableArrayContractReturns['test_bool_array(uint64)void'] - }> - & Record<'test_fixed_size_tuple_array()void' | 'test_fixed_size_tuple_array', { - argsObj: ImmutableArrayContractArgs['obj']['test_fixed_size_tuple_array()void'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_fixed_size_tuple_array()void'] - returns: ImmutableArrayContractReturns['test_fixed_size_tuple_array()void'] - }> - & Record<'test_fixed_size_named_tuple_array()void' | 'test_fixed_size_named_tuple_array', { - argsObj: ImmutableArrayContractArgs['obj']['test_fixed_size_named_tuple_array()void'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_fixed_size_named_tuple_array()void'] - returns: ImmutableArrayContractReturns['test_fixed_size_named_tuple_array()void'] - }> - & Record<'test_dynamic_sized_tuple_array()void' | 'test_dynamic_sized_tuple_array', { - argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_sized_tuple_array()void'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_sized_tuple_array()void'] - returns: ImmutableArrayContractReturns['test_dynamic_sized_tuple_array()void'] - }> - & Record<'test_dynamic_sized_named_tuple_array()void' | 'test_dynamic_sized_named_tuple_array', { - argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_sized_named_tuple_array()void'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_sized_named_tuple_array()void'] - returns: ImmutableArrayContractReturns['test_dynamic_sized_named_tuple_array()void'] - }> - & Record<'test_implicit_conversion_log(uint64[])void' | 'test_implicit_conversion_log', { - argsObj: ImmutableArrayContractArgs['obj']['test_implicit_conversion_log(uint64[])void'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_implicit_conversion_log(uint64[])void'] - returns: ImmutableArrayContractReturns['test_implicit_conversion_log(uint64[])void'] - }> - & Record<'test_implicit_conversion_emit(uint64[])void' | 'test_implicit_conversion_emit', { - argsObj: ImmutableArrayContractArgs['obj']['test_implicit_conversion_emit(uint64[])void'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_implicit_conversion_emit(uint64[])void'] - returns: ImmutableArrayContractReturns['test_implicit_conversion_emit(uint64[])void'] - }> - & Record<'test_nested_array(uint64,uint64[][])uint64[]' | 'test_nested_array', { - argsObj: ImmutableArrayContractArgs['obj']['test_nested_array(uint64,uint64[][])uint64[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_nested_array(uint64,uint64[][])uint64[]'] - returns: ImmutableArrayContractReturns['test_nested_array(uint64,uint64[][])uint64[]'] - }> - & Record<'test_bit_packed_tuples()void' | 'test_bit_packed_tuples', { - argsObj: ImmutableArrayContractArgs['obj']['test_bit_packed_tuples()void'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_bit_packed_tuples()void'] - returns: ImmutableArrayContractReturns['test_bit_packed_tuples()void'] - }> - & Record<'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)' | 'sum_uints_and_lengths_and_trues', { - argsObj: ImmutableArrayContractArgs['obj']['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'] - argsTuple: ImmutableArrayContractArgs['tuple']['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'] - returns: ImmutableArrayContractReturns['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'] - }> - & Record<'test_uint64_return(uint64)uint64[]' | 'test_uint64_return', { - argsObj: ImmutableArrayContractArgs['obj']['test_uint64_return(uint64)uint64[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_uint64_return(uint64)uint64[]'] - returns: ImmutableArrayContractReturns['test_uint64_return(uint64)uint64[]'] - }> - & Record<'test_bool_return(uint64)bool[]' | 'test_bool_return', { - argsObj: ImmutableArrayContractArgs['obj']['test_bool_return(uint64)bool[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_bool_return(uint64)bool[]'] - returns: ImmutableArrayContractReturns['test_bool_return(uint64)bool[]'] - }> - & Record<'test_tuple_return(uint64)(uint64,bool,bool)[]' | 'test_tuple_return', { - argsObj: ImmutableArrayContractArgs['obj']['test_tuple_return(uint64)(uint64,bool,bool)[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_tuple_return(uint64)(uint64,bool,bool)[]'] - returns: ImmutableArrayContractReturns['test_tuple_return(uint64)(uint64,bool,bool)[]'] - }> - & Record<'test_dynamic_tuple_return(uint64)(uint64,string)[]' | 'test_dynamic_tuple_return', { - argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_tuple_return(uint64)(uint64,string)[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_tuple_return(uint64)(uint64,string)[]'] - returns: ImmutableArrayContractReturns['test_dynamic_tuple_return(uint64)(uint64,string)[]'] - }> - & Record<'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]' | 'test_convert_to_array_and_back', { - argsObj: ImmutableArrayContractArgs['obj']['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'] - returns: ImmutableArrayContractReturns['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'] - }> - & Record<'test_concat_with_arc4_tuple((uint64,uint64))uint64[]' | 'test_concat_with_arc4_tuple', { - argsObj: ImmutableArrayContractArgs['obj']['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'] - returns: ImmutableArrayContractReturns['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'] - }> - & Record<'test_concat_with_native_tuple((uint64,uint64))uint64[]' | 'test_concat_with_native_tuple', { - argsObj: ImmutableArrayContractArgs['obj']['test_concat_with_native_tuple((uint64,uint64))uint64[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_concat_with_native_tuple((uint64,uint64))uint64[]'] - returns: ImmutableArrayContractReturns['test_concat_with_native_tuple((uint64,uint64))uint64[]'] - }> - & Record<'test_dynamic_concat_with_arc4_tuple((string,string))string[]' | 'test_dynamic_concat_with_arc4_tuple', { - argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_concat_with_arc4_tuple((string,string))string[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_concat_with_arc4_tuple((string,string))string[]'] - returns: ImmutableArrayContractReturns['test_dynamic_concat_with_arc4_tuple((string,string))string[]'] - }> - & Record<'test_dynamic_concat_with_native_tuple((string,string))string[]' | 'test_dynamic_concat_with_native_tuple', { - argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_concat_with_native_tuple((string,string))string[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_concat_with_native_tuple((string,string))string[]'] - returns: ImmutableArrayContractReturns['test_dynamic_concat_with_native_tuple((string,string))string[]'] - }> - & Record<'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]' | 'test_concat_immutable_dynamic', { - argsObj: ImmutableArrayContractArgs['obj']['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'] - returns: ImmutableArrayContractReturns['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'] - }> - & Record<'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]' | 'test_immutable_arc4', { - argsObj: ImmutableArrayContractArgs['obj']['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'] - returns: ImmutableArrayContractReturns['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'] - }> - & Record<'test_imm_fixed_arr()(uint64,uint64)[3]' | 'test_imm_fixed_arr', { - argsObj: ImmutableArrayContractArgs['obj']['test_imm_fixed_arr()(uint64,uint64)[3]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_imm_fixed_arr()(uint64,uint64)[3]'] - returns: ImmutableArrayContractReturns['test_imm_fixed_arr()(uint64,uint64)[3]'] - }> - /** - * Defines the shape of the state of the application. - */ - state: { - global: { - keys: { - a: bigint[] - g: boolean[] - c: [bigint, bigint][] - d: [bigint, boolean, boolean][] - e: [bigint, Uint8Array][] - f: [bigint, string][] - bool2: [boolean, boolean][] - bool7: [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] - bool8: [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] - bool9: [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] - immFixedArr: [[bigint, bigint], [bigint, bigint], [bigint, bigint]] - } - maps: {} - } - } -} - -/** - * Defines the possible abi call signatures. - */ -export type ImmutableArrayContractSignatures = keyof ImmutableArrayContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type ImmutableArrayContractNonVoidMethodSignatures = keyof ImmutableArrayContractTypes['methods'] extends infer T ? T extends keyof ImmutableArrayContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the ImmutableArrayContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = ImmutableArrayContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the ImmutableArrayContract smart contract to the method's return type - */ -export type MethodReturn = ImmutableArrayContractTypes['methods'][TSignature]['returns'] - -/** - * Defines the shape of the keyed global state of the application. - */ -export type GlobalKeysState = ImmutableArrayContractTypes['state']['global']['keys'] - - -/** - * Defines supported create method params for this smart contract - */ -export type ImmutableArrayContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type ImmutableArrayContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: ImmutableArrayContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the ImmutableArrayContract smart contract - */ -export abstract class ImmutableArrayContractParamsFactory { - /** - * Constructs a no op call for the test_uint64_array()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testUint64Array(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_uint64_array()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_biguint_array()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testBiguintArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_biguint_array()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_bool_array(uint64)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testBoolArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_bool_array(uint64)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.length], - } - } - /** - * Constructs a no op call for the test_fixed_size_tuple_array()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testFixedSizeTupleArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_fixed_size_tuple_array()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_fixed_size_named_tuple_array()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testFixedSizeNamedTupleArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_fixed_size_named_tuple_array()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_dynamic_sized_tuple_array()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testDynamicSizedTupleArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_dynamic_sized_tuple_array()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_dynamic_sized_named_tuple_array()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testDynamicSizedNamedTupleArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_dynamic_sized_named_tuple_array()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_implicit_conversion_log(uint64[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testImplicitConversionLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_implicit_conversion_log(uint64[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.arr], - } - } - /** - * Constructs a no op call for the test_implicit_conversion_emit(uint64[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testImplicitConversionEmit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_implicit_conversion_emit(uint64[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.arr], - } - } - /** - * Constructs a no op call for the test_nested_array(uint64,uint64[][])uint64[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testNestedArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_nested_array(uint64,uint64[][])uint64[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.arrToAdd, params.args.arr], - } - } - /** - * Constructs a no op call for the test_bit_packed_tuples()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testBitPackedTuples(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_bit_packed_tuples()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static sumUintsAndLengthsAndTrues(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.arr1, params.args.arr2, params.args.arr3, params.args.arr4], - } - } - /** - * Constructs a no op call for the test_uint64_return(uint64)uint64[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testUint64Return(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_uint64_return(uint64)uint64[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.append], - } - } - /** - * Constructs a no op call for the test_bool_return(uint64)bool[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testBoolReturn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_bool_return(uint64)bool[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.append], - } - } - /** - * Constructs a no op call for the test_tuple_return(uint64)(uint64,bool,bool)[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testTupleReturn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_tuple_return(uint64)(uint64,bool,bool)[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.append], - } - } - /** - * Constructs a no op call for the test_dynamic_tuple_return(uint64)(uint64,string)[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testDynamicTupleReturn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_dynamic_tuple_return(uint64)(uint64,string)[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.append], - } - } - /** - * Constructs a no op call for the test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testConvertToArrayAndBack(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.arr, params.args.append], - } - } - /** - * Constructs a no op call for the test_concat_with_arc4_tuple((uint64,uint64))uint64[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testConcatWithArc4Tuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_concat_with_arc4_tuple((uint64,uint64))uint64[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.arg], - } - } - /** - * Constructs a no op call for the test_concat_with_native_tuple((uint64,uint64))uint64[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testConcatWithNativeTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_concat_with_native_tuple((uint64,uint64))uint64[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.arg], - } - } - /** - * Constructs a no op call for the test_dynamic_concat_with_arc4_tuple((string,string))string[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testDynamicConcatWithArc4Tuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_dynamic_concat_with_arc4_tuple((string,string))string[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.arg], - } - } - /** - * Constructs a no op call for the test_dynamic_concat_with_native_tuple((string,string))string[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testDynamicConcatWithNativeTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_dynamic_concat_with_native_tuple((string,string))string[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.arg], - } - } - /** - * Constructs a no op call for the test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testConcatImmutableDynamic(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.imm1, params.args.imm2], - } - } - /** - * Constructs a no op call for the test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testImmutableArc4(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.imm], - } - } - /** - * Constructs a no op call for the test_imm_fixed_arr()(uint64,uint64)[3] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testImmFixedArr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_imm_fixed_arr()(uint64,uint64)[3]' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } -} - -/** - * A factory to create and deploy one or more instance of the ImmutableArrayContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class ImmutableArrayContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `ImmutableArrayContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new ImmutableArrayContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new ImmutableArrayContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the ImmutableArrayContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: ImmutableArrayContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new ImmutableArrayContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ImmutableArrayContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ImmutableArrayContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ImmutableArrayContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new ImmutableArrayContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the ImmutableArrayContract smart contract - */ -export class ImmutableArrayContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `ImmutableArrayContractClient` - * - * @param appClient An `AppClient` instance which has been created with the ImmutableArrayContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `ImmutableArrayContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `ImmutableArrayContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new ImmutableArrayContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `ImmutableArrayContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new ImmutableArrayContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the ImmutableArrayContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testUint64Array: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testUint64Array(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_biguint_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testBiguintArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testBiguintArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_array(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testBoolArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testBoolArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testFixedSizeTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testFixedSizeTupleArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_named_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testFixedSizeNamedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testFixedSizeNamedTupleArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testDynamicSizedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicSizedTupleArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_named_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testDynamicSizedNamedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicSizedNamedTupleArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_log(uint64[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testImplicitConversionLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testImplicitConversionLog(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_emit(uint64[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testImplicitConversionEmit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testImplicitConversionEmit(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_nested_array(uint64,uint64[][])uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testNestedArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testNestedArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_bit_packed_tuples()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testBitPackedTuples: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testBitPackedTuples(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - sumUintsAndLengthsAndTrues: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.sumUintsAndLengthsAndTrues(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_return(uint64)uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testUint64Return: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testUint64Return(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_return(uint64)bool[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testBoolReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testBoolReturn(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_tuple_return(uint64)(uint64,bool,bool)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testTupleReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testTupleReturn(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_tuple_return(uint64)(uint64,string)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testDynamicTupleReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicTupleReturn(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testConvertToArrayAndBack: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testConvertToArrayAndBack(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_arc4_tuple((uint64,uint64))uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testConcatWithArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testConcatWithArc4Tuple(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_native_tuple((uint64,uint64))uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testConcatWithNativeTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testConcatWithNativeTuple(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_arc4_tuple((string,string))string[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testDynamicConcatWithArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithArc4Tuple(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_native_tuple((string,string))string[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testDynamicConcatWithNativeTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithNativeTuple(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testConcatImmutableDynamic: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testConcatImmutableDynamic(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testImmutableArc4: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testImmutableArc4(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_imm_fixed_arr()(uint64,uint64)[3]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testImmFixedArr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testImmFixedArr(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the ImmutableArrayContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testUint64Array: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testUint64Array(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_biguint_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testBiguintArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testBiguintArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_array(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testBoolArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testBoolArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testFixedSizeTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testFixedSizeTupleArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_named_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testFixedSizeNamedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testFixedSizeNamedTupleArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testDynamicSizedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicSizedTupleArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_named_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testDynamicSizedNamedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicSizedNamedTupleArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_log(uint64[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testImplicitConversionLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testImplicitConversionLog(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_emit(uint64[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testImplicitConversionEmit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testImplicitConversionEmit(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_nested_array(uint64,uint64[][])uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testNestedArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testNestedArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_bit_packed_tuples()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testBitPackedTuples: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testBitPackedTuples(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - sumUintsAndLengthsAndTrues: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.sumUintsAndLengthsAndTrues(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_return(uint64)uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testUint64Return: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testUint64Return(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_return(uint64)bool[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testBoolReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testBoolReturn(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_tuple_return(uint64)(uint64,bool,bool)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testTupleReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testTupleReturn(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_tuple_return(uint64)(uint64,string)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testDynamicTupleReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicTupleReturn(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testConvertToArrayAndBack: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testConvertToArrayAndBack(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_arc4_tuple((uint64,uint64))uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testConcatWithArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testConcatWithArc4Tuple(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_native_tuple((uint64,uint64))uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testConcatWithNativeTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testConcatWithNativeTuple(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_arc4_tuple((string,string))string[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testDynamicConcatWithArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithArc4Tuple(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_native_tuple((string,string))string[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testDynamicConcatWithNativeTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithNativeTuple(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testConcatImmutableDynamic: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testConcatImmutableDynamic(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testImmutableArc4: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testImmutableArc4(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_imm_fixed_arr()(uint64,uint64)[3]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testImmFixedArr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testImmFixedArr(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the ImmutableArrayContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testUint64Array: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testUint64Array(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_uint64_array()void'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_biguint_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testBiguintArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testBiguintArray(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_biguint_array()void'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_array(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testBoolArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testBoolArray(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_bool_array(uint64)void'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testFixedSizeTupleArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testFixedSizeTupleArray(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_fixed_size_tuple_array()void'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_named_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testFixedSizeNamedTupleArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testFixedSizeNamedTupleArray(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_fixed_size_named_tuple_array()void'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testDynamicSizedTupleArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicSizedTupleArray(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_sized_tuple_array()void'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_named_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testDynamicSizedNamedTupleArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicSizedNamedTupleArray(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_sized_named_tuple_array()void'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_log(uint64[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testImplicitConversionLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testImplicitConversionLog(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_implicit_conversion_log(uint64[])void'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_emit(uint64[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testImplicitConversionEmit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testImplicitConversionEmit(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_implicit_conversion_emit(uint64[])void'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_nested_array(uint64,uint64[][])uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testNestedArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testNestedArray(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_nested_array(uint64,uint64[][])uint64[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_bit_packed_tuples()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testBitPackedTuples: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testBitPackedTuples(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_bit_packed_tuples()void'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - sumUintsAndLengthsAndTrues: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.sumUintsAndLengthsAndTrues(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_return(uint64)uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testUint64Return: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testUint64Return(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_uint64_return(uint64)uint64[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_return(uint64)bool[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testBoolReturn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testBoolReturn(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_bool_return(uint64)bool[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_tuple_return(uint64)(uint64,bool,bool)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testTupleReturn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testTupleReturn(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_tuple_return(uint64)(uint64,bool,bool)[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_tuple_return(uint64)(uint64,string)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testDynamicTupleReturn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicTupleReturn(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_tuple_return(uint64)(uint64,string)[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testConvertToArrayAndBack: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testConvertToArrayAndBack(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_arc4_tuple((uint64,uint64))uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testConcatWithArc4Tuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testConcatWithArc4Tuple(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_native_tuple((uint64,uint64))uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testConcatWithNativeTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testConcatWithNativeTuple(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_concat_with_native_tuple((uint64,uint64))uint64[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_arc4_tuple((string,string))string[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testDynamicConcatWithArc4Tuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithArc4Tuple(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_concat_with_arc4_tuple((string,string))string[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_native_tuple((string,string))string[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testDynamicConcatWithNativeTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithNativeTuple(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_concat_with_native_tuple((string,string))string[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testConcatImmutableDynamic: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testConcatImmutableDynamic(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testImmutableArc4: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testImmutableArc4(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_imm_fixed_arr()(uint64,uint64)[3]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testImmFixedArr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testImmFixedArr(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_imm_fixed_arr()(uint64,uint64)[3]'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new ImmutableArrayContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current ImmutableArrayContract app - */ - state = { - /** - * Methods to access global state for the current ImmutableArrayContract app - */ - global: { - /** - * Get all current keyed values from global state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.global.getAll() - return { - a: result.a, - g: result.g, - c: result.c, - d: result.d, - e: result.e, - f: result.f, - bool2: result.bool2, - bool7: result.bool7, - bool8: result.bool8, - bool9: result.bool9, - immFixedArr: result.imm_fixed_arr, - } - }, - /** - * Get the current value of the a key in global state - */ - a: async (): Promise => { return (await this.appClient.state.global.getValue("a")) as bigint[] | undefined }, - /** - * Get the current value of the g key in global state - */ - g: async (): Promise => { return (await this.appClient.state.global.getValue("g")) as boolean[] | undefined }, - /** - * Get the current value of the c key in global state - */ - c: async (): Promise<[bigint, bigint][] | undefined> => { return (await this.appClient.state.global.getValue("c")) as [bigint, bigint][] | undefined }, - /** - * Get the current value of the d key in global state - */ - d: async (): Promise<[bigint, boolean, boolean][] | undefined> => { return (await this.appClient.state.global.getValue("d")) as [bigint, boolean, boolean][] | undefined }, - /** - * Get the current value of the e key in global state - */ - e: async (): Promise<[bigint, Uint8Array][] | undefined> => { return (await this.appClient.state.global.getValue("e")) as [bigint, Uint8Array][] | undefined }, - /** - * Get the current value of the f key in global state - */ - f: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.global.getValue("f")) as [bigint, string][] | undefined }, - /** - * Get the current value of the bool2 key in global state - */ - bool2: async (): Promise<[boolean, boolean][] | undefined> => { return (await this.appClient.state.global.getValue("bool2")) as [boolean, boolean][] | undefined }, - /** - * Get the current value of the bool7 key in global state - */ - bool7: async (): Promise<[bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined> => { return (await this.appClient.state.global.getValue("bool7")) as [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined }, - /** - * Get the current value of the bool8 key in global state - */ - bool8: async (): Promise<[bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined> => { return (await this.appClient.state.global.getValue("bool8")) as [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined }, - /** - * Get the current value of the bool9 key in global state - */ - bool9: async (): Promise<[bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined> => { return (await this.appClient.state.global.getValue("bool9")) as [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined }, - /** - * Get the current value of the imm_fixed_arr key in global state - */ - immFixedArr: async (): Promise<[[bigint, bigint], [bigint, bigint], [bigint, bigint]] | undefined> => { return (await this.appClient.state.global.getValue("imm_fixed_arr")) as [[bigint, bigint], [bigint, bigint], [bigint, bigint]] | undefined }, - }, - } - - public newGroup(composerConfig?: TransactionComposerConfig): ImmutableArrayContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a test_uint64_array()void method call against the ImmutableArrayContract contract - */ - testUint64Array(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testUint64Array(params))) - return this - }, - /** - * Add a test_biguint_array()void method call against the ImmutableArrayContract contract - */ - testBiguintArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBiguintArray(params))) - return this - }, - /** - * Add a test_bool_array(uint64)void method call against the ImmutableArrayContract contract - */ - testBoolArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBoolArray(params))) - return this - }, - /** - * Add a test_fixed_size_tuple_array()void method call against the ImmutableArrayContract contract - */ - testFixedSizeTupleArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testFixedSizeTupleArray(params))) - return this - }, - /** - * Add a test_fixed_size_named_tuple_array()void method call against the ImmutableArrayContract contract - */ - testFixedSizeNamedTupleArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testFixedSizeNamedTupleArray(params))) - return this - }, - /** - * Add a test_dynamic_sized_tuple_array()void method call against the ImmutableArrayContract contract - */ - testDynamicSizedTupleArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicSizedTupleArray(params))) - return this - }, - /** - * Add a test_dynamic_sized_named_tuple_array()void method call against the ImmutableArrayContract contract - */ - testDynamicSizedNamedTupleArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicSizedNamedTupleArray(params))) - return this - }, - /** - * Add a test_implicit_conversion_log(uint64[])void method call against the ImmutableArrayContract contract - */ - testImplicitConversionLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImplicitConversionLog(params))) - return this - }, - /** - * Add a test_implicit_conversion_emit(uint64[])void method call against the ImmutableArrayContract contract - */ - testImplicitConversionEmit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImplicitConversionEmit(params))) - return this - }, - /** - * Add a test_nested_array(uint64,uint64[][])uint64[] method call against the ImmutableArrayContract contract - */ - testNestedArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testNestedArray(params))) - return this - }, - /** - * Add a test_bit_packed_tuples()void method call against the ImmutableArrayContract contract - */ - testBitPackedTuples(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBitPackedTuples(params))) - return this - }, - /** - * Add a sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64) method call against the ImmutableArrayContract contract - */ - sumUintsAndLengthsAndTrues(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sumUintsAndLengthsAndTrues(params))) - return this - }, - /** - * Add a test_uint64_return(uint64)uint64[] method call against the ImmutableArrayContract contract - */ - testUint64Return(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testUint64Return(params))) - return this - }, - /** - * Add a test_bool_return(uint64)bool[] method call against the ImmutableArrayContract contract - */ - testBoolReturn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBoolReturn(params))) - return this - }, - /** - * Add a test_tuple_return(uint64)(uint64,bool,bool)[] method call against the ImmutableArrayContract contract - */ - testTupleReturn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testTupleReturn(params))) - return this - }, - /** - * Add a test_dynamic_tuple_return(uint64)(uint64,string)[] method call against the ImmutableArrayContract contract - */ - testDynamicTupleReturn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicTupleReturn(params))) - return this - }, - /** - * Add a test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[] method call against the ImmutableArrayContract contract - */ - testConvertToArrayAndBack(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testConvertToArrayAndBack(params))) - return this - }, - /** - * Add a test_concat_with_arc4_tuple((uint64,uint64))uint64[] method call against the ImmutableArrayContract contract - */ - testConcatWithArc4Tuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testConcatWithArc4Tuple(params))) - return this - }, - /** - * Add a test_concat_with_native_tuple((uint64,uint64))uint64[] method call against the ImmutableArrayContract contract - */ - testConcatWithNativeTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testConcatWithNativeTuple(params))) - return this - }, - /** - * Add a test_dynamic_concat_with_arc4_tuple((string,string))string[] method call against the ImmutableArrayContract contract - */ - testDynamicConcatWithArc4Tuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicConcatWithArc4Tuple(params))) - return this - }, - /** - * Add a test_dynamic_concat_with_native_tuple((string,string))string[] method call against the ImmutableArrayContract contract - */ - testDynamicConcatWithNativeTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicConcatWithNativeTuple(params))) - return this - }, - /** - * Add a test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[] method call against the ImmutableArrayContract contract - */ - testConcatImmutableDynamic(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testConcatImmutableDynamic(params))) - return this - }, - /** - * Add a test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[] method call against the ImmutableArrayContract contract - */ - testImmutableArc4(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArc4(params))) - return this - }, - /** - * Add a test_imm_fixed_arr()(uint64,uint64)[3] method call against the ImmutableArrayContract contract - */ - testImmFixedArr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmFixedArr(params))) - return this - }, - /** - * Add a clear state call to the ImmutableArrayContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as ImmutableArrayContractComposer - } -} -export type ImmutableArrayContractComposer = { - /** - * Calls the test_uint64_array()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testUint64Array(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_uint64_array()void'] | undefined]> - - /** - * Calls the test_biguint_array()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testBiguintArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_biguint_array()void'] | undefined]> - - /** - * Calls the test_bool_array(uint64)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testBoolArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_bool_array(uint64)void'] | undefined]> - - /** - * Calls the test_fixed_size_tuple_array()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testFixedSizeTupleArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_fixed_size_tuple_array()void'] | undefined]> - - /** - * Calls the test_fixed_size_named_tuple_array()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testFixedSizeNamedTupleArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_fixed_size_named_tuple_array()void'] | undefined]> - - /** - * Calls the test_dynamic_sized_tuple_array()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testDynamicSizedTupleArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_sized_tuple_array()void'] | undefined]> - - /** - * Calls the test_dynamic_sized_named_tuple_array()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testDynamicSizedNamedTupleArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_sized_named_tuple_array()void'] | undefined]> - - /** - * Calls the test_implicit_conversion_log(uint64[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testImplicitConversionLog(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_implicit_conversion_log(uint64[])void'] | undefined]> - - /** - * Calls the test_implicit_conversion_emit(uint64[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testImplicitConversionEmit(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_implicit_conversion_emit(uint64[])void'] | undefined]> - - /** - * Calls the test_nested_array(uint64,uint64[][])uint64[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testNestedArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_nested_array(uint64,uint64[][])uint64[]'] | undefined]> - - /** - * Calls the test_bit_packed_tuples()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testBitPackedTuples(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_bit_packed_tuples()void'] | undefined]> - - /** - * Calls the sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - sumUintsAndLengthsAndTrues(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'] | undefined]> - - /** - * Calls the test_uint64_return(uint64)uint64[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testUint64Return(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_uint64_return(uint64)uint64[]'] | undefined]> - - /** - * Calls the test_bool_return(uint64)bool[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testBoolReturn(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_bool_return(uint64)bool[]'] | undefined]> - - /** - * Calls the test_tuple_return(uint64)(uint64,bool,bool)[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testTupleReturn(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_tuple_return(uint64)(uint64,bool,bool)[]'] | undefined]> - - /** - * Calls the test_dynamic_tuple_return(uint64)(uint64,string)[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testDynamicTupleReturn(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_tuple_return(uint64)(uint64,string)[]'] | undefined]> - - /** - * Calls the test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testConvertToArrayAndBack(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'] | undefined]> - - /** - * Calls the test_concat_with_arc4_tuple((uint64,uint64))uint64[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testConcatWithArc4Tuple(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'] | undefined]> - - /** - * Calls the test_concat_with_native_tuple((uint64,uint64))uint64[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testConcatWithNativeTuple(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_concat_with_native_tuple((uint64,uint64))uint64[]'] | undefined]> - - /** - * Calls the test_dynamic_concat_with_arc4_tuple((string,string))string[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testDynamicConcatWithArc4Tuple(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_concat_with_arc4_tuple((string,string))string[]'] | undefined]> - - /** - * Calls the test_dynamic_concat_with_native_tuple((string,string))string[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testDynamicConcatWithNativeTuple(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_concat_with_native_tuple((string,string))string[]'] | undefined]> - - /** - * Calls the test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testConcatImmutableDynamic(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'] | undefined]> - - /** - * Calls the test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testImmutableArc4(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'] | undefined]> - - /** - * Calls the test_imm_fixed_arr()(uint64,uint64)[3] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testImmFixedArr(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_imm_fixed_arr()(uint64,uint64)[3]'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the ImmutableArrayContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): ImmutableArrayContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): ImmutableArrayContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type ImmutableArrayContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayInitContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayInitContract.ts deleted file mode 100644 index 358fea4..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayInitContract.ts +++ /dev/null @@ -1,755 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"ImmutableArrayInitContract","structs":{},"methods":[{"name":"test_immutable_array_init","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_immutable_array_init_without_type_generic","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reference_array_init","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reference_array_init_without_type_generic","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[42],"errorMessage":"OnCompletion must be NoOp"},{"pc":[89],"errorMessage":"OnCompletion must be NoOp && can only call when creating"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayA4IDMgMSAwCiAgICBieXRlY2Jsb2NrIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzkKICAgIC8vIGNsYXNzIEltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDExCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDg0MzRiYTJhIDB4NjNhYWJiYTAgMHhkYmFmMDM0ZSAweGE5ZDE0NTU0IC8vIG1ldGhvZCAidGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdCgpdm9pZCIsIG1ldGhvZCAidGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYygpdm9pZCIsIG1ldGhvZCAidGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdCgpdm9pZCIsIG1ldGhvZCAidGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYygpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXQgdGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYyB0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0IHRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWMKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDkwCiAgICAvLyBhMyA9IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0oUmVmZXJlbmNlQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTEyCiAgICAvLyBhMyA9IEltbXV0YWJsZUFycmF5KFJlZmVyZW5jZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUluaXRDb250cmFjdC50ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNgogICAgLy8gYTEgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyOAogICAgLy8gYTIgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKEZpeGVkQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKSkKICAgIGR1cAogICAgcG9wCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyOQogICAgLy8gYXNzZXJ0IGExLmxlbmd0aCA9PSBhMi5sZW5ndGgKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzAKICAgIC8vIGFzc2VydCBhMVswXSA9PSBhMlswXQogICAgZHVwCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzEKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhMlsxXQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzIKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhMlsyXQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzQKICAgIC8vIGEzID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XShJbW11dGFibGVBcnJheSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgcG9wCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzNgogICAgLy8gYXNzZXJ0IGExWzBdID09IGEzWzBdCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzcKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhM1sxXQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzgKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhM1syXQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MjYKICAgIC8vIGExID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQxCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGE0Lmxlbmd0aAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQyCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTRbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQzCiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTRbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ0CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTRbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0LnRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ4CiAgICAvLyBhMSA9IFJlZmVyZW5jZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1MAogICAgLy8gYTIgPSBSZWZlcmVuY2VBcnJheShGaXhlZEFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBkdXAKICAgIHBvcAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NTEKICAgIC8vIGFzc2VydCBhMS5sZW5ndGggPT0gYTIubGVuZ3RoCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUyCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTJbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUzCiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTJbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU0CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTJbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU2CiAgICAvLyBhMyA9IFJlZmVyZW5jZUFycmF5KEltbXV0YWJsZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU4CiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTNbMF0KICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1OQogICAgLy8gYXNzZXJ0IGExWzFdID09IGEzWzFdCiAgICBkdXAKICAgIGludGNfMCAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU2MAogICAgLy8gYXNzZXJ0IGExWzJdID09IGEzWzJdCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0OAogICAgLy8gYTEgPSBSZWZlcmVuY2VBcnJheSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTYzCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGE0Lmxlbmd0aAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY0CiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTRbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY1CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTRbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY2CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTRbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"byteCode":{"approval":"CiAECAMBACYBGAAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAzEbQQArMRkURDEYRIIEBIQ0uioEY6q7oATbrwNOBKnRRVQ2GgCOBAAJAA0AEQBjADEZFDEYFBBDKEgkQyhIJEMoSUhHAhUiCiMSREklWyQSREkiW4ECEkSBEFsjEkQoSEcCJVskEkRJIluBAhJEgRBbIxJEKEgoSEkVIgojEkRJJVskEkRJIluBAhJEgRBbIxJDKElIRwIVIgojEkRJJVskEkRJIluBAhJEgRBbIxJEKEhHAiVbJBJESSJbgQISRIEQWyMSRChIKEhJFSIKIxJESSVbJBJESSJbgQISRIEQWyMSQw==","clear":"CoEBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the ImmutableArrayInitContract contract - */ -export type ImmutableArrayInitContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'test_immutable_array_init()void': Record - 'test_immutable_array_init_without_type_generic()void': Record - 'test_reference_array_init()void': Record - 'test_reference_array_init_without_type_generic()void': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'test_immutable_array_init()void': [] - 'test_immutable_array_init_without_type_generic()void': [] - 'test_reference_array_init()void': [] - 'test_reference_array_init_without_type_generic()void': [] - } -} - -/** - * The return type for each method - */ -export type ImmutableArrayInitContractReturns = { - 'test_immutable_array_init()void': void - 'test_immutable_array_init_without_type_generic()void': void - 'test_reference_array_init()void': void - 'test_reference_array_init_without_type_generic()void': void -} - -/** - * Defines the types of available calls and state of the ImmutableArrayInitContract smart contract. - */ -export type ImmutableArrayInitContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'test_immutable_array_init()void' | 'test_immutable_array_init', { - argsObj: ImmutableArrayInitContractArgs['obj']['test_immutable_array_init()void'] - argsTuple: ImmutableArrayInitContractArgs['tuple']['test_immutable_array_init()void'] - returns: ImmutableArrayInitContractReturns['test_immutable_array_init()void'] - }> - & Record<'test_immutable_array_init_without_type_generic()void' | 'test_immutable_array_init_without_type_generic', { - argsObj: ImmutableArrayInitContractArgs['obj']['test_immutable_array_init_without_type_generic()void'] - argsTuple: ImmutableArrayInitContractArgs['tuple']['test_immutable_array_init_without_type_generic()void'] - returns: ImmutableArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'] - }> - & Record<'test_reference_array_init()void' | 'test_reference_array_init', { - argsObj: ImmutableArrayInitContractArgs['obj']['test_reference_array_init()void'] - argsTuple: ImmutableArrayInitContractArgs['tuple']['test_reference_array_init()void'] - returns: ImmutableArrayInitContractReturns['test_reference_array_init()void'] - }> - & Record<'test_reference_array_init_without_type_generic()void' | 'test_reference_array_init_without_type_generic', { - argsObj: ImmutableArrayInitContractArgs['obj']['test_reference_array_init_without_type_generic()void'] - argsTuple: ImmutableArrayInitContractArgs['tuple']['test_reference_array_init_without_type_generic()void'] - returns: ImmutableArrayInitContractReturns['test_reference_array_init_without_type_generic()void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type ImmutableArrayInitContractSignatures = keyof ImmutableArrayInitContractTypes['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the ImmutableArrayInitContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = ImmutableArrayInitContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the ImmutableArrayInitContract smart contract to the method's return type - */ -export type MethodReturn = ImmutableArrayInitContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type ImmutableArrayInitContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type ImmutableArrayInitContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: ImmutableArrayInitContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the ImmutableArrayInitContract smart contract - */ -export abstract class ImmutableArrayInitContractParamsFactory { - /** - * Constructs a no op call for the test_immutable_array_init()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testImmutableArrayInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_immutable_array_init()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_immutable_array_init_without_type_generic()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testImmutableArrayInitWithoutTypeGeneric(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_immutable_array_init_without_type_generic()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_reference_array_init()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testReferenceArrayInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_reference_array_init()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_reference_array_init_without_type_generic()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testReferenceArrayInitWithoutTypeGeneric(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_reference_array_init_without_type_generic()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } -} - -/** - * A factory to create and deploy one or more instance of the ImmutableArrayInitContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class ImmutableArrayInitContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `ImmutableArrayInitContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new ImmutableArrayInitContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new ImmutableArrayInitContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the ImmutableArrayInitContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: ImmutableArrayInitContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new ImmutableArrayInitContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ImmutableArrayInitContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ImmutableArrayInitContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ImmutableArrayInitContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new ImmutableArrayInitContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the ImmutableArrayInitContract smart contract - */ -export class ImmutableArrayInitContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `ImmutableArrayInitContractClient` - * - * @param appClient An `AppClient` instance which has been created with the ImmutableArrayInitContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `ImmutableArrayInitContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `ImmutableArrayInitContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new ImmutableArrayInitContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `ImmutableArrayInitContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new ImmutableArrayInitContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the ImmutableArrayInitContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testImmutableArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInit(params)) - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testImmutableArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testReferenceArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInit(params)) - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testReferenceArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the ImmutableArrayInitContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testImmutableArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInit(params)) - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testImmutableArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testReferenceArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInit(params)) - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testReferenceArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the ImmutableArrayInitContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testImmutableArrayInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInit(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayInitContractReturns['test_immutable_array_init()void'])} - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testImmutableArrayInitWithoutTypeGeneric: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'])} - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testReferenceArrayInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInit(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayInitContractReturns['test_reference_array_init()void'])} - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testReferenceArrayInitWithoutTypeGeneric: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayInitContractReturns['test_reference_array_init_without_type_generic()void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new ImmutableArrayInitContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current ImmutableArrayInitContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): ImmutableArrayInitContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a test_immutable_array_init()void method call against the ImmutableArrayInitContract contract - */ - testImmutableArrayInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArrayInit(params))) - return this - }, - /** - * Add a test_immutable_array_init_without_type_generic()void method call against the ImmutableArrayInitContract contract - */ - testImmutableArrayInitWithoutTypeGeneric(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArrayInitWithoutTypeGeneric(params))) - return this - }, - /** - * Add a test_reference_array_init()void method call against the ImmutableArrayInitContract contract - */ - testReferenceArrayInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testReferenceArrayInit(params))) - return this - }, - /** - * Add a test_reference_array_init_without_type_generic()void method call against the ImmutableArrayInitContract contract - */ - testReferenceArrayInitWithoutTypeGeneric(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testReferenceArrayInitWithoutTypeGeneric(params))) - return this - }, - /** - * Add a clear state call to the ImmutableArrayInitContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as ImmutableArrayInitContractComposer - } -} -export type ImmutableArrayInitContractComposer = { - /** - * Calls the test_immutable_array_init()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testImmutableArrayInit(params?: CallParams): ImmutableArrayInitContractComposer<[...TReturns, ImmutableArrayInitContractReturns['test_immutable_array_init()void'] | undefined]> - - /** - * Calls the test_immutable_array_init_without_type_generic()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testImmutableArrayInitWithoutTypeGeneric(params?: CallParams): ImmutableArrayInitContractComposer<[...TReturns, ImmutableArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'] | undefined]> - - /** - * Calls the test_reference_array_init()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testReferenceArrayInit(params?: CallParams): ImmutableArrayInitContractComposer<[...TReturns, ImmutableArrayInitContractReturns['test_reference_array_init()void'] | undefined]> - - /** - * Calls the test_reference_array_init_without_type_generic()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testReferenceArrayInitWithoutTypeGeneric(params?: CallParams): ImmutableArrayInitContractComposer<[...TReturns, ImmutableArrayInitContractReturns['test_reference_array_init_without_type_generic()void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the ImmutableArrayInitContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): ImmutableArrayInitContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): ImmutableArrayInitContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type ImmutableArrayInitContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/LocalStateContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/LocalStateContract.ts deleted file mode 100644 index 767e777..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/LocalStateContract.ts +++ /dev/null @@ -1,1746 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"LocalStateContract","structs":{},"methods":[{"name":"opt_in","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["OptIn"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_uint","args":[{"type":"address","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_string","args":[{"type":"address","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_byte","args":[{"type":"address","name":"a"}],"returns":{"type":"byte"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_bool","args":[{"type":"address","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_address","args":[{"type":"address","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_uint128","args":[{"type":"address","name":"a"}],"returns":{"type":"uint128"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_dynamic_bytes","args":[{"type":"address","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_tuple","args":[{"type":"address","name":"a"}],"returns":{"type":"(uint64,byte[],bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_uint","args":[{"type":"address","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_string","args":[{"type":"address","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_byte","args":[{"type":"address","name":"a"}],"returns":{"type":"byte"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_bool","args":[{"type":"address","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_address","args":[{"type":"address","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_uint128","args":[{"type":"address","name":"a"}],"returns":{"type":"uint128"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_dynamic_bytes","args":[{"type":"address","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":15}},"keys":{"global":{},"local":{"implicit_key_arc4_uint":{"keyType":"AVMString","valueType":"uint64","key":"aW1wbGljaXRfa2V5X2FyYzRfdWludA=="},"implicit_key_arc4_string":{"keyType":"AVMString","valueType":"string","key":"aW1wbGljaXRfa2V5X2FyYzRfc3RyaW5n"},"implicit_key_arc4_byte":{"keyType":"AVMString","valueType":"byte","key":"aW1wbGljaXRfa2V5X2FyYzRfYnl0ZQ=="},"implicit_key_arc4_bool":{"keyType":"AVMString","valueType":"bool","key":"aW1wbGljaXRfa2V5X2FyYzRfYm9vbA=="},"implicit_key_arc4_address":{"keyType":"AVMString","valueType":"address","key":"aW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcw=="},"implicit_key_arc4_uint128":{"keyType":"AVMString","valueType":"uint128","key":"aW1wbGljaXRfa2V5X2FyYzRfdWludDEyOA=="},"implicit_key_arc4_dynamic_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"aW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcw=="},"implicit_key_tuple":{"keyType":"AVMString","valueType":"(uint64,byte[],bool)","key":"aW1wbGljaXRfa2V5X3R1cGxl"},"arc4_uint":{"keyType":"AVMString","valueType":"uint64","key":"ZXhwbGljaXRfa2V5X2FyYzRfdWludA=="},"arc4_string":{"keyType":"AVMString","valueType":"string","key":"ZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5n"},"arc4_byte":{"keyType":"AVMString","valueType":"byte","key":"ZXhwbGljaXRfa2V5X2FyYzRfYnl0ZQ=="},"arc4_bool":{"keyType":"AVMString","valueType":"bool","key":"ZXhwbGljaXRfa2V5X2FyYzRfYm9vbA=="},"arc4_address":{"keyType":"AVMString","valueType":"address","key":"ZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcw=="},"arc4_uint128":{"keyType":"AVMString","valueType":"uint128","key":"ZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOA=="},"arc4_dynamic_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"ZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcw=="}},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[891],"errorMessage":"check self.arc4_address exists for account"},{"pc":[877],"errorMessage":"check self.arc4_bool exists for account"},{"pc":[863],"errorMessage":"check self.arc4_byte exists for account"},{"pc":[919],"errorMessage":"check self.arc4_dynamic_bytes exists for account"},{"pc":[849],"errorMessage":"check self.arc4_string exists for account"},{"pc":[835],"errorMessage":"check self.arc4_uint exists for account"},{"pc":[905],"errorMessage":"check self.arc4_uint128 exists for account"},{"pc":[779],"errorMessage":"check self.implicit_key_arc4_address exists for account"},{"pc":[765],"errorMessage":"check self.implicit_key_arc4_bool exists for account"},{"pc":[751],"errorMessage":"check self.implicit_key_arc4_byte exists for account"},{"pc":[807],"errorMessage":"check self.implicit_key_arc4_dynamic_bytes exists for account"},{"pc":[737],"errorMessage":"check self.implicit_key_arc4_string exists for account"},{"pc":[724],"errorMessage":"check self.implicit_key_arc4_uint exists for account"},{"pc":[793],"errorMessage":"check self.implicit_key_arc4_uint128 exists for account"},{"pc":[821],"errorMessage":"check self.implicit_key_tuple exists for account"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIgMHgwMDAwMDAwMDAwMDAwNTM5ICJpbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmciIDB4MDAwNTQ4NjU2YzZjNmYgImltcGxpY2l0X2tleV9hcmM0X2J5dGUiICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIiAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiIDB4MDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgImltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczICJpbXBsaWNpdF9rZXlfdHVwbGUiICJleHBsaWNpdF9rZXlfYXJjNF91aW50IiAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIiAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIgImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOCIgImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjYzCiAgICAvLyBjbGFzcyBMb2NhbFN0YXRlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDI2CiAgICBwdXNoYnl0ZXMgMHgzMGM2ZDU4YSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2luX3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY2MwogICAgLy8gY2xhc3MgTG9jYWxTdGF0ZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhiM2NmYTM4OSAweGRiODU4MTc2IDB4NzgyNjc3NjIgMHg0MjYzNTFjOCAweDA3NWNhZTkxIDB4NTljMGI4MGIgMHgwZDZmYTY5MCAweDk3ZTEwZDljIDB4MmU0YThjNDkgMHhiMjJjZDIxZSAweGIzZjQ0NzAxIDB4ZWRkOTcyOTcgMHg2NzFkMzUzYyAweGEzZmQ2ZmRjIDB4Y2QyZTVkNjYgLy8gbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludChhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyhhZGRyZXNzKXN0cmluZyIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGUoYWRkcmVzcylieXRlIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbChhZGRyZXNzKWJvb2wiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKGFkZHJlc3MpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgoYWRkcmVzcyl1aW50MTI4IiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyhhZGRyZXNzKWJ5dGVbXSIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV90dXBsZShhZGRyZXNzKSh1aW50NjQsYnl0ZVtdLGJvb2wpIiwgbWV0aG9kICJnZXRfYXJjNF91aW50KGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJnZXRfYXJjNF9zdHJpbmcoYWRkcmVzcylzdHJpbmciLCBtZXRob2QgImdldF9hcmM0X2J5dGUoYWRkcmVzcylieXRlIiwgbWV0aG9kICJnZXRfYXJjNF9ib29sKGFkZHJlc3MpYm9vbCIsIG1ldGhvZCAiZ2V0X2FyYzRfYWRkcmVzcyhhZGRyZXNzKWFkZHJlc3MiLCBtZXRob2QgImdldF9hcmM0X3VpbnQxMjgoYWRkcmVzcyl1aW50MTI4IiwgbWV0aG9kICJnZXRfYXJjNF9keW5hbWljX2J5dGVzKGFkZHJlc3MpYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBnZXRfaW1wbGljaXRfa2V5X3R1cGxlIGdldF9hcmM0X3VpbnQgZ2V0X2FyYzRfc3RyaW5nIGdldF9hcmM0X2J5dGUgZ2V0X2FyYzRfYm9vbCBnZXRfYXJjNF9hZGRyZXNzIGdldF9hcmM0X3VpbnQxMjggZ2V0X2FyYzRfZHluYW1pY19ieXRlcwogICAgZXJyCgptYWluX29wdF9pbl9yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE9wdEluCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgb3B0X2luCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDI2OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0Lm9wdF9pbltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdF9pbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2ODgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuVUludDY0KDEzMzcpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDUzOQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY4OQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlY18zIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICBieXRlYyA0IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTAKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZVtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQnl0ZSgwKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyA1IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTEKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQm9vbChUcnVlKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgcHVzaGJ5dGVzIDB4ODAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTIKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQWRkcmVzcygKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTMKICAgIC8vIEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5Mi02OTQKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQWRkcmVzcygKICAgIC8vICAgICBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzCiAgICAvLyApCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk1CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjhbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlVJbnQxMjgoMioqMTAwKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyA4IC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk2CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkR5bmFtaWNCeXRlcygKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTAgLy8gImltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk2LTY5OAogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoCiAgICAvLyAgICAgYiJkeW5hbWljIGJ5dGVzIgogICAgLy8gKQogICAgYnl0ZWMgMTEgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTkKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gKFVJbnQ2NCgxMCksIEJ5dGVzKGIidGVzdCIpLCBGYWxzZSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTIgLy8gImltcGxpY2l0X2tleV90dXBsZSIKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMGEwMDBiMDAwMDA0NzQ2NTczNzQKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDEKICAgIC8vIHNlbGYuYXJjNF91aW50W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5VSW50NjQoMTMzNykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTMgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDUzOQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwMgogICAgLy8gc2VsZi5hcmM0X3N0cmluZ1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuU3RyaW5nKCJIZWxsbyIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDE0IC8vICJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njg5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZ1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuU3RyaW5nKCJIZWxsbyIpCiAgICBieXRlYyA0IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDIKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmdbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwMwogICAgLy8gc2VsZi5hcmM0X2J5dGVbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJ5dGUoMCkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTUgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwNAogICAgLy8gc2VsZi5hcmM0X2Jvb2xbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJvb2woVHJ1ZSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTYgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjkxCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2xbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJvb2woVHJ1ZSkKICAgIHB1c2hieXRlcyAweDgwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA0CiAgICAvLyBzZWxmLmFyYzRfYm9vbFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQm9vbChUcnVlKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwNQogICAgLy8gc2VsZi5hcmM0X2FkZHJlc3NbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkFkZHJlc3MoR2xvYmFsLmNyZWF0b3JfYWRkcmVzcykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTcgLy8gImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDYKICAgIC8vIHNlbGYuYXJjNF91aW50MTI4W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5VSW50MTI4KDIqKjEwMCkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTggLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDcKICAgIC8vIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTkgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk2LTY5OAogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoCiAgICAvLyAgICAgYiJkeW5hbWljIGJ5dGVzIgogICAgLy8gKQogICAgYnl0ZWMgMTEgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDcKICAgIC8vIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA5LTcxMAogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgaW1wbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MTIKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnRbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDktNzEwCiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxNgogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyMAogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZVthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ieXRlIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyNAogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyOAogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDcgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczMgogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDggLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczNgogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQwCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGVbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMiAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0Mi03NDMKICAgIC8vICMgR2V0dGVyIG1ldGhvZHMgZm9yIGV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQ1CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3VpbnRbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfdWludCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDItNzQzCiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfc3RyaW5nW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDkKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfc3RyaW5nW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfc3RyaW5nIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTMKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYnl0ZVthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJleHBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ieXRlIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ib29sOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTcKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYm9vbFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ib29sIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2FkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjEKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYWRkcmVzc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9hZGRyZXNzIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjUKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfdWludDEyOFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF91aW50MTI4IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2R5bmFtaWNfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9keW5hbWljX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjkKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfZHluYW1pY19ieXRlc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmFAQVH3x1FmltcGxpY2l0X2tleV9hcmM0X3VpbnQIAAAAAAAABTkYaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nBwAFSGVsbG8WaW1wbGljaXRfa2V5X2FyYzRfYnl0ZRZpbXBsaWNpdF9rZXlfYXJjNF9ib29sGWltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MZaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOBAAAAAQAAAAAAAAAAAAAAAAH2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMPAA1keW5hbWljIGJ5dGVzEmltcGxpY2l0X2tleV90dXBsZRZleHBsaWNpdF9rZXlfYXJjNF91aW50GGV4cGxpY2l0X2tleV9hcmM0X3N0cmluZxZleHBsaWNpdF9rZXlfYXJjNF9ieXRlFmV4cGxpY2l0X2tleV9hcmM0X2Jvb2wZZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcxlleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4H2V4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMxG0EAkIAEMMbVijYaAI4BAHgxGRREMRhEgg8Es8+jiQTbhYF2BHgmd2IEQmNRyAQHXK6RBFnAuAsEDW+mkASX4Q2cBC5KjEkEsizSHgSz9EcBBO3ZcpcEZx01PASj/W/cBM0uXWY2GgCODwCQAJ0AqgC4AMYA1ADiAPAA/gEMARoBKAE2AUQBUgAxGSISMRgQREIACDEZFDEYFBBDMgkpKmYyCSsnBGYyCScFgAEAZjIJJwaAAYBmMgknBzIJZjIJJwgnCWYyCScKJwtmMgknDIARAAAAAAAAAAoACwAABHRlc3RmMgknDSpmMgknDicEZjIJJw+AAQBmMgknEIABgGYyCScRMglmMgknEicJZjIJJxMnC2YiQzYaASMpY0QoTFCwIkM2GgEjK2NEKExQsCJDNhoBIycFY0QoTFCwIkM2GgEjJwZjRChMULAiQzYaASMnB2NEKExQsCJDNhoBIycIY0QoTFCwIkM2GgEjJwpjRChMULAiQzYaASMnDGNEKExQsCJDNhoBIycNY0QoTFCwIkM2GgEjJw5jRChMULAiQzYaASMnD2NEKExQsCJDNhoBIycQY0QoTFCwIkM2GgEjJxFjRChMULAiQzYaASMnEmNEKExQsCJDNhoBIycTY0QoTFCwIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the LocalStateContract contract - */ -export type LocalStateContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'opt_in()void': Record - 'get_implicit_key_arc4_uint(address)uint64': { - a: string - } - 'get_implicit_key_arc4_string(address)string': { - a: string - } - 'get_implicit_key_arc4_byte(address)byte': { - a: string - } - 'get_implicit_key_arc4_bool(address)bool': { - a: string - } - 'get_implicit_key_arc4_address(address)address': { - a: string - } - 'get_implicit_key_arc4_uint128(address)uint128': { - a: string - } - 'get_implicit_key_arc4_dynamic_bytes(address)byte[]': { - a: string - } - 'get_implicit_key_tuple(address)(uint64,byte[],bool)': { - a: string - } - 'get_arc4_uint(address)uint64': { - a: string - } - 'get_arc4_string(address)string': { - a: string - } - 'get_arc4_byte(address)byte': { - a: string - } - 'get_arc4_bool(address)bool': { - a: string - } - 'get_arc4_address(address)address': { - a: string - } - 'get_arc4_uint128(address)uint128': { - a: string - } - 'get_arc4_dynamic_bytes(address)byte[]': { - a: string - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'opt_in()void': [] - 'get_implicit_key_arc4_uint(address)uint64': [a: string] - 'get_implicit_key_arc4_string(address)string': [a: string] - 'get_implicit_key_arc4_byte(address)byte': [a: string] - 'get_implicit_key_arc4_bool(address)bool': [a: string] - 'get_implicit_key_arc4_address(address)address': [a: string] - 'get_implicit_key_arc4_uint128(address)uint128': [a: string] - 'get_implicit_key_arc4_dynamic_bytes(address)byte[]': [a: string] - 'get_implicit_key_tuple(address)(uint64,byte[],bool)': [a: string] - 'get_arc4_uint(address)uint64': [a: string] - 'get_arc4_string(address)string': [a: string] - 'get_arc4_byte(address)byte': [a: string] - 'get_arc4_bool(address)bool': [a: string] - 'get_arc4_address(address)address': [a: string] - 'get_arc4_uint128(address)uint128': [a: string] - 'get_arc4_dynamic_bytes(address)byte[]': [a: string] - } -} - -/** - * The return type for each method - */ -export type LocalStateContractReturns = { - 'opt_in()void': void - 'get_implicit_key_arc4_uint(address)uint64': bigint - 'get_implicit_key_arc4_string(address)string': string - 'get_implicit_key_arc4_byte(address)byte': number - 'get_implicit_key_arc4_bool(address)bool': boolean - 'get_implicit_key_arc4_address(address)address': string - 'get_implicit_key_arc4_uint128(address)uint128': bigint - 'get_implicit_key_arc4_dynamic_bytes(address)byte[]': Uint8Array - 'get_implicit_key_tuple(address)(uint64,byte[],bool)': [bigint, Uint8Array, boolean] - 'get_arc4_uint(address)uint64': bigint - 'get_arc4_string(address)string': string - 'get_arc4_byte(address)byte': number - 'get_arc4_bool(address)bool': boolean - 'get_arc4_address(address)address': string - 'get_arc4_uint128(address)uint128': bigint - 'get_arc4_dynamic_bytes(address)byte[]': Uint8Array -} - -/** - * Defines the types of available calls and state of the LocalStateContract smart contract. - */ -export type LocalStateContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'opt_in()void' | 'opt_in', { - argsObj: LocalStateContractArgs['obj']['opt_in()void'] - argsTuple: LocalStateContractArgs['tuple']['opt_in()void'] - returns: LocalStateContractReturns['opt_in()void'] - }> - & Record<'get_implicit_key_arc4_uint(address)uint64' | 'get_implicit_key_arc4_uint', { - argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_uint(address)uint64'] - argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_uint(address)uint64'] - returns: LocalStateContractReturns['get_implicit_key_arc4_uint(address)uint64'] - }> - & Record<'get_implicit_key_arc4_string(address)string' | 'get_implicit_key_arc4_string', { - argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_string(address)string'] - argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_string(address)string'] - returns: LocalStateContractReturns['get_implicit_key_arc4_string(address)string'] - }> - & Record<'get_implicit_key_arc4_byte(address)byte' | 'get_implicit_key_arc4_byte', { - argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_byte(address)byte'] - argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_byte(address)byte'] - returns: LocalStateContractReturns['get_implicit_key_arc4_byte(address)byte'] - }> - & Record<'get_implicit_key_arc4_bool(address)bool' | 'get_implicit_key_arc4_bool', { - argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_bool(address)bool'] - argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_bool(address)bool'] - returns: LocalStateContractReturns['get_implicit_key_arc4_bool(address)bool'] - }> - & Record<'get_implicit_key_arc4_address(address)address' | 'get_implicit_key_arc4_address', { - argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_address(address)address'] - argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_address(address)address'] - returns: LocalStateContractReturns['get_implicit_key_arc4_address(address)address'] - }> - & Record<'get_implicit_key_arc4_uint128(address)uint128' | 'get_implicit_key_arc4_uint128', { - argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_uint128(address)uint128'] - argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_uint128(address)uint128'] - returns: LocalStateContractReturns['get_implicit_key_arc4_uint128(address)uint128'] - }> - & Record<'get_implicit_key_arc4_dynamic_bytes(address)byte[]' | 'get_implicit_key_arc4_dynamic_bytes', { - argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_dynamic_bytes(address)byte[]'] - argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_dynamic_bytes(address)byte[]'] - returns: LocalStateContractReturns['get_implicit_key_arc4_dynamic_bytes(address)byte[]'] - }> - & Record<'get_implicit_key_tuple(address)(uint64,byte[],bool)' | 'get_implicit_key_tuple', { - argsObj: LocalStateContractArgs['obj']['get_implicit_key_tuple(address)(uint64,byte[],bool)'] - argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_tuple(address)(uint64,byte[],bool)'] - returns: LocalStateContractReturns['get_implicit_key_tuple(address)(uint64,byte[],bool)'] - }> - & Record<'get_arc4_uint(address)uint64' | 'get_arc4_uint', { - argsObj: LocalStateContractArgs['obj']['get_arc4_uint(address)uint64'] - argsTuple: LocalStateContractArgs['tuple']['get_arc4_uint(address)uint64'] - returns: LocalStateContractReturns['get_arc4_uint(address)uint64'] - }> - & Record<'get_arc4_string(address)string' | 'get_arc4_string', { - argsObj: LocalStateContractArgs['obj']['get_arc4_string(address)string'] - argsTuple: LocalStateContractArgs['tuple']['get_arc4_string(address)string'] - returns: LocalStateContractReturns['get_arc4_string(address)string'] - }> - & Record<'get_arc4_byte(address)byte' | 'get_arc4_byte', { - argsObj: LocalStateContractArgs['obj']['get_arc4_byte(address)byte'] - argsTuple: LocalStateContractArgs['tuple']['get_arc4_byte(address)byte'] - returns: LocalStateContractReturns['get_arc4_byte(address)byte'] - }> - & Record<'get_arc4_bool(address)bool' | 'get_arc4_bool', { - argsObj: LocalStateContractArgs['obj']['get_arc4_bool(address)bool'] - argsTuple: LocalStateContractArgs['tuple']['get_arc4_bool(address)bool'] - returns: LocalStateContractReturns['get_arc4_bool(address)bool'] - }> - & Record<'get_arc4_address(address)address' | 'get_arc4_address', { - argsObj: LocalStateContractArgs['obj']['get_arc4_address(address)address'] - argsTuple: LocalStateContractArgs['tuple']['get_arc4_address(address)address'] - returns: LocalStateContractReturns['get_arc4_address(address)address'] - }> - & Record<'get_arc4_uint128(address)uint128' | 'get_arc4_uint128', { - argsObj: LocalStateContractArgs['obj']['get_arc4_uint128(address)uint128'] - argsTuple: LocalStateContractArgs['tuple']['get_arc4_uint128(address)uint128'] - returns: LocalStateContractReturns['get_arc4_uint128(address)uint128'] - }> - & Record<'get_arc4_dynamic_bytes(address)byte[]' | 'get_arc4_dynamic_bytes', { - argsObj: LocalStateContractArgs['obj']['get_arc4_dynamic_bytes(address)byte[]'] - argsTuple: LocalStateContractArgs['tuple']['get_arc4_dynamic_bytes(address)byte[]'] - returns: LocalStateContractReturns['get_arc4_dynamic_bytes(address)byte[]'] - }> - /** - * Defines the shape of the state of the application. - */ - state: { - local: { - keys: { - implicitKeyArc4Uint: bigint - implicitKeyArc4String: string - implicitKeyArc4Byte: number - implicitKeyArc4Bool: boolean - implicitKeyArc4Address: string - implicitKeyArc4Uint128: bigint - implicitKeyArc4DynamicBytes: Uint8Array - implicitKeyTuple: [bigint, Uint8Array, boolean] - arc4Uint: bigint - arc4String: string - arc4Byte: number - arc4Bool: boolean - arc4Address: string - arc4Uint128: bigint - arc4DynamicBytes: Uint8Array - } - maps: {} - } - } -} - -/** - * Defines the possible abi call signatures. - */ -export type LocalStateContractSignatures = keyof LocalStateContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type LocalStateContractNonVoidMethodSignatures = keyof LocalStateContractTypes['methods'] extends infer T ? T extends keyof LocalStateContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the LocalStateContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = LocalStateContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the LocalStateContract smart contract to the method's return type - */ -export type MethodReturn = LocalStateContractTypes['methods'][TSignature]['returns'] - -/** - * Defines the shape of the keyed local state of the application. - */ -export type LocalKeysState = LocalStateContractTypes['state']['local']['keys'] - - -/** - * Defines supported create method params for this smart contract - */ -export type LocalStateContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type LocalStateContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: LocalStateContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the LocalStateContract smart contract - */ -export abstract class LocalStateContractParamsFactory { - /** - * Gets available optIn ABI call param factories - */ - static get optIn() { - return { - /** - * Constructs opt-in ABI call params for the LocalStateContract smart contract using the opt_in()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - optIn(params: CallParams): AppClientMethodCallParams { - return { - ...params, - method: 'opt_in()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - }, - } - } - - /** - * Constructs a no op call for the get_implicit_key_arc4_uint(address)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_uint(address)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_string(address)string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_string(address)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_byte(address)byte ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_byte(address)byte' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_bool(address)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_bool(address)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_address(address)address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_address(address)address' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_uint128(address)uint128 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_uint128(address)uint128' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_dynamic_bytes(address)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_dynamic_bytes(address)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_implicit_key_tuple(address)(uint64,byte[],bool) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_tuple(address)(uint64,byte[],bool)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_arc4_uint(address)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_uint(address)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_arc4_string(address)string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_string(address)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_arc4_byte(address)byte ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_byte(address)byte' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_arc4_bool(address)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_bool(address)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_arc4_address(address)address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_address(address)address' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_arc4_uint128(address)uint128 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_uint128(address)uint128' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_arc4_dynamic_bytes(address)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_dynamic_bytes(address)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } -} - -/** - * A factory to create and deploy one or more instance of the LocalStateContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class LocalStateContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `LocalStateContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new LocalStateContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new LocalStateContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the LocalStateContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: LocalStateContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new LocalStateContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the LocalStateContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the LocalStateContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the LocalStateContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new LocalStateContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the LocalStateContract smart contract - */ -export class LocalStateContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `LocalStateContractClient` - * - * @param appClient An `AppClient` instance which has been created with the LocalStateContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `LocalStateContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `LocalStateContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new LocalStateContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `LocalStateContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new LocalStateContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the LocalStateContract smart contract using the `opt_in()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The optIn params - */ - optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { - return this.appClient.params.optIn(LocalStateContractParamsFactory.optIn.optIn(params)) - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the LocalStateContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint(address)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_string(address)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4String(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_byte(address)byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_bool(address)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_address(address)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Address(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint128(address)uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes(address)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_tuple(address)(uint64,byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyTuple(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint(address)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Uint(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_string(address)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getArc4String(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_byte(address)byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Byte(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_bool(address)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Bool(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_address(address)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Address(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint128(address)uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Uint128(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_dynamic_bytes(address)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getArc4DynamicBytes(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the LocalStateContract smart contract using the `opt_in()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The optIn transaction - */ - optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { - return this.appClient.createTransaction.optIn(LocalStateContractParamsFactory.optIn.optIn(params)) - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the LocalStateContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint(address)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_string(address)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4String(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_byte(address)byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_bool(address)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_address(address)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Address(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint128(address)uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes(address)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_tuple(address)(uint64,byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyTuple(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint(address)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Uint(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_string(address)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4String(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_byte(address)byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Byte(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_bool(address)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Bool(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_address(address)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Address(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint128(address)uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Uint128(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_dynamic_bytes(address)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4DynamicBytes(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the LocalStateContract smart contract using the `opt_in()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The optIn result - */ - optIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { - const result = await this.appClient.send.optIn(LocalStateContractParamsFactory.optIn.optIn(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['opt_in()void'])} - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the LocalStateContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint(address)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_uint(address)uint64'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_string(address)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4String(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_string(address)string'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_byte(address)byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_byte(address)byte'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_bool(address)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_bool(address)bool'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_address(address)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Address(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_address(address)address'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint128(address)uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_uint128(address)uint128'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes(address)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_dynamic_bytes(address)byte[]'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_tuple(address)(uint64,byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyTuple(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_tuple(address)(uint64,byte[],bool)'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint(address)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Uint(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_uint(address)uint64'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_string(address)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4String(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_string(address)string'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_byte(address)byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Byte(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_byte(address)byte'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_bool(address)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Bool(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_bool(address)bool'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_address(address)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Address(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_address(address)address'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint128(address)uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Uint128(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_uint128(address)uint128'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_dynamic_bytes(address)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4DynamicBytes(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_dynamic_bytes(address)byte[]'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new LocalStateContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current LocalStateContract app - */ - state = { - /** - * Methods to access local state for the current LocalStateContract app - */ - local: (address: string | Address) => { - const encodedAddress = typeof address === 'string' ? address : encodeAddress(address.publicKey) - return { - /** - * Get all current keyed values from local state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.local(encodedAddress).getAll() - return { - implicitKeyArc4Uint: result.implicit_key_arc4_uint, - implicitKeyArc4String: result.implicit_key_arc4_string, - implicitKeyArc4Byte: result.implicit_key_arc4_byte, - implicitKeyArc4Bool: result.implicit_key_arc4_bool, - implicitKeyArc4Address: result.implicit_key_arc4_address, - implicitKeyArc4Uint128: result.implicit_key_arc4_uint128, - implicitKeyArc4DynamicBytes: result.implicit_key_arc4_dynamic_bytes, - implicitKeyTuple: result.implicit_key_tuple, - arc4Uint: result.arc4_uint, - arc4String: result.arc4_string, - arc4Byte: result.arc4_byte, - arc4Bool: result.arc4_bool, - arc4Address: result.arc4_address, - arc4Uint128: result.arc4_uint128, - arc4DynamicBytes: result.arc4_dynamic_bytes, - } - }, - /** - * Get the current value of the implicit_key_arc4_uint key in local state - */ - implicitKeyArc4Uint: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_uint")) as bigint | undefined }, - /** - * Get the current value of the implicit_key_arc4_string key in local state - */ - implicitKeyArc4String: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_string")) as string | undefined }, - /** - * Get the current value of the implicit_key_arc4_byte key in local state - */ - implicitKeyArc4Byte: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_byte")) as number | undefined }, - /** - * Get the current value of the implicit_key_arc4_bool key in local state - */ - implicitKeyArc4Bool: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_bool")) as boolean | undefined }, - /** - * Get the current value of the implicit_key_arc4_address key in local state - */ - implicitKeyArc4Address: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_address")) as string | undefined }, - /** - * Get the current value of the implicit_key_arc4_uint128 key in local state - */ - implicitKeyArc4Uint128: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_uint128")) as bigint | undefined }, - /** - * Get the current value of the implicit_key_arc4_dynamic_bytes key in local state - */ - implicitKeyArc4DynamicBytes: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_dynamic_bytes")) as Uint8Array | undefined }, - /** - * Get the current value of the implicit_key_tuple key in local state - */ - implicitKeyTuple: async (): Promise<[bigint, Uint8Array, boolean] | undefined> => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_tuple")) as [bigint, Uint8Array, boolean] | undefined }, - /** - * Get the current value of the arc4_uint key in local state - */ - arc4Uint: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_uint")) as bigint | undefined }, - /** - * Get the current value of the arc4_string key in local state - */ - arc4String: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_string")) as string | undefined }, - /** - * Get the current value of the arc4_byte key in local state - */ - arc4Byte: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_byte")) as number | undefined }, - /** - * Get the current value of the arc4_bool key in local state - */ - arc4Bool: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_bool")) as boolean | undefined }, - /** - * Get the current value of the arc4_address key in local state - */ - arc4Address: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_address")) as string | undefined }, - /** - * Get the current value of the arc4_uint128 key in local state - */ - arc4Uint128: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_uint128")) as bigint | undefined }, - /** - * Get the current value of the arc4_dynamic_bytes key in local state - */ - arc4DynamicBytes: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_dynamic_bytes")) as Uint8Array | undefined }, - } - }, - } - - public newGroup(composerConfig?: TransactionComposerConfig): LocalStateContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a get_implicit_key_arc4_uint(address)uint64 method call against the LocalStateContract contract - */ - getImplicitKeyArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Uint(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_string(address)string method call against the LocalStateContract contract - */ - getImplicitKeyArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4String(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_byte(address)byte method call against the LocalStateContract contract - */ - getImplicitKeyArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Byte(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_bool(address)bool method call against the LocalStateContract contract - */ - getImplicitKeyArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Bool(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_address(address)address method call against the LocalStateContract contract - */ - getImplicitKeyArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Address(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_uint128(address)uint128 method call against the LocalStateContract contract - */ - getImplicitKeyArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Uint128(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_dynamic_bytes(address)byte[] method call against the LocalStateContract contract - */ - getImplicitKeyArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4DynamicBytes(params))) - return this - }, - /** - * Add a get_implicit_key_tuple(address)(uint64,byte[],bool) method call against the LocalStateContract contract - */ - getImplicitKeyTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyTuple(params))) - return this - }, - /** - * Add a get_arc4_uint(address)uint64 method call against the LocalStateContract contract - */ - getArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Uint(params))) - return this - }, - /** - * Add a get_arc4_string(address)string method call against the LocalStateContract contract - */ - getArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4String(params))) - return this - }, - /** - * Add a get_arc4_byte(address)byte method call against the LocalStateContract contract - */ - getArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Byte(params))) - return this - }, - /** - * Add a get_arc4_bool(address)bool method call against the LocalStateContract contract - */ - getArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Bool(params))) - return this - }, - /** - * Add a get_arc4_address(address)address method call against the LocalStateContract contract - */ - getArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Address(params))) - return this - }, - /** - * Add a get_arc4_uint128(address)uint128 method call against the LocalStateContract contract - */ - getArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Uint128(params))) - return this - }, - /** - * Add a get_arc4_dynamic_bytes(address)byte[] method call against the LocalStateContract contract - */ - getArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4DynamicBytes(params))) - return this - }, - get optIn() { - return { - optIn: (params: CallParams) => { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn.optIn(params))) - return this - }, - } - }, - /** - * Add a clear state call to the LocalStateContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as LocalStateContractComposer - } -} -export type LocalStateContractComposer = { - /** - * Calls the get_implicit_key_arc4_uint(address)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4Uint(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_uint(address)uint64'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_string(address)string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4String(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_string(address)string'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_byte(address)byte ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4Byte(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_byte(address)byte'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_bool(address)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4Bool(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_bool(address)bool'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_address(address)address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4Address(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_address(address)address'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_uint128(address)uint128 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4Uint128(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_uint128(address)uint128'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_dynamic_bytes(address)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4DynamicBytes(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_dynamic_bytes(address)byte[]'] | undefined]> - - /** - * Calls the get_implicit_key_tuple(address)(uint64,byte[],bool) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyTuple(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_tuple(address)(uint64,byte[],bool)'] | undefined]> - - /** - * Calls the get_arc4_uint(address)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4Uint(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_uint(address)uint64'] | undefined]> - - /** - * Calls the get_arc4_string(address)string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4String(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_string(address)string'] | undefined]> - - /** - * Calls the get_arc4_byte(address)byte ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4Byte(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_byte(address)byte'] | undefined]> - - /** - * Calls the get_arc4_bool(address)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4Bool(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_bool(address)bool'] | undefined]> - - /** - * Calls the get_arc4_address(address)address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4Address(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_address(address)address'] | undefined]> - - /** - * Calls the get_arc4_uint128(address)uint128 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4Uint128(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_uint128(address)uint128'] | undefined]> - - /** - * Calls the get_arc4_dynamic_bytes(address)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4DynamicBytes(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_dynamic_bytes(address)byte[]'] | undefined]> - - /** - * Gets available optIn methods - */ - readonly optIn: { - /** - * Opts the user into an existing instance of the LocalStateContract smart contract using the opt_in()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - optIn(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['opt_in()void'] | undefined]> - } - - /** - * Makes a clear_state call to an existing instance of the LocalStateContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): LocalStateContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): LocalStateContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type LocalStateContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/MiscellaneousOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/MiscellaneousOpsContract.ts deleted file mode 100644 index afd9e82..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/MiscellaneousOpsContract.ts +++ /dev/null @@ -1,3082 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"MiscellaneousOpsContract","structs":{},"methods":[{"name":"verify_addw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_base64_decode_standard","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_base64_decode_url","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_bitlen","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_a_size"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_bitlen","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bsqrt","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_btoi","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bzero","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_concat","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"uint64","name":"pad_a_size"},{"type":"uint64","name":"pad_b_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_divmodw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"},{"type":"uint64","name":"d"}],"returns":{"type":"(uint64,uint64,uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_divw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_err","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_exp","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_expw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract_from_2","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract_uint16","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract_uint32","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_getbit_bytes","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_getbit_uint64","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_getbyte","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_itob","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_mulw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_replace","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_select_bytes","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_select_uint64","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_setbit_bytes","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"bool","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_setbit_uint64","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"},{"type":"bool","name":"c"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_setbyte","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_shl","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_shr","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_sqrt","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_substring","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_json_ref_string","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_json_ref_uint64","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_json_ref_object","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDE1MWY3Yzc1MDAyMCAweDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDQ0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg0NTg0N2VlYSAweGY1N2FjZWI1IDB4N2Q2MzE3MzAgMHhhMWIyNDQ0MSAweGNkN2JlMWFjIDB4N2NmZGE2NGIgMHg1NGE5MTBkOSAweGM0NjU2OGRlIDB4N2E0NmE2YWUgMHgwNDM3MjIwOSAweDdlNWY2ZDcyIDB4MjRlYmNmODQgMHg5YzBiMzM5NyAweDBhZDQwZGE0IDB4OTUxNzg4NzAgMHhkZWVkYzk5YiAweGFiMjE1MGJiIDB4MDJhNTQwMTcgMHgzZGI2NmI0MSAweDZlM2ZmMzhjIDB4OGYzYjlmMTggMHgxNjE2NmY5YSAweDJmNDcyMDY1IDB4ZDVhNzM5YzMgMHg2MWYzYjNlMSAweDU2Y2YzNjhiIDB4OTE5ZmZiZDIgMHhhYWU4YjY5NyAweDg0NzQyMmIxIDB4ZDUyNjAzMjcgMHgxMTRjOGM2ZCAweDM5ZTllNjJhIDB4ZDZhNGMwNWUgMHgxZWY4MTUxYSAweDY2ZGQ3Zjk2IDB4NGQ5ZWNlYjIgMHgxOWJhNzBlZSAvLyBtZXRob2QgInZlcmlmeV9hZGR3KHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfYmFzZTY0X2RlY29kZV9zdGFuZGFyZChieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmFzZTY0X2RlY29kZV91cmwoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2JpdGxlbihieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9iaXRsZW4odWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2JzcXJ0KGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9idG9pKGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9iemVybyh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfY29uY2F0KGJ5dGVbXSxieXRlW10sdWludDY0LHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9kaXZtb2R3KHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidmVyaWZ5X2RpdncodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZXJyKCl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfZXhwKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZXhwdyh1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidmVyaWZ5X2V4dHJhY3QoYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdF9mcm9tXzIoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2V4dHJhY3RfdWludDE2KGJ5dGVbXSx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdF91aW50MzIoYnl0ZVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9leHRyYWN0X3VpbnQ2NChieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2dldGJpdF9ieXRlcyhieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9nZXRiaXRfdWludDY0KHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2dldGJ5dGUoYnl0ZVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9pdG9iKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9tdWx3KHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfcmVwbGFjZShieXRlW10sdWludDY0LGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9zZWxlY3RfYnl0ZXMoYnl0ZVtdLGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc2VsZWN0X3VpbnQ2NCh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9zZXRiaXRfYnl0ZXMoYnl0ZVtdLHVpbnQ2NCxib29sKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X3NldGJpdF91aW50NjQodWludDY0LHVpbnQ2NCxib29sKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3NldGJ5dGUoYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc2hsKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc2hyKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc3FydCh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc3Vic3RyaW5nKGJ5dGVbXSx1aW50NjQsdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2pzb25fcmVmX3N0cmluZyhieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2pzb25fcmVmX3VpbnQ2NChieXRlW10sYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2pzb25fcmVmX29iamVjdChieXRlW10sYnl0ZVtdKWJ5dGVbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9hZGR3IHZlcmlmeV9iYXNlNjRfZGVjb2RlX3N0YW5kYXJkIHZlcmlmeV9iYXNlNjRfZGVjb2RlX3VybCB2ZXJpZnlfYnl0ZXNfYml0bGVuIHZlcmlmeV91aW50NjRfYml0bGVuIHZlcmlmeV9ic3FydCB2ZXJpZnlfYnRvaSB2ZXJpZnlfYnplcm8gdmVyaWZ5X2NvbmNhdCB2ZXJpZnlfZGl2bW9kdyB2ZXJpZnlfZGl2dyBtYWluX3ZlcmlmeV9lcnJfcm91dGVAMTUgdmVyaWZ5X2V4cCB2ZXJpZnlfZXhwdyB2ZXJpZnlfZXh0cmFjdCB2ZXJpZnlfZXh0cmFjdF9mcm9tXzIgdmVyaWZ5X2V4dHJhY3RfdWludDE2IHZlcmlmeV9leHRyYWN0X3VpbnQzMiB2ZXJpZnlfZXh0cmFjdF91aW50NjQgdmVyaWZ5X2dldGJpdF9ieXRlcyB2ZXJpZnlfZ2V0Yml0X3VpbnQ2NCB2ZXJpZnlfZ2V0Ynl0ZSB2ZXJpZnlfaXRvYiB2ZXJpZnlfbXVsdyB2ZXJpZnlfcmVwbGFjZSB2ZXJpZnlfc2VsZWN0X2J5dGVzIHZlcmlmeV9zZWxlY3RfdWludDY0IHZlcmlmeV9zZXRiaXRfYnl0ZXMgdmVyaWZ5X3NldGJpdF91aW50NjQgdmVyaWZ5X3NldGJ5dGUgdmVyaWZ5X3NobCB2ZXJpZnlfc2hyIHZlcmlmeV9zcXJ0IHZlcmlmeV9zdWJzdHJpbmcgdmVyaWZ5X2pzb25fcmVmX3N0cmluZyB2ZXJpZnlfanNvbl9yZWZfdWludDY0IHZlcmlmeV9qc29uX3JlZl9vYmplY3QKICAgIGVycgoKbWFpbl92ZXJpZnlfZXJyX3JvdXRlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANDQ6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYWRkd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hZGR3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjcKICAgIC8vIHJlc3VsdCA9IG9wLmFkZHcoYSwgYikKICAgIGFkZHcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Jhc2U2NF9kZWNvZGVfc3RhbmRhcmRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmFzZTY0X2RlY29kZV9zdGFuZGFyZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyCiAgICAvLyByZXN1bHQgPSBvcC5iYXNlNjRfZGVjb2RlKG9wLkJhc2U2NC5TdGRFbmNvZGluZywgYSkKICAgIGJhc2U2NF9kZWNvZGUgU3RkRW5jb2RpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIHJlc3VsdCA9IG9wLmJhc2U2NF9kZWNvZGUob3AuQmFzZTY0LlVSTEVuY29kaW5nLCBhKQogICAgYmFzZTY0X2RlY29kZSBVUkxFbmNvZGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfYml0bGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX2JpdGxlbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBhID0gb3AuYnplcm8ocGFkX2Ffc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToyMwogICAgLy8gcmVzdWx0ID0gb3AuYml0bGVuKGEpCiAgICBiaXRsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2JpdGxlbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfYml0bGVuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToyOAogICAgLy8gcmVzdWx0ID0gb3AuYml0bGVuKGEpCiAgICBiaXRsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYnNxcnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnNxcnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTozMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTozNAogICAgLy8gcmVzdWx0ID0gb3AuYnNxcnQoYV9iaWd1aW50KQogICAgYnNxcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2J0b2lbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnRvaToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjM5CiAgICAvLyByZXN1bHQgPSBvcC5idG9pKGEpCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTozNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2J6ZXJvW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J6ZXJvOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NAogICAgLy8gcmVzdWx0ID0gb3AuYnplcm8oYSkKICAgIGJ6ZXJvCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NQogICAgLy8gcmV0dXJuIG9wLnNoYTI1NihyZXN1bHQpCiAgICBzaGEyNTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2NvbmNhdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9jb25jYXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NDkKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfYV9zaXplKSArIGEKICAgIHN3YXAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NTAKICAgIC8vIGIgPSBvcC5iemVybyhwYWRfYl9zaXplKSArIGIKICAgIHN3YXAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NTEKICAgIC8vIHJlc3VsdCA9IGEgKyBiCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjUyCiAgICAvLyByZXN1bHQgPSBvcC5zaGEyNTYocmVzdWx0KQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9kaXZtb2R3W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Rpdm1vZHc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjU5CiAgICAvLyByZXN1bHQgPSBvcC5kaXZtb2R3KGEsIGIsIGMsIGQpCiAgICBkaXZtb2R3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Rpdndbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGl2dzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NjQKICAgIC8vIHJlc3VsdCA9IG9wLmRpdncoYSwgYiwgYykKICAgIGRpdncKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXhwW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4cDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIHJlc3VsdCA9IG9wLmV4cChhLCBiKQogICAgZXhwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4cHdbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZXhwdzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NzgKICAgIC8vIHJlc3VsdCA9IG9wLmV4cHcoYSwgYikKICAgIGV4cHcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4MwogICAgLy8gcmVzdWx0ID0gb3AuZXh0cmFjdChhLCBiLCBjKQogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3RfZnJvbV8yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3RfZnJvbV8yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4OAogICAgLy8gcmVzdWx0ID0gb3AuZXh0cmFjdChhLCAyLCAwKQogICAgZXh0cmFjdCA0IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3RfdWludDE2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3RfdWludDE2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTMKICAgIC8vIHJlc3VsdCA9IG9wLmV4dHJhY3RfdWludDE2KGEsIGIpCiAgICBleHRyYWN0X3VpbnQxNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0X3VpbnQzMltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9leHRyYWN0X3VpbnQzMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyByZXN1bHQgPSBvcC5leHRyYWN0X3VpbnQzMihhLCBiKQogICAgZXh0cmFjdF91aW50MzIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXh0cmFjdF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZXh0cmFjdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgcHVzaGludCA4CiAgICBleHRyYWN0MwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZ2V0Yml0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldGJpdF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMDgKICAgIC8vIHJlc3VsdCA9IG9wLmdldGJpdChhLCBiKQogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18yIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZ2V0Yml0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRiaXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTEzCiAgICAvLyByZXN1bHQgPSBvcC5nZXRiaXQoYSwgYikKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMiAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2dldGJ5dGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0Ynl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjExNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMTgKICAgIC8vIHJlc3VsdCA9IG9wLmdldGJ5dGUoYSwgYikKICAgIGdldGJ5dGUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjExNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2l0b2Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfaXRvYjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gcmVzdWx0ID0gb3AuaXRvYihhKQogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUwMDA4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfbXVsd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9tdWx3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTI4CiAgICAvLyByZXN1bHQgPSBvcC5tdWx3KGEsIGIpCiAgICBtdWx3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3JlcGxhY2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfcmVwbGFjZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTMzCiAgICAvLyByZXN1bHQgPSBvcC5yZXBsYWNlKGEsIGIsIGMpCiAgICByZXBsYWNlMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NlbGVjdF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zZWxlY3RfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gcmVzdWx0ID0gb3Auc2VsZWN0X2J5dGVzKGEsIGIsIGMpCiAgICBzZWxlY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zZWxlY3RfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NlbGVjdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDMKICAgIC8vIHJlc3VsdCA9IG9wLnNlbGVjdF91aW50NjQoYSwgYiwgYykKICAgIHNlbGVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2V0Yml0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NldGJpdF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDgKICAgIC8vIHJlc3VsdCA9IG9wLnNldGJpdF9ieXRlcyhhLCBiLCBjKQogICAgc2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2V0Yml0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zZXRiaXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUzCiAgICAvLyByZXN1bHQgPSBvcC5zZXRiaXRfdWludDY0KGEsIGIsIGMpCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NldGJ5dGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2V0Ynl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNTgKICAgIC8vIHJlc3VsdCA9IG9wLnNldGJ5dGUoYSwgYiwgYykKICAgIHNldGJ5dGUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zaGxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2hsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTYzCiAgICAvLyByZXN1bHQgPSBvcC5zaGwoYSwgYikKICAgIHNobAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2hyW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NocjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2OAogICAgLy8gcmVzdWx0ID0gb3Auc2hyKGEsIGIpCiAgICBzaHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NxcnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3FydDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3MwogICAgLy8gcmVzdWx0ID0gb3Auc3FydChhKQogICAgc3FydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc3Vic3RyaW5nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N1YnN0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNzgKICAgIC8vIHJlc3VsdCA9IG9wLnN1YnN0cmluZyhhLCBiLCBjKQogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2pzb25fcmVmX3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9qc29uX3JlZl9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gcmVzdWx0ID0gb3AuSnNvblJlZi5qc29uX3N0cmluZyhhLCBiKQogICAganNvbl9yZWYgSlNPTlN0cmluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2pzb25fcmVmX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9qc29uX3JlZl91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gcmVzdWx0ID0gb3AuSnNvblJlZi5qc29uX3VpbnQ2NChhLCBiKQogICAganNvbl9yZWYgSlNPTlVpbnQ2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfanNvbl9yZWZfb2JqZWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2pzb25fcmVmX29iamVjdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTkzCiAgICAvLyByZXN1bHQgPSBvcC5Kc29uUmVmLmpzb25fb2JqZWN0KGEsIGIpCiAgICBqc29uX3JlZiBKU09OT2JqZWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmAwQVH3x1BhUffHUAIAEAMRtBARMxGRREMRhEgiUERYR+6gT1es61BH1jFzAEobJEQQTNe+GsBHz9pksEVKkQ2QTEZWjeBHpGpq4EBDciCQR+X21yBCTrz4QEnAszlwQK1A2kBJUXiHAE3u3JmwSrIVC7BAKlQBcEPbZrQQRuP/OMBI87nxgEFhZvmgQvRyBlBNWnOcMEYfOz4QRWzzaLBJGf+9IEqui2lwSEdCKxBNUmAycEEUyMbQQ56eYqBNakwF4EHvgVGgRm3X+WBE2ezrIEGbpw7jYaAI4lAAoAHgA0AEoAXwBrAIAAjgCaAMAA5QABAPkBCQEdAToBTgFgAXIBhQGbAa8BwQHTAecCBgIlAjkCVwJsAokCmQKpArUC0gLuAwMAADEZFDEYFBBDNhoBFzYaAhceTBZMFlAoTFCwIkM2GgFXAgBeAUkVFlcGAkxQKExQsCJDNhoBVwIAXgBJFRZXBgJMUChMULAiQzYaAVcCADYaAhevTFCTFihMULAiQzYaAReTFihMULAiQzYaAVcCAJZJFRZXBgJMUChMULAiQzYaAVcCABcWKExQsCJDNhoBF68BKUxQsCJDNhoBVwIANhoCVwIANhoDFzYaBBdMr08DUEyvTwJQUAEpTFCwIkM2GgEXNhoCFzYaAxc2GgQXH08DFk8DFlBPAhZQTBZQKExQsCJDNhoBFzYaAhc2GgMXlxYoTFCwIkM2GgEXNhoCF5QWKExQsCJDNhoBFzYaAheVTBZMFlAoTFCwIkM2GgFXAgA2GgIXNhoDF1hJFRZXBgJMUChMULAiQzYaAVcEAEkVFlcGAkxQKExQsCJDNhoBVwIANhoCF1kWKExQsCJDNhoBVwIANhoCF1oWKExQsCJDNhoBVwIANhoCF4EIWChMULAiQzYaAVcCADYaAhdTKiNPAlQoTFCwIkM2GgEXNhoCF1MqI08CVChMULAiQzYaAVcCADYaAhdVFihMULAiQzYaARcWgAYVH3x1AAhMULAiQzYaARc2GgIXHUwWTBZQKExQsCJDNhoBVwIANhoCFzYaA1cCAF1JFRZXBgJMUChMULAiQzYaAVcCADYaAlcCADYaAxdNSRUWVwYCTFAoTFCwIkM2GgEXNhoCFzYaAxdNFihMULAiQzYaAVcCADYaAhc2GgMjU1RJFRZXBgJMUChMULAiQzYaARc2GgIXNhoDI1NUFihMULAiQzYaAVcCADYaAhc2GgMXVkkVFlcGAkxQKExQsCJDNhoBFzYaAheQFihMULAiQzYaARc2GgIXkRYoTFCwIkM2GgEXkhYoTFCwIkM2GgFXAgA2GgIXNhoDF1JJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAF8ASRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgBfARYoTFCwIkM2GgFXAgA2GgJXAgBfAkkVFlcGAkxQKExQsCJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the MiscellaneousOpsContract contract - */ -export type MiscellaneousOpsContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify_addw(uint64,uint64)(uint64,uint64)': { - a: bigint | number - b: bigint | number - } - 'verify_base64_decode_standard(byte[])byte[]': { - a: Uint8Array - } - 'verify_base64_decode_url(byte[])byte[]': { - a: Uint8Array - } - 'verify_bytes_bitlen(byte[],uint64)uint64': { - a: Uint8Array - padASize: bigint | number - } - 'verify_uint64_bitlen(uint64)uint64': { - a: bigint | number - } - 'verify_bsqrt(byte[])byte[]': { - a: Uint8Array - } - 'verify_btoi(byte[])uint64': { - a: Uint8Array - } - 'verify_bzero(uint64)byte[]': { - a: bigint | number - } - 'verify_concat(byte[],byte[],uint64,uint64)byte[]': { - a: Uint8Array - b: Uint8Array - padASize: bigint | number - padBSize: bigint | number - } - 'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)': { - a: bigint | number - b: bigint | number - c: bigint | number - d: bigint | number - } - 'verify_divw(uint64,uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - c: bigint | number - } - 'verify_err()void': Record - 'verify_exp(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_expw(uint64,uint64)(uint64,uint64)': { - a: bigint | number - b: bigint | number - } - 'verify_extract(byte[],uint64,uint64)byte[]': { - a: Uint8Array - b: bigint | number - c: bigint | number - } - 'verify_extract_from_2(byte[])byte[]': { - a: Uint8Array - } - 'verify_extract_uint16(byte[],uint64)uint64': { - a: Uint8Array - b: bigint | number - } - 'verify_extract_uint32(byte[],uint64)uint64': { - a: Uint8Array - b: bigint | number - } - 'verify_extract_uint64(byte[],uint64)uint64': { - a: Uint8Array - b: bigint | number - } - 'verify_getbit_bytes(byte[],uint64)bool': { - a: Uint8Array - b: bigint | number - } - 'verify_getbit_uint64(uint64,uint64)bool': { - a: bigint | number - b: bigint | number - } - 'verify_getbyte(byte[],uint64)uint64': { - a: Uint8Array - b: bigint | number - } - 'verify_itob(uint64)byte[]': { - a: bigint | number - } - 'verify_mulw(uint64,uint64)(uint64,uint64)': { - a: bigint | number - b: bigint | number - } - 'verify_replace(byte[],uint64,byte[])byte[]': { - a: Uint8Array - b: bigint | number - c: Uint8Array - } - 'verify_select_bytes(byte[],byte[],uint64)byte[]': { - a: Uint8Array - b: Uint8Array - c: bigint | number - } - 'verify_select_uint64(uint64,uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - c: bigint | number - } - 'verify_setbit_bytes(byte[],uint64,bool)byte[]': { - a: Uint8Array - b: bigint | number - c: boolean - } - 'verify_setbit_uint64(uint64,uint64,bool)uint64': { - a: bigint | number - b: bigint | number - c: boolean - } - 'verify_setbyte(byte[],uint64,uint64)byte[]': { - a: Uint8Array - b: bigint | number - c: bigint | number - } - 'verify_shl(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_shr(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_sqrt(uint64)uint64': { - a: bigint | number - } - 'verify_substring(byte[],uint64,uint64)byte[]': { - a: Uint8Array - b: bigint | number - c: bigint | number - } - 'verify_json_ref_string(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_json_ref_uint64(byte[],byte[])uint64': { - a: Uint8Array - b: Uint8Array - } - 'verify_json_ref_object(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify_addw(uint64,uint64)(uint64,uint64)': [a: bigint | number, b: bigint | number] - 'verify_base64_decode_standard(byte[])byte[]': [a: Uint8Array] - 'verify_base64_decode_url(byte[])byte[]': [a: Uint8Array] - 'verify_bytes_bitlen(byte[],uint64)uint64': [a: Uint8Array, padASize: bigint | number] - 'verify_uint64_bitlen(uint64)uint64': [a: bigint | number] - 'verify_bsqrt(byte[])byte[]': [a: Uint8Array] - 'verify_btoi(byte[])uint64': [a: Uint8Array] - 'verify_bzero(uint64)byte[]': [a: bigint | number] - 'verify_concat(byte[],byte[],uint64,uint64)byte[]': [a: Uint8Array, b: Uint8Array, padASize: bigint | number, padBSize: bigint | number] - 'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)': [a: bigint | number, b: bigint | number, c: bigint | number, d: bigint | number] - 'verify_divw(uint64,uint64,uint64)uint64': [a: bigint | number, b: bigint | number, c: bigint | number] - 'verify_err()void': [] - 'verify_exp(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_expw(uint64,uint64)(uint64,uint64)': [a: bigint | number, b: bigint | number] - 'verify_extract(byte[],uint64,uint64)byte[]': [a: Uint8Array, b: bigint | number, c: bigint | number] - 'verify_extract_from_2(byte[])byte[]': [a: Uint8Array] - 'verify_extract_uint16(byte[],uint64)uint64': [a: Uint8Array, b: bigint | number] - 'verify_extract_uint32(byte[],uint64)uint64': [a: Uint8Array, b: bigint | number] - 'verify_extract_uint64(byte[],uint64)uint64': [a: Uint8Array, b: bigint | number] - 'verify_getbit_bytes(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] - 'verify_getbit_uint64(uint64,uint64)bool': [a: bigint | number, b: bigint | number] - 'verify_getbyte(byte[],uint64)uint64': [a: Uint8Array, b: bigint | number] - 'verify_itob(uint64)byte[]': [a: bigint | number] - 'verify_mulw(uint64,uint64)(uint64,uint64)': [a: bigint | number, b: bigint | number] - 'verify_replace(byte[],uint64,byte[])byte[]': [a: Uint8Array, b: bigint | number, c: Uint8Array] - 'verify_select_bytes(byte[],byte[],uint64)byte[]': [a: Uint8Array, b: Uint8Array, c: bigint | number] - 'verify_select_uint64(uint64,uint64,uint64)uint64': [a: bigint | number, b: bigint | number, c: bigint | number] - 'verify_setbit_bytes(byte[],uint64,bool)byte[]': [a: Uint8Array, b: bigint | number, c: boolean] - 'verify_setbit_uint64(uint64,uint64,bool)uint64': [a: bigint | number, b: bigint | number, c: boolean] - 'verify_setbyte(byte[],uint64,uint64)byte[]': [a: Uint8Array, b: bigint | number, c: bigint | number] - 'verify_shl(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_shr(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_sqrt(uint64)uint64': [a: bigint | number] - 'verify_substring(byte[],uint64,uint64)byte[]': [a: Uint8Array, b: bigint | number, c: bigint | number] - 'verify_json_ref_string(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_json_ref_uint64(byte[],byte[])uint64': [a: Uint8Array, b: Uint8Array] - 'verify_json_ref_object(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - } -} - -/** - * The return type for each method - */ -export type MiscellaneousOpsContractReturns = { - 'verify_addw(uint64,uint64)(uint64,uint64)': [bigint, bigint] - 'verify_base64_decode_standard(byte[])byte[]': Uint8Array - 'verify_base64_decode_url(byte[])byte[]': Uint8Array - 'verify_bytes_bitlen(byte[],uint64)uint64': bigint - 'verify_uint64_bitlen(uint64)uint64': bigint - 'verify_bsqrt(byte[])byte[]': Uint8Array - 'verify_btoi(byte[])uint64': bigint - 'verify_bzero(uint64)byte[]': Uint8Array - 'verify_concat(byte[],byte[],uint64,uint64)byte[]': Uint8Array - 'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)': [bigint, bigint, bigint, bigint] - 'verify_divw(uint64,uint64,uint64)uint64': bigint - 'verify_err()void': void - 'verify_exp(uint64,uint64)uint64': bigint - 'verify_expw(uint64,uint64)(uint64,uint64)': [bigint, bigint] - 'verify_extract(byte[],uint64,uint64)byte[]': Uint8Array - 'verify_extract_from_2(byte[])byte[]': Uint8Array - 'verify_extract_uint16(byte[],uint64)uint64': bigint - 'verify_extract_uint32(byte[],uint64)uint64': bigint - 'verify_extract_uint64(byte[],uint64)uint64': bigint - 'verify_getbit_bytes(byte[],uint64)bool': boolean - 'verify_getbit_uint64(uint64,uint64)bool': boolean - 'verify_getbyte(byte[],uint64)uint64': bigint - 'verify_itob(uint64)byte[]': Uint8Array - 'verify_mulw(uint64,uint64)(uint64,uint64)': [bigint, bigint] - 'verify_replace(byte[],uint64,byte[])byte[]': Uint8Array - 'verify_select_bytes(byte[],byte[],uint64)byte[]': Uint8Array - 'verify_select_uint64(uint64,uint64,uint64)uint64': bigint - 'verify_setbit_bytes(byte[],uint64,bool)byte[]': Uint8Array - 'verify_setbit_uint64(uint64,uint64,bool)uint64': bigint - 'verify_setbyte(byte[],uint64,uint64)byte[]': Uint8Array - 'verify_shl(uint64,uint64)uint64': bigint - 'verify_shr(uint64,uint64)uint64': bigint - 'verify_sqrt(uint64)uint64': bigint - 'verify_substring(byte[],uint64,uint64)byte[]': Uint8Array - 'verify_json_ref_string(byte[],byte[])byte[]': Uint8Array - 'verify_json_ref_uint64(byte[],byte[])uint64': bigint - 'verify_json_ref_object(byte[],byte[])byte[]': Uint8Array -} - -/** - * Defines the types of available calls and state of the MiscellaneousOpsContract smart contract. - */ -export type MiscellaneousOpsContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify_addw(uint64,uint64)(uint64,uint64)' | 'verify_addw', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_addw(uint64,uint64)(uint64,uint64)'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_addw(uint64,uint64)(uint64,uint64)'] - returns: MiscellaneousOpsContractReturns['verify_addw(uint64,uint64)(uint64,uint64)'] - }> - & Record<'verify_base64_decode_standard(byte[])byte[]' | 'verify_base64_decode_standard', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_base64_decode_standard(byte[])byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_base64_decode_standard(byte[])byte[]'] - returns: MiscellaneousOpsContractReturns['verify_base64_decode_standard(byte[])byte[]'] - }> - & Record<'verify_base64_decode_url(byte[])byte[]' | 'verify_base64_decode_url', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_base64_decode_url(byte[])byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_base64_decode_url(byte[])byte[]'] - returns: MiscellaneousOpsContractReturns['verify_base64_decode_url(byte[])byte[]'] - }> - & Record<'verify_bytes_bitlen(byte[],uint64)uint64' | 'verify_bytes_bitlen', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_bytes_bitlen(byte[],uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_bytes_bitlen(byte[],uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_bytes_bitlen(byte[],uint64)uint64'] - }> - & Record<'verify_uint64_bitlen(uint64)uint64' | 'verify_uint64_bitlen', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_uint64_bitlen(uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_uint64_bitlen(uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_uint64_bitlen(uint64)uint64'] - }> - & Record<'verify_bsqrt(byte[])byte[]' | 'verify_bsqrt', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_bsqrt(byte[])byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_bsqrt(byte[])byte[]'] - returns: MiscellaneousOpsContractReturns['verify_bsqrt(byte[])byte[]'] - }> - & Record<'verify_btoi(byte[])uint64' | 'verify_btoi', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_btoi(byte[])uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_btoi(byte[])uint64'] - returns: MiscellaneousOpsContractReturns['verify_btoi(byte[])uint64'] - }> - & Record<'verify_bzero(uint64)byte[]' | 'verify_bzero', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_bzero(uint64)byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_bzero(uint64)byte[]'] - returns: MiscellaneousOpsContractReturns['verify_bzero(uint64)byte[]'] - }> - & Record<'verify_concat(byte[],byte[],uint64,uint64)byte[]' | 'verify_concat', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_concat(byte[],byte[],uint64,uint64)byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_concat(byte[],byte[],uint64,uint64)byte[]'] - returns: MiscellaneousOpsContractReturns['verify_concat(byte[],byte[],uint64,uint64)byte[]'] - }> - & Record<'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)' | 'verify_divmodw', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'] - returns: MiscellaneousOpsContractReturns['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'] - }> - & Record<'verify_divw(uint64,uint64,uint64)uint64' | 'verify_divw', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_divw(uint64,uint64,uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_divw(uint64,uint64,uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_divw(uint64,uint64,uint64)uint64'] - }> - & Record<'verify_err()void' | 'verify_err', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_err()void'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_err()void'] - returns: MiscellaneousOpsContractReturns['verify_err()void'] - }> - & Record<'verify_exp(uint64,uint64)uint64' | 'verify_exp', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_exp(uint64,uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_exp(uint64,uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_exp(uint64,uint64)uint64'] - }> - & Record<'verify_expw(uint64,uint64)(uint64,uint64)' | 'verify_expw', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_expw(uint64,uint64)(uint64,uint64)'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_expw(uint64,uint64)(uint64,uint64)'] - returns: MiscellaneousOpsContractReturns['verify_expw(uint64,uint64)(uint64,uint64)'] - }> - & Record<'verify_extract(byte[],uint64,uint64)byte[]' | 'verify_extract', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract(byte[],uint64,uint64)byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract(byte[],uint64,uint64)byte[]'] - returns: MiscellaneousOpsContractReturns['verify_extract(byte[],uint64,uint64)byte[]'] - }> - & Record<'verify_extract_from_2(byte[])byte[]' | 'verify_extract_from_2', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract_from_2(byte[])byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract_from_2(byte[])byte[]'] - returns: MiscellaneousOpsContractReturns['verify_extract_from_2(byte[])byte[]'] - }> - & Record<'verify_extract_uint16(byte[],uint64)uint64' | 'verify_extract_uint16', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract_uint16(byte[],uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract_uint16(byte[],uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_extract_uint16(byte[],uint64)uint64'] - }> - & Record<'verify_extract_uint32(byte[],uint64)uint64' | 'verify_extract_uint32', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract_uint32(byte[],uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract_uint32(byte[],uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_extract_uint32(byte[],uint64)uint64'] - }> - & Record<'verify_extract_uint64(byte[],uint64)uint64' | 'verify_extract_uint64', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract_uint64(byte[],uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract_uint64(byte[],uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_extract_uint64(byte[],uint64)uint64'] - }> - & Record<'verify_getbit_bytes(byte[],uint64)bool' | 'verify_getbit_bytes', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_getbit_bytes(byte[],uint64)bool'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_getbit_bytes(byte[],uint64)bool'] - returns: MiscellaneousOpsContractReturns['verify_getbit_bytes(byte[],uint64)bool'] - }> - & Record<'verify_getbit_uint64(uint64,uint64)bool' | 'verify_getbit_uint64', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_getbit_uint64(uint64,uint64)bool'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_getbit_uint64(uint64,uint64)bool'] - returns: MiscellaneousOpsContractReturns['verify_getbit_uint64(uint64,uint64)bool'] - }> - & Record<'verify_getbyte(byte[],uint64)uint64' | 'verify_getbyte', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_getbyte(byte[],uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_getbyte(byte[],uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_getbyte(byte[],uint64)uint64'] - }> - & Record<'verify_itob(uint64)byte[]' | 'verify_itob', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_itob(uint64)byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_itob(uint64)byte[]'] - returns: MiscellaneousOpsContractReturns['verify_itob(uint64)byte[]'] - }> - & Record<'verify_mulw(uint64,uint64)(uint64,uint64)' | 'verify_mulw', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_mulw(uint64,uint64)(uint64,uint64)'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_mulw(uint64,uint64)(uint64,uint64)'] - returns: MiscellaneousOpsContractReturns['verify_mulw(uint64,uint64)(uint64,uint64)'] - }> - & Record<'verify_replace(byte[],uint64,byte[])byte[]' | 'verify_replace', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_replace(byte[],uint64,byte[])byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_replace(byte[],uint64,byte[])byte[]'] - returns: MiscellaneousOpsContractReturns['verify_replace(byte[],uint64,byte[])byte[]'] - }> - & Record<'verify_select_bytes(byte[],byte[],uint64)byte[]' | 'verify_select_bytes', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_select_bytes(byte[],byte[],uint64)byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_select_bytes(byte[],byte[],uint64)byte[]'] - returns: MiscellaneousOpsContractReturns['verify_select_bytes(byte[],byte[],uint64)byte[]'] - }> - & Record<'verify_select_uint64(uint64,uint64,uint64)uint64' | 'verify_select_uint64', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_select_uint64(uint64,uint64,uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_select_uint64(uint64,uint64,uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_select_uint64(uint64,uint64,uint64)uint64'] - }> - & Record<'verify_setbit_bytes(byte[],uint64,bool)byte[]' | 'verify_setbit_bytes', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_setbit_bytes(byte[],uint64,bool)byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_setbit_bytes(byte[],uint64,bool)byte[]'] - returns: MiscellaneousOpsContractReturns['verify_setbit_bytes(byte[],uint64,bool)byte[]'] - }> - & Record<'verify_setbit_uint64(uint64,uint64,bool)uint64' | 'verify_setbit_uint64', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_setbit_uint64(uint64,uint64,bool)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_setbit_uint64(uint64,uint64,bool)uint64'] - returns: MiscellaneousOpsContractReturns['verify_setbit_uint64(uint64,uint64,bool)uint64'] - }> - & Record<'verify_setbyte(byte[],uint64,uint64)byte[]' | 'verify_setbyte', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_setbyte(byte[],uint64,uint64)byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_setbyte(byte[],uint64,uint64)byte[]'] - returns: MiscellaneousOpsContractReturns['verify_setbyte(byte[],uint64,uint64)byte[]'] - }> - & Record<'verify_shl(uint64,uint64)uint64' | 'verify_shl', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_shl(uint64,uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_shl(uint64,uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_shl(uint64,uint64)uint64'] - }> - & Record<'verify_shr(uint64,uint64)uint64' | 'verify_shr', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_shr(uint64,uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_shr(uint64,uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_shr(uint64,uint64)uint64'] - }> - & Record<'verify_sqrt(uint64)uint64' | 'verify_sqrt', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_sqrt(uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_sqrt(uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_sqrt(uint64)uint64'] - }> - & Record<'verify_substring(byte[],uint64,uint64)byte[]' | 'verify_substring', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_substring(byte[],uint64,uint64)byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_substring(byte[],uint64,uint64)byte[]'] - returns: MiscellaneousOpsContractReturns['verify_substring(byte[],uint64,uint64)byte[]'] - }> - & Record<'verify_json_ref_string(byte[],byte[])byte[]' | 'verify_json_ref_string', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_json_ref_string(byte[],byte[])byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_json_ref_string(byte[],byte[])byte[]'] - returns: MiscellaneousOpsContractReturns['verify_json_ref_string(byte[],byte[])byte[]'] - }> - & Record<'verify_json_ref_uint64(byte[],byte[])uint64' | 'verify_json_ref_uint64', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_json_ref_uint64(byte[],byte[])uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_json_ref_uint64(byte[],byte[])uint64'] - returns: MiscellaneousOpsContractReturns['verify_json_ref_uint64(byte[],byte[])uint64'] - }> - & Record<'verify_json_ref_object(byte[],byte[])byte[]' | 'verify_json_ref_object', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_json_ref_object(byte[],byte[])byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_json_ref_object(byte[],byte[])byte[]'] - returns: MiscellaneousOpsContractReturns['verify_json_ref_object(byte[],byte[])byte[]'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type MiscellaneousOpsContractSignatures = keyof MiscellaneousOpsContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type MiscellaneousOpsContractNonVoidMethodSignatures = keyof MiscellaneousOpsContractTypes['methods'] extends infer T ? T extends keyof MiscellaneousOpsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the MiscellaneousOpsContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = MiscellaneousOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the MiscellaneousOpsContract smart contract to the method's return type - */ -export type MethodReturn = MiscellaneousOpsContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type MiscellaneousOpsContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type MiscellaneousOpsContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: MiscellaneousOpsContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the MiscellaneousOpsContract smart contract - */ -export abstract class MiscellaneousOpsContractParamsFactory { - /** - * Constructs a no op call for the verify_addw(uint64,uint64)(uint64,uint64) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAddw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_addw(uint64,uint64)(uint64,uint64)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_base64_decode_standard(byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBase64DecodeStandard(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_base64_decode_standard(byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_base64_decode_url(byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBase64DecodeUrl(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_base64_decode_url(byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_bytes_bitlen(byte[],uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBytesBitlen(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bytes_bitlen(byte[],uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padASize], - } - } - /** - * Constructs a no op call for the verify_uint64_bitlen(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Bitlen(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_bitlen(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_bsqrt(byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBsqrt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bsqrt(byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_btoi(byte[])uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBtoi(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_btoi(byte[])uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_bzero(uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBzero(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bzero(uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_concat(byte[],byte[],uint64,uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyConcat(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_concat(byte[],byte[],uint64,uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.padASize, params.args.padBSize], - } - } - /** - * Constructs a no op call for the verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyDivmodw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d], - } - } - /** - * Constructs a no op call for the verify_divw(uint64,uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyDivw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_divw(uint64,uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_err()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyErr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_err()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the verify_exp(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyExp(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_exp(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_expw(uint64,uint64)(uint64,uint64) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyExpw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_expw(uint64,uint64)(uint64,uint64)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_extract(byte[],uint64,uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyExtract(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_extract(byte[],uint64,uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_extract_from_2(byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyExtractFrom_2(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_extract_from_2(byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_extract_uint16(byte[],uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyExtractUint16(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_extract_uint16(byte[],uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_extract_uint32(byte[],uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyExtractUint32(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_extract_uint32(byte[],uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_extract_uint64(byte[],uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyExtractUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_extract_uint64(byte[],uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_getbit_bytes(byte[],uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyGetbitBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_getbit_bytes(byte[],uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_getbit_uint64(uint64,uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyGetbitUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_getbit_uint64(uint64,uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_getbyte(byte[],uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyGetbyte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_getbyte(byte[],uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_itob(uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyItob(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_itob(uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_mulw(uint64,uint64)(uint64,uint64) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyMulw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_mulw(uint64,uint64)(uint64,uint64)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_replace(byte[],uint64,byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyReplace(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_replace(byte[],uint64,byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_select_bytes(byte[],byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifySelectBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_select_bytes(byte[],byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_select_uint64(uint64,uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifySelectUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_select_uint64(uint64,uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_setbit_bytes(byte[],uint64,bool)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifySetbitBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_setbit_bytes(byte[],uint64,bool)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_setbit_uint64(uint64,uint64,bool)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifySetbitUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_setbit_uint64(uint64,uint64,bool)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_setbyte(byte[],uint64,uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifySetbyte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_setbyte(byte[],uint64,uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_shl(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyShl(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_shl(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_shr(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyShr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_shr(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_sqrt(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifySqrt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_sqrt(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_substring(byte[],uint64,uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifySubstring(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_substring(byte[],uint64,uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_json_ref_string(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyJsonRefString(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_json_ref_string(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_json_ref_uint64(byte[],byte[])uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyJsonRefUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_json_ref_uint64(byte[],byte[])uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_json_ref_object(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyJsonRefObject(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_json_ref_object(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } -} - -/** - * A factory to create and deploy one or more instance of the MiscellaneousOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class MiscellaneousOpsContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `MiscellaneousOpsContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new MiscellaneousOpsContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new MiscellaneousOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the MiscellaneousOpsContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: MiscellaneousOpsContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new MiscellaneousOpsContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the MiscellaneousOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the MiscellaneousOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the MiscellaneousOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new MiscellaneousOpsContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the MiscellaneousOpsContract smart contract - */ -export class MiscellaneousOpsContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `MiscellaneousOpsContractClient` - * - * @param appClient An `AppClient` instance which has been created with the MiscellaneousOpsContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `MiscellaneousOpsContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `MiscellaneousOpsContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new MiscellaneousOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `MiscellaneousOpsContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new MiscellaneousOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the MiscellaneousOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_addw(uint64,uint64)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAddw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyAddw(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_standard(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBase64DecodeStandard: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeStandard(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_url(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBase64DecodeUrl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeUrl(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bytes_bitlen(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBytesBitlen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBytesBitlen(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_uint64_bitlen(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Bitlen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyUint64Bitlen(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bsqrt(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBsqrt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBsqrt(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_btoi(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBtoi: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBtoi(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bzero(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBzero: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBzero(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_concat(byte[],byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyConcat: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyConcat(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyDivmodw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyDivmodw(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divw(uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyDivw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyDivw(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_err()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyErr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyErr(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_exp(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyExp: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExp(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_expw(uint64,uint64)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyExpw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExpw(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract(byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyExtract: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtract(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_from_2(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyExtractFrom_2: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtractFrom_2(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint16(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyExtractUint16: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint16(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint32(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyExtractUint32: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint32(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint64(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyExtractUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint64(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_bytes(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyGetbitBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyGetbitBytes(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_uint64(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyGetbitUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyGetbitUint64(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbyte(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyGetbyte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyGetbyte(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_itob(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyItob: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyItob(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_mulw(uint64,uint64)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyMulw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyMulw(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_replace(byte[],uint64,byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyReplace: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyReplace(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_bytes(byte[],byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifySelectBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySelectBytes(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_uint64(uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifySelectUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySelectUint64(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_bytes(byte[],uint64,bool)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifySetbitBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySetbitBytes(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_uint64(uint64,uint64,bool)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifySetbitUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySetbitUint64(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbyte(byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifySetbyte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySetbyte(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shl(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyShl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyShl(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shr(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyShr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyShr(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_sqrt(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifySqrt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySqrt(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_substring(byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifySubstring: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySubstring(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_string(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyJsonRefString: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefString(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_uint64(byte[],byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyJsonRefUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefUint64(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_object(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyJsonRefObject: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefObject(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the MiscellaneousOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_addw(uint64,uint64)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAddw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyAddw(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_standard(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBase64DecodeStandard: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeStandard(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_url(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBase64DecodeUrl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeUrl(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bytes_bitlen(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBytesBitlen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBytesBitlen(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_uint64_bitlen(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Bitlen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyUint64Bitlen(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bsqrt(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBsqrt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBsqrt(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_btoi(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBtoi: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBtoi(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bzero(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBzero: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBzero(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_concat(byte[],byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyConcat: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyConcat(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyDivmodw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyDivmodw(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divw(uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyDivw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyDivw(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_err()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyErr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyErr(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_exp(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyExp: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExp(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_expw(uint64,uint64)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyExpw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExpw(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract(byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyExtract: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtract(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_from_2(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyExtractFrom_2: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtractFrom_2(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint16(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyExtractUint16: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint16(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint32(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyExtractUint32: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint32(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint64(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyExtractUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint64(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_bytes(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyGetbitBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyGetbitBytes(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_uint64(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyGetbitUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyGetbitUint64(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbyte(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyGetbyte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyGetbyte(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_itob(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyItob: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyItob(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_mulw(uint64,uint64)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyMulw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyMulw(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_replace(byte[],uint64,byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyReplace: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyReplace(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_bytes(byte[],byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifySelectBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySelectBytes(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_uint64(uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifySelectUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySelectUint64(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_bytes(byte[],uint64,bool)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifySetbitBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySetbitBytes(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_uint64(uint64,uint64,bool)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifySetbitUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySetbitUint64(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbyte(byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifySetbyte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySetbyte(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shl(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyShl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyShl(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shr(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyShr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyShr(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_sqrt(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifySqrt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySqrt(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_substring(byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifySubstring: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySubstring(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_string(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyJsonRefString: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefString(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_uint64(byte[],byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyJsonRefUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefUint64(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_object(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyJsonRefObject: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefObject(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the MiscellaneousOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_addw(uint64,uint64)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAddw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyAddw(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_addw(uint64,uint64)(uint64,uint64)'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_standard(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBase64DecodeStandard: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeStandard(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_base64_decode_standard(byte[])byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_url(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBase64DecodeUrl: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeUrl(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_base64_decode_url(byte[])byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bytes_bitlen(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBytesBitlen: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBytesBitlen(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_bytes_bitlen(byte[],uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_uint64_bitlen(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Bitlen: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyUint64Bitlen(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_uint64_bitlen(uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bsqrt(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBsqrt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBsqrt(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_bsqrt(byte[])byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_btoi(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBtoi: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBtoi(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_btoi(byte[])uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bzero(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBzero: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBzero(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_bzero(uint64)byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_concat(byte[],byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyConcat: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyConcat(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_concat(byte[],byte[],uint64,uint64)byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyDivmodw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyDivmodw(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divw(uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyDivw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyDivw(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_divw(uint64,uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_err()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyErr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyErr(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_err()void'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_exp(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyExp: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExp(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_exp(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_expw(uint64,uint64)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyExpw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExpw(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_expw(uint64,uint64)(uint64,uint64)'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract(byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyExtract: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtract(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract(byte[],uint64,uint64)byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_from_2(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyExtractFrom_2: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtractFrom_2(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract_from_2(byte[])byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint16(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyExtractUint16: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint16(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract_uint16(byte[],uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint32(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyExtractUint32: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint32(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract_uint32(byte[],uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint64(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyExtractUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint64(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract_uint64(byte[],uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_bytes(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyGetbitBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyGetbitBytes(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_getbit_bytes(byte[],uint64)bool'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_uint64(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyGetbitUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyGetbitUint64(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_getbit_uint64(uint64,uint64)bool'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbyte(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyGetbyte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyGetbyte(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_getbyte(byte[],uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_itob(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyItob: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyItob(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_itob(uint64)byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_mulw(uint64,uint64)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyMulw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyMulw(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_mulw(uint64,uint64)(uint64,uint64)'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_replace(byte[],uint64,byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyReplace: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyReplace(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_replace(byte[],uint64,byte[])byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_bytes(byte[],byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifySelectBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySelectBytes(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_select_bytes(byte[],byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_uint64(uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifySelectUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySelectUint64(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_select_uint64(uint64,uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_bytes(byte[],uint64,bool)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifySetbitBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySetbitBytes(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_setbit_bytes(byte[],uint64,bool)byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_uint64(uint64,uint64,bool)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifySetbitUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySetbitUint64(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_setbit_uint64(uint64,uint64,bool)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbyte(byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifySetbyte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySetbyte(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_setbyte(byte[],uint64,uint64)byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shl(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyShl: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyShl(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_shl(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shr(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyShr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyShr(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_shr(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_sqrt(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifySqrt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySqrt(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_sqrt(uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_substring(byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifySubstring: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySubstring(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_substring(byte[],uint64,uint64)byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_string(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyJsonRefString: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefString(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_json_ref_string(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_uint64(byte[],byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyJsonRefUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefUint64(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_json_ref_uint64(byte[],byte[])uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_object(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyJsonRefObject: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefObject(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_json_ref_object(byte[],byte[])byte[]'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new MiscellaneousOpsContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current MiscellaneousOpsContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): MiscellaneousOpsContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_addw(uint64,uint64)(uint64,uint64) method call against the MiscellaneousOpsContract contract - */ - verifyAddw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAddw(params))) - return this - }, - /** - * Add a verify_base64_decode_standard(byte[])byte[] method call against the MiscellaneousOpsContract contract - */ - verifyBase64DecodeStandard(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBase64DecodeStandard(params))) - return this - }, - /** - * Add a verify_base64_decode_url(byte[])byte[] method call against the MiscellaneousOpsContract contract - */ - verifyBase64DecodeUrl(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBase64DecodeUrl(params))) - return this - }, - /** - * Add a verify_bytes_bitlen(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifyBytesBitlen(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesBitlen(params))) - return this - }, - /** - * Add a verify_uint64_bitlen(uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifyUint64Bitlen(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Bitlen(params))) - return this - }, - /** - * Add a verify_bsqrt(byte[])byte[] method call against the MiscellaneousOpsContract contract - */ - verifyBsqrt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBsqrt(params))) - return this - }, - /** - * Add a verify_btoi(byte[])uint64 method call against the MiscellaneousOpsContract contract - */ - verifyBtoi(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBtoi(params))) - return this - }, - /** - * Add a verify_bzero(uint64)byte[] method call against the MiscellaneousOpsContract contract - */ - verifyBzero(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBzero(params))) - return this - }, - /** - * Add a verify_concat(byte[],byte[],uint64,uint64)byte[] method call against the MiscellaneousOpsContract contract - */ - verifyConcat(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyConcat(params))) - return this - }, - /** - * Add a verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64) method call against the MiscellaneousOpsContract contract - */ - verifyDivmodw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyDivmodw(params))) - return this - }, - /** - * Add a verify_divw(uint64,uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifyDivw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyDivw(params))) - return this - }, - /** - * Add a verify_err()void method call against the MiscellaneousOpsContract contract - */ - verifyErr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyErr(params))) - return this - }, - /** - * Add a verify_exp(uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifyExp(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExp(params))) - return this - }, - /** - * Add a verify_expw(uint64,uint64)(uint64,uint64) method call against the MiscellaneousOpsContract contract - */ - verifyExpw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExpw(params))) - return this - }, - /** - * Add a verify_extract(byte[],uint64,uint64)byte[] method call against the MiscellaneousOpsContract contract - */ - verifyExtract(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtract(params))) - return this - }, - /** - * Add a verify_extract_from_2(byte[])byte[] method call against the MiscellaneousOpsContract contract - */ - verifyExtractFrom_2(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtractFrom_2(params))) - return this - }, - /** - * Add a verify_extract_uint16(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifyExtractUint16(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtractUint16(params))) - return this - }, - /** - * Add a verify_extract_uint32(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifyExtractUint32(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtractUint32(params))) - return this - }, - /** - * Add a verify_extract_uint64(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifyExtractUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtractUint64(params))) - return this - }, - /** - * Add a verify_getbit_bytes(byte[],uint64)bool method call against the MiscellaneousOpsContract contract - */ - verifyGetbitBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetbitBytes(params))) - return this - }, - /** - * Add a verify_getbit_uint64(uint64,uint64)bool method call against the MiscellaneousOpsContract contract - */ - verifyGetbitUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetbitUint64(params))) - return this - }, - /** - * Add a verify_getbyte(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifyGetbyte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetbyte(params))) - return this - }, - /** - * Add a verify_itob(uint64)byte[] method call against the MiscellaneousOpsContract contract - */ - verifyItob(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyItob(params))) - return this - }, - /** - * Add a verify_mulw(uint64,uint64)(uint64,uint64) method call against the MiscellaneousOpsContract contract - */ - verifyMulw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyMulw(params))) - return this - }, - /** - * Add a verify_replace(byte[],uint64,byte[])byte[] method call against the MiscellaneousOpsContract contract - */ - verifyReplace(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyReplace(params))) - return this - }, - /** - * Add a verify_select_bytes(byte[],byte[],uint64)byte[] method call against the MiscellaneousOpsContract contract - */ - verifySelectBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySelectBytes(params))) - return this - }, - /** - * Add a verify_select_uint64(uint64,uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifySelectUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySelectUint64(params))) - return this - }, - /** - * Add a verify_setbit_bytes(byte[],uint64,bool)byte[] method call against the MiscellaneousOpsContract contract - */ - verifySetbitBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySetbitBytes(params))) - return this - }, - /** - * Add a verify_setbit_uint64(uint64,uint64,bool)uint64 method call against the MiscellaneousOpsContract contract - */ - verifySetbitUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySetbitUint64(params))) - return this - }, - /** - * Add a verify_setbyte(byte[],uint64,uint64)byte[] method call against the MiscellaneousOpsContract contract - */ - verifySetbyte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySetbyte(params))) - return this - }, - /** - * Add a verify_shl(uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifyShl(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyShl(params))) - return this - }, - /** - * Add a verify_shr(uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifyShr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyShr(params))) - return this - }, - /** - * Add a verify_sqrt(uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifySqrt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySqrt(params))) - return this - }, - /** - * Add a verify_substring(byte[],uint64,uint64)byte[] method call against the MiscellaneousOpsContract contract - */ - verifySubstring(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySubstring(params))) - return this - }, - /** - * Add a verify_json_ref_string(byte[],byte[])byte[] method call against the MiscellaneousOpsContract contract - */ - verifyJsonRefString(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyJsonRefString(params))) - return this - }, - /** - * Add a verify_json_ref_uint64(byte[],byte[])uint64 method call against the MiscellaneousOpsContract contract - */ - verifyJsonRefUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyJsonRefUint64(params))) - return this - }, - /** - * Add a verify_json_ref_object(byte[],byte[])byte[] method call against the MiscellaneousOpsContract contract - */ - verifyJsonRefObject(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyJsonRefObject(params))) - return this - }, - /** - * Add a clear state call to the MiscellaneousOpsContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as MiscellaneousOpsContractComposer - } -} -export type MiscellaneousOpsContractComposer = { - /** - * Calls the verify_addw(uint64,uint64)(uint64,uint64) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAddw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_addw(uint64,uint64)(uint64,uint64)'] | undefined]> - - /** - * Calls the verify_base64_decode_standard(byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBase64DecodeStandard(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_base64_decode_standard(byte[])byte[]'] | undefined]> - - /** - * Calls the verify_base64_decode_url(byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBase64DecodeUrl(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_base64_decode_url(byte[])byte[]'] | undefined]> - - /** - * Calls the verify_bytes_bitlen(byte[],uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBytesBitlen(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_bytes_bitlen(byte[],uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_bitlen(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Bitlen(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_uint64_bitlen(uint64)uint64'] | undefined]> - - /** - * Calls the verify_bsqrt(byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBsqrt(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_bsqrt(byte[])byte[]'] | undefined]> - - /** - * Calls the verify_btoi(byte[])uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBtoi(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_btoi(byte[])uint64'] | undefined]> - - /** - * Calls the verify_bzero(uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBzero(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_bzero(uint64)byte[]'] | undefined]> - - /** - * Calls the verify_concat(byte[],byte[],uint64,uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyConcat(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_concat(byte[],byte[],uint64,uint64)byte[]'] | undefined]> - - /** - * Calls the verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyDivmodw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'] | undefined]> - - /** - * Calls the verify_divw(uint64,uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyDivw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_divw(uint64,uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_err()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyErr(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_err()void'] | undefined]> - - /** - * Calls the verify_exp(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyExp(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_exp(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_expw(uint64,uint64)(uint64,uint64) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyExpw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_expw(uint64,uint64)(uint64,uint64)'] | undefined]> - - /** - * Calls the verify_extract(byte[],uint64,uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyExtract(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract(byte[],uint64,uint64)byte[]'] | undefined]> - - /** - * Calls the verify_extract_from_2(byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyExtractFrom_2(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract_from_2(byte[])byte[]'] | undefined]> - - /** - * Calls the verify_extract_uint16(byte[],uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyExtractUint16(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract_uint16(byte[],uint64)uint64'] | undefined]> - - /** - * Calls the verify_extract_uint32(byte[],uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyExtractUint32(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract_uint32(byte[],uint64)uint64'] | undefined]> - - /** - * Calls the verify_extract_uint64(byte[],uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyExtractUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract_uint64(byte[],uint64)uint64'] | undefined]> - - /** - * Calls the verify_getbit_bytes(byte[],uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyGetbitBytes(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_getbit_bytes(byte[],uint64)bool'] | undefined]> - - /** - * Calls the verify_getbit_uint64(uint64,uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyGetbitUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_getbit_uint64(uint64,uint64)bool'] | undefined]> - - /** - * Calls the verify_getbyte(byte[],uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyGetbyte(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_getbyte(byte[],uint64)uint64'] | undefined]> - - /** - * Calls the verify_itob(uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyItob(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_itob(uint64)byte[]'] | undefined]> - - /** - * Calls the verify_mulw(uint64,uint64)(uint64,uint64) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyMulw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_mulw(uint64,uint64)(uint64,uint64)'] | undefined]> - - /** - * Calls the verify_replace(byte[],uint64,byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyReplace(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_replace(byte[],uint64,byte[])byte[]'] | undefined]> - - /** - * Calls the verify_select_bytes(byte[],byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifySelectBytes(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_select_bytes(byte[],byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_select_uint64(uint64,uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifySelectUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_select_uint64(uint64,uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_setbit_bytes(byte[],uint64,bool)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifySetbitBytes(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_setbit_bytes(byte[],uint64,bool)byte[]'] | undefined]> - - /** - * Calls the verify_setbit_uint64(uint64,uint64,bool)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifySetbitUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_setbit_uint64(uint64,uint64,bool)uint64'] | undefined]> - - /** - * Calls the verify_setbyte(byte[],uint64,uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifySetbyte(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_setbyte(byte[],uint64,uint64)byte[]'] | undefined]> - - /** - * Calls the verify_shl(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyShl(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_shl(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_shr(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyShr(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_shr(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_sqrt(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifySqrt(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_sqrt(uint64)uint64'] | undefined]> - - /** - * Calls the verify_substring(byte[],uint64,uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifySubstring(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_substring(byte[],uint64,uint64)byte[]'] | undefined]> - - /** - * Calls the verify_json_ref_string(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyJsonRefString(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_json_ref_string(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_json_ref_uint64(byte[],byte[])uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyJsonRefUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_json_ref_uint64(byte[],byte[])uint64'] | undefined]> - - /** - * Calls the verify_json_ref_object(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyJsonRefObject(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_json_ref_object(byte[],byte[])byte[]'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the MiscellaneousOpsContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): MiscellaneousOpsContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): MiscellaneousOpsContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type MiscellaneousOpsContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/PrimitiveOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/PrimitiveOpsContract.ts deleted file mode 100644 index 5ff671b..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/PrimitiveOpsContract.ts +++ /dev/null @@ -1,4701 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"PrimitiveOpsContract","structs":{},"methods":[{"name":"verify_uint64_init","args":[{"type":"byte[]","name":"raw_value"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_add","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_sub","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_mul","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_div","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_mod","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_and","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_or","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_xor","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_not","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_lshift","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_rshift","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_pow","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_eq","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_ne","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_lt","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_le","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_gt","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_ge","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_init","args":[{"type":"uint64","name":"raw_value"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_add","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"uint64","name":"pad_a_size"},{"type":"uint64","name":"pad_b_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_and","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_or","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_xor","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_not","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_add","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_add_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_sub","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_sub_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_mul","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_mul_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_div","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_div_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_mod","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_mod_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_and","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_and_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_or","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_or_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_xor","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_xor_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_eq_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_ne_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_lt_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_le_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_gt_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_ge_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_init","args":[{"type":"string","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_startswith","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_endswith","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_join","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_log","args":[{"type":"string","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"},{"type":"bool","name":"e"},{"type":"string","name":"f"},{"type":"uint64","name":"g"},{"type":"uint256","name":"h"},{"type":"ufixed32x8","name":"i"},{"type":"ufixed256x16","name":"j"},{"type":"byte[]","name":"k"},{"type":"byte[]","name":"m"},{"type":"byte[]","name":"n"},{"type":"byte[5]","name":"o"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDAwICItIiAweDE1MWY3Yzc1MDAyMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANjcKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDcyNWM2OTJiIDB4MTczMTQ1NTkgMHg1M2YzNDg5MyAweDg4YzhiMjY5IDB4YTQ2NGI3YWIgMHg5YzhiMTFiOCAweDZmNDA2NTRlIDB4ZWM5YTI5NzQgMHhjNzkzNzA4ZiAweDdkZGI3NDk5IDB4YTIxYzQ0M2QgMHg2ZTdmYjIxMiAweGIwMDdmY2IwIDB4MmViYzIwZDQgMHhiMDk1NGI2NiAweGRkMTQwYWVmIDB4YWNlNDc0ZGEgMHhiYTY5NDk5MCAweDZkYjU4MWMwIDB4OTFjOGRiODkgMHhkYmU3NzE1OCAweDlhMGYyMmUxIDB4NjQwMzNkMzcgMHgyYTcyMzdjNSAweGUzYTk0NDU4IDB4NDJmODdmN2QgMHgyYjU1NDJhNCAweDliZTJmYmU5IDB4MWNkOTI1MTUgMHg2NGUxNzA1YyAweGYxMjcxYzUwIDB4MmFiNjNiNzAgMHg4MzRiYjdkMiAweDUzMTYyMGQ3IDB4M2ZiOWU3NjkgMHhmYThkYjBiYyAweGE3MmVhNDg1IDB4YjdiMGJhMTkgMHg3NDQ2MGM0MiAweGFiMzIwNzM4IDB4NTJhZDQ2NTQgMHgxMDE1NjM5OSAweDBmMDc1OTU3IDB4YmQ4NDNkZmYgMHhiMzc3ZDM4MSAweDg5NzY3MjY1IDB4NDU2YjRiMjMgMHgzM2QxYjg4YyAweDZiZjk3M2VhIDB4NjdjZDZiYjIgMHgzZjU4ODA1YSAweDFlMTMwMDM5IDB4NTA5ZGM5MWQgMHhhNTY0YTIwMiAweDIzNjUwNzYzIDB4ZjhjOGY4ZDUgMHgyM2ZhZjdhNCAweDdkMGFmZTE1IDB4NDg1ODFhZGYgMHgzZGFlZjljZCAvLyBtZXRob2QgInZlcmlmeV91aW50NjRfaW5pdChieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2FkZCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9zdWIodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbXVsKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2Rpdih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9tb2QodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfYW5kKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X29yKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X3hvcih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9ub3QodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9sc2hpZnQodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfcnNoaWZ0KHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X3Bvdyh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9lcSh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbmUodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2x0KHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9sZSh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfZ3QodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2dlKHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2luaXQodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2FkZChieXRlW10sYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfYW5kKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfb3IoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc194b3IoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc19ub3QoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2FkZChieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfYWRkX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfc3ViKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9zdWJfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9tdWwoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X211bF91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2RpdihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZGl2X3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbW9kKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9tb2RfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9hbmQoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X29yKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9vcl91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X3hvcihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfeG9yX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9lcV91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9uZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2x0KGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9sZV91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9ndChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2dlKGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19pbml0KHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aChzdHJpbmcsc3RyaW5nKWJvb2wiLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfZW5kc3dpdGgoc3RyaW5nLHN0cmluZylib29sIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2pvaW4oc3RyaW5nLHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9sb2coc3RyaW5nLHVpbnQ2NCxieXRlW10sYnl0ZVtdLGJvb2wsc3RyaW5nLHVpbnQ2NCx1aW50MjU2LHVmaXhlZDMyeDgsdWZpeGVkMjU2eDE2LGJ5dGVbXSxieXRlW10sYnl0ZVtdLGJ5dGVbNV0pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV91aW50NjRfaW5pdCB2ZXJpZnlfdWludDY0X2FkZCB2ZXJpZnlfdWludDY0X3N1YiB2ZXJpZnlfdWludDY0X211bCB2ZXJpZnlfdWludDY0X2RpdiB2ZXJpZnlfdWludDY0X21vZCB2ZXJpZnlfdWludDY0X2FuZCB2ZXJpZnlfdWludDY0X29yIHZlcmlmeV91aW50NjRfeG9yIHZlcmlmeV91aW50NjRfbm90IHZlcmlmeV91aW50NjRfbHNoaWZ0IHZlcmlmeV91aW50NjRfcnNoaWZ0IHZlcmlmeV91aW50NjRfcG93IHZlcmlmeV91aW50NjRfZXEgdmVyaWZ5X3VpbnQ2NF9uZSB2ZXJpZnlfdWludDY0X2x0IHZlcmlmeV91aW50NjRfbGUgdmVyaWZ5X3VpbnQ2NF9ndCB2ZXJpZnlfdWludDY0X2dlIHZlcmlmeV9ieXRlc19pbml0IHZlcmlmeV9ieXRlc19hZGQgdmVyaWZ5X2J5dGVzX2VxIHZlcmlmeV9ieXRlc19uZSB2ZXJpZnlfYnl0ZXNfYW5kIHZlcmlmeV9ieXRlc19vciB2ZXJpZnlfYnl0ZXNfeG9yIHZlcmlmeV9ieXRlc19ub3QgdmVyaWZ5X2JpZ3VpbnRfYWRkIHZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfc3ViIHZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbXVsIHZlcmlmeV9iaWd1aW50X211bF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfZGl2IHZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbW9kIHZlcmlmeV9iaWd1aW50X21vZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfYW5kIHZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfb3IgdmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0IHZlcmlmeV9iaWd1aW50X3hvciB2ZXJpZnlfYmlndWludF94b3JfdWludDY0IHZlcmlmeV9iaWd1aW50X2VxIHZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NCB2ZXJpZnlfYmlndWludF9uZSB2ZXJpZnlfYmlndWludF9uZV91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbHQgdmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0IHZlcmlmeV9iaWd1aW50X2xlIHZlcmlmeV9iaWd1aW50X2xlX3VpbnQ2NCB2ZXJpZnlfYmlndWludF9ndCB2ZXJpZnlfYmlndWludF9ndF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfZ2UgdmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0IHZlcmlmeV9zdHJpbmdfaW5pdCB2ZXJpZnlfc3RyaW5nX3N0YXJ0c3dpdGggdmVyaWZ5X3N0cmluZ19lbmRzd2l0aCB2ZXJpZnlfc3RyaW5nX2pvaW4gdmVyaWZ5X2xvZwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDY3OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjkKICAgIC8vIHJlc3VsdCA9IG9wLmJ0b2kocmF3X3ZhbHVlKQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9hZGRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0CiAgICAvLyByZXN1bHQgPSBhICsgYgogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfc3ViW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9zdWI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOQogICAgLy8gcmVzdWx0ID0gYSAtIGIKICAgIC0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X211bFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbXVsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQKICAgIC8vIHJlc3VsdCA9IGEgKiBiCiAgICAqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9kaXZbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2RpdjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI5CiAgICAvLyByZXN1bHQgPSBhIC8vIGIKICAgIC8KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X21vZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbW9kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzQKICAgIC8vIHJlc3VsdCA9IGEgJSBiCiAgICAlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9hbmRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2FuZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM5CiAgICAvLyByZXN1bHQgPSBhICYgYgogICAgJgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfb3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X29yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDQKICAgIC8vIHJlc3VsdCA9IGEgfCBiCiAgICB8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF94b3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X3hvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyByZXN1bHQgPSBhIF4gYgogICAgXgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbm90W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9ub3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NAogICAgLy8gcmVzdWx0ID0gfmEKICAgIH4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2xzaGlmdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbHNoaWZ0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIHJlc3VsdCA9IGEgPDwgYgogICAgc2hsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9yc2hpZnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X3JzaGlmdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY0CiAgICAvLyByZXN1bHQgPSBhID4+IGIKICAgIHNocgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfcG93W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9wb3c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2OQogICAgLy8gcmVzdWx0ID0gYSoqYgogICAgZXhwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfZXE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3NAogICAgLy8gcmVzdWx0ID0gYSA9PSBiCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9uZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyByZXN1bHQgPSBhICE9IGIKICAgICE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODQKICAgIC8vIHJlc3VsdCA9IGEgPCBiCiAgICA8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2xlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODkKICAgIC8vIHJlc3VsdCA9IGEgPD0gYgogICAgPD0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9ndFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NAogICAgLy8gcmVzdWx0ID0gYSA+IGIKICAgID4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9nZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5OQogICAgLy8gcmVzdWx0ID0gYSA+PSBiCiAgICA+PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ieXRlc19pbml0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmVzdWx0ID0gb3AuaXRvYihyYXdfdmFsdWUpCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1MDAwOAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19hZGRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfYWRkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTExCiAgICAvLyBhID0gb3AuYnplcm8ocGFkX2Ffc2l6ZSkgKyBhCiAgICBzd2FwCiAgICBiemVybwogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTEyCiAgICAvLyBiID0gb3AuYnplcm8ocGFkX2Jfc2l6ZSkgKyBiCiAgICBzd2FwCiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTEzCiAgICAvLyByZXN1bHQgPSBhICsgYgogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExNAogICAgLy8gcmVzdWx0ID0gb3Auc2hhMjU2KHJlc3VsdCkKICAgIHNoYTI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUwMDIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX2VxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTE5CiAgICAvLyByZXN1bHQgPSBhID09IGIKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfbmVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfbmU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjQKICAgIC8vIHJlc3VsdCA9IGEgIT0gYgogICAgIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19hbmRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfYW5kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTI5CiAgICAvLyByZXN1bHQgPSBhICYgYgogICAgYiYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19vcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ieXRlc19vcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gcmVzdWx0ID0gYSB8IGIKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfeG9yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX3hvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gcmVzdWx0ID0gYSBeIGIKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfbm90W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX25vdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQ0CiAgICAvLyBhID0gb3AuYnplcm8ocGFkX3NpemUpICsgYQogICAgYnplcm8KICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDUKICAgIC8vIHJlc3VsdCA9IH5hCiAgICBifgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDYKICAgIC8vIHJlc3VsdCA9IG9wLnNoYTI1NihyZXN1bHQpCiAgICBzaGEyNTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FkZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICsgYl9iaWd1aW50CiAgICBiKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfYWRkX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1OQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICsgYgogICAgaXRvYgogICAgYisKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3N1Yltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X3N1YjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IC0gYl9iaWd1aW50CiAgICBiLQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfc3ViX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3MgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IC0gYgogICAgaXRvYgogICAgYi0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X211bFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X211bDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3OQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICogYl9iaWd1aW50CiAgICBiKgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbXVsX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X211bF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICogYgogICAgaXRvYgogICAgYioKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2Rpdltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2RpdjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE5MgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IC8vIGJfYmlndWludAogICAgYi8KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9kaXZfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTgKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCAvLyBiCiAgICBpdG9iCiAgICBiLwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbW9kW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbW9kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjA1CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJSBiX2JpZ3VpbnQKICAgIGIlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9tb2RfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbW9kX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjExCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJSBiCiAgICBpdG9iCiAgICBiJQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfYW5kW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfYW5kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjE4CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJiBiX2JpZ3VpbnQKICAgIGImCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9hbmRfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfYW5kX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI0CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJiBiCiAgICBpdG9iCiAgICBiJgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfb3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9vcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzMQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IHwgYl9iaWd1aW50CiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzcKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCB8IGIKICAgIGl0b2IKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF94b3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF94b3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDQKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCBeIGJfYmlndWludAogICAgYl4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3hvcl91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF94b3JfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTAKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCBeIGIKICAgIGl0b2IKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjU3CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPT0gYl9iaWd1aW50CiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjYzCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPT0gYgogICAgaXRvYgogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9uZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcwCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgIT0gYl9iaWd1aW50CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjc2CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgIT0gYgogICAgaXRvYgogICAgYiE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9sdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjgzCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPCBiX2JpZ3VpbnQKICAgIGI8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9sdF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9sdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI4OQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IDwgYgogICAgaXRvYgogICAgYjwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTYKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA8PSBiX2JpZ3VpbnQKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMDIKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA8PSBiCiAgICBpdG9iCiAgICBiPD0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2d0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMDkKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA+IGJfYmlndWludAogICAgYj4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzE1CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPiBiCiAgICBpdG9iCiAgICBiPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9nZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyMgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ID49IGJfYmlndWludAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9nZV91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9nZV91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ID49IGIKICAgIGl0b2IKICAgIGI+PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N0cmluZ19pbml0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzMzCiAgICAvLyByZXN1bHQgPSBTdHJpbmcoIkhlbGxvLCAiKSArIGEKICAgIHB1c2hieXRlcyAiSGVsbG8sICIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzM4CiAgICAvLyByZXN1bHQgPSBhLnN0YXJ0c3dpdGgoYikKICAgIGxlbgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGxlbgogICAgPgogICAgYnogdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoX3Rlcm5hcnlfZmFsc2VAMwogICAgaW50Y18xIC8vIDAKCnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aF90ZXJuYXJ5X21lcmdlQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoX3Rlcm5hcnlfZmFsc2VAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzM4CiAgICAvLyByZXN1bHQgPSBhLnN0YXJ0c3dpdGgoYikKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMAogICAgZGlnIDIKICAgIGV4dHJhY3QzCiAgICBkaWcgMgogICAgPT0KICAgIGIgdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoX3Rlcm5hcnlfbWVyZ2VANAoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19lbmRzd2l0aFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfZW5kc3dpdGg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gcmVzdWx0ID0gYS5lbmRzd2l0aChiKQogICAgbGVuCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID4KICAgIGJ6IHZlcmlmeV9zdHJpbmdfZW5kc3dpdGhfdGVybmFyeV9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMAoKdmVyaWZ5X3N0cmluZ19lbmRzd2l0aF90ZXJuYXJ5X21lcmdlQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKdmVyaWZ5X3N0cmluZ19lbmRzd2l0aF90ZXJuYXJ5X2ZhbHNlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gcmVzdWx0ID0gYS5lbmRzd2l0aChiKQogICAgZHVwCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICAtCiAgICBkaWcgNQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0MwogICAgZGlnIDMKICAgID09CiAgICBiIHZlcmlmeV9zdHJpbmdfZW5kc3dpdGhfdGVybmFyeV9tZXJnZUA0CgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2pvaW5bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2pvaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzQ4CiAgICAvLyByZXN1bHQgPSBTdHJpbmcoIiwgIikuam9pbigoYSwgYikpCiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgIiwgIgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNzMKICAgIC8vIGxvZyhhLCBiLCBjLCBkX2JpZ3VpbnQsIGUsIGYsIGcsIGgsIGksIGosIGFyYzRfaywgYXJjNF9tLCBhcmM0X24sIG8sIHNlcD0iLSIpCiAgICB1bmNvdmVyIDEzCiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmBAQVH3x1AQABLQYVH3x1ACAxG0EBszEZFEQxGESCPARyXGkrBBcxRVkEU/NIkwSIyLJpBKRkt6sEnIsRuARvQGVOBOyaKXQEx5NwjwR923SZBKIcRD0Ebn+yEgSwB/ywBC68INQEsJVLZgTdFArvBKzkdNoEumlJkARttYHABJHI24kE2+dxWASaDyLhBGQDPTcEKnI3xQTjqURYBEL4f30EK1VCpASb4vvpBBzZJRUEZOFwXATxJxxQBCq2O3AEg0u30gRTFiDXBD+552kE+o2wvASnLqSFBLewuhkEdEYMQgSrMgc4BFKtRlQEEBVjmQQPB1lXBL2EPf8Es3fTgQSJdnJlBEVrSyMEM9G4jARr+XPqBGfNa7IEP1iAWgQeEwA5BFCdyR0EpWSiAgQjZQdjBPjI+NUEI/r3pAR9Cv4VBEhYGt8EPa75zTYaAI48AAkAFwAnADcARwBXAGcAdwCHAJcAowCzAMMA0wDnAPsBDwEjATcBSwFdAYMBmwGzAc4B6QIEAhkCNAJOAmkCgwKeArgC0wLtAwgDIgM9A1cDcgOMA6cDwQPZA/AECAQfBDcETgRmBH0ElQSsBMQE2wT6BSsFZgWIADEZFDEYFBBDNhoBVwIAFxYoTFCwIkM2GgEXNhoCFwgWKExQsCJDNhoBFzYaAhcJFihMULAiQzYaARc2GgIXCxYoTFCwIkM2GgEXNhoCFwoWKExQsCJDNhoBFzYaAhcYFihMULAiQzYaARc2GgIXGhYoTFCwIkM2GgEXNhoCFxkWKExQsCJDNhoBFzYaAhcbFihMULAiQzYaARccFihMULAiQzYaARc2GgIXkBYoTFCwIkM2GgEXNhoCF5EWKExQsCJDNhoBFzYaAheUFihMULAiQzYaARc2GgIXEikjTwJUKExQsCJDNhoBFzYaAhcTKSNPAlQoTFCwIkM2GgEXNhoCFwwpI08CVChMULAiQzYaARc2GgIXDikjTwJUKExQsCJDNhoBFzYaAhcNKSNPAlQoTFCwIkM2GgEXNhoCFw8pI08CVChMULAiQzYaARcWgAYVH3x1AAhMULAiQzYaAVcCADYaAlcCADYaAxc2GgQXTK9PA1BMr08CUFABK0xQsCJDNhoBVwIANhoCVwIAEikjTwJUKExQsCJDNhoBVwIANhoCVwIAEykjTwJUKExQsCJDNhoBVwIANhoCVwIArEkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAq0kVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIArUkVFlcGAkxQKExQsCJDNhoBVwIANhoCF69MUK4BK0xQsCJDNhoBVwIANhoCVwIAoEkVFlcGAkxQKExQsCJDNhoBVwIANhoCFxagSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgChSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFqFJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKNJFRZXBgJMUChMULAiQzYaAVcCADYaAhcWo0kVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAokkVFlcGAkxQKExQsCJDNhoBVwIANhoCFxaiSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCqSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFqpJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKxJFRZXBgJMUChMULAiQzYaAVcCADYaAhcWrEkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAq0kVFlcGAkxQKExQsCJDNhoBVwIANhoCFxarSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCtSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFq1JFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKgpI08CVChMULAiQzYaAVcCADYaAhcWqCkjTwJUKExQsCJDNhoBVwIANhoCVwIAqSkjTwJUKExQsCJDNhoBVwIANhoCFxapKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgCkKSNPAlQoTFCwIkM2GgFXAgA2GgIXFqQpI08CVChMULAiQzYaAVcCADYaAlcCAKYpI08CVChMULAiQzYaAVcCADYaAhcWpikjTwJUKExQsCJDNhoBVwIANhoCVwIApSkjTwJUKExQsCJDNhoBVwIANhoCFxalKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgCnKSNPAlQoTFCwIkM2GgFXAgA2GgIXFqcpI08CVChMULAiQzYaAVcCAIAHSGVsbG8sIExQSRUWVwYCTFAoTFCwIkM2GgFXAgBJNhoCVwIASU4CFUlPAhUNQQAMIykjTwJUKExQsCJDSwIjSwJYSwISQv/pNhoBVwIASTYaAlcCAElOAhVJTwIVSU4CDUEADCMpI08CVChMULAiQ0lLAklOAglLBUxPAlhLAxJC/+I2GgFXAgA2GgJXAgBMgAIsIFBMUEkVFlcGAkxQKExQsCJDNhoBVwIANhoCFzYaA1cCADYaBFcCADYaBTYaBjYaBzYaCDYaCTYaCjYaC1cCADYaDFcCADYaDVcCADYaDk8NKlBPDRZQKlBPDFAqUE8LUCpQTwpQKlBPCVAqUE8IUCpQTwdQKlBPBlAqUE8FUCpQTwRQKlBPA1AqUE8CUCpQTFCwIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the PrimitiveOpsContract contract - */ -export type PrimitiveOpsContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify_uint64_init(byte[])uint64': { - rawValue: Uint8Array - } - 'verify_uint64_add(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_sub(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_mul(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_div(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_mod(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_and(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_or(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_xor(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_not(uint64)uint64': { - a: bigint | number - } - 'verify_uint64_lshift(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_rshift(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_pow(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_eq(uint64,uint64)bool': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_ne(uint64,uint64)bool': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_lt(uint64,uint64)bool': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_le(uint64,uint64)bool': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_gt(uint64,uint64)bool': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_ge(uint64,uint64)bool': { - a: bigint | number - b: bigint | number - } - 'verify_bytes_init(uint64)byte[]': { - rawValue: bigint | number - } - 'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]': { - a: Uint8Array - b: Uint8Array - padASize: bigint | number - padBSize: bigint | number - } - 'verify_bytes_eq(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_bytes_ne(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_bytes_and(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_bytes_or(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_bytes_xor(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_bytes_not(byte[],uint64)byte[]': { - a: Uint8Array - padSize: bigint | number - } - 'verify_biguint_add(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_add_uint64(byte[],uint64)byte[]': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_sub(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_sub_uint64(byte[],uint64)byte[]': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_mul(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_mul_uint64(byte[],uint64)byte[]': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_div(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_div_uint64(byte[],uint64)byte[]': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_mod(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_mod_uint64(byte[],uint64)byte[]': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_and(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_and_uint64(byte[],uint64)byte[]': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_or(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_or_uint64(byte[],uint64)byte[]': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_xor(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_xor_uint64(byte[],uint64)byte[]': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_eq(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_eq_uint64(byte[],uint64)bool': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_ne(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_ne_uint64(byte[],uint64)bool': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_lt(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_lt_uint64(byte[],uint64)bool': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_le(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_le_uint64(byte[],uint64)bool': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_gt(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_gt_uint64(byte[],uint64)bool': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_ge(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_ge_uint64(byte[],uint64)bool': { - a: Uint8Array - b: bigint | number - } - 'verify_string_init(string)string': { - a: string - } - 'verify_string_startswith(string,string)bool': { - a: string - b: string - } - 'verify_string_endswith(string,string)bool': { - a: string - b: string - } - 'verify_string_join(string,string)string': { - a: string - b: string - } - 'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void': { - a: string - b: bigint | number - c: Uint8Array - d: Uint8Array - e: boolean - f: string - g: bigint | number - h: bigint | number - i: number - j: number - k: Uint8Array - m: Uint8Array - n: Uint8Array - o: Uint8Array - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify_uint64_init(byte[])uint64': [rawValue: Uint8Array] - 'verify_uint64_add(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_uint64_sub(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_uint64_mul(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_uint64_div(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_uint64_mod(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_uint64_and(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_uint64_or(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_uint64_xor(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_uint64_not(uint64)uint64': [a: bigint | number] - 'verify_uint64_lshift(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_uint64_rshift(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_uint64_pow(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_uint64_eq(uint64,uint64)bool': [a: bigint | number, b: bigint | number] - 'verify_uint64_ne(uint64,uint64)bool': [a: bigint | number, b: bigint | number] - 'verify_uint64_lt(uint64,uint64)bool': [a: bigint | number, b: bigint | number] - 'verify_uint64_le(uint64,uint64)bool': [a: bigint | number, b: bigint | number] - 'verify_uint64_gt(uint64,uint64)bool': [a: bigint | number, b: bigint | number] - 'verify_uint64_ge(uint64,uint64)bool': [a: bigint | number, b: bigint | number] - 'verify_bytes_init(uint64)byte[]': [rawValue: bigint | number] - 'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]': [a: Uint8Array, b: Uint8Array, padASize: bigint | number, padBSize: bigint | number] - 'verify_bytes_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_bytes_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_bytes_and(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_bytes_or(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_bytes_xor(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_bytes_not(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] - 'verify_biguint_add(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_add_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] - 'verify_biguint_sub(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_sub_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] - 'verify_biguint_mul(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_mul_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] - 'verify_biguint_div(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_div_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] - 'verify_biguint_mod(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_mod_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] - 'verify_biguint_and(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_and_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] - 'verify_biguint_or(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_or_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] - 'verify_biguint_xor(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_xor_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] - 'verify_biguint_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_eq_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] - 'verify_biguint_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_ne_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] - 'verify_biguint_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_lt_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] - 'verify_biguint_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_le_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] - 'verify_biguint_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_gt_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] - 'verify_biguint_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_ge_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] - 'verify_string_init(string)string': [a: string] - 'verify_string_startswith(string,string)bool': [a: string, b: string] - 'verify_string_endswith(string,string)bool': [a: string, b: string] - 'verify_string_join(string,string)string': [a: string, b: string] - 'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void': [a: string, b: bigint | number, c: Uint8Array, d: Uint8Array, e: boolean, f: string, g: bigint | number, h: bigint | number, i: number, j: number, k: Uint8Array, m: Uint8Array, n: Uint8Array, o: Uint8Array] - } -} - -/** - * The return type for each method - */ -export type PrimitiveOpsContractReturns = { - 'verify_uint64_init(byte[])uint64': bigint - 'verify_uint64_add(uint64,uint64)uint64': bigint - 'verify_uint64_sub(uint64,uint64)uint64': bigint - 'verify_uint64_mul(uint64,uint64)uint64': bigint - 'verify_uint64_div(uint64,uint64)uint64': bigint - 'verify_uint64_mod(uint64,uint64)uint64': bigint - 'verify_uint64_and(uint64,uint64)uint64': bigint - 'verify_uint64_or(uint64,uint64)uint64': bigint - 'verify_uint64_xor(uint64,uint64)uint64': bigint - 'verify_uint64_not(uint64)uint64': bigint - 'verify_uint64_lshift(uint64,uint64)uint64': bigint - 'verify_uint64_rshift(uint64,uint64)uint64': bigint - 'verify_uint64_pow(uint64,uint64)uint64': bigint - 'verify_uint64_eq(uint64,uint64)bool': boolean - 'verify_uint64_ne(uint64,uint64)bool': boolean - 'verify_uint64_lt(uint64,uint64)bool': boolean - 'verify_uint64_le(uint64,uint64)bool': boolean - 'verify_uint64_gt(uint64,uint64)bool': boolean - 'verify_uint64_ge(uint64,uint64)bool': boolean - 'verify_bytes_init(uint64)byte[]': Uint8Array - 'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]': Uint8Array - 'verify_bytes_eq(byte[],byte[])bool': boolean - 'verify_bytes_ne(byte[],byte[])bool': boolean - 'verify_bytes_and(byte[],byte[])byte[]': Uint8Array - 'verify_bytes_or(byte[],byte[])byte[]': Uint8Array - 'verify_bytes_xor(byte[],byte[])byte[]': Uint8Array - 'verify_bytes_not(byte[],uint64)byte[]': Uint8Array - 'verify_biguint_add(byte[],byte[])byte[]': Uint8Array - 'verify_biguint_add_uint64(byte[],uint64)byte[]': Uint8Array - 'verify_biguint_sub(byte[],byte[])byte[]': Uint8Array - 'verify_biguint_sub_uint64(byte[],uint64)byte[]': Uint8Array - 'verify_biguint_mul(byte[],byte[])byte[]': Uint8Array - 'verify_biguint_mul_uint64(byte[],uint64)byte[]': Uint8Array - 'verify_biguint_div(byte[],byte[])byte[]': Uint8Array - 'verify_biguint_div_uint64(byte[],uint64)byte[]': Uint8Array - 'verify_biguint_mod(byte[],byte[])byte[]': Uint8Array - 'verify_biguint_mod_uint64(byte[],uint64)byte[]': Uint8Array - 'verify_biguint_and(byte[],byte[])byte[]': Uint8Array - 'verify_biguint_and_uint64(byte[],uint64)byte[]': Uint8Array - 'verify_biguint_or(byte[],byte[])byte[]': Uint8Array - 'verify_biguint_or_uint64(byte[],uint64)byte[]': Uint8Array - 'verify_biguint_xor(byte[],byte[])byte[]': Uint8Array - 'verify_biguint_xor_uint64(byte[],uint64)byte[]': Uint8Array - 'verify_biguint_eq(byte[],byte[])bool': boolean - 'verify_biguint_eq_uint64(byte[],uint64)bool': boolean - 'verify_biguint_ne(byte[],byte[])bool': boolean - 'verify_biguint_ne_uint64(byte[],uint64)bool': boolean - 'verify_biguint_lt(byte[],byte[])bool': boolean - 'verify_biguint_lt_uint64(byte[],uint64)bool': boolean - 'verify_biguint_le(byte[],byte[])bool': boolean - 'verify_biguint_le_uint64(byte[],uint64)bool': boolean - 'verify_biguint_gt(byte[],byte[])bool': boolean - 'verify_biguint_gt_uint64(byte[],uint64)bool': boolean - 'verify_biguint_ge(byte[],byte[])bool': boolean - 'verify_biguint_ge_uint64(byte[],uint64)bool': boolean - 'verify_string_init(string)string': string - 'verify_string_startswith(string,string)bool': boolean - 'verify_string_endswith(string,string)bool': boolean - 'verify_string_join(string,string)string': string - 'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void': void -} - -/** - * Defines the types of available calls and state of the PrimitiveOpsContract smart contract. - */ -export type PrimitiveOpsContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify_uint64_init(byte[])uint64' | 'verify_uint64_init', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_init(byte[])uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_init(byte[])uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_init(byte[])uint64'] - }> - & Record<'verify_uint64_add(uint64,uint64)uint64' | 'verify_uint64_add', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_add(uint64,uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_add(uint64,uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_add(uint64,uint64)uint64'] - }> - & Record<'verify_uint64_sub(uint64,uint64)uint64' | 'verify_uint64_sub', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_sub(uint64,uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_sub(uint64,uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_sub(uint64,uint64)uint64'] - }> - & Record<'verify_uint64_mul(uint64,uint64)uint64' | 'verify_uint64_mul', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_mul(uint64,uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_mul(uint64,uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_mul(uint64,uint64)uint64'] - }> - & Record<'verify_uint64_div(uint64,uint64)uint64' | 'verify_uint64_div', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_div(uint64,uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_div(uint64,uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_div(uint64,uint64)uint64'] - }> - & Record<'verify_uint64_mod(uint64,uint64)uint64' | 'verify_uint64_mod', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_mod(uint64,uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_mod(uint64,uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_mod(uint64,uint64)uint64'] - }> - & Record<'verify_uint64_and(uint64,uint64)uint64' | 'verify_uint64_and', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_and(uint64,uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_and(uint64,uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_and(uint64,uint64)uint64'] - }> - & Record<'verify_uint64_or(uint64,uint64)uint64' | 'verify_uint64_or', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_or(uint64,uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_or(uint64,uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_or(uint64,uint64)uint64'] - }> - & Record<'verify_uint64_xor(uint64,uint64)uint64' | 'verify_uint64_xor', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_xor(uint64,uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_xor(uint64,uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_xor(uint64,uint64)uint64'] - }> - & Record<'verify_uint64_not(uint64)uint64' | 'verify_uint64_not', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_not(uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_not(uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_not(uint64)uint64'] - }> - & Record<'verify_uint64_lshift(uint64,uint64)uint64' | 'verify_uint64_lshift', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_lshift(uint64,uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_lshift(uint64,uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_lshift(uint64,uint64)uint64'] - }> - & Record<'verify_uint64_rshift(uint64,uint64)uint64' | 'verify_uint64_rshift', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_rshift(uint64,uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_rshift(uint64,uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_rshift(uint64,uint64)uint64'] - }> - & Record<'verify_uint64_pow(uint64,uint64)uint64' | 'verify_uint64_pow', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_pow(uint64,uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_pow(uint64,uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_pow(uint64,uint64)uint64'] - }> - & Record<'verify_uint64_eq(uint64,uint64)bool' | 'verify_uint64_eq', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_eq(uint64,uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_eq(uint64,uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_uint64_eq(uint64,uint64)bool'] - }> - & Record<'verify_uint64_ne(uint64,uint64)bool' | 'verify_uint64_ne', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_ne(uint64,uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_ne(uint64,uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_uint64_ne(uint64,uint64)bool'] - }> - & Record<'verify_uint64_lt(uint64,uint64)bool' | 'verify_uint64_lt', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_lt(uint64,uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_lt(uint64,uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_uint64_lt(uint64,uint64)bool'] - }> - & Record<'verify_uint64_le(uint64,uint64)bool' | 'verify_uint64_le', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_le(uint64,uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_le(uint64,uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_uint64_le(uint64,uint64)bool'] - }> - & Record<'verify_uint64_gt(uint64,uint64)bool' | 'verify_uint64_gt', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_gt(uint64,uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_gt(uint64,uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_uint64_gt(uint64,uint64)bool'] - }> - & Record<'verify_uint64_ge(uint64,uint64)bool' | 'verify_uint64_ge', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_ge(uint64,uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_ge(uint64,uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_uint64_ge(uint64,uint64)bool'] - }> - & Record<'verify_bytes_init(uint64)byte[]' | 'verify_bytes_init', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_init(uint64)byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_init(uint64)byte[]'] - returns: PrimitiveOpsContractReturns['verify_bytes_init(uint64)byte[]'] - }> - & Record<'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]' | 'verify_bytes_add', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'] - returns: PrimitiveOpsContractReturns['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'] - }> - & Record<'verify_bytes_eq(byte[],byte[])bool' | 'verify_bytes_eq', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_eq(byte[],byte[])bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_eq(byte[],byte[])bool'] - returns: PrimitiveOpsContractReturns['verify_bytes_eq(byte[],byte[])bool'] - }> - & Record<'verify_bytes_ne(byte[],byte[])bool' | 'verify_bytes_ne', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_ne(byte[],byte[])bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_ne(byte[],byte[])bool'] - returns: PrimitiveOpsContractReturns['verify_bytes_ne(byte[],byte[])bool'] - }> - & Record<'verify_bytes_and(byte[],byte[])byte[]' | 'verify_bytes_and', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_and(byte[],byte[])byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_and(byte[],byte[])byte[]'] - returns: PrimitiveOpsContractReturns['verify_bytes_and(byte[],byte[])byte[]'] - }> - & Record<'verify_bytes_or(byte[],byte[])byte[]' | 'verify_bytes_or', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_or(byte[],byte[])byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_or(byte[],byte[])byte[]'] - returns: PrimitiveOpsContractReturns['verify_bytes_or(byte[],byte[])byte[]'] - }> - & Record<'verify_bytes_xor(byte[],byte[])byte[]' | 'verify_bytes_xor', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_xor(byte[],byte[])byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_xor(byte[],byte[])byte[]'] - returns: PrimitiveOpsContractReturns['verify_bytes_xor(byte[],byte[])byte[]'] - }> - & Record<'verify_bytes_not(byte[],uint64)byte[]' | 'verify_bytes_not', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_not(byte[],uint64)byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_not(byte[],uint64)byte[]'] - returns: PrimitiveOpsContractReturns['verify_bytes_not(byte[],uint64)byte[]'] - }> - & Record<'verify_biguint_add(byte[],byte[])byte[]' | 'verify_biguint_add', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_add(byte[],byte[])byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_add(byte[],byte[])byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_add(byte[],byte[])byte[]'] - }> - & Record<'verify_biguint_add_uint64(byte[],uint64)byte[]' | 'verify_biguint_add_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_add_uint64(byte[],uint64)byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_add_uint64(byte[],uint64)byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_add_uint64(byte[],uint64)byte[]'] - }> - & Record<'verify_biguint_sub(byte[],byte[])byte[]' | 'verify_biguint_sub', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_sub(byte[],byte[])byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_sub(byte[],byte[])byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_sub(byte[],byte[])byte[]'] - }> - & Record<'verify_biguint_sub_uint64(byte[],uint64)byte[]' | 'verify_biguint_sub_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_sub_uint64(byte[],uint64)byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_sub_uint64(byte[],uint64)byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_sub_uint64(byte[],uint64)byte[]'] - }> - & Record<'verify_biguint_mul(byte[],byte[])byte[]' | 'verify_biguint_mul', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_mul(byte[],byte[])byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_mul(byte[],byte[])byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_mul(byte[],byte[])byte[]'] - }> - & Record<'verify_biguint_mul_uint64(byte[],uint64)byte[]' | 'verify_biguint_mul_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_mul_uint64(byte[],uint64)byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_mul_uint64(byte[],uint64)byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_mul_uint64(byte[],uint64)byte[]'] - }> - & Record<'verify_biguint_div(byte[],byte[])byte[]' | 'verify_biguint_div', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_div(byte[],byte[])byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_div(byte[],byte[])byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_div(byte[],byte[])byte[]'] - }> - & Record<'verify_biguint_div_uint64(byte[],uint64)byte[]' | 'verify_biguint_div_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_div_uint64(byte[],uint64)byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_div_uint64(byte[],uint64)byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_div_uint64(byte[],uint64)byte[]'] - }> - & Record<'verify_biguint_mod(byte[],byte[])byte[]' | 'verify_biguint_mod', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_mod(byte[],byte[])byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_mod(byte[],byte[])byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_mod(byte[],byte[])byte[]'] - }> - & Record<'verify_biguint_mod_uint64(byte[],uint64)byte[]' | 'verify_biguint_mod_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_mod_uint64(byte[],uint64)byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_mod_uint64(byte[],uint64)byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_mod_uint64(byte[],uint64)byte[]'] - }> - & Record<'verify_biguint_and(byte[],byte[])byte[]' | 'verify_biguint_and', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_and(byte[],byte[])byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_and(byte[],byte[])byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_and(byte[],byte[])byte[]'] - }> - & Record<'verify_biguint_and_uint64(byte[],uint64)byte[]' | 'verify_biguint_and_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_and_uint64(byte[],uint64)byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_and_uint64(byte[],uint64)byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_and_uint64(byte[],uint64)byte[]'] - }> - & Record<'verify_biguint_or(byte[],byte[])byte[]' | 'verify_biguint_or', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_or(byte[],byte[])byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_or(byte[],byte[])byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_or(byte[],byte[])byte[]'] - }> - & Record<'verify_biguint_or_uint64(byte[],uint64)byte[]' | 'verify_biguint_or_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_or_uint64(byte[],uint64)byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_or_uint64(byte[],uint64)byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_or_uint64(byte[],uint64)byte[]'] - }> - & Record<'verify_biguint_xor(byte[],byte[])byte[]' | 'verify_biguint_xor', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_xor(byte[],byte[])byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_xor(byte[],byte[])byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_xor(byte[],byte[])byte[]'] - }> - & Record<'verify_biguint_xor_uint64(byte[],uint64)byte[]' | 'verify_biguint_xor_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_xor_uint64(byte[],uint64)byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_xor_uint64(byte[],uint64)byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_xor_uint64(byte[],uint64)byte[]'] - }> - & Record<'verify_biguint_eq(byte[],byte[])bool' | 'verify_biguint_eq', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_eq(byte[],byte[])bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_eq(byte[],byte[])bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_eq(byte[],byte[])bool'] - }> - & Record<'verify_biguint_eq_uint64(byte[],uint64)bool' | 'verify_biguint_eq_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_eq_uint64(byte[],uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_eq_uint64(byte[],uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_eq_uint64(byte[],uint64)bool'] - }> - & Record<'verify_biguint_ne(byte[],byte[])bool' | 'verify_biguint_ne', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_ne(byte[],byte[])bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_ne(byte[],byte[])bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_ne(byte[],byte[])bool'] - }> - & Record<'verify_biguint_ne_uint64(byte[],uint64)bool' | 'verify_biguint_ne_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_ne_uint64(byte[],uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_ne_uint64(byte[],uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_ne_uint64(byte[],uint64)bool'] - }> - & Record<'verify_biguint_lt(byte[],byte[])bool' | 'verify_biguint_lt', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_lt(byte[],byte[])bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_lt(byte[],byte[])bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_lt(byte[],byte[])bool'] - }> - & Record<'verify_biguint_lt_uint64(byte[],uint64)bool' | 'verify_biguint_lt_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_lt_uint64(byte[],uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_lt_uint64(byte[],uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_lt_uint64(byte[],uint64)bool'] - }> - & Record<'verify_biguint_le(byte[],byte[])bool' | 'verify_biguint_le', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_le(byte[],byte[])bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_le(byte[],byte[])bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_le(byte[],byte[])bool'] - }> - & Record<'verify_biguint_le_uint64(byte[],uint64)bool' | 'verify_biguint_le_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_le_uint64(byte[],uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_le_uint64(byte[],uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_le_uint64(byte[],uint64)bool'] - }> - & Record<'verify_biguint_gt(byte[],byte[])bool' | 'verify_biguint_gt', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_gt(byte[],byte[])bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_gt(byte[],byte[])bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_gt(byte[],byte[])bool'] - }> - & Record<'verify_biguint_gt_uint64(byte[],uint64)bool' | 'verify_biguint_gt_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_gt_uint64(byte[],uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_gt_uint64(byte[],uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_gt_uint64(byte[],uint64)bool'] - }> - & Record<'verify_biguint_ge(byte[],byte[])bool' | 'verify_biguint_ge', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_ge(byte[],byte[])bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_ge(byte[],byte[])bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_ge(byte[],byte[])bool'] - }> - & Record<'verify_biguint_ge_uint64(byte[],uint64)bool' | 'verify_biguint_ge_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_ge_uint64(byte[],uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_ge_uint64(byte[],uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_ge_uint64(byte[],uint64)bool'] - }> - & Record<'verify_string_init(string)string' | 'verify_string_init', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_string_init(string)string'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_string_init(string)string'] - returns: PrimitiveOpsContractReturns['verify_string_init(string)string'] - }> - & Record<'verify_string_startswith(string,string)bool' | 'verify_string_startswith', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_string_startswith(string,string)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_string_startswith(string,string)bool'] - returns: PrimitiveOpsContractReturns['verify_string_startswith(string,string)bool'] - }> - & Record<'verify_string_endswith(string,string)bool' | 'verify_string_endswith', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_string_endswith(string,string)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_string_endswith(string,string)bool'] - returns: PrimitiveOpsContractReturns['verify_string_endswith(string,string)bool'] - }> - & Record<'verify_string_join(string,string)string' | 'verify_string_join', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_string_join(string,string)string'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_string_join(string,string)string'] - returns: PrimitiveOpsContractReturns['verify_string_join(string,string)string'] - }> - & Record<'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void' | 'verify_log', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'] - returns: PrimitiveOpsContractReturns['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type PrimitiveOpsContractSignatures = keyof PrimitiveOpsContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type PrimitiveOpsContractNonVoidMethodSignatures = keyof PrimitiveOpsContractTypes['methods'] extends infer T ? T extends keyof PrimitiveOpsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the PrimitiveOpsContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = PrimitiveOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the PrimitiveOpsContract smart contract to the method's return type - */ -export type MethodReturn = PrimitiveOpsContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type PrimitiveOpsContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type PrimitiveOpsContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: PrimitiveOpsContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the PrimitiveOpsContract smart contract - */ -export abstract class PrimitiveOpsContractParamsFactory { - /** - * Constructs a no op call for the verify_uint64_init(byte[])uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Init(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_init(byte[])uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.rawValue], - } - } - /** - * Constructs a no op call for the verify_uint64_add(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Add(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_add(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_sub(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Sub(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_sub(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_mul(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Mul(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_mul(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_div(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Div(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_div(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_mod(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Mod(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_mod(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_and(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64And(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_and(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_or(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Or(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_or(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_xor(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Xor(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_xor(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_not(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Not(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_not(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_uint64_lshift(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Lshift(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_lshift(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_rshift(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Rshift(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_rshift(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_pow(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Pow(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_pow(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_eq(uint64,uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Eq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_eq(uint64,uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_ne(uint64,uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Ne(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_ne(uint64,uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_lt(uint64,uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Lt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_lt(uint64,uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_le(uint64,uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Le(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_le(uint64,uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_gt(uint64,uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Gt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_gt(uint64,uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_ge(uint64,uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Ge(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_ge(uint64,uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_bytes_init(uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBytesInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bytes_init(uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.rawValue], - } - } - /** - * Constructs a no op call for the verify_bytes_add(byte[],byte[],uint64,uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBytesAdd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.padASize, params.args.padBSize], - } - } - /** - * Constructs a no op call for the verify_bytes_eq(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBytesEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bytes_eq(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_bytes_ne(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBytesNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bytes_ne(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_bytes_and(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBytesAnd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bytes_and(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_bytes_or(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBytesOr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bytes_or(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_bytes_xor(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBytesXor(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bytes_xor(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_bytes_not(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBytesNot(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bytes_not(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], - } - } - /** - * Constructs a no op call for the verify_biguint_add(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintAdd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_add(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_add_uint64(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintAddUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_add_uint64(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_sub(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintSub(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_sub(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_sub_uint64(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintSubUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_sub_uint64(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_mul(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintMul(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_mul(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_mul_uint64(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintMulUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_mul_uint64(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_div(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintDiv(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_div(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_div_uint64(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintDivUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_div_uint64(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_mod(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintMod(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_mod(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_mod_uint64(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintModUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_mod_uint64(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_and(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintAnd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_and(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_and_uint64(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintAndUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_and_uint64(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_or(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintOr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_or(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_or_uint64(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintOrUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_or_uint64(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_xor(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintXor(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_xor(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_xor_uint64(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintXorUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_xor_uint64(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_eq(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_eq(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_eq_uint64(byte[],uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintEqUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_eq_uint64(byte[],uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_ne(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_ne(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_ne_uint64(byte[],uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintNeUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_ne_uint64(byte[],uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_lt(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_lt(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_lt_uint64(byte[],uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintLtUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_lt_uint64(byte[],uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_le(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_le(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_le_uint64(byte[],uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintLeUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_le_uint64(byte[],uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_gt(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_gt(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_gt_uint64(byte[],uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintGtUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_gt_uint64(byte[],uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_ge(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_ge(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_ge_uint64(byte[],uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintGeUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_ge_uint64(byte[],uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_string_init(string)string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyStringInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_string_init(string)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_string_startswith(string,string)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyStringStartswith(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_string_startswith(string,string)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_string_endswith(string,string)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyStringEndswith(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_string_endswith(string,string)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_string_join(string,string)string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyStringJoin(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_string_join(string,string)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d, params.args.e, params.args.f, params.args.g, params.args.h, params.args.i, params.args.j, params.args.k, params.args.m, params.args.n, params.args.o], - } - } -} - -/** - * A factory to create and deploy one or more instance of the PrimitiveOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class PrimitiveOpsContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `PrimitiveOpsContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new PrimitiveOpsContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new PrimitiveOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the PrimitiveOpsContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: PrimitiveOpsContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new PrimitiveOpsContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the PrimitiveOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the PrimitiveOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the PrimitiveOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new PrimitiveOpsContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the PrimitiveOpsContract smart contract - */ -export class PrimitiveOpsContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `PrimitiveOpsContractClient` - * - * @param appClient An `AppClient` instance which has been created with the PrimitiveOpsContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `PrimitiveOpsContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `PrimitiveOpsContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new PrimitiveOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `PrimitiveOpsContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new PrimitiveOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the PrimitiveOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_init(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Init: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Init(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_add(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Add: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Add(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_sub(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Sub: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Sub(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mul(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Mul: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Mul(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_div(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Div: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Div(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mod(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Mod: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Mod(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_and(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64And: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64And(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_or(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Or: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Or(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_xor(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Xor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Xor(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_not(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Not: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Not(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lshift(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Lshift: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Lshift(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_rshift(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Rshift: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Rshift(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_pow(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Pow: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Pow(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_eq(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Eq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Eq(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ne(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Ne: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Ne(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lt(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Lt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Lt(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_le(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Le: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Le(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_gt(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Gt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Gt(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ge(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Ge: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Ge(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_init(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBytesInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesInit(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_add(byte[],byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBytesAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesAdd(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBytesEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesEq(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBytesNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesNe(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_and(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBytesAnd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesAnd(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_or(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBytesOr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesOr(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_xor(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBytesXor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesXor(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_not(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBytesNot: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesNot(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintAdd(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintAddUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintAddUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintSub: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintSub(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintSubUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintSubUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintMul: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintMul(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintMulUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintMulUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintDiv: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintDiv(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintDivUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintDivUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintMod: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintMod(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintModUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintModUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintAnd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintAnd(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintAndUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintAndUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintOr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintOr(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintOrUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintOrUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintXor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintXor(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintXorUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintXorUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintEq(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintEqUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintEqUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintNe(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintNeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintNeUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintLt(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintLtUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintLtUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintLe(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintLeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintLeUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintGt(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintGtUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintGtUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintGe(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintGeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintGeUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyStringInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyStringInit(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_startswith(string,string)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyStringStartswith: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyStringStartswith(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_endswith(string,string)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyStringEndswith: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyStringEndswith(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_join(string,string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyStringJoin: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyStringJoin(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyLog(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the PrimitiveOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_init(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Init: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Init(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_add(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Add: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Add(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_sub(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Sub: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Sub(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mul(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Mul: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Mul(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_div(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Div: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Div(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mod(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Mod: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Mod(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_and(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64And: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64And(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_or(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Or: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Or(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_xor(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Xor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Xor(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_not(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Not: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Not(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lshift(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Lshift: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Lshift(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_rshift(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Rshift: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Rshift(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_pow(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Pow: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Pow(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_eq(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Eq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Eq(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ne(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Ne: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Ne(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lt(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Lt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Lt(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_le(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Le: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Le(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_gt(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Gt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Gt(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ge(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Ge: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Ge(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_init(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBytesInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesInit(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_add(byte[],byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBytesAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesAdd(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBytesEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesEq(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBytesNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesNe(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_and(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBytesAnd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesAnd(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_or(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBytesOr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesOr(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_xor(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBytesXor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesXor(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_not(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBytesNot: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesNot(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintAdd(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintAddUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintAddUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintSub: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintSub(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintSubUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintSubUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintMul: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintMul(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintMulUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintMulUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintDiv: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintDiv(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintDivUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintDivUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintMod: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintMod(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintModUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintModUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintAnd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintAnd(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintAndUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintAndUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintOr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintOr(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintOrUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintOrUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintXor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintXor(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintXorUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintXorUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintEq(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintEqUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintEqUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintNe(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintNeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintNeUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintLt(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintLtUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintLtUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintLe(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintLeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintLeUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintGt(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintGtUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintGtUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintGe(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintGeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintGeUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyStringInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyStringInit(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_startswith(string,string)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyStringStartswith: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyStringStartswith(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_endswith(string,string)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyStringEndswith: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyStringEndswith(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_join(string,string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyStringJoin: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyStringJoin(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyLog(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the PrimitiveOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_init(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Init: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Init(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_init(byte[])uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_add(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Add: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Add(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_add(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_sub(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Sub: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Sub(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_sub(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mul(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Mul: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Mul(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_mul(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_div(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Div: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Div(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_div(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mod(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Mod: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Mod(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_mod(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_and(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64And: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64And(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_and(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_or(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Or: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Or(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_or(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_xor(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Xor: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Xor(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_xor(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_not(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Not: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Not(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_not(uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lshift(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Lshift: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Lshift(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_lshift(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_rshift(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Rshift: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Rshift(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_rshift(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_pow(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Pow: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Pow(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_pow(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_eq(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Eq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Eq(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_eq(uint64,uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ne(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Ne: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Ne(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_ne(uint64,uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lt(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Lt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Lt(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_lt(uint64,uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_le(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Le: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Le(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_le(uint64,uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_gt(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Gt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Gt(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_gt(uint64,uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ge(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Ge: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Ge(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_ge(uint64,uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_init(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBytesInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesInit(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_init(uint64)byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_add(byte[],byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBytesAdd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesAdd(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBytesEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesEq(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_eq(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBytesNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesNe(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_ne(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_and(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBytesAnd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesAnd(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_and(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_or(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBytesOr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesOr(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_or(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_xor(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBytesXor: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesXor(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_xor(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_not(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBytesNot: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesNot(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_not(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintAdd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintAdd(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_add(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintAddUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintAddUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_add_uint64(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintSub: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintSub(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_sub(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintSubUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintSubUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_sub_uint64(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintMul: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintMul(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_mul(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintMulUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintMulUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_mul_uint64(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintDiv: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintDiv(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_div(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintDivUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintDivUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_div_uint64(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintMod: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintMod(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_mod(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintModUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintModUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_mod_uint64(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintAnd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintAnd(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_and(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintAndUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintAndUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_and_uint64(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintOr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintOr(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_or(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintOrUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintOrUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_or_uint64(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintXor: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintXor(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_xor(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintXorUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintXorUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_xor_uint64(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintEq(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_eq(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintEqUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintEqUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_eq_uint64(byte[],uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintNe(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_ne(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintNeUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintNeUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_ne_uint64(byte[],uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintLt(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_lt(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintLtUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintLtUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_lt_uint64(byte[],uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintLe(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_le(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintLeUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintLeUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_le_uint64(byte[],uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintGt(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_gt(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintGtUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintGtUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_gt_uint64(byte[],uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintGe(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_ge(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintGeUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintGeUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_ge_uint64(byte[],uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyStringInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyStringInit(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_string_init(string)string'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_startswith(string,string)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyStringStartswith: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyStringStartswith(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_string_startswith(string,string)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_endswith(string,string)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyStringEndswith: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyStringEndswith(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_string_endswith(string,string)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_join(string,string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyStringJoin: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyStringJoin(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_string_join(string,string)string'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyLog(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new PrimitiveOpsContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current PrimitiveOpsContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): PrimitiveOpsContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_uint64_init(byte[])uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Init(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Init(params))) - return this - }, - /** - * Add a verify_uint64_add(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Add(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Add(params))) - return this - }, - /** - * Add a verify_uint64_sub(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Sub(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Sub(params))) - return this - }, - /** - * Add a verify_uint64_mul(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Mul(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Mul(params))) - return this - }, - /** - * Add a verify_uint64_div(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Div(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Div(params))) - return this - }, - /** - * Add a verify_uint64_mod(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Mod(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Mod(params))) - return this - }, - /** - * Add a verify_uint64_and(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64And(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64And(params))) - return this - }, - /** - * Add a verify_uint64_or(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Or(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Or(params))) - return this - }, - /** - * Add a verify_uint64_xor(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Xor(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Xor(params))) - return this - }, - /** - * Add a verify_uint64_not(uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Not(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Not(params))) - return this - }, - /** - * Add a verify_uint64_lshift(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Lshift(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Lshift(params))) - return this - }, - /** - * Add a verify_uint64_rshift(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Rshift(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Rshift(params))) - return this - }, - /** - * Add a verify_uint64_pow(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Pow(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Pow(params))) - return this - }, - /** - * Add a verify_uint64_eq(uint64,uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyUint64Eq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Eq(params))) - return this - }, - /** - * Add a verify_uint64_ne(uint64,uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyUint64Ne(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Ne(params))) - return this - }, - /** - * Add a verify_uint64_lt(uint64,uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyUint64Lt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Lt(params))) - return this - }, - /** - * Add a verify_uint64_le(uint64,uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyUint64Le(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Le(params))) - return this - }, - /** - * Add a verify_uint64_gt(uint64,uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyUint64Gt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Gt(params))) - return this - }, - /** - * Add a verify_uint64_ge(uint64,uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyUint64Ge(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Ge(params))) - return this - }, - /** - * Add a verify_bytes_init(uint64)byte[] method call against the PrimitiveOpsContract contract - */ - verifyBytesInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesInit(params))) - return this - }, - /** - * Add a verify_bytes_add(byte[],byte[],uint64,uint64)byte[] method call against the PrimitiveOpsContract contract - */ - verifyBytesAdd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesAdd(params))) - return this - }, - /** - * Add a verify_bytes_eq(byte[],byte[])bool method call against the PrimitiveOpsContract contract - */ - verifyBytesEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesEq(params))) - return this - }, - /** - * Add a verify_bytes_ne(byte[],byte[])bool method call against the PrimitiveOpsContract contract - */ - verifyBytesNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesNe(params))) - return this - }, - /** - * Add a verify_bytes_and(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract - */ - verifyBytesAnd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesAnd(params))) - return this - }, - /** - * Add a verify_bytes_or(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract - */ - verifyBytesOr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesOr(params))) - return this - }, - /** - * Add a verify_bytes_xor(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract - */ - verifyBytesXor(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesXor(params))) - return this - }, - /** - * Add a verify_bytes_not(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract - */ - verifyBytesNot(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesNot(params))) - return this - }, - /** - * Add a verify_biguint_add(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintAdd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintAdd(params))) - return this - }, - /** - * Add a verify_biguint_add_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintAddUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintAddUint64(params))) - return this - }, - /** - * Add a verify_biguint_sub(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintSub(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintSub(params))) - return this - }, - /** - * Add a verify_biguint_sub_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintSubUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintSubUint64(params))) - return this - }, - /** - * Add a verify_biguint_mul(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintMul(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintMul(params))) - return this - }, - /** - * Add a verify_biguint_mul_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintMulUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintMulUint64(params))) - return this - }, - /** - * Add a verify_biguint_div(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintDiv(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintDiv(params))) - return this - }, - /** - * Add a verify_biguint_div_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintDivUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintDivUint64(params))) - return this - }, - /** - * Add a verify_biguint_mod(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintMod(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintMod(params))) - return this - }, - /** - * Add a verify_biguint_mod_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintModUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintModUint64(params))) - return this - }, - /** - * Add a verify_biguint_and(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintAnd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintAnd(params))) - return this - }, - /** - * Add a verify_biguint_and_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintAndUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintAndUint64(params))) - return this - }, - /** - * Add a verify_biguint_or(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintOr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintOr(params))) - return this - }, - /** - * Add a verify_biguint_or_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintOrUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintOrUint64(params))) - return this - }, - /** - * Add a verify_biguint_xor(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintXor(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintXor(params))) - return this - }, - /** - * Add a verify_biguint_xor_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintXorUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintXorUint64(params))) - return this - }, - /** - * Add a verify_biguint_eq(byte[],byte[])bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintEq(params))) - return this - }, - /** - * Add a verify_biguint_eq_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintEqUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintEqUint64(params))) - return this - }, - /** - * Add a verify_biguint_ne(byte[],byte[])bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintNe(params))) - return this - }, - /** - * Add a verify_biguint_ne_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintNeUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintNeUint64(params))) - return this - }, - /** - * Add a verify_biguint_lt(byte[],byte[])bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintLt(params))) - return this - }, - /** - * Add a verify_biguint_lt_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintLtUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintLtUint64(params))) - return this - }, - /** - * Add a verify_biguint_le(byte[],byte[])bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintLe(params))) - return this - }, - /** - * Add a verify_biguint_le_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintLeUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintLeUint64(params))) - return this - }, - /** - * Add a verify_biguint_gt(byte[],byte[])bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintGt(params))) - return this - }, - /** - * Add a verify_biguint_gt_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintGtUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintGtUint64(params))) - return this - }, - /** - * Add a verify_biguint_ge(byte[],byte[])bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintGe(params))) - return this - }, - /** - * Add a verify_biguint_ge_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintGeUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintGeUint64(params))) - return this - }, - /** - * Add a verify_string_init(string)string method call against the PrimitiveOpsContract contract - */ - verifyStringInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringInit(params))) - return this - }, - /** - * Add a verify_string_startswith(string,string)bool method call against the PrimitiveOpsContract contract - */ - verifyStringStartswith(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringStartswith(params))) - return this - }, - /** - * Add a verify_string_endswith(string,string)bool method call against the PrimitiveOpsContract contract - */ - verifyStringEndswith(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringEndswith(params))) - return this - }, - /** - * Add a verify_string_join(string,string)string method call against the PrimitiveOpsContract contract - */ - verifyStringJoin(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringJoin(params))) - return this - }, - /** - * Add a verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void method call against the PrimitiveOpsContract contract - */ - verifyLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyLog(params))) - return this - }, - /** - * Add a clear state call to the PrimitiveOpsContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as PrimitiveOpsContractComposer - } -} -export type PrimitiveOpsContractComposer = { - /** - * Calls the verify_uint64_init(byte[])uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Init(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_init(byte[])uint64'] | undefined]> - - /** - * Calls the verify_uint64_add(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Add(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_add(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_sub(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Sub(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_sub(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_mul(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Mul(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_mul(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_div(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Div(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_div(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_mod(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Mod(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_mod(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_and(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64And(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_and(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_or(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Or(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_or(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_xor(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Xor(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_xor(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_not(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Not(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_not(uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_lshift(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Lshift(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_lshift(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_rshift(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Rshift(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_rshift(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_pow(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Pow(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_pow(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_eq(uint64,uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Eq(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_eq(uint64,uint64)bool'] | undefined]> - - /** - * Calls the verify_uint64_ne(uint64,uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Ne(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_ne(uint64,uint64)bool'] | undefined]> - - /** - * Calls the verify_uint64_lt(uint64,uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Lt(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_lt(uint64,uint64)bool'] | undefined]> - - /** - * Calls the verify_uint64_le(uint64,uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Le(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_le(uint64,uint64)bool'] | undefined]> - - /** - * Calls the verify_uint64_gt(uint64,uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Gt(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_gt(uint64,uint64)bool'] | undefined]> - - /** - * Calls the verify_uint64_ge(uint64,uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Ge(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_ge(uint64,uint64)bool'] | undefined]> - - /** - * Calls the verify_bytes_init(uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBytesInit(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_init(uint64)byte[]'] | undefined]> - - /** - * Calls the verify_bytes_add(byte[],byte[],uint64,uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBytesAdd(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'] | undefined]> - - /** - * Calls the verify_bytes_eq(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBytesEq(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_eq(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_bytes_ne(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBytesNe(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_ne(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_bytes_and(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBytesAnd(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_and(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_bytes_or(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBytesOr(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_or(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_bytes_xor(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBytesXor(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_xor(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_bytes_not(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBytesNot(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_not(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_biguint_add(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintAdd(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_add(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_biguint_add_uint64(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintAddUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_add_uint64(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_biguint_sub(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintSub(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_sub(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_biguint_sub_uint64(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintSubUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_sub_uint64(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_biguint_mul(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintMul(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_mul(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_biguint_mul_uint64(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintMulUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_mul_uint64(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_biguint_div(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintDiv(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_div(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_biguint_div_uint64(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintDivUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_div_uint64(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_biguint_mod(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintMod(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_mod(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_biguint_mod_uint64(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintModUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_mod_uint64(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_biguint_and(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintAnd(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_and(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_biguint_and_uint64(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintAndUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_and_uint64(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_biguint_or(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintOr(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_or(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_biguint_or_uint64(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintOrUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_or_uint64(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_biguint_xor(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintXor(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_xor(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_biguint_xor_uint64(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintXorUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_xor_uint64(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_biguint_eq(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintEq(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_eq(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguint_eq_uint64(byte[],uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintEqUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_eq_uint64(byte[],uint64)bool'] | undefined]> - - /** - * Calls the verify_biguint_ne(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintNe(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_ne(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguint_ne_uint64(byte[],uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintNeUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_ne_uint64(byte[],uint64)bool'] | undefined]> - - /** - * Calls the verify_biguint_lt(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintLt(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_lt(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguint_lt_uint64(byte[],uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintLtUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_lt_uint64(byte[],uint64)bool'] | undefined]> - - /** - * Calls the verify_biguint_le(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintLe(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_le(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguint_le_uint64(byte[],uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintLeUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_le_uint64(byte[],uint64)bool'] | undefined]> - - /** - * Calls the verify_biguint_gt(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintGt(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_gt(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguint_gt_uint64(byte[],uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintGtUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_gt_uint64(byte[],uint64)bool'] | undefined]> - - /** - * Calls the verify_biguint_ge(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintGe(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_ge(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguint_ge_uint64(byte[],uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintGeUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_ge_uint64(byte[],uint64)bool'] | undefined]> - - /** - * Calls the verify_string_init(string)string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyStringInit(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_string_init(string)string'] | undefined]> - - /** - * Calls the verify_string_startswith(string,string)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyStringStartswith(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_string_startswith(string,string)bool'] | undefined]> - - /** - * Calls the verify_string_endswith(string,string)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyStringEndswith(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_string_endswith(string,string)bool'] | undefined]> - - /** - * Calls the verify_string_join(string,string)string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyStringJoin(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_string_join(string,string)string'] | undefined]> - - /** - * Calls the verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyLog(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the PrimitiveOpsContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): PrimitiveOpsContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): PrimitiveOpsContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type PrimitiveOpsContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/SignaturesContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/SignaturesContract.ts deleted file mode 100644 index e810782..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/SignaturesContract.ts +++ /dev/null @@ -1,1203 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"SignaturesContract","structs":{"AnotherStruct":[{"name":"one","type":"uint64"},{"name":"two","type":"string"}],"MyStruct":[{"name":"anotherStruct","type":"AnotherStruct"},{"name":"anotherStructAlias","type":"AnotherStruct"},{"name":"three","type":"uint128"},{"name":"four","type":"uint128"}]},"methods":[{"name":"create","args":[],"returns":{"type":"void"},"actions":{"create":["NoOp"],"call":[]},"readonly":false,"events":[],"recommendations":{}},{"name":"sink","args":[{"type":"string","name":"value"},{"type":"uint8[]","name":"arr"},{"type":"byte[4]","name":"fixed_bytes"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"alias","args":[{"type":"string","name":"value"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"with_txn","args":[{"type":"string","name":"value"},{"type":"pay","name":"pay"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"with_asset","args":[{"type":"string","name":"value"},{"type":"asset","name":"asset"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"with_app","args":[{"type":"string","name":"value"},{"type":"application","name":"app"},{"type":"uint64","name":"app_id"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"with_acc","args":[{"type":"string","name":"value"},{"type":"account","name":"acc"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"complex_sig","args":[{"type":"((uint64,string),(uint64,string),uint128,uint128)","struct":"MyStruct","name":"struct1"},{"type":"txn","name":"txn"},{"type":"account","name":"acc"},{"type":"uint8[]","name":"five"}],"returns":{"type":"((uint64,string),((uint64,string),(uint64,string),uint128,uint128))"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"echo_resource_by_index","args":[{"type":"asset","name":"asset"},{"type":"application","name":"app"},{"type":"account","name":"acc"}],"returns":{"type":"(uint64,uint64,address)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"echo_resource_by_value","args":[{"type":"uint64","name":"asset"},{"type":"uint64","name":"app"},{"type":"address","name":"acc"}],"returns":{"type":"(uint64,uint64,address)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":[],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[348,353,547,552],"errorMessage":"account funded"},{"pc":[284],"errorMessage":"application exists"},{"pc":[242],"errorMessage":"asset exists"},{"pc":[639],"errorMessage":"expected account to be passed by index"},{"pc":[693],"errorMessage":"expected account to be passed by value"},{"pc":[280],"errorMessage":"expected app id to match provided app id"},{"pc":[629],"errorMessage":"expected application to be passed by index"},{"pc":[687],"errorMessage":"expected application to be passed by value"},{"pc":[619],"errorMessage":"expected asset to be passed by index"},{"pc":[679],"errorMessage":"expected asset to be passed by value"},{"pc":[138],"errorMessage":"expected global to have app address"},{"pc":[132],"errorMessage":"expected global to have app id"},{"pc":[288],"errorMessage":"expected other app to have same creator"},{"pc":[143,147],"errorMessage":"expected txn to have 0"},{"pc":[392],"errorMessage":"invalid array length header"},{"pc":[400],"errorMessage":"invalid number of bytes for arc4.dynamic_array"},{"pc":[671],"errorMessage":"invalid number of bytes for arc4.static_array"},{"pc":[129,294],"errorMessage":"transaction type is appl"},{"pc":[190],"errorMessage":"transaction type is pay"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgNiAxMjMKICAgIGJ5dGVjYmxvY2sgMHgwMDAwIDB4MTUxZjdjNzUgMHgwMDAwMDAwMDAwMDAwMDAxIDB4MDAwMTMyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyNQogICAgLy8gY2xhc3MgU2lnbmF0dXJlc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDEzCiAgICBwdXNoYnl0ZXNzIDB4MmUwMTc4MWUgMHgzYjA1Y2YxNyAweDA2NThkY2MzIDB4NWI2NDQ3ZGUgMHgwNjFmNGU3NyAweGVhYTg5MTM5IDB4NTEwZTcyYTQgMHhkNmMyYWM3ZiAweDQ4MTQyZDVlIC8vIG1ldGhvZCAic2luayhzdHJpbmcsdWludDhbXSxieXRlWzRdKXZvaWQiLCBtZXRob2QgImFsaWFzKHN0cmluZyx1aW50OFtdKXZvaWQiLCBtZXRob2QgIndpdGhfdHhuKHN0cmluZyxwYXksdWludDhbXSl2b2lkIiwgbWV0aG9kICJ3aXRoX2Fzc2V0KHN0cmluZyxhc3NldCx1aW50OFtdKXZvaWQiLCBtZXRob2QgIndpdGhfYXBwKHN0cmluZyxhcHBsaWNhdGlvbix1aW50NjQsdWludDhbXSl2b2lkIiwgbWV0aG9kICJ3aXRoX2FjYyhzdHJpbmcsYWNjb3VudCx1aW50OFtdKXZvaWQiLCBtZXRob2QgImNvbXBsZXhfc2lnKCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpLHVpbnQxMjgsdWludDEyOCksdHhuLGFjY291bnQsdWludDhbXSkoKHVpbnQ2NCxzdHJpbmcpLCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpLHVpbnQxMjgsdWludDEyOCkpIiwgbWV0aG9kICJlY2hvX3Jlc291cmNlX2J5X2luZGV4KGFzc2V0LGFwcGxpY2F0aW9uLGFjY291bnQpKHVpbnQ2NCx1aW50NjQsYWRkcmVzcykiLCBtZXRob2QgImVjaG9fcmVzb3VyY2VfYnlfdmFsdWUodWludDY0LHVpbnQ2NCxhZGRyZXNzKSh1aW50NjQsdWludDY0LGFkZHJlc3MpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggc2luayBzaW5rMiB3aXRoX3R4biB3aXRoX2Fzc2V0IHdpdGhfYXBwIHdpdGhfYWNjIGNvbXBsZXhfc2lnIGVjaG9fcmVzb3VyY2VfYnlfaW5kZXggZWNob19yZXNvdXJjZV9ieV92YWx1ZQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjUKICAgIC8vIGNsYXNzIFNpZ25hdHVyZXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgcHVzaGJ5dGVzIDB4NGM1YzYxYmEgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGUKICAgIGVycgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyOAogICAgLy8gYXBwX3R4biA9IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24oMCkKICAgIGludGNfMSAvLyAwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyOQogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkICE9IDAsICJleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgaWQiCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzICE9IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozMC0zMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzICE9IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIC8vICksICJleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgYWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjgKICAgIC8vIGFwcF90eG4gPSBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKDApCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzMKICAgIC8vIGFzc2VydCBhcHBfdHhuLmFwcF9pZCA9PSAwLCAiZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMCIKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBleHBlY3RlZCB0eG4gdG8gaGF2ZSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozNAogICAgLy8gYXNzZXJ0IFR4bi5hcHBsaWNhdGlvbl9pZCA9PSAwLCAiZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMCIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5zaW5rW3JvdXRpbmddKCkgLT4gdm9pZDoKc2luazoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QodmFsaWRhdGVfZW5jb2Rpbmc9InVuc2FmZV9kaXNhYmxlZCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0MAogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDEKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHZhbGlkYXRlX2VuY29kaW5nPSJ1bnNhZmVfZGlzYWJsZWQiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5zaW5rMltyb3V0aW5nXSgpIC0+IHZvaWQ6CnNpbmsyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPSJhbGlhcyIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0NgogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDcKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9ImFsaWFzIikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF90eG5bcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX3R4bjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTEKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgdW5jb3ZlciAyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTIKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1MwogICAgLy8gYXNzZXJ0IHBheS5ncm91cF9pbmRleCA9PSAwCiAgICBkdXAKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTQKICAgIC8vIGFzc2VydCBUeG4uZ3JvdXBfaW5kZXggPT0gMQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1NQogICAgLy8gYXNzZXJ0IHBheS5hbW91bnQgPT0gMTIzCiAgICBndHhucyBBbW91bnQKICAgIGludGNfMyAvLyAxMjMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hc3NldFtyb3V0aW5nXSgpIC0+IHZvaWQ6CndpdGhfYXNzZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBhc3NlcnQgdmFsdWUKICAgIHVuY292ZXIgMgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBhc3NlcnQgYXJyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjEKICAgIC8vIGFzc2VydCBhc3NldC50b3RhbCA9PSAxMjMKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpbnRjXzMgLy8gMTIzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo2MgogICAgLy8gYXNzZXJ0IFR4bi5hc3NldHMoMCkgPT0gYXNzZXQKICAgIHR4bmEgQXNzZXRzIDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hcHBbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX2FwcDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjgKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgdW5jb3ZlciAzCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjkKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3MAogICAgLy8gYXNzZXJ0IGFwcC5pZCA9PSBhcHBfaWQsICJleHBlY3RlZCBhcHAgaWQgdG8gbWF0Y2ggcHJvdmlkZWQgYXBwIGlkIgogICAgZGlnIDEKICAgIGl0b2IKICAgIGI9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcCBpZCB0byBtYXRjaCBwcm92aWRlZCBhcHAgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBhc3NlcnQgYXBwLmNyZWF0b3IgPT0gb3AuR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgImV4cGVjdGVkIG90aGVyIGFwcCB0byBoYXZlIHNhbWUgY3JlYXRvciIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG90aGVyIGFwcCB0byBoYXZlIHNhbWUgY3JlYXRvcgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NzIKICAgIC8vIGFwcF90eG4gPSBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKDApCiAgICBpbnRjXzEgLy8gMAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjczCiAgICAvLyBhc3NlcnQgYXBwX3R4bi5hcHBzKDApID09IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkCiAgICBkdXAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25zCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9ucygwKSA9PSBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZAogICAgdHhuYSBBcHBsaWNhdGlvbnMgMAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3MgogICAgLy8gYXBwX3R4biA9IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24oMCkKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3NQogICAgLy8gYXNzZXJ0IGFwcF90eG4uYXBwcygxKSA9PSBhcHAKICAgIGludGNfMCAvLyAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9ucwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9ucygxKSA9PSBhcHAKICAgIHR4bmEgQXBwbGljYXRpb25zIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hY2Nbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX2FjYzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4MAogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4MQogICAgLy8gYXNzZXJ0IGFycgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBhc3NlcnQgYWNjLmJhbGFuY2UgPT0gYWNjLm1pbl9iYWxhbmNlICsgMTIzNAogICAgZHVwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBwdXNoaW50IDEyMzQKICAgICsKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBhc3NlcnQgVHhuLmFjY291bnRzKDApID09IFR4bi5zZW5kZXIKICAgIHR4bmEgQWNjb3VudHMgMAogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6ODQKICAgIC8vIGFzc2VydCBUeG4uYWNjb3VudHMoMSkgPT0gYWNjCiAgICB0eG5hIEFjY291bnRzIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3QuY29tcGxleF9zaWdbcm91dGluZ10oKSAtPiB2b2lkOgpjb21wbGV4X3NpZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBmaXZlLnZhbGlkYXRlKCkKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5MQogICAgLy8gYXNzZXJ0IFR4bi5udW1fYXBwX2FyZ3MgPT0gNAogICAgdHhuIE51bUFwcEFyZ3MKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTItOTMKICAgIC8vICMgc3RydWN0CiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdC5vbmUgPT0gMQogICAgZGlnIDMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDQKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyA1CiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4CiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjkyLTk0CiAgICAvLyAjIHN0cnVjdAogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3Qub25lID09IDEKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0LnR3byA9PSAiMiIKICAgIGR1cAogICAgcHVzaGludCA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdC50d28gPT0gIjIiCiAgICBieXRlY18zIC8vIDB4MDAwMTMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5NQogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3RfYWxpYXMub25lID09IDEKICAgIGRpZyA2CiAgICBsZW4KICAgIGRpZyA3CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5NS05NgogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3RfYWxpYXMub25lID09IDEKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0X2FsaWFzLnR3byA9PSAiMiIKICAgIGR1cAogICAgcHVzaGludCA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTQKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0LnR3byA9PSAiMiIKICAgIGJ5dGVjXzMgLy8gMHgwMDAxMzIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdF9hbGlhcy50d28gPT0gIjIiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5NwogICAgLy8gYXNzZXJ0IHN0cnVjdDEudGhyZWUgPT0gMwogICAgZGlnIDUKICAgIGV4dHJhY3QgNCAxNgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5OAogICAgLy8gYXNzZXJ0IHN0cnVjdDEuZm91ciA9PSA0CiAgICBkaWcgNQogICAgZXh0cmFjdCAyMCAxNgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMDAtMTAxCiAgICAvLyAjIHR4bgogICAgLy8gYXNzZXJ0IHR4bi5ncm91cF9pbmRleCA9PSBUeG4uZ3JvdXBfaW5kZXggLSAxCiAgICB1bmNvdmVyIDQKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTAzLTEwNAogICAgLy8gIyBhY2MKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygyKSA9PSBhcmM0LlVJbnQ4KDEpLmJ5dGVzICAjIGFjYyBhcnJheSByZWYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHB1c2hieXRlcyAweDAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMDUKICAgIC8vIGFzc2VydCBhY2MuYmFsYW5jZSA9PSBhY2MubWluX2JhbGFuY2UgKyAxMjM0CiAgICBkaWcgMwogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIHVuY292ZXIgNAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIHB1c2hpbnQgMTIzNAogICAgKwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTA2CiAgICAvLyBhc3NlcnQgZml2ZVswXSA9PSA1CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAxCiAgICBwdXNoYnl0ZXMgMHgwNQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHB1c2hpbnQgNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3QuZWNob19yZXNvdXJjZV9ieV9pbmRleFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmVjaG9fcmVzb3VyY2VfYnlfaW5kZXg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTAtMTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IiwKICAgIC8vICkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NldF9pZHggPSBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTE3CiAgICAvLyBhc3NlcnQgYXNzZXQgPT0gVHhuLmFzc2V0cyhhc3NldF9pZHgpLCAiZXhwZWN0ZWQgYXNzZXQgdG8gYmUgcGFzc2VkIGJ5IGluZGV4IgogICAgdHhuYXMgQXNzZXRzCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCB0byBiZSBwYXNzZWQgYnkgaW5kZXgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjExOAogICAgLy8gYXBwX2lkeCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMikpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTkKICAgIC8vIGFzc2VydCBhcHAgPT0gVHhuLmFwcGxpY2F0aW9ucyhhcHBfaWR4KSwgImV4cGVjdGVkIGFwcGxpY2F0aW9uIHRvIGJlIHBhc3NlZCBieSBpbmRleCIKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXBwbGljYXRpb24gdG8gYmUgcGFzc2VkIGJ5IGluZGV4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMjAKICAgIC8vIGFjY19pZHggPSBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDMpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTIxCiAgICAvLyBhc3NlcnQgYWNjID09IFR4bi5hY2NvdW50cyhhY2NfaWR4KSwgImV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IGluZGV4IgogICAgdHhuYXMgQWNjb3VudHMKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IGluZGV4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTAtMTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IiwKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5lY2hvX3Jlc291cmNlX2J5X3ZhbHVlW3JvdXRpbmddKCkgLT4gdm9pZDoKZWNob19yZXNvdXJjZV9ieV92YWx1ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEyNC0xMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICByZXNvdXJjZV9lbmNvZGluZz0idmFsdWUiLAogICAgLy8gKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMwCiAgICAvLyBhY2MudmFsaWRhdGUoKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMxCiAgICAvLyBhc3NldF9pZCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMzIKICAgIC8vIGFzc2VydCBhc3NldC5pZCA9PSBhc3NldF9pZCwgImV4cGVjdGVkIGFzc2V0IHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFzc2V0IHRvIGJlIHBhc3NlZCBieSB2YWx1ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMzCiAgICAvLyBhcHBfaWQgPSBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDIpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTM0CiAgICAvLyBhc3NlcnQgYXBwLmlkID09IGFwcF9pZCwgImV4cGVjdGVkIGFwcGxpY2F0aW9uIHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcGxpY2F0aW9uIHRvIGJlIHBhc3NlZCBieSB2YWx1ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTM2CiAgICAvLyBhc3NlcnQgYWNjLmJ5dGVzID09IGFkZHJlc3MsICJleHBlY3RlZCBhY2NvdW50IHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTM1CiAgICAvLyBhZGRyZXNzID0gVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMykKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gYXNzZXJ0IGFjYy5ieXRlcyA9PSBhZGRyZXNzLCAiZXhwZWN0ZWQgYWNjb3VudCB0byBiZSBwYXNzZWQgYnkgdmFsdWUiCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IHZhbHVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMjQtMTI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9InZhbHVlIiwKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAQAGeyYEAgAABBUffHUIAAAAAAAAAAEDAAEyMRkURDEYQQBHggkELgF4HgQ7Bc8XBAZY3MMEW2RH3gQGH053BOqokTkEUQ5ypATWwqx/BEgULV42GgCOCQApADcARQBuAJAA2AEJAeMCIgCABExcYbo2GgCOAQABACM4ECQSRDIIRDIKMgMTRCM4GBREMRgURCJDNhoCNhoBKBNEKBNEIkM2GgI2GgEoE0QoE0QiQzYaATEWIglJOBAiEkQ2GgJPAigTRCgTREk4FhREMRYiEkQ4CCUSRCJDNhoBNhoCF8AwNhoDTwIoE0QoE0RJcQBEJRJENjAAEkQiQzYaATYaAhfAMjYaAzYaBE8DKBNEKBNESwEWqERJcgdEMgkSRCM4ECQSRCNJwjIyCBJENjIAMggSRCMiwjJLARJENjIBEkQiQzYaATYaAhfAHDYaA08CKBNEKBNESXMAREsBcwFEgdIJCBJENhwAMQASRDYcARJEIkM2GgExFiIJNhoCF8AcNhoDSSNZgQIISwEVEkQxG4EEEkRLAyNZSwSBAllLBU8CSwJSSVcACCqoREmBCFlLARVLAk8CSwJSKxJESwYVSwdPBE8CUklXAAgqqERJgQhZSwEVUisSREsFVwQQgBAAAAAAAAAAAAAAAAAAAAADqERLBVcUEIAQAAAAAAAAAAAAAAAAAAAABKhETwQ4FjEWIgkSRDYaAoABARJESwNzAERPBHMBRIHSCQgSRE8CVwIBgAEFqESBBAgWVwYCgAIABExQTFBMUClMULAiQzYaARfAMDYaAhfAMjYaAxfAHDYaARfAMEsDEkQ2GgIXwDJLAhJENhoDF8AcSwESRE8CFk8CFlBMUClMULAiQzYaARc2GgIXNhoDSRWBIBJENhoBF0sDEkQ2GgIXSwISREk2GgMSRE8CFk8CFlBMUClMULAiQw==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -// Type definitions for ARC-56 structs - -export type AnotherStruct = { - one: bigint, - two: string -} - - -/** - * Converts the ABI tuple representation of a AnotherStruct to the struct representation - */ -export function AnotherStructFromTuple(abiTuple: [bigint, string]) { - const abiStructType = ABIStructType.fromStruct('AnotherStruct', APP_SPEC.structs) - return getStructValueFromTupleValue(abiStructType, abiTuple) as AnotherStruct -} - -export type MyStruct = { - anotherStruct: AnotherStruct, - anotherStructAlias: AnotherStruct, - three: bigint, - four: bigint -} - - -/** - * Converts the ABI tuple representation of a MyStruct to the struct representation - */ -export function MyStructFromTuple(abiTuple: [AnotherStruct, AnotherStruct, bigint, bigint]) { - const abiStructType = ABIStructType.fromStruct('MyStruct', APP_SPEC.structs) - return getStructValueFromTupleValue(abiStructType, abiTuple) as MyStruct -} - -/** - * The argument types for the SignaturesContract contract - */ -export type SignaturesContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'create()void': Record - 'sink(string,uint8[],byte[4])void': { - value: string - arr: bigint[] | number[] - fixedBytes: Uint8Array - } - 'alias(string,uint8[])void': { - value: string - arr: bigint[] | number[] - } - 'with_txn(string,pay,uint8[])void': { - value: string - pay: AppMethodCallTransactionArgument - arr: bigint[] | number[] - } - 'with_asset(string,asset,uint8[])void': { - value: string - asset: bigint - arr: bigint[] | number[] - } - 'with_app(string,application,uint64,uint8[])void': { - value: string - app: bigint - appId: bigint | number - arr: bigint[] | number[] - } - 'with_acc(string,account,uint8[])void': { - value: string - acc: Uint8Array | string - arr: bigint[] | number[] - } - 'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))': { - struct1: MyStruct - txn: AppMethodCallTransactionArgument - acc: Uint8Array | string - five: bigint[] | number[] - } - 'echo_resource_by_index(asset,application,account)(uint64,uint64,address)': { - asset: bigint - app: bigint - acc: Uint8Array | string - } - 'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)': { - asset: bigint | number - app: bigint | number - acc: string - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'create()void': [] - 'sink(string,uint8[],byte[4])void': [value: string, arr: bigint[] | number[], fixedBytes: Uint8Array] - 'alias(string,uint8[])void': [value: string, arr: bigint[] | number[]] - 'with_txn(string,pay,uint8[])void': [value: string, pay: AppMethodCallTransactionArgument, arr: bigint[] | number[]] - 'with_asset(string,asset,uint8[])void': [value: string, asset: bigint, arr: bigint[] | number[]] - 'with_app(string,application,uint64,uint8[])void': [value: string, app: bigint, appId: bigint | number, arr: bigint[] | number[]] - 'with_acc(string,account,uint8[])void': [value: string, acc: Uint8Array | string, arr: bigint[] | number[]] - 'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))': [struct1: MyStruct, txn: AppMethodCallTransactionArgument, acc: Uint8Array | string, five: bigint[] | number[]] - 'echo_resource_by_index(asset,application,account)(uint64,uint64,address)': [asset: bigint, app: bigint, acc: Uint8Array | string] - 'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)': [asset: bigint | number, app: bigint | number, acc: string] - } -} - -/** - * The return type for each method - */ -export type SignaturesContractReturns = { - 'create()void': void - 'sink(string,uint8[],byte[4])void': void - 'alias(string,uint8[])void': void - 'with_txn(string,pay,uint8[])void': void - 'with_asset(string,asset,uint8[])void': void - 'with_app(string,application,uint64,uint8[])void': void - 'with_acc(string,account,uint8[])void': void - 'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))': [[bigint, string], [[bigint, string], [bigint, string], bigint, bigint]] - 'echo_resource_by_index(asset,application,account)(uint64,uint64,address)': [bigint, bigint, string] - 'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)': [bigint, bigint, string] -} - -/** - * Defines the types of available calls and state of the SignaturesContract smart contract. - */ -export type SignaturesContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'create()void' | 'create', { - argsObj: SignaturesContractArgs['obj']['create()void'] - argsTuple: SignaturesContractArgs['tuple']['create()void'] - returns: SignaturesContractReturns['create()void'] - }> - & Record<'sink(string,uint8[],byte[4])void' | 'sink', { - argsObj: SignaturesContractArgs['obj']['sink(string,uint8[],byte[4])void'] - argsTuple: SignaturesContractArgs['tuple']['sink(string,uint8[],byte[4])void'] - returns: SignaturesContractReturns['sink(string,uint8[],byte[4])void'] - }> - & Record<'alias(string,uint8[])void' | 'alias', { - argsObj: SignaturesContractArgs['obj']['alias(string,uint8[])void'] - argsTuple: SignaturesContractArgs['tuple']['alias(string,uint8[])void'] - returns: SignaturesContractReturns['alias(string,uint8[])void'] - }> - & Record<'with_txn(string,pay,uint8[])void' | 'with_txn', { - argsObj: SignaturesContractArgs['obj']['with_txn(string,pay,uint8[])void'] - argsTuple: SignaturesContractArgs['tuple']['with_txn(string,pay,uint8[])void'] - returns: SignaturesContractReturns['with_txn(string,pay,uint8[])void'] - }> - & Record<'with_asset(string,asset,uint8[])void' | 'with_asset', { - argsObj: SignaturesContractArgs['obj']['with_asset(string,asset,uint8[])void'] - argsTuple: SignaturesContractArgs['tuple']['with_asset(string,asset,uint8[])void'] - returns: SignaturesContractReturns['with_asset(string,asset,uint8[])void'] - }> - & Record<'with_app(string,application,uint64,uint8[])void' | 'with_app', { - argsObj: SignaturesContractArgs['obj']['with_app(string,application,uint64,uint8[])void'] - argsTuple: SignaturesContractArgs['tuple']['with_app(string,application,uint64,uint8[])void'] - returns: SignaturesContractReturns['with_app(string,application,uint64,uint8[])void'] - }> - & Record<'with_acc(string,account,uint8[])void' | 'with_acc', { - argsObj: SignaturesContractArgs['obj']['with_acc(string,account,uint8[])void'] - argsTuple: SignaturesContractArgs['tuple']['with_acc(string,account,uint8[])void'] - returns: SignaturesContractReturns['with_acc(string,account,uint8[])void'] - }> - & Record<'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))' | 'complex_sig', { - argsObj: SignaturesContractArgs['obj']['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'] - argsTuple: SignaturesContractArgs['tuple']['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'] - returns: SignaturesContractReturns['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'] - }> - & Record<'echo_resource_by_index(asset,application,account)(uint64,uint64,address)' | 'echo_resource_by_index', { - argsObj: SignaturesContractArgs['obj']['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'] - argsTuple: SignaturesContractArgs['tuple']['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'] - returns: SignaturesContractReturns['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'] - }> - & Record<'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)' | 'echo_resource_by_value', { - argsObj: SignaturesContractArgs['obj']['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'] - argsTuple: SignaturesContractArgs['tuple']['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'] - returns: SignaturesContractReturns['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type SignaturesContractSignatures = keyof SignaturesContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type SignaturesContractNonVoidMethodSignatures = keyof SignaturesContractTypes['methods'] extends infer T ? T extends keyof SignaturesContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the SignaturesContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = SignaturesContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the SignaturesContract smart contract to the method's return type - */ -export type MethodReturn = SignaturesContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type SignaturesContractCreateCallParams = - | Expand & {method: 'create'} & { onComplete?: OnApplicationComplete.NoOp } & CreateSchema> - | Expand & {method: 'create()void'} & { onComplete?: OnApplicationComplete.NoOp } & CreateSchema> -/** - * Defines arguments required for the deploy method. - */ -export type SignaturesContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: SignaturesContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the SignaturesContract smart contract - */ -export abstract class SignaturesContractParamsFactory { - /** - * Gets available create ABI call param factories - */ - static get create() { - return { - _resolveByMethod(params: TParams) { - switch(params.method) { - case 'create': - case 'create()void': - return SignaturesContractParamsFactory.create.create(params) - } - throw new Error(`Unknown ' + verb + ' method`) - }, - - /** - * Constructs create ABI call params for the SignaturesContract smart contract using the create()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - create(params: CallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.NoOp }): AppClientMethodCallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.NoOp } { - return { - ...params, - method: 'create()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - }, - } - } - - /** - * Constructs a no op call for the sink(string,uint8[],byte[4])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static sink(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'sink(string,uint8[],byte[4])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.arr, params.args.fixedBytes], - } - } - /** - * Constructs a no op call for the alias(string,uint8[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static alias(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'alias(string,uint8[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.arr], - } - } - /** - * Constructs a no op call for the with_txn(string,pay,uint8[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static withTxn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'with_txn(string,pay,uint8[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.pay, params.args.arr], - } - } - /** - * Constructs a no op call for the with_asset(string,asset,uint8[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static withAsset(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'with_asset(string,asset,uint8[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.asset, params.args.arr], - } - } - /** - * Constructs a no op call for the with_app(string,application,uint64,uint8[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static withApp(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'with_app(string,application,uint64,uint8[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.app, params.args.appId, params.args.arr], - } - } - /** - * Constructs a no op call for the with_acc(string,account,uint8[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static withAcc(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'with_acc(string,account,uint8[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.acc, params.args.arr], - } - } - /** - * Constructs a no op call for the complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128)) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static complexSig(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))' as const, - args: Array.isArray(params.args) ? params.args : [params.args.struct1, params.args.txn, params.args.acc, params.args.five], - } - } - /** - * Constructs a no op call for the echo_resource_by_index(asset,application,account)(uint64,uint64,address) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static echoResourceByIndex(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'echo_resource_by_index(asset,application,account)(uint64,uint64,address)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.asset, params.args.app, params.args.acc], - } - } - /** - * Constructs a no op call for the echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static echoResourceByValue(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.asset, params.args.app, params.args.acc], - } - } -} - -/** - * A factory to create and deploy one or more instance of the SignaturesContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class SignaturesContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `SignaturesContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new SignaturesContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new SignaturesContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the SignaturesContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: SignaturesContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - createParams: params.createParams?.method ? SignaturesContractParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (SignaturesContractCreateCallParams & { args: Uint8Array[] }) : undefined, - }) - return { result: result.result, appClient: new SignaturesContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the SignaturesContract smart contract using the create()void ABI method. - * - * @param params The params for the smart contract call - * @returns The create params - */ - create: (params: CallParams & AppClientCompilationParams & CreateSchema & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appFactory.params.create(SignaturesContractParamsFactory.create.create(params)) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the SignaturesContract smart contract using the create()void ABI method. - * - * @param params The params for the smart contract call - * @returns The create transaction - */ - create: (params: CallParams & AppClientCompilationParams & CreateSchema & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appFactory.createTransaction.create(SignaturesContractParamsFactory.create.create(params)) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the SignaturesContract smart contract using an ABI method call using the create()void ABI method. - * - * @param params The params for the smart contract call - * @returns The create result - */ - create: async (params: CallParams & AppClientCompilationParams & CreateSchema & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appFactory.send.create(SignaturesContractParamsFactory.create.create(params)) - return { result: { ...result.result, return: result.result.return as unknown as (undefined | SignaturesContractReturns['create()void']) }, appClient: new SignaturesContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the SignaturesContract smart contract - */ -export class SignaturesContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `SignaturesContractClient` - * - * @param appClient An `AppClient` instance which has been created with the SignaturesContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `SignaturesContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `SignaturesContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new SignaturesContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `SignaturesContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new SignaturesContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the SignaturesContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `sink(string,uint8[],byte[4])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - sink: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(SignaturesContractParamsFactory.sink(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `alias(string,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - alias: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(SignaturesContractParamsFactory.alias(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_txn(string,pay,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - withTxn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(SignaturesContractParamsFactory.withTxn(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_asset(string,asset,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - withAsset: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(SignaturesContractParamsFactory.withAsset(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_app(string,application,uint64,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - withApp: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(SignaturesContractParamsFactory.withApp(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_acc(string,account,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - withAcc: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(SignaturesContractParamsFactory.withAcc(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - complexSig: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(SignaturesContractParamsFactory.complexSig(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_index(asset,application,account)(uint64,uint64,address)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - echoResourceByIndex: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(SignaturesContractParamsFactory.echoResourceByIndex(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - echoResourceByValue: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(SignaturesContractParamsFactory.echoResourceByValue(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the SignaturesContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `sink(string,uint8[],byte[4])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - sink: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(SignaturesContractParamsFactory.sink(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `alias(string,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - alias: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(SignaturesContractParamsFactory.alias(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_txn(string,pay,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - withTxn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(SignaturesContractParamsFactory.withTxn(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_asset(string,asset,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - withAsset: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(SignaturesContractParamsFactory.withAsset(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_app(string,application,uint64,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - withApp: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(SignaturesContractParamsFactory.withApp(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_acc(string,account,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - withAcc: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(SignaturesContractParamsFactory.withAcc(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - complexSig: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(SignaturesContractParamsFactory.complexSig(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_index(asset,application,account)(uint64,uint64,address)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - echoResourceByIndex: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(SignaturesContractParamsFactory.echoResourceByIndex(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - echoResourceByValue: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(SignaturesContractParamsFactory.echoResourceByValue(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the SignaturesContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `sink(string,uint8[],byte[4])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - sink: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(SignaturesContractParamsFactory.sink(params)) - return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['sink(string,uint8[],byte[4])void'])} - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `alias(string,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - alias: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(SignaturesContractParamsFactory.alias(params)) - return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['alias(string,uint8[])void'])} - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_txn(string,pay,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - withTxn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(SignaturesContractParamsFactory.withTxn(params)) - return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['with_txn(string,pay,uint8[])void'])} - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_asset(string,asset,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - withAsset: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(SignaturesContractParamsFactory.withAsset(params)) - return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['with_asset(string,asset,uint8[])void'])} - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_app(string,application,uint64,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - withApp: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(SignaturesContractParamsFactory.withApp(params)) - return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['with_app(string,application,uint64,uint8[])void'])} - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_acc(string,account,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - withAcc: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(SignaturesContractParamsFactory.withAcc(params)) - return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['with_acc(string,account,uint8[])void'])} - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - complexSig: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(SignaturesContractParamsFactory.complexSig(params)) - return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'])} - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_index(asset,application,account)(uint64,uint64,address)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - echoResourceByIndex: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(SignaturesContractParamsFactory.echoResourceByIndex(params)) - return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'])} - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - echoResourceByValue: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(SignaturesContractParamsFactory.echoResourceByValue(params)) - return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new SignaturesContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current SignaturesContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): SignaturesContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a sink(string,uint8[],byte[4])void method call against the SignaturesContract contract - */ - sink(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sink(params))) - return this - }, - /** - * Add a alias(string,uint8[])void method call against the SignaturesContract contract - */ - alias(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.alias(params))) - return this - }, - /** - * Add a with_txn(string,pay,uint8[])void method call against the SignaturesContract contract - */ - withTxn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withTxn(params))) - return this - }, - /** - * Add a with_asset(string,asset,uint8[])void method call against the SignaturesContract contract - */ - withAsset(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withAsset(params))) - return this - }, - /** - * Add a with_app(string,application,uint64,uint8[])void method call against the SignaturesContract contract - */ - withApp(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withApp(params))) - return this - }, - /** - * Add a with_acc(string,account,uint8[])void method call against the SignaturesContract contract - */ - withAcc(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withAcc(params))) - return this - }, - /** - * Add a complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128)) method call against the SignaturesContract contract - */ - complexSig(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.complexSig(params))) - return this - }, - /** - * Add a echo_resource_by_index(asset,application,account)(uint64,uint64,address) method call against the SignaturesContract contract - */ - echoResourceByIndex(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.echoResourceByIndex(params))) - return this - }, - /** - * Add a echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address) method call against the SignaturesContract contract - */ - echoResourceByValue(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.echoResourceByValue(params))) - return this - }, - /** - * Add a clear state call to the SignaturesContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as SignaturesContractComposer - } -} -export type SignaturesContractComposer = { - /** - * Calls the sink(string,uint8[],byte[4])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - sink(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['sink(string,uint8[],byte[4])void'] | undefined]> - - /** - * Calls the alias(string,uint8[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - alias(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['alias(string,uint8[])void'] | undefined]> - - /** - * Calls the with_txn(string,pay,uint8[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - withTxn(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['with_txn(string,pay,uint8[])void'] | undefined]> - - /** - * Calls the with_asset(string,asset,uint8[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - withAsset(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['with_asset(string,asset,uint8[])void'] | undefined]> - - /** - * Calls the with_app(string,application,uint64,uint8[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - withApp(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['with_app(string,application,uint64,uint8[])void'] | undefined]> - - /** - * Calls the with_acc(string,account,uint8[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - withAcc(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['with_acc(string,account,uint8[])void'] | undefined]> - - /** - * Calls the complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128)) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - complexSig(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'] | undefined]> - - /** - * Calls the echo_resource_by_index(asset,application,account)(uint64,uint64,address) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - echoResourceByIndex(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'] | undefined]> - - /** - * Calls the echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - echoResourceByValue(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the SignaturesContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): SignaturesContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): SignaturesContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type SignaturesContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGet.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGet.ts deleted file mode 100644 index 62c4b5b..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGet.ts +++ /dev/null @@ -1,1319 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"arcs":[],"name":"StateAcctParamsGet","structs":{},"methods":[{"name":"verify_acct_balance","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_min_balance","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_auth_addr","args":[{"name":"a","type":"account"}],"returns":{"type":"byte[]"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_num_uint","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_num_byte_slice","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_extra_app_pages","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_apps_created","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_apps_opted_in","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_assets_created","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_assets","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_boxes","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_box_bytes","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}}],"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LmFwcHJvdmFsX3Byb2dyYW06CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDE2CiAgICBtZXRob2QgInZlcmlmeV9hY2N0X2JhbGFuY2UoYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X21pbl9iYWxhbmNlKGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF9hdXRoX2FkZHIoYWNjb3VudClieXRlW10iCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50KGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhY2NvdW50KXVpbnQ2NCIKICAgIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzKGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQoYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4oYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMoYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2JveGVzKGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMoYWNjb3VudCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3ZlcmlmeV9hY2N0X2JhbGFuY2Vfcm91dGVAMiBtYWluX3ZlcmlmeV9hY2N0X21pbl9iYWxhbmNlX3JvdXRlQDMgbWFpbl92ZXJpZnlfYWNjdF9hdXRoX2FkZHJfcm91dGVANCBtYWluX3ZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50X3JvdXRlQDUgbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZV9yb3V0ZUA2IG1haW5fdmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzX3JvdXRlQDcgbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWRfcm91dGVAOCBtYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW5fcm91dGVAOSBtYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkX3JvdXRlQDEwIG1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX3JvdXRlQDExIG1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXNfcm91dGVAMTIgbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXNfcm91dGVAMTMKICAgIGVyciAvLyByZWplY3QgdHJhbnNhY3Rpb24KCm1haW5fdmVyaWZ5X2FjY3RfYmFsYW5jZV9yb3V0ZUAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXQoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X2JhbGFuY2UKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfbWluX2JhbGFuY2Vfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF9taW5fYmFsYW5jZQogICAgaXRvYgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl92ZXJpZnlfYWNjdF9hdXRoX2FkZHJfcm91dGVANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF9hdXRoX2FkZHIKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50X3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2Vfcm91dGVANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZQogICAgaXRvYgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXNfcm91dGVANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkX3JvdXRlQDg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW5fcm91dGVAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX29wdGVkX2luCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkX3JvdXRlQDEwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXQoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19yb3V0ZUAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXNfcm91dGVAMTI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXMKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYm94X2J5dGVzX3JvdXRlQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXQoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlcwogICAgaXRvYgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIHJlamVjdCB0cmFuc2FjdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50IDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXQudmVyaWZ5X2FjY3RfYmFsYW5jZShhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4LTE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9hY2N0X2JhbGFuY2Uoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMAogICAgLy8gYmFsYW5jZSwgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9iYWxhbmNlKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBiYWxhbmNlCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LnZlcmlmeV9hY2N0X21pbl9iYWxhbmNlKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X21pbl9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzLTI0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9hY2N0X21pbl9iYWxhbmNlKHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhbGdvcHkuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUKICAgIC8vIG1pbl9iYWxhbmNlLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X21pbl9iYWxhbmNlKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjYKICAgIC8vIHJldHVybiBtaW5fYmFsYW5jZQogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF9hdXRoX2FkZHIoYTogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYWNjdF9hdXRoX2FkZHI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgtMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfYXV0aF9hZGRyKHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhbGdvcHkuQnl0ZXM6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMAogICAgLy8gYXV0aF9hZGRyLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2F1dGhfYWRkcihhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEF1dGhBZGRyCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMQogICAgLy8gcmV0dXJuIGF1dGhfYWRkci5ieXRlcwogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludChhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMy0zNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludChzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM1CiAgICAvLyB0b3RhbF9udW1fdWludCwgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9udW1fdWludChhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtVWludAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzYKICAgIC8vIHJldHVybiB0b3RhbF9udW1fdWludAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOC0zOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwCiAgICAvLyB0b3RhbF9udW1fYnl0ZV9zbGljZSwgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MQogICAgLy8gcmV0dXJuIHRvdGFsX251bV9ieXRlX3NsaWNlCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LnZlcmlmeV9hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlcyhhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDMtNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzKHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhbGdvcHkuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDUKICAgIC8vIHRvdGFsX2V4dHJhX2FwcF9wYWdlcywgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEV4dHJhQXBwUGFnZXMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2CiAgICAvLyByZXR1cm4gdG90YWxfZXh0cmFfYXBwX3BhZ2VzCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgtNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkKHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhbGdvcHkuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTAKICAgIC8vIHRvdGFsX2FwcHNfY3JlYXRlZCwgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNDcmVhdGVkCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MQogICAgLy8gcmV0dXJuIHRvdGFsX2FwcHNfY3JlYXRlZAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF90b3RhbF9hcHBzX29wdGVkX2luKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTMtNTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbihzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1CiAgICAvLyB0b3RhbF9hcHBzX29wdGVkX2luLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4oYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNPcHRlZEluCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NgogICAgLy8gcmV0dXJuIHRvdGFsX2FwcHNfb3B0ZWRfaW4KICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXQudmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTgtNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MAogICAgLy8gdG90YWxfYXNzZXRzX2NyZWF0ZWQsIF92YWwgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFzc2V0c0NyZWF0ZWQKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxCiAgICAvLyByZXR1cm4gdG90YWxfYXNzZXRzX2NyZWF0ZWQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXQudmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0czoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2My02NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NQogICAgLy8gdG90YWxfYXNzZXRzLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0cyhhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXNzZXRzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NgogICAgLy8gcmV0dXJuIHRvdGFsX2Fzc2V0cwogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF90b3RhbF9ib3hlcyhhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9ib3hlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OC02OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9ib3hlcyhzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwCiAgICAvLyB0b3RhbF9ib3hlcywgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9ib3hlcyhhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94ZXMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxCiAgICAvLyByZXR1cm4gdG90YWxfYm94ZXMKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXQudmVyaWZ5X2FjY3RfdG90YWxfYm94X2J5dGVzKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3My03NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NQogICAgLy8gdG90YWxfYm94X2J5dGVzLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveF9ieXRlcyhhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94Qnl0ZXMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyByZXR1cm4gdG90YWxfYm94X2J5dGVzCiAgICByZXRzdWIK","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgaW50IDEKICAgIHJldHVybgo="},"bareActions":{"create":["NoOp"],"call":[]}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the StateAcctParamsGet contract - */ -export type StateAcctParamsGetArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify_acct_balance(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_min_balance(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_auth_addr(account)byte[]': { - a: Uint8Array | string - } - 'verify_acct_total_num_uint(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_num_byte_slice(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_extra_app_pages(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_apps_created(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_apps_opted_in(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_assets_created(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_assets(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_boxes(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_box_bytes(account)uint64': { - a: Uint8Array | string - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify_acct_balance(account)uint64': [a: Uint8Array | string] - 'verify_acct_min_balance(account)uint64': [a: Uint8Array | string] - 'verify_acct_auth_addr(account)byte[]': [a: Uint8Array | string] - 'verify_acct_total_num_uint(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_num_byte_slice(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_extra_app_pages(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_apps_created(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_apps_opted_in(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_assets_created(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_assets(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_boxes(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_box_bytes(account)uint64': [a: Uint8Array | string] - } -} - -/** - * The return type for each method - */ -export type StateAcctParamsGetReturns = { - 'verify_acct_balance(account)uint64': bigint - 'verify_acct_min_balance(account)uint64': bigint - 'verify_acct_auth_addr(account)byte[]': Uint8Array - 'verify_acct_total_num_uint(account)uint64': bigint - 'verify_acct_total_num_byte_slice(account)uint64': bigint - 'verify_acct_total_extra_app_pages(account)uint64': bigint - 'verify_acct_total_apps_created(account)uint64': bigint - 'verify_acct_total_apps_opted_in(account)uint64': bigint - 'verify_acct_total_assets_created(account)uint64': bigint - 'verify_acct_total_assets(account)uint64': bigint - 'verify_acct_total_boxes(account)uint64': bigint - 'verify_acct_total_box_bytes(account)uint64': bigint -} - -/** - * Defines the types of available calls and state of the StateAcctParamsGet smart contract. - */ -export type StateAcctParamsGetTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify_acct_balance(account)uint64' | 'verify_acct_balance', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_balance(account)uint64'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_balance(account)uint64'] - returns: StateAcctParamsGetReturns['verify_acct_balance(account)uint64'] - }> - & Record<'verify_acct_min_balance(account)uint64' | 'verify_acct_min_balance', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_min_balance(account)uint64'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_min_balance(account)uint64'] - returns: StateAcctParamsGetReturns['verify_acct_min_balance(account)uint64'] - }> - & Record<'verify_acct_auth_addr(account)byte[]' | 'verify_acct_auth_addr', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_auth_addr(account)byte[]'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_auth_addr(account)byte[]'] - returns: StateAcctParamsGetReturns['verify_acct_auth_addr(account)byte[]'] - }> - & Record<'verify_acct_total_num_uint(account)uint64' | 'verify_acct_total_num_uint', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_num_uint(account)uint64'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_num_uint(account)uint64'] - returns: StateAcctParamsGetReturns['verify_acct_total_num_uint(account)uint64'] - }> - & Record<'verify_acct_total_num_byte_slice(account)uint64' | 'verify_acct_total_num_byte_slice', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_num_byte_slice(account)uint64'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_num_byte_slice(account)uint64'] - returns: StateAcctParamsGetReturns['verify_acct_total_num_byte_slice(account)uint64'] - }> - & Record<'verify_acct_total_extra_app_pages(account)uint64' | 'verify_acct_total_extra_app_pages', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_extra_app_pages(account)uint64'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_extra_app_pages(account)uint64'] - returns: StateAcctParamsGetReturns['verify_acct_total_extra_app_pages(account)uint64'] - }> - & Record<'verify_acct_total_apps_created(account)uint64' | 'verify_acct_total_apps_created', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_apps_created(account)uint64'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_apps_created(account)uint64'] - returns: StateAcctParamsGetReturns['verify_acct_total_apps_created(account)uint64'] - }> - & Record<'verify_acct_total_apps_opted_in(account)uint64' | 'verify_acct_total_apps_opted_in', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_apps_opted_in(account)uint64'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_apps_opted_in(account)uint64'] - returns: StateAcctParamsGetReturns['verify_acct_total_apps_opted_in(account)uint64'] - }> - & Record<'verify_acct_total_assets_created(account)uint64' | 'verify_acct_total_assets_created', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_assets_created(account)uint64'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_assets_created(account)uint64'] - returns: StateAcctParamsGetReturns['verify_acct_total_assets_created(account)uint64'] - }> - & Record<'verify_acct_total_assets(account)uint64' | 'verify_acct_total_assets', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_assets(account)uint64'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_assets(account)uint64'] - returns: StateAcctParamsGetReturns['verify_acct_total_assets(account)uint64'] - }> - & Record<'verify_acct_total_boxes(account)uint64' | 'verify_acct_total_boxes', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_boxes(account)uint64'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_boxes(account)uint64'] - returns: StateAcctParamsGetReturns['verify_acct_total_boxes(account)uint64'] - }> - & Record<'verify_acct_total_box_bytes(account)uint64' | 'verify_acct_total_box_bytes', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_box_bytes(account)uint64'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_box_bytes(account)uint64'] - returns: StateAcctParamsGetReturns['verify_acct_total_box_bytes(account)uint64'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type StateAcctParamsGetSignatures = keyof StateAcctParamsGetTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type StateAcctParamsGetNonVoidMethodSignatures = keyof StateAcctParamsGetTypes['methods'] extends infer T ? T extends keyof StateAcctParamsGetTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the StateAcctParamsGet smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = StateAcctParamsGetTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the StateAcctParamsGet smart contract to the method's return type - */ -export type MethodReturn = StateAcctParamsGetTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type StateAcctParamsGetCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type StateAcctParamsGetDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: StateAcctParamsGetCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAcctParamsGet smart contract - */ -export abstract class StateAcctParamsGetParamsFactory { - /** - * Constructs a no op call for the verify_acct_balance(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctBalance(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_balance(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_min_balance(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctMinBalance(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_min_balance(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_auth_addr(account)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctAuthAddr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_auth_addr(account)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_num_uint(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalNumUint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_num_uint(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_num_byte_slice(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalNumByteSlice(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_num_byte_slice(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_extra_app_pages(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalExtraAppPages(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_extra_app_pages(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_apps_created(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalAppsCreated(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_apps_created(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_apps_opted_in(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalAppsOptedIn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_apps_opted_in(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_assets_created(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalAssetsCreated(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_assets_created(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_assets(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalAssets(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_assets(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_boxes(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_boxes(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_box_bytes(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalBoxBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_box_bytes(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } -} - -/** - * A factory to create and deploy one or more instance of the StateAcctParamsGet smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class StateAcctParamsGetFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `StateAcctParamsGetFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new StateAcctParamsGetClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new StateAcctParamsGetClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the StateAcctParamsGet smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: StateAcctParamsGetDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new StateAcctParamsGetClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAcctParamsGet smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAcctParamsGet smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAcctParamsGet smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new StateAcctParamsGetClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the StateAcctParamsGet smart contract - */ -export class StateAcctParamsGetClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `StateAcctParamsGetClient` - * - * @param appClient An `AppClient` instance which has been created with the StateAcctParamsGet app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `StateAcctParamsGetClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `StateAcctParamsGetClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new StateAcctParamsGetClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `StateAcctParamsGetClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new StateAcctParamsGetClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the StateAcctParamsGet smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctBalance(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_min_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctMinBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctMinBalance(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_auth_addr(account)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctAuthAddr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctAuthAddr(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumUint(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumByteSlice(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalExtraAppPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalExtraAppPages(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalAppsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsCreated(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalAppsOptedIn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsOptedIn(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalAssetsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssetsCreated(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalAssets: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssets(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxes(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalBoxBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxBytes(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the StateAcctParamsGet smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctBalance(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_min_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctMinBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctMinBalance(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_auth_addr(account)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctAuthAddr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctAuthAddr(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumUint(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumByteSlice(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalExtraAppPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalExtraAppPages(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalAppsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsCreated(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalAppsOptedIn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsOptedIn(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalAssetsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssetsCreated(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalAssets: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssets(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxes(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalBoxBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxBytes(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the StateAcctParamsGet smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctBalance: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctBalance(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_balance(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_min_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctMinBalance: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctMinBalance(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_min_balance(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_auth_addr(account)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctAuthAddr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctAuthAddr(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_auth_addr(account)byte[]'])} - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalNumUint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumUint(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_num_uint(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalNumByteSlice: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumByteSlice(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_num_byte_slice(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalExtraAppPages: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalExtraAppPages(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_extra_app_pages(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalAppsCreated: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsCreated(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_apps_created(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalAppsOptedIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsOptedIn(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_apps_opted_in(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalAssetsCreated: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssetsCreated(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_assets_created(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalAssets: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssets(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_assets(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxes(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_boxes(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalBoxBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxBytes(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_box_bytes(account)uint64'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new StateAcctParamsGetClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current StateAcctParamsGet app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): StateAcctParamsGetComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_acct_balance(account)uint64 method call against the StateAcctParamsGet contract - */ - verifyAcctBalance(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctBalance(params))) - return this - }, - /** - * Add a verify_acct_min_balance(account)uint64 method call against the StateAcctParamsGet contract - */ - verifyAcctMinBalance(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctMinBalance(params))) - return this - }, - /** - * Add a verify_acct_auth_addr(account)byte[] method call against the StateAcctParamsGet contract - */ - verifyAcctAuthAddr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctAuthAddr(params))) - return this - }, - /** - * Add a verify_acct_total_num_uint(account)uint64 method call against the StateAcctParamsGet contract - */ - verifyAcctTotalNumUint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalNumUint(params))) - return this - }, - /** - * Add a verify_acct_total_num_byte_slice(account)uint64 method call against the StateAcctParamsGet contract - */ - verifyAcctTotalNumByteSlice(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalNumByteSlice(params))) - return this - }, - /** - * Add a verify_acct_total_extra_app_pages(account)uint64 method call against the StateAcctParamsGet contract - */ - verifyAcctTotalExtraAppPages(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalExtraAppPages(params))) - return this - }, - /** - * Add a verify_acct_total_apps_created(account)uint64 method call against the StateAcctParamsGet contract - */ - verifyAcctTotalAppsCreated(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAppsCreated(params))) - return this - }, - /** - * Add a verify_acct_total_apps_opted_in(account)uint64 method call against the StateAcctParamsGet contract - */ - verifyAcctTotalAppsOptedIn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAppsOptedIn(params))) - return this - }, - /** - * Add a verify_acct_total_assets_created(account)uint64 method call against the StateAcctParamsGet contract - */ - verifyAcctTotalAssetsCreated(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAssetsCreated(params))) - return this - }, - /** - * Add a verify_acct_total_assets(account)uint64 method call against the StateAcctParamsGet contract - */ - verifyAcctTotalAssets(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAssets(params))) - return this - }, - /** - * Add a verify_acct_total_boxes(account)uint64 method call against the StateAcctParamsGet contract - */ - verifyAcctTotalBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalBoxes(params))) - return this - }, - /** - * Add a verify_acct_total_box_bytes(account)uint64 method call against the StateAcctParamsGet contract - */ - verifyAcctTotalBoxBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalBoxBytes(params))) - return this - }, - /** - * Add a clear state call to the StateAcctParamsGet contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as StateAcctParamsGetComposer - } -} -export type StateAcctParamsGetComposer = { - /** - * Calls the verify_acct_balance(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctBalance(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_balance(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_min_balance(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctMinBalance(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_min_balance(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_auth_addr(account)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctAuthAddr(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_auth_addr(account)byte[]'] | undefined]> - - /** - * Calls the verify_acct_total_num_uint(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalNumUint(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_num_uint(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_num_byte_slice(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalNumByteSlice(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_num_byte_slice(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_extra_app_pages(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalExtraAppPages(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_extra_app_pages(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_apps_created(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalAppsCreated(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_apps_created(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_apps_opted_in(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalAppsOptedIn(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_apps_opted_in(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_assets_created(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalAssetsCreated(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_assets_created(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_assets(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalAssets(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_assets(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_boxes(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalBoxes(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_boxes(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_box_bytes(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalBoxBytes(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_box_bytes(account)uint64'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the StateAcctParamsGet smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): StateAcctParamsGetComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): StateAcctParamsGetComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type StateAcctParamsGetComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGetContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGetContract.ts deleted file mode 100644 index 01c1c8f..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGetContract.ts +++ /dev/null @@ -1,1526 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"StateAcctParamsGetContract","structs":{},"methods":[{"name":"verify_acct_balance","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_min_balance","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_auth_addr","args":[{"type":"account","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_num_uint","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_num_byte_slice","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_extra_app_pages","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_apps_created","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_apps_opted_in","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_assets_created","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_assets","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_boxes","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_box_bytes","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_incentive_eligible","args":[{"type":"account","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_last_heartbeat","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_last_proposed","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[171,225],"errorMessage":"account funded"},{"pc":[175],"errorMessage":"expected Account balance to match"},{"pc":[229],"errorMessage":"expected Account min_balance to match"},{"pc":[166,220,273,301,330,359,388,417,446,475,504,533,562,598,627],"errorMessage":"expected funded by index to match"},{"pc":[190],"errorMessage":"expected op.balance by index to match"},{"pc":[181],"errorMessage":"expected op.balance to match"},{"pc":[244],"errorMessage":"expected op.min_balance by index to match"},{"pc":[235],"errorMessage":"expected op.min_balance to match"},{"pc":[164,218,271,299,328,357,386,415,444,473,502,531,560,596,625],"errorMessage":"expected value by index to match"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNAogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NWY1YjQzZTQgMHg3M2RjOTNjNyAweDU2MjZkZmViIDB4ZGM4YTI1YmYgMHgxOThlYmQ4YyAweDIzMDFhYjI2IDB4OWY2OGZjYTYgMHhhOTc1YzJkMSAweGQxZTA0ODAxIDB4YjY5NjZiZTUgMHgxOTVkNTQxOCAweDZhZGFlM2YxIDB4ZGY4Y2ZlZTUgMHg2YWQ3MGQyMSAweDE3MzVmZDIyIC8vIG1ldGhvZCAidmVyaWZ5X2FjY3RfYmFsYW5jZShhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfbWluX2JhbGFuY2UoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X2F1dGhfYWRkcihhY2NvdW50KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50KGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4oYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2JveGVzKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X2luY2VudGl2ZV9lbGlnaWJsZShhY2NvdW50KWJvb2wiLCBtZXRob2QgInZlcmlmeV9hY2N0X2xhc3RfaGVhcnRiZWF0KGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF9sYXN0X3Byb3Bvc2VkKGFjY291bnQpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X2FjY3RfYmFsYW5jZSB2ZXJpZnlfYWNjdF9taW5fYmFsYW5jZSB2ZXJpZnlfYWNjdF9hdXRoX2FkZHIgdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQgdmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2UgdmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzIHZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZCB2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX29wdGVkX2luIHZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkIHZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0cyB2ZXJpZnlfYWNjdF90b3RhbF9ib3hlcyB2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMgdmVyaWZ5X2FjY3RfaW5jZW50aXZlX2VsaWdpYmxlIHZlcmlmeV9hY2N0X2xhc3RfaGVhcnRiZWF0IHZlcmlmeV9hY2N0X2xhc3RfcHJvcG9zZWQKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyMjoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2JhbGFuY2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjcKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYmFsYW5jZShhKQogICAgZHVwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYmFsYW5jZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYS5iYWxhbmNlLCAiZXhwZWN0ZWQgQWNjb3VudCBiYWxhbmNlIHRvIG1hdGNoIgogICAgZGlnIDEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBBY2NvdW50IGJhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMgogICAgLy8gYXNzZXJ0IHZhbHVlID09IGFsZ29weS5vcC5iYWxhbmNlKGEpLCAiZXhwZWN0ZWQgb3AuYmFsYW5jZSB0byBtYXRjaCIKICAgIHN3YXAKICAgIGJhbGFuY2UKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG9wLmJhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzMtMzUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhbGdvcHkub3AuYmFsYW5jZSgKICAgIC8vICAgICBfZ2V0XzFzdF9yZWZfaW5kZXgoKQogICAgLy8gKSwgImV4cGVjdGVkIG9wLmJhbGFuY2UgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBiYWxhbmNlCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvcC5iYWxhbmNlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF9taW5fYmFsYW5jZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X21pbl9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDAKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbWluX2JhbGFuY2UoYSkKICAgIGR1cAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQxCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X21pbl9iYWxhbmNlKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDIKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhLm1pbl9iYWxhbmNlLCAiZXhwZWN0ZWQgQWNjb3VudCBtaW5fYmFsYW5jZSB0byBtYXRjaCIKICAgIGRpZyAxCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgQWNjb3VudCBtaW5fYmFsYW5jZSB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYWxnb3B5Lm9wLm1pbl9iYWxhbmNlKGEpLCAiZXhwZWN0ZWQgb3AubWluX2JhbGFuY2UgdG8gbWF0Y2giCiAgICBzd2FwCiAgICBtaW5fYmFsYW5jZQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgb3AubWluX2JhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDYtNDgKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhbGdvcHkub3AubWluX2JhbGFuY2UoCiAgICAvLyAgICAgX2dldF8xc3RfcmVmX2luZGV4KCkKICAgIC8vICksICJleHBlY3RlZCBvcC5taW5fYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaCIKICAgIG1pbl9iYWxhbmNlCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvcC5taW5fYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfYXV0aF9hZGRyW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfYXV0aF9hZGRyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTMKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYXV0aF9hZGRyKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEF1dGhBZGRyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2F1dGhfYWRkcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QXV0aEFkZHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTYKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9udW1fdWludChhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbE51bVVpbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfbnVtX3VpbnQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtVWludAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwLTcyCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlKAogICAgLy8gICAgIF9nZXRfMXN0X3JlZl9pbmRleCgpCiAgICAvLyApCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3OQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxFeHRyYUFwcFBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjgwLTgyCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlcygKICAgIC8vICAgICBfZ2V0XzFzdF9yZWZfaW5kZXgoKQogICAgLy8gKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEV4dHJhQXBwUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo4MwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6ODQKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNDcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjkwCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBcHBzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5MgogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hcHBzX29wdGVkX2luKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXBwc09wdGVkSW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXBwc19vcHRlZF9pbihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBcHBzT3B0ZWRJbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMDAKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTA1CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXNzZXRzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMDYtMTA4CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKAogICAgLy8gICAgIF9nZXRfMXN0X3JlZl9pbmRleCgpCiAgICAvLyApCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXNzZXRzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTEwCiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExNQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hc3NldHMoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTE2CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0cyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMTcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExOAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTIzCiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveGVzKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI0CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveGVzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEJveGVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjYKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTMxCiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveF9ieXRlcyhhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEJveEJ5dGVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9ib3hfYnl0ZXMoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94Qnl0ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2luY2VudGl2ZV9lbGlnaWJsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X2luY2VudGl2ZV9lbGlnaWJsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfaW5jZW50aXZlX2VsaWdpYmxlKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEluY2VudGl2ZUVsaWdpYmxlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE0MAogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9pbmNlbnRpdmVfZWxpZ2libGUoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEluY2VudGl2ZUVsaWdpYmxlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTQxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDIKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIHB1c2hpbnQgMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfbGFzdF9oZWFydGJlYXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF9sYXN0X2hlYXJ0YmVhdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDcKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbGFzdF9oZWFydGJlYXQoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TGFzdEhlYXJ0YmVhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbGFzdF9oZWFydGJlYXQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdExhc3RIZWFydGJlYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDkKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1MAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2xhc3RfcHJvcG9zZWRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF9sYXN0X3Byb3Bvc2VkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1NQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9sYXN0X3Byb3Bvc2VkKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdExhc3RQcm9wb3NlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTYKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbGFzdF9wcm9wb3NlZChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TGFzdFByb3Bvc2VkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTU3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTgKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyABASYBBBUffHUxG0EAeDEZFEQxGESCDwRfW0PkBHPck8cEVibf6wTciiW/BBmOvYwEIwGrJgSfaPymBKl1wtEE0eBIAQS2lmvlBBldVBgEatrj8QTfjP7lBGrXDSEEFzX9IjYaAI4PAAkAPwB1AJEArgDLAOgBBQEiAT8BXAF5AZYBugHXADEZFDEYFBBDNhoBF8AcSXMANhoBF3MASwNPAhJEEkRLAXMAREsBEkRMYEsBEkQ2GgEXYEsBEkQWKExQsCJDNhoBF8AcSXMBNhoBF3MBSwNPAhJEEkRLAXMBREsBEkRMeEsBEkQ2GgEXeEsBEkQWKExQsCJDNhoBF8AccwI2GgEXcwJLA08CEkQSRChMULAiQzYaARfAHHMDNhoBF3MDSwNPAhJEEkQWKExQsCJDNhoBF8AccwQ2GgEXcwRLA08CEkQSRBYoTFCwIkM2GgEXwBxzBTYaARdzBUsDTwISRBJEFihMULAiQzYaARfAHHMGNhoBF3MGSwNPAhJEEkQWKExQsCJDNhoBF8Accwc2GgEXcwdLA08CEkQSRBYoTFCwIkM2GgEXwBxzCDYaARdzCEsDTwISRBJEFihMULAiQzYaARfAHHMJNhoBF3MJSwNPAhJEEkQWKExQsCJDNhoBF8Accwo2GgEXcwpLA08CEkQSRBYoTFCwIkM2GgEXwBxzCzYaARdzC0sDTwISRBJEFihMULAiQzYaARfAHHMMNhoBF3MMSwNPAhJEEkSAAQCBAE8CVChMULAiQzYaARfAHHMONhoBF3MOSwNPAhJEEkQWKExQsCJDNhoBF8Accw02GgEXcw1LA08CEkQSRBYoTFCwIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the StateAcctParamsGetContract contract - */ -export type StateAcctParamsGetContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify_acct_balance(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_min_balance(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_auth_addr(account)address': { - a: Uint8Array | string - } - 'verify_acct_total_num_uint(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_num_byte_slice(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_extra_app_pages(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_apps_created(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_apps_opted_in(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_assets_created(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_assets(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_boxes(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_box_bytes(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_incentive_eligible(account)bool': { - a: Uint8Array | string - } - 'verify_acct_last_heartbeat(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_last_proposed(account)uint64': { - a: Uint8Array | string - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify_acct_balance(account)uint64': [a: Uint8Array | string] - 'verify_acct_min_balance(account)uint64': [a: Uint8Array | string] - 'verify_acct_auth_addr(account)address': [a: Uint8Array | string] - 'verify_acct_total_num_uint(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_num_byte_slice(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_extra_app_pages(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_apps_created(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_apps_opted_in(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_assets_created(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_assets(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_boxes(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_box_bytes(account)uint64': [a: Uint8Array | string] - 'verify_acct_incentive_eligible(account)bool': [a: Uint8Array | string] - 'verify_acct_last_heartbeat(account)uint64': [a: Uint8Array | string] - 'verify_acct_last_proposed(account)uint64': [a: Uint8Array | string] - } -} - -/** - * The return type for each method - */ -export type StateAcctParamsGetContractReturns = { - 'verify_acct_balance(account)uint64': bigint - 'verify_acct_min_balance(account)uint64': bigint - 'verify_acct_auth_addr(account)address': string - 'verify_acct_total_num_uint(account)uint64': bigint - 'verify_acct_total_num_byte_slice(account)uint64': bigint - 'verify_acct_total_extra_app_pages(account)uint64': bigint - 'verify_acct_total_apps_created(account)uint64': bigint - 'verify_acct_total_apps_opted_in(account)uint64': bigint - 'verify_acct_total_assets_created(account)uint64': bigint - 'verify_acct_total_assets(account)uint64': bigint - 'verify_acct_total_boxes(account)uint64': bigint - 'verify_acct_total_box_bytes(account)uint64': bigint - 'verify_acct_incentive_eligible(account)bool': boolean - 'verify_acct_last_heartbeat(account)uint64': bigint - 'verify_acct_last_proposed(account)uint64': bigint -} - -/** - * Defines the types of available calls and state of the StateAcctParamsGetContract smart contract. - */ -export type StateAcctParamsGetContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify_acct_balance(account)uint64' | 'verify_acct_balance', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_balance(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_balance(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_balance(account)uint64'] - }> - & Record<'verify_acct_min_balance(account)uint64' | 'verify_acct_min_balance', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_min_balance(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_min_balance(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_min_balance(account)uint64'] - }> - & Record<'verify_acct_auth_addr(account)address' | 'verify_acct_auth_addr', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_auth_addr(account)address'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_auth_addr(account)address'] - returns: StateAcctParamsGetContractReturns['verify_acct_auth_addr(account)address'] - }> - & Record<'verify_acct_total_num_uint(account)uint64' | 'verify_acct_total_num_uint', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_num_uint(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_num_uint(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_total_num_uint(account)uint64'] - }> - & Record<'verify_acct_total_num_byte_slice(account)uint64' | 'verify_acct_total_num_byte_slice', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_num_byte_slice(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_num_byte_slice(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_total_num_byte_slice(account)uint64'] - }> - & Record<'verify_acct_total_extra_app_pages(account)uint64' | 'verify_acct_total_extra_app_pages', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_extra_app_pages(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_extra_app_pages(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_total_extra_app_pages(account)uint64'] - }> - & Record<'verify_acct_total_apps_created(account)uint64' | 'verify_acct_total_apps_created', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_apps_created(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_apps_created(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_total_apps_created(account)uint64'] - }> - & Record<'verify_acct_total_apps_opted_in(account)uint64' | 'verify_acct_total_apps_opted_in', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_apps_opted_in(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_apps_opted_in(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_total_apps_opted_in(account)uint64'] - }> - & Record<'verify_acct_total_assets_created(account)uint64' | 'verify_acct_total_assets_created', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_assets_created(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_assets_created(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_total_assets_created(account)uint64'] - }> - & Record<'verify_acct_total_assets(account)uint64' | 'verify_acct_total_assets', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_assets(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_assets(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_total_assets(account)uint64'] - }> - & Record<'verify_acct_total_boxes(account)uint64' | 'verify_acct_total_boxes', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_boxes(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_boxes(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_total_boxes(account)uint64'] - }> - & Record<'verify_acct_total_box_bytes(account)uint64' | 'verify_acct_total_box_bytes', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_box_bytes(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_box_bytes(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_total_box_bytes(account)uint64'] - }> - & Record<'verify_acct_incentive_eligible(account)bool' | 'verify_acct_incentive_eligible', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_incentive_eligible(account)bool'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_incentive_eligible(account)bool'] - returns: StateAcctParamsGetContractReturns['verify_acct_incentive_eligible(account)bool'] - }> - & Record<'verify_acct_last_heartbeat(account)uint64' | 'verify_acct_last_heartbeat', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_last_heartbeat(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_last_heartbeat(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_last_heartbeat(account)uint64'] - }> - & Record<'verify_acct_last_proposed(account)uint64' | 'verify_acct_last_proposed', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_last_proposed(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_last_proposed(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_last_proposed(account)uint64'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type StateAcctParamsGetContractSignatures = keyof StateAcctParamsGetContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type StateAcctParamsGetContractNonVoidMethodSignatures = keyof StateAcctParamsGetContractTypes['methods'] extends infer T ? T extends keyof StateAcctParamsGetContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the StateAcctParamsGetContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = StateAcctParamsGetContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the StateAcctParamsGetContract smart contract to the method's return type - */ -export type MethodReturn = StateAcctParamsGetContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type StateAcctParamsGetContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type StateAcctParamsGetContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: StateAcctParamsGetContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAcctParamsGetContract smart contract - */ -export abstract class StateAcctParamsGetContractParamsFactory { - /** - * Constructs a no op call for the verify_acct_balance(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctBalance(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_balance(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_min_balance(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctMinBalance(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_min_balance(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_auth_addr(account)address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctAuthAddr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_auth_addr(account)address' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_num_uint(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalNumUint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_num_uint(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_num_byte_slice(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalNumByteSlice(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_num_byte_slice(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_extra_app_pages(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalExtraAppPages(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_extra_app_pages(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_apps_created(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalAppsCreated(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_apps_created(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_apps_opted_in(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalAppsOptedIn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_apps_opted_in(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_assets_created(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalAssetsCreated(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_assets_created(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_assets(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalAssets(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_assets(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_boxes(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_boxes(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_box_bytes(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalBoxBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_box_bytes(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_incentive_eligible(account)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctIncentiveEligible(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_incentive_eligible(account)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_last_heartbeat(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctLastHeartbeat(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_last_heartbeat(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_last_proposed(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctLastProposed(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_last_proposed(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } -} - -/** - * A factory to create and deploy one or more instance of the StateAcctParamsGetContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class StateAcctParamsGetContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `StateAcctParamsGetContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new StateAcctParamsGetContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new StateAcctParamsGetContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the StateAcctParamsGetContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: StateAcctParamsGetContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new StateAcctParamsGetContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAcctParamsGetContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAcctParamsGetContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAcctParamsGetContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new StateAcctParamsGetContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the StateAcctParamsGetContract smart contract - */ -export class StateAcctParamsGetContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `StateAcctParamsGetContractClient` - * - * @param appClient An `AppClient` instance which has been created with the StateAcctParamsGetContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `StateAcctParamsGetContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `StateAcctParamsGetContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new StateAcctParamsGetContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `StateAcctParamsGetContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new StateAcctParamsGetContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the StateAcctParamsGetContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctBalance(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_min_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctMinBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctMinBalance(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_auth_addr(account)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctAuthAddr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctAuthAddr(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumUint(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumByteSlice(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalExtraAppPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalExtraAppPages(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalAppsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsCreated(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalAppsOptedIn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsOptedIn(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalAssetsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssetsCreated(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalAssets: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssets(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxes(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalBoxBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxBytes(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_incentive_eligible(account)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctIncentiveEligible: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctIncentiveEligible(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_heartbeat(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctLastHeartbeat: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastHeartbeat(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_proposed(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctLastProposed: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastProposed(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the StateAcctParamsGetContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctBalance(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_min_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctMinBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctMinBalance(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_auth_addr(account)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctAuthAddr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctAuthAddr(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumUint(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumByteSlice(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalExtraAppPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalExtraAppPages(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalAppsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsCreated(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalAppsOptedIn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsOptedIn(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalAssetsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssetsCreated(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalAssets: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssets(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxes(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalBoxBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxBytes(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_incentive_eligible(account)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctIncentiveEligible: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctIncentiveEligible(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_heartbeat(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctLastHeartbeat: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastHeartbeat(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_proposed(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctLastProposed: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastProposed(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the StateAcctParamsGetContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctBalance: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctBalance(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_balance(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_min_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctMinBalance: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctMinBalance(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_min_balance(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_auth_addr(account)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctAuthAddr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctAuthAddr(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_auth_addr(account)address'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalNumUint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumUint(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_num_uint(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalNumByteSlice: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumByteSlice(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_num_byte_slice(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalExtraAppPages: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalExtraAppPages(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_extra_app_pages(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalAppsCreated: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsCreated(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_apps_created(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalAppsOptedIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsOptedIn(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_apps_opted_in(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalAssetsCreated: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssetsCreated(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_assets_created(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalAssets: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssets(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_assets(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxes(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_boxes(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalBoxBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxBytes(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_box_bytes(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_incentive_eligible(account)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctIncentiveEligible: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctIncentiveEligible(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_incentive_eligible(account)bool'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_heartbeat(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctLastHeartbeat: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastHeartbeat(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_last_heartbeat(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_proposed(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctLastProposed: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastProposed(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_last_proposed(account)uint64'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new StateAcctParamsGetContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current StateAcctParamsGetContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): StateAcctParamsGetContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_acct_balance(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctBalance(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctBalance(params))) - return this - }, - /** - * Add a verify_acct_min_balance(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctMinBalance(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctMinBalance(params))) - return this - }, - /** - * Add a verify_acct_auth_addr(account)address method call against the StateAcctParamsGetContract contract - */ - verifyAcctAuthAddr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctAuthAddr(params))) - return this - }, - /** - * Add a verify_acct_total_num_uint(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctTotalNumUint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalNumUint(params))) - return this - }, - /** - * Add a verify_acct_total_num_byte_slice(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctTotalNumByteSlice(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalNumByteSlice(params))) - return this - }, - /** - * Add a verify_acct_total_extra_app_pages(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctTotalExtraAppPages(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalExtraAppPages(params))) - return this - }, - /** - * Add a verify_acct_total_apps_created(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctTotalAppsCreated(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAppsCreated(params))) - return this - }, - /** - * Add a verify_acct_total_apps_opted_in(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctTotalAppsOptedIn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAppsOptedIn(params))) - return this - }, - /** - * Add a verify_acct_total_assets_created(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctTotalAssetsCreated(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAssetsCreated(params))) - return this - }, - /** - * Add a verify_acct_total_assets(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctTotalAssets(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAssets(params))) - return this - }, - /** - * Add a verify_acct_total_boxes(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctTotalBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalBoxes(params))) - return this - }, - /** - * Add a verify_acct_total_box_bytes(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctTotalBoxBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalBoxBytes(params))) - return this - }, - /** - * Add a verify_acct_incentive_eligible(account)bool method call against the StateAcctParamsGetContract contract - */ - verifyAcctIncentiveEligible(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctIncentiveEligible(params))) - return this - }, - /** - * Add a verify_acct_last_heartbeat(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctLastHeartbeat(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctLastHeartbeat(params))) - return this - }, - /** - * Add a verify_acct_last_proposed(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctLastProposed(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctLastProposed(params))) - return this - }, - /** - * Add a clear state call to the StateAcctParamsGetContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as StateAcctParamsGetContractComposer - } -} -export type StateAcctParamsGetContractComposer = { - /** - * Calls the verify_acct_balance(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctBalance(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_balance(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_min_balance(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctMinBalance(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_min_balance(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_auth_addr(account)address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctAuthAddr(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_auth_addr(account)address'] | undefined]> - - /** - * Calls the verify_acct_total_num_uint(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalNumUint(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_num_uint(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_num_byte_slice(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalNumByteSlice(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_num_byte_slice(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_extra_app_pages(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalExtraAppPages(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_extra_app_pages(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_apps_created(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalAppsCreated(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_apps_created(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_apps_opted_in(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalAppsOptedIn(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_apps_opted_in(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_assets_created(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalAssetsCreated(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_assets_created(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_assets(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalAssets(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_assets(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_boxes(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalBoxes(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_boxes(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_box_bytes(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalBoxBytes(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_box_bytes(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_incentive_eligible(account)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctIncentiveEligible(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_incentive_eligible(account)bool'] | undefined]> - - /** - * Calls the verify_acct_last_heartbeat(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctLastHeartbeat(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_last_heartbeat(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_last_proposed(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctLastProposed(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_last_proposed(account)uint64'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the StateAcctParamsGetContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): StateAcctParamsGetContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): StateAcctParamsGetContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type StateAcctParamsGetContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalContract.ts deleted file mode 100644 index fc6b74f..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalContract.ts +++ /dev/null @@ -1,1018 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"StateAppGlobalContract","structs":{},"methods":[{"name":"verify_get_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_uint64","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_ex_bytes","args":[{"type":"uint64","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"(byte[],bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_ex_uint64","args":[{"type":"uint64","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"(uint64,bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_delete","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_put_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_put_bytes","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":1,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"global_uint64":{"keyType":"AVMString","valueType":"AVMUint64","key":"Z2xvYmFsX3VpbnQ2NA=="},"global_bytes":{"keyType":"AVMString","valueType":"AVMBytes","key":"Z2xvYmFsX2J5dGVz"}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQ1CiAgICAvLyBjbGFzcyBTdGF0ZUFwcEdsb2JhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxNgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4YTk5N2ExODcgMHg0ZGI4YWE0MSAweDBjMWY1NmE3IDB4YWZkZGIwODggMHg5M2E4NTJlMSAweDM2OTk2NDUxIDB4MzkyMGE1N2IgLy8gbWV0aG9kICJ2ZXJpZnlfZ2V0X2J5dGVzKGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9nZXRfdWludDY0KGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfYnl0ZXModWludDY0LGJ5dGVbXSkoYnl0ZVtdLGJvb2wpIiwgbWV0aG9kICJ2ZXJpZnlfZ2V0X2V4X3VpbnQ2NCh1aW50NjQsYnl0ZVtdKSh1aW50NjQsYm9vbCkiLCBtZXRob2QgInZlcmlmeV9kZWxldGUoYnl0ZVtdKXZvaWQiLCBtZXRob2QgInZlcmlmeV9wdXRfdWludDY0KGJ5dGVbXSx1aW50NjQpdm9pZCIsIG1ldGhvZCAidmVyaWZ5X3B1dF9ieXRlcyhieXRlW10sYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfZ2V0X2J5dGVzIHZlcmlmeV9nZXRfdWludDY0IHZlcmlmeV9nZXRfZXhfYnl0ZXMgdmVyaWZ5X2dldF9leF91aW50NjQgdmVyaWZ5X2RlbGV0ZSB2ZXJpZnlfcHV0X3VpbnQ2NCB2ZXJpZnlfcHV0X2J5dGVzCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTY6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9nZXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDU5CiAgICAvLyB2YWx1ZSA9IG9wLkFwcEdsb2JhbC5nZXRfYnl0ZXMoYSkKICAgIGFwcF9nbG9iYWxfZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDY0CiAgICAvLyB2YWx1ZSA9IG9wLkFwcEdsb2JhbC5nZXRfdWludDY0KGEpCiAgICBhcHBfZ2xvYmFsX2dldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF9leF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2OQogICAgLy8gcmV0dXJuIG9wLkFwcEdsb2JhbC5nZXRfZXhfYnl0ZXMoYSwgYikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfZXhfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDczCiAgICAvLyByZXR1cm4gb3AuQXBwR2xvYmFsLmdldF9leF91aW50NjQoYSwgYikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgc3dhcAogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9kZWxldGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGVsZXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDc3CiAgICAvLyBvcC5BcHBHbG9iYWwuZGVsZXRlKGEpCiAgICBhcHBfZ2xvYmFsX2RlbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfcHV0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgxCiAgICAvLyBvcC5BcHBHbG9iYWwucHV0KGEsIGIpCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfcHV0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3B1dF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODUKICAgIC8vIG9wLkFwcEdsb2JhbC5wdXQoYSwgYikKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmAgQVH3x1AQAxG0EAQDEZFEQxGESCBwSpl6GHBE24qkEEDB9WpwSv3bCIBJOoUuEENplkUQQ5IKV7NhoAjgcACQAeACwAVABtAHYAgwAxGRQxGBQQQzYaAVcCAGRJFRZXBgJMUChMULAiQzYaAVcCAGQWKExQsCJDNhoBFzYaAlcCAGVLARUWVwYCTwJQKSNPA1SAAgADTFBMUChMULAiQzYaARc2GgJXAgBlTBYpI08DVFAoTFCwIkM2GgFXAgBpIkM2GgFXAgA2GgIXZyJDNhoBVwIANhoCVwIAZyJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the StateAppGlobalContract contract - */ -export type StateAppGlobalContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify_get_bytes(byte[])byte[]': { - a: Uint8Array - } - 'verify_get_uint64(byte[])uint64': { - a: Uint8Array - } - 'verify_get_ex_bytes(uint64,byte[])(byte[],bool)': { - a: bigint | number - b: Uint8Array - } - 'verify_get_ex_uint64(uint64,byte[])(uint64,bool)': { - a: bigint | number - b: Uint8Array - } - 'verify_delete(byte[])void': { - a: Uint8Array - } - 'verify_put_uint64(byte[],uint64)void': { - a: Uint8Array - b: bigint | number - } - 'verify_put_bytes(byte[],byte[])void': { - a: Uint8Array - b: Uint8Array - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify_get_bytes(byte[])byte[]': [a: Uint8Array] - 'verify_get_uint64(byte[])uint64': [a: Uint8Array] - 'verify_get_ex_bytes(uint64,byte[])(byte[],bool)': [a: bigint | number, b: Uint8Array] - 'verify_get_ex_uint64(uint64,byte[])(uint64,bool)': [a: bigint | number, b: Uint8Array] - 'verify_delete(byte[])void': [a: Uint8Array] - 'verify_put_uint64(byte[],uint64)void': [a: Uint8Array, b: bigint | number] - 'verify_put_bytes(byte[],byte[])void': [a: Uint8Array, b: Uint8Array] - } -} - -/** - * The return type for each method - */ -export type StateAppGlobalContractReturns = { - 'verify_get_bytes(byte[])byte[]': Uint8Array - 'verify_get_uint64(byte[])uint64': bigint - 'verify_get_ex_bytes(uint64,byte[])(byte[],bool)': [Uint8Array, boolean] - 'verify_get_ex_uint64(uint64,byte[])(uint64,bool)': [bigint, boolean] - 'verify_delete(byte[])void': void - 'verify_put_uint64(byte[],uint64)void': void - 'verify_put_bytes(byte[],byte[])void': void -} - -/** - * Defines the types of available calls and state of the StateAppGlobalContract smart contract. - */ -export type StateAppGlobalContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify_get_bytes(byte[])byte[]' | 'verify_get_bytes', { - argsObj: StateAppGlobalContractArgs['obj']['verify_get_bytes(byte[])byte[]'] - argsTuple: StateAppGlobalContractArgs['tuple']['verify_get_bytes(byte[])byte[]'] - returns: StateAppGlobalContractReturns['verify_get_bytes(byte[])byte[]'] - }> - & Record<'verify_get_uint64(byte[])uint64' | 'verify_get_uint64', { - argsObj: StateAppGlobalContractArgs['obj']['verify_get_uint64(byte[])uint64'] - argsTuple: StateAppGlobalContractArgs['tuple']['verify_get_uint64(byte[])uint64'] - returns: StateAppGlobalContractReturns['verify_get_uint64(byte[])uint64'] - }> - & Record<'verify_get_ex_bytes(uint64,byte[])(byte[],bool)' | 'verify_get_ex_bytes', { - argsObj: StateAppGlobalContractArgs['obj']['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'] - argsTuple: StateAppGlobalContractArgs['tuple']['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'] - returns: StateAppGlobalContractReturns['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'] - }> - & Record<'verify_get_ex_uint64(uint64,byte[])(uint64,bool)' | 'verify_get_ex_uint64', { - argsObj: StateAppGlobalContractArgs['obj']['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'] - argsTuple: StateAppGlobalContractArgs['tuple']['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'] - returns: StateAppGlobalContractReturns['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'] - }> - & Record<'verify_delete(byte[])void' | 'verify_delete', { - argsObj: StateAppGlobalContractArgs['obj']['verify_delete(byte[])void'] - argsTuple: StateAppGlobalContractArgs['tuple']['verify_delete(byte[])void'] - returns: StateAppGlobalContractReturns['verify_delete(byte[])void'] - }> - & Record<'verify_put_uint64(byte[],uint64)void' | 'verify_put_uint64', { - argsObj: StateAppGlobalContractArgs['obj']['verify_put_uint64(byte[],uint64)void'] - argsTuple: StateAppGlobalContractArgs['tuple']['verify_put_uint64(byte[],uint64)void'] - returns: StateAppGlobalContractReturns['verify_put_uint64(byte[],uint64)void'] - }> - & Record<'verify_put_bytes(byte[],byte[])void' | 'verify_put_bytes', { - argsObj: StateAppGlobalContractArgs['obj']['verify_put_bytes(byte[],byte[])void'] - argsTuple: StateAppGlobalContractArgs['tuple']['verify_put_bytes(byte[],byte[])void'] - returns: StateAppGlobalContractReturns['verify_put_bytes(byte[],byte[])void'] - }> - /** - * Defines the shape of the state of the application. - */ - state: { - global: { - keys: { - globalUint64: bigint - globalBytes: BinaryState - } - maps: {} - } - } -} - -/** - * Defines the possible abi call signatures. - */ -export type StateAppGlobalContractSignatures = keyof StateAppGlobalContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type StateAppGlobalContractNonVoidMethodSignatures = keyof StateAppGlobalContractTypes['methods'] extends infer T ? T extends keyof StateAppGlobalContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the StateAppGlobalContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = StateAppGlobalContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the StateAppGlobalContract smart contract to the method's return type - */ -export type MethodReturn = StateAppGlobalContractTypes['methods'][TSignature]['returns'] - -/** - * Defines the shape of the keyed global state of the application. - */ -export type GlobalKeysState = StateAppGlobalContractTypes['state']['global']['keys'] - - -/** - * Defines supported create method params for this smart contract - */ -export type StateAppGlobalContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type StateAppGlobalContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: StateAppGlobalContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppGlobalContract smart contract - */ -export abstract class StateAppGlobalContractParamsFactory { - /** - * Constructs a no op call for the verify_get_bytes(byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyGetBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_get_bytes(byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_get_uint64(byte[])uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyGetUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_get_uint64(byte[])uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_get_ex_bytes(uint64,byte[])(byte[],bool) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyGetExBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_get_ex_bytes(uint64,byte[])(byte[],bool)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_get_ex_uint64(uint64,byte[])(uint64,bool) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyGetExUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_get_ex_uint64(uint64,byte[])(uint64,bool)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_delete(byte[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyDelete(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_delete(byte[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_put_uint64(byte[],uint64)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyPutUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_put_uint64(byte[],uint64)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_put_bytes(byte[],byte[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyPutBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_put_bytes(byte[],byte[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } -} - -/** - * A factory to create and deploy one or more instance of the StateAppGlobalContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class StateAppGlobalContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `StateAppGlobalContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new StateAppGlobalContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new StateAppGlobalContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the StateAppGlobalContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: StateAppGlobalContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new StateAppGlobalContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppGlobalContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppGlobalContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppGlobalContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new StateAppGlobalContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the StateAppGlobalContract smart contract - */ -export class StateAppGlobalContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `StateAppGlobalContractClient` - * - * @param appClient An `AppClient` instance which has been created with the StateAppGlobalContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `StateAppGlobalContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `StateAppGlobalContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new StateAppGlobalContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `StateAppGlobalContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new StateAppGlobalContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the StateAppGlobalContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_bytes(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyGetBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyGetBytes(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_uint64(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyGetUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyGetUint64(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_bytes(uint64,byte[])(byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyGetExBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyGetExBytes(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_uint64(uint64,byte[])(uint64,bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyGetExUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyGetExUint64(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_delete(byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyDelete: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyDelete(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_uint64(byte[],uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyPutUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyPutUint64(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_bytes(byte[],byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyPutBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyPutBytes(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the StateAppGlobalContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_bytes(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyGetBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyGetBytes(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_uint64(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyGetUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyGetUint64(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_bytes(uint64,byte[])(byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyGetExBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyGetExBytes(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_uint64(uint64,byte[])(uint64,bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyGetExUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyGetExUint64(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_delete(byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyDelete: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyDelete(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_uint64(byte[],uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyPutUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyPutUint64(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_bytes(byte[],byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyPutBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyPutBytes(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the StateAppGlobalContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_bytes(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyGetBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyGetBytes(params)) - return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_get_bytes(byte[])byte[]'])} - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_uint64(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyGetUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyGetUint64(params)) - return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_get_uint64(byte[])uint64'])} - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_bytes(uint64,byte[])(byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyGetExBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyGetExBytes(params)) - return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'])} - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_uint64(uint64,byte[])(uint64,bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyGetExUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyGetExUint64(params)) - return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'])} - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_delete(byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyDelete: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyDelete(params)) - return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_delete(byte[])void'])} - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_uint64(byte[],uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyPutUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyPutUint64(params)) - return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_put_uint64(byte[],uint64)void'])} - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_bytes(byte[],byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyPutBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyPutBytes(params)) - return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_put_bytes(byte[],byte[])void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new StateAppGlobalContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current StateAppGlobalContract app - */ - state = { - /** - * Methods to access global state for the current StateAppGlobalContract app - */ - global: { - /** - * Get all current keyed values from global state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.global.getAll() - return { - globalUint64: result.global_uint64, - globalBytes: new BinaryStateValue(result.global_bytes), - } - }, - /** - * Get the current value of the global_uint64 key in global state - */ - globalUint64: async (): Promise => { return (await this.appClient.state.global.getValue("global_uint64")) as bigint | undefined }, - /** - * Get the current value of the global_bytes key in global state - */ - globalBytes: async (): Promise => { return new BinaryStateValue((await this.appClient.state.global.getValue("global_bytes")) as Uint8Array | undefined) }, - }, - } - - public newGroup(composerConfig?: TransactionComposerConfig): StateAppGlobalContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_get_bytes(byte[])byte[] method call against the StateAppGlobalContract contract - */ - verifyGetBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetBytes(params))) - return this - }, - /** - * Add a verify_get_uint64(byte[])uint64 method call against the StateAppGlobalContract contract - */ - verifyGetUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetUint64(params))) - return this - }, - /** - * Add a verify_get_ex_bytes(uint64,byte[])(byte[],bool) method call against the StateAppGlobalContract contract - */ - verifyGetExBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetExBytes(params))) - return this - }, - /** - * Add a verify_get_ex_uint64(uint64,byte[])(uint64,bool) method call against the StateAppGlobalContract contract - */ - verifyGetExUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetExUint64(params))) - return this - }, - /** - * Add a verify_delete(byte[])void method call against the StateAppGlobalContract contract - */ - verifyDelete(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyDelete(params))) - return this - }, - /** - * Add a verify_put_uint64(byte[],uint64)void method call against the StateAppGlobalContract contract - */ - verifyPutUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyPutUint64(params))) - return this - }, - /** - * Add a verify_put_bytes(byte[],byte[])void method call against the StateAppGlobalContract contract - */ - verifyPutBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyPutBytes(params))) - return this - }, - /** - * Add a clear state call to the StateAppGlobalContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as StateAppGlobalContractComposer - } -} -export type StateAppGlobalContractComposer = { - /** - * Calls the verify_get_bytes(byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyGetBytes(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_get_bytes(byte[])byte[]'] | undefined]> - - /** - * Calls the verify_get_uint64(byte[])uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyGetUint64(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_get_uint64(byte[])uint64'] | undefined]> - - /** - * Calls the verify_get_ex_bytes(uint64,byte[])(byte[],bool) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyGetExBytes(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'] | undefined]> - - /** - * Calls the verify_get_ex_uint64(uint64,byte[])(uint64,bool) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyGetExUint64(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'] | undefined]> - - /** - * Calls the verify_delete(byte[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyDelete(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_delete(byte[])void'] | undefined]> - - /** - * Calls the verify_put_uint64(byte[],uint64)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyPutUint64(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_put_uint64(byte[],uint64)void'] | undefined]> - - /** - * Calls the verify_put_bytes(byte[],byte[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyPutBytes(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_put_bytes(byte[],byte[])void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the StateAppGlobalContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): StateAppGlobalContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppGlobalContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type StateAppGlobalContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalExContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalExContract.ts deleted file mode 100644 index cf78371..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalExContract.ts +++ /dev/null @@ -1,551 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"StateAppGlobalExContract","structs":{},"methods":[],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":2,"bytes":4},"local":{"ints":0,"bytes":0}},"keys":{"global":{"global_uint64":{"keyType":"AVMString","valueType":"AVMUint64","key":"Z2xvYmFsX3VpbnQ2NA=="},"global_bytes":{"keyType":"AVMString","valueType":"AVMBytes","key":"Z2xvYmFsX2J5dGVz"},"global_uint64_explicit":{"keyType":"AVMString","valueType":"AVMUint64","key":"Z2xvYmFsX3VpbnQ2NF9leHBsaWNpdA=="},"global_bytes_explicit":{"keyType":"AVMString","valueType":"AVMBytes","key":"Z2xvYmFsX2J5dGVzX2V4cGxpY2l0"},"global_arc4_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"Z2xvYmFsX2FyYzRfYnl0ZXM="},"global_arc4_bytes_explicit":{"keyType":"AVMString","valueType":"byte[]","key":"Z2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQ="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDMxCiAgICAvLyBrZXk9Imdsb2JhbF91aW50NjQiLAogICAgcHVzaGJ5dGVzICJnbG9iYWxfdWludDY0IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzMAogICAgLy8gVUludDY0KDIpLAogICAgcHVzaGludCAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDI5LTQzMgogICAgLy8gc2VsZi5nbG9iYWxfdWludDY0ID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgVUludDY0KDIpLAogICAgLy8gICAgIGtleT0iZ2xvYmFsX3VpbnQ2NCIsCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzNQogICAgLy8ga2V5PSJnbG9iYWxfYnl0ZXMiLAogICAgcHVzaGJ5dGVzICJnbG9iYWxfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM0CiAgICAvLyBCeXRlcyhiImR1bW15X2J5dGVzIiksCiAgICBieXRlY18wIC8vIDB4NjQ3NTZkNmQ3OTVmNjI3OTc0NjU3MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzMy00MzYKICAgIC8vIHNlbGYuZ2xvYmFsX2J5dGVzID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgQnl0ZXMoYiJkdW1teV9ieXRlcyIpLAogICAgLy8gICAgIGtleT0iZ2xvYmFsX2J5dGVzIiwKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM3CiAgICAvLyBzZWxmLmdsb2JhbF91aW50NjRfZXhwbGljaXQgPSBhbGdvcHkuVUludDY0KDIpCiAgICBwdXNoYnl0ZXMgImdsb2JhbF91aW50NjRfZXhwbGljaXQiCiAgICBwdXNoaW50IDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM4CiAgICAvLyBzZWxmLmdsb2JhbF9ieXRlc19leHBsaWNpdCA9IGFsZ29weS5CeXRlcyhiImR1bW15X2J5dGVzIikKICAgIHB1c2hieXRlcyAiZ2xvYmFsX2J5dGVzX2V4cGxpY2l0IgogICAgYnl0ZWNfMCAvLyAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQwCiAgICAvLyBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIiksIGtleT0iZ2xvYmFsX2FyYzRfYnl0ZXMiCiAgICBwdXNoYnl0ZXMgImdsb2JhbF9hcmM0X2J5dGVzIgogICAgYnl0ZWNfMSAvLyAweDAwMTA2NDc1NmQ2ZDc5NWY2MTcyNjMzNDVmNjI3OTc0NjU3MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzOS00NDEKICAgIC8vIHNlbGYuZ2xvYmFsX2FyYzRfYnl0ZXMgPSBHbG9iYWxTdGF0ZSgKICAgIC8vICAgICBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIiksIGtleT0iZ2xvYmFsX2FyYzRfYnl0ZXMiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ0MgogICAgLy8gc2VsZi5nbG9iYWxfYXJjNF9ieXRlc19leHBsaWNpdCA9IGFsZ29weS5hcmM0LkR5bmFtaWNCeXRlcyhiImR1bW15X2FyYzRfYnl0ZXMiKQogICAgcHVzaGJ5dGVzICJnbG9iYWxfYXJjNF9ieXRlc19leHBsaWNpdCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDAKICAgIC8vIGFsZ29weS5hcmM0LkR5bmFtaWNCeXRlcyhiImR1bW15X2FyYzRfYnl0ZXMiKSwga2V5PSJnbG9iYWxfYXJjNF9ieXRlcyIKICAgIGJ5dGVjXzEgLy8gMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDIKICAgIC8vIHNlbGYuZ2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQgPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIikKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjcKICAgIC8vIGNsYXNzIFN0YXRlQXBwR2xvYmFsRXhDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgICEKICAgIGFzc2VydAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyYCC2R1bW15X2J5dGVzEgAQZHVtbXlfYXJjNF9ieXRlczEYQACJgA1nbG9iYWxfdWludDY0gQJngAxnbG9iYWxfYnl0ZXMoZ4AWZ2xvYmFsX3VpbnQ2NF9leHBsaWNpdIECZ4AVZ2xvYmFsX2J5dGVzX2V4cGxpY2l0KGeAEWdsb2JhbF9hcmM0X2J5dGVzKWeAGmdsb2JhbF9hcmM0X2J5dGVzX2V4cGxpY2l0KWcxGxREMRkUMRgUEEM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the StateAppGlobalExContract contract - */ -export type StateAppGlobalExContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - } -} - -/** - * The return type for each method - */ -export type StateAppGlobalExContractReturns = { -} - -/** - * Defines the types of available calls and state of the StateAppGlobalExContract smart contract. - */ -export type StateAppGlobalExContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: {} - /** - * Defines the shape of the state of the application. - */ - state: { - global: { - keys: { - globalUint64: bigint - globalBytes: BinaryState - globalUint64Explicit: bigint - globalBytesExplicit: BinaryState - globalArc4Bytes: Uint8Array - globalArc4BytesExplicit: Uint8Array - } - maps: {} - } - } -} - -/** - * Defines the possible abi call signatures. - */ -export type StateAppGlobalExContractSignatures = keyof StateAppGlobalExContractTypes['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the StateAppGlobalExContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = StateAppGlobalExContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the StateAppGlobalExContract smart contract to the method's return type - */ -export type MethodReturn = StateAppGlobalExContractTypes['methods'][TSignature]['returns'] - -/** - * Defines the shape of the keyed global state of the application. - */ -export type GlobalKeysState = StateAppGlobalExContractTypes['state']['global']['keys'] - - -/** - * Defines supported create method params for this smart contract - */ -export type StateAppGlobalExContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type StateAppGlobalExContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: StateAppGlobalExContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppGlobalExContract smart contract - */ -export abstract class StateAppGlobalExContractParamsFactory { -} - -/** - * A factory to create and deploy one or more instance of the StateAppGlobalExContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class StateAppGlobalExContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `StateAppGlobalExContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new StateAppGlobalExContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new StateAppGlobalExContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the StateAppGlobalExContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: StateAppGlobalExContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new StateAppGlobalExContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppGlobalExContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppGlobalExContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppGlobalExContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new StateAppGlobalExContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the StateAppGlobalExContract smart contract - */ -export class StateAppGlobalExContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `StateAppGlobalExContractClient` - * - * @param appClient An `AppClient` instance which has been created with the StateAppGlobalExContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `StateAppGlobalExContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `StateAppGlobalExContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new StateAppGlobalExContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `StateAppGlobalExContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new StateAppGlobalExContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the StateAppGlobalExContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the StateAppGlobalExContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the StateAppGlobalExContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new StateAppGlobalExContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current StateAppGlobalExContract app - */ - state = { - /** - * Methods to access global state for the current StateAppGlobalExContract app - */ - global: { - /** - * Get all current keyed values from global state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.global.getAll() - return { - globalUint64: result.global_uint64, - globalBytes: new BinaryStateValue(result.global_bytes), - globalUint64Explicit: result.global_uint64_explicit, - globalBytesExplicit: new BinaryStateValue(result.global_bytes_explicit), - globalArc4Bytes: result.global_arc4_bytes, - globalArc4BytesExplicit: result.global_arc4_bytes_explicit, - } - }, - /** - * Get the current value of the global_uint64 key in global state - */ - globalUint64: async (): Promise => { return (await this.appClient.state.global.getValue("global_uint64")) as bigint | undefined }, - /** - * Get the current value of the global_bytes key in global state - */ - globalBytes: async (): Promise => { return new BinaryStateValue((await this.appClient.state.global.getValue("global_bytes")) as Uint8Array | undefined) }, - /** - * Get the current value of the global_uint64_explicit key in global state - */ - globalUint64Explicit: async (): Promise => { return (await this.appClient.state.global.getValue("global_uint64_explicit")) as bigint | undefined }, - /** - * Get the current value of the global_bytes_explicit key in global state - */ - globalBytesExplicit: async (): Promise => { return new BinaryStateValue((await this.appClient.state.global.getValue("global_bytes_explicit")) as Uint8Array | undefined) }, - /** - * Get the current value of the global_arc4_bytes key in global state - */ - globalArc4Bytes: async (): Promise => { return (await this.appClient.state.global.getValue("global_arc4_bytes")) as Uint8Array | undefined }, - /** - * Get the current value of the global_arc4_bytes_explicit key in global state - */ - globalArc4BytesExplicit: async (): Promise => { return (await this.appClient.state.global.getValue("global_arc4_bytes_explicit")) as Uint8Array | undefined }, - }, - } - - public newGroup(composerConfig?: TransactionComposerConfig): StateAppGlobalExContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a clear state call to the StateAppGlobalExContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as StateAppGlobalExContractComposer - } -} -export type StateAppGlobalExContractComposer = { - /** - * Makes a clear_state call to an existing instance of the StateAppGlobalExContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): StateAppGlobalExContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppGlobalExContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type StateAppGlobalExContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalContract.ts deleted file mode 100644 index be9dae8..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalContract.ts +++ /dev/null @@ -1,1197 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"StateAppLocalContract","structs":{},"methods":[{"name":"opt_in","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["OptIn"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_bytes","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_uint64","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_ex_bytes","args":[{"type":"address","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_ex_uint64","args":[{"type":"address","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_delete","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_exists","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_put_uint64","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_put_bytes","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":1,"bytes":1}},"keys":{"global":{},"local":{"local_uint64":{"keyType":"AVMString","valueType":"AVMUint64","key":"bG9jYWxfdWludDY0"},"local_bytes":{"keyType":"AVMString","valueType":"AVMBytes","key":"bG9jYWxfYnl0ZXM="}},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM3MgogICAgLy8gY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxOQogICAgcHVzaGJ5dGVzIDB4MzBjNmQ1OGEgLy8gbWV0aG9kICJvcHRfaW4oKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX29wdF9pbl9yb3V0ZUA1CgptYWluX3N3aXRjaF9jYXNlX25leHRANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNzIKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4YTg4MzAyZmUgMHg0OWI3ZGRmOSAweGMwNzhiZWFkIDB4YTUyZjk5MmIgMHg4YzU2YWQ5MCAweDRjN2FkODIzIDB4Y2FhN2I4NjQgMHgyNGY5ZjA4NSAvLyBtZXRob2QgInZlcmlmeV9nZXRfYnl0ZXMoYWRkcmVzcyxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZ2V0X3VpbnQ2NChhZGRyZXNzLGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfYnl0ZXMoYWRkcmVzcyx1aW50NjQsYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2dldF9leF91aW50NjQoYWRkcmVzcyx1aW50NjQsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2RlbGV0ZShhZGRyZXNzLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfZXhpc3RzKGFkZHJlc3MsYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9wdXRfdWludDY0KGFkZHJlc3MsYnl0ZVtdLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfcHV0X2J5dGVzKGFkZHJlc3MsYnl0ZVtdLGJ5dGVbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X2dldF9ieXRlcyB2ZXJpZnlfZ2V0X3VpbnQ2NCB2ZXJpZnlfZ2V0X2V4X2J5dGVzIHZlcmlmeV9nZXRfZXhfdWludDY0IHZlcmlmeV9kZWxldGUgdmVyaWZ5X2V4aXN0cyB2ZXJpZnlfcHV0X3VpbnQ2NCB2ZXJpZnlfcHV0X2J5dGVzCiAgICBlcnIKCm1haW5fb3B0X2luX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gT3B0SW4KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBvcHRfaW4KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3Qub3B0X2luW3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4NgogICAgLy8gc2VsZi5sb2NhbF9ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IEJ5dGVzKGIiZHVtbXlfYnl0ZXMiKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBwdXNoYnl0ZXNzICJsb2NhbF9ieXRlcyIgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzg3CiAgICAvLyBzZWxmLmxvY2FsX3VpbnQ2NFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IFVJbnQ2NCg5OTkpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIHB1c2hieXRlcyAibG9jYWxfdWludDY0IgogICAgcHVzaGludCA5OTkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9nZXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzkxCiAgICAvLyB2YWx1ZSA9IG9wLkFwcExvY2FsLmdldF9ieXRlcyhhLCBiKQogICAgYXBwX2xvY2FsX2dldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzk2CiAgICAvLyB2YWx1ZSA9IG9wLkFwcExvY2FsLmdldF91aW50NjQoYSwgYikKICAgIGFwcF9sb2NhbF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF9leF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gdmFsdWUsIF92YWwgPSBvcC5BcHBMb2NhbC5nZXRfZXhfYnl0ZXMoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfZXhfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDA2CiAgICAvLyB2YWx1ZSwgX3ZhbCA9IG9wLkFwcExvY2FsLmdldF9leF91aW50NjQoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9kZWxldGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGVsZXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDExCiAgICAvLyBvcC5BcHBMb2NhbC5kZWxldGUoYSwgYikKICAgIGFwcF9sb2NhbF9kZWwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZXhpc3RzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4aXN0czoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQxNQogICAgLy8gX3ZhbHVlLCBleGlzdHMgPSBvcC5BcHBMb2NhbC5nZXRfZXhfdWludDY0KGEsIDAsIGIpCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAogICAgYXBwX2xvY2FsX2dldF9leAogICAgYnVyeSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X3B1dF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfcHV0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQyMAogICAgLy8gb3AuQXBwTG9jYWwucHV0KGEsIGIsIGMpCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X3B1dF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDI0CiAgICAvLyBvcC5BcHBMb2NhbC5wdXQoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmAQQVH3x1MRtBAF+ABDDG1Yo2GgCOAQBHMRkURDEYRIIIBKiDAv4ESbfd+QTAeL6tBKUvmSsEjFatkARMetgjBMqnuGQEJPnwhTYaAI4IAEcAXwBwAI0AowCvAMoA2gAxGSISMRgQREIACDEZFDEYFBBDMgmCAgtsb2NhbF9ieXRlcwtkdW1teV9ieXRlc2YyCYAMbG9jYWxfdWludDY0gecHZiJDNhoBNhoCVwIAYkkVFlcGAkxQKExQsCJDNhoBNhoCVwIAYhYoTFCwIkM2GgE2GgIXNhoDVwIAY0hJFRZXBgJMUChMULAiQzYaATYaAhc2GgNXAgBjSBYoTFCwIkM2GgE2GgJXAgBoIkM2GgE2GgJXAgAjTGNFAYABACNPAlQoTFCwIkM2GgE2GgJXAgA2GgMXZiJDNhoBNhoCVwIANhoDVwIAZiJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the StateAppLocalContract contract - */ -export type StateAppLocalContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'opt_in()void': Record - 'verify_get_bytes(address,byte[])byte[]': { - a: string - b: Uint8Array - } - 'verify_get_uint64(address,byte[])uint64': { - a: string - b: Uint8Array - } - 'verify_get_ex_bytes(address,uint64,byte[])byte[]': { - a: string - b: bigint | number - c: Uint8Array - } - 'verify_get_ex_uint64(address,uint64,byte[])uint64': { - a: string - b: bigint | number - c: Uint8Array - } - 'verify_delete(address,byte[])void': { - a: string - b: Uint8Array - } - 'verify_exists(address,byte[])bool': { - a: string - b: Uint8Array - } - 'verify_put_uint64(address,byte[],uint64)void': { - a: string - b: Uint8Array - c: bigint | number - } - 'verify_put_bytes(address,byte[],byte[])void': { - a: string - b: Uint8Array - c: Uint8Array - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'opt_in()void': [] - 'verify_get_bytes(address,byte[])byte[]': [a: string, b: Uint8Array] - 'verify_get_uint64(address,byte[])uint64': [a: string, b: Uint8Array] - 'verify_get_ex_bytes(address,uint64,byte[])byte[]': [a: string, b: bigint | number, c: Uint8Array] - 'verify_get_ex_uint64(address,uint64,byte[])uint64': [a: string, b: bigint | number, c: Uint8Array] - 'verify_delete(address,byte[])void': [a: string, b: Uint8Array] - 'verify_exists(address,byte[])bool': [a: string, b: Uint8Array] - 'verify_put_uint64(address,byte[],uint64)void': [a: string, b: Uint8Array, c: bigint | number] - 'verify_put_bytes(address,byte[],byte[])void': [a: string, b: Uint8Array, c: Uint8Array] - } -} - -/** - * The return type for each method - */ -export type StateAppLocalContractReturns = { - 'opt_in()void': void - 'verify_get_bytes(address,byte[])byte[]': Uint8Array - 'verify_get_uint64(address,byte[])uint64': bigint - 'verify_get_ex_bytes(address,uint64,byte[])byte[]': Uint8Array - 'verify_get_ex_uint64(address,uint64,byte[])uint64': bigint - 'verify_delete(address,byte[])void': void - 'verify_exists(address,byte[])bool': boolean - 'verify_put_uint64(address,byte[],uint64)void': void - 'verify_put_bytes(address,byte[],byte[])void': void -} - -/** - * Defines the types of available calls and state of the StateAppLocalContract smart contract. - */ -export type StateAppLocalContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'opt_in()void' | 'opt_in', { - argsObj: StateAppLocalContractArgs['obj']['opt_in()void'] - argsTuple: StateAppLocalContractArgs['tuple']['opt_in()void'] - returns: StateAppLocalContractReturns['opt_in()void'] - }> - & Record<'verify_get_bytes(address,byte[])byte[]' | 'verify_get_bytes', { - argsObj: StateAppLocalContractArgs['obj']['verify_get_bytes(address,byte[])byte[]'] - argsTuple: StateAppLocalContractArgs['tuple']['verify_get_bytes(address,byte[])byte[]'] - returns: StateAppLocalContractReturns['verify_get_bytes(address,byte[])byte[]'] - }> - & Record<'verify_get_uint64(address,byte[])uint64' | 'verify_get_uint64', { - argsObj: StateAppLocalContractArgs['obj']['verify_get_uint64(address,byte[])uint64'] - argsTuple: StateAppLocalContractArgs['tuple']['verify_get_uint64(address,byte[])uint64'] - returns: StateAppLocalContractReturns['verify_get_uint64(address,byte[])uint64'] - }> - & Record<'verify_get_ex_bytes(address,uint64,byte[])byte[]' | 'verify_get_ex_bytes', { - argsObj: StateAppLocalContractArgs['obj']['verify_get_ex_bytes(address,uint64,byte[])byte[]'] - argsTuple: StateAppLocalContractArgs['tuple']['verify_get_ex_bytes(address,uint64,byte[])byte[]'] - returns: StateAppLocalContractReturns['verify_get_ex_bytes(address,uint64,byte[])byte[]'] - }> - & Record<'verify_get_ex_uint64(address,uint64,byte[])uint64' | 'verify_get_ex_uint64', { - argsObj: StateAppLocalContractArgs['obj']['verify_get_ex_uint64(address,uint64,byte[])uint64'] - argsTuple: StateAppLocalContractArgs['tuple']['verify_get_ex_uint64(address,uint64,byte[])uint64'] - returns: StateAppLocalContractReturns['verify_get_ex_uint64(address,uint64,byte[])uint64'] - }> - & Record<'verify_delete(address,byte[])void' | 'verify_delete', { - argsObj: StateAppLocalContractArgs['obj']['verify_delete(address,byte[])void'] - argsTuple: StateAppLocalContractArgs['tuple']['verify_delete(address,byte[])void'] - returns: StateAppLocalContractReturns['verify_delete(address,byte[])void'] - }> - & Record<'verify_exists(address,byte[])bool' | 'verify_exists', { - argsObj: StateAppLocalContractArgs['obj']['verify_exists(address,byte[])bool'] - argsTuple: StateAppLocalContractArgs['tuple']['verify_exists(address,byte[])bool'] - returns: StateAppLocalContractReturns['verify_exists(address,byte[])bool'] - }> - & Record<'verify_put_uint64(address,byte[],uint64)void' | 'verify_put_uint64', { - argsObj: StateAppLocalContractArgs['obj']['verify_put_uint64(address,byte[],uint64)void'] - argsTuple: StateAppLocalContractArgs['tuple']['verify_put_uint64(address,byte[],uint64)void'] - returns: StateAppLocalContractReturns['verify_put_uint64(address,byte[],uint64)void'] - }> - & Record<'verify_put_bytes(address,byte[],byte[])void' | 'verify_put_bytes', { - argsObj: StateAppLocalContractArgs['obj']['verify_put_bytes(address,byte[],byte[])void'] - argsTuple: StateAppLocalContractArgs['tuple']['verify_put_bytes(address,byte[],byte[])void'] - returns: StateAppLocalContractReturns['verify_put_bytes(address,byte[],byte[])void'] - }> - /** - * Defines the shape of the state of the application. - */ - state: { - local: { - keys: { - localUint64: bigint - localBytes: BinaryState - } - maps: {} - } - } -} - -/** - * Defines the possible abi call signatures. - */ -export type StateAppLocalContractSignatures = keyof StateAppLocalContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type StateAppLocalContractNonVoidMethodSignatures = keyof StateAppLocalContractTypes['methods'] extends infer T ? T extends keyof StateAppLocalContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the StateAppLocalContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = StateAppLocalContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the StateAppLocalContract smart contract to the method's return type - */ -export type MethodReturn = StateAppLocalContractTypes['methods'][TSignature]['returns'] - -/** - * Defines the shape of the keyed local state of the application. - */ -export type LocalKeysState = StateAppLocalContractTypes['state']['local']['keys'] - - -/** - * Defines supported create method params for this smart contract - */ -export type StateAppLocalContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type StateAppLocalContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: StateAppLocalContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppLocalContract smart contract - */ -export abstract class StateAppLocalContractParamsFactory { - /** - * Gets available optIn ABI call param factories - */ - static get optIn() { - return { - /** - * Constructs opt-in ABI call params for the StateAppLocalContract smart contract using the opt_in()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - optIn(params: CallParams): AppClientMethodCallParams { - return { - ...params, - method: 'opt_in()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - }, - } - } - - /** - * Constructs a no op call for the verify_get_bytes(address,byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyGetBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_get_bytes(address,byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_get_uint64(address,byte[])uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyGetUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_get_uint64(address,byte[])uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_get_ex_bytes(address,uint64,byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyGetExBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_get_ex_bytes(address,uint64,byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_get_ex_uint64(address,uint64,byte[])uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyGetExUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_get_ex_uint64(address,uint64,byte[])uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_delete(address,byte[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyDelete(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_delete(address,byte[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_exists(address,byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyExists(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_exists(address,byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_put_uint64(address,byte[],uint64)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyPutUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_put_uint64(address,byte[],uint64)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_put_bytes(address,byte[],byte[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyPutBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_put_bytes(address,byte[],byte[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } -} - -/** - * A factory to create and deploy one or more instance of the StateAppLocalContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class StateAppLocalContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `StateAppLocalContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new StateAppLocalContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new StateAppLocalContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the StateAppLocalContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: StateAppLocalContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new StateAppLocalContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppLocalContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppLocalContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppLocalContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new StateAppLocalContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the StateAppLocalContract smart contract - */ -export class StateAppLocalContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `StateAppLocalContractClient` - * - * @param appClient An `AppClient` instance which has been created with the StateAppLocalContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `StateAppLocalContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `StateAppLocalContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new StateAppLocalContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `StateAppLocalContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new StateAppLocalContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the StateAppLocalContract smart contract using the `opt_in()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The optIn params - */ - optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { - return this.appClient.params.optIn(StateAppLocalContractParamsFactory.optIn.optIn(params)) - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the StateAppLocalContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_bytes(address,byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyGetBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyGetBytes(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_uint64(address,byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyGetUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyGetUint64(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_bytes(address,uint64,byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyGetExBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyGetExBytes(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_uint64(address,uint64,byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyGetExUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyGetExUint64(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_delete(address,byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyDelete: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyDelete(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_exists(address,byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyExists: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyExists(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_put_uint64(address,byte[],uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyPutUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyPutUint64(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_put_bytes(address,byte[],byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyPutBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyPutBytes(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the StateAppLocalContract smart contract using the `opt_in()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The optIn transaction - */ - optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { - return this.appClient.createTransaction.optIn(StateAppLocalContractParamsFactory.optIn.optIn(params)) - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the StateAppLocalContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_bytes(address,byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyGetBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyGetBytes(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_uint64(address,byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyGetUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyGetUint64(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_bytes(address,uint64,byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyGetExBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyGetExBytes(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_uint64(address,uint64,byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyGetExUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyGetExUint64(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_delete(address,byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyDelete: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyDelete(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_exists(address,byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyExists: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyExists(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_put_uint64(address,byte[],uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyPutUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyPutUint64(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_put_bytes(address,byte[],byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyPutBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyPutBytes(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the StateAppLocalContract smart contract using the `opt_in()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The optIn result - */ - optIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { - const result = await this.appClient.send.optIn(StateAppLocalContractParamsFactory.optIn.optIn(params)) - return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['opt_in()void'])} - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the StateAppLocalContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_bytes(address,byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyGetBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyGetBytes(params)) - return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_get_bytes(address,byte[])byte[]'])} - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_uint64(address,byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyGetUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyGetUint64(params)) - return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_get_uint64(address,byte[])uint64'])} - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_bytes(address,uint64,byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyGetExBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyGetExBytes(params)) - return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_get_ex_bytes(address,uint64,byte[])byte[]'])} - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_uint64(address,uint64,byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyGetExUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyGetExUint64(params)) - return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_get_ex_uint64(address,uint64,byte[])uint64'])} - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_delete(address,byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyDelete: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyDelete(params)) - return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_delete(address,byte[])void'])} - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_exists(address,byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyExists: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyExists(params)) - return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_exists(address,byte[])bool'])} - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_put_uint64(address,byte[],uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyPutUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyPutUint64(params)) - return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_put_uint64(address,byte[],uint64)void'])} - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_put_bytes(address,byte[],byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyPutBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyPutBytes(params)) - return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_put_bytes(address,byte[],byte[])void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new StateAppLocalContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current StateAppLocalContract app - */ - state = { - /** - * Methods to access local state for the current StateAppLocalContract app - */ - local: (address: string | Address) => { - const encodedAddress = typeof address === 'string' ? address : encodeAddress(address.publicKey) - return { - /** - * Get all current keyed values from local state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.local(encodedAddress).getAll() - return { - localUint64: result.local_uint64, - localBytes: new BinaryStateValue(result.local_bytes), - } - }, - /** - * Get the current value of the local_uint64 key in local state - */ - localUint64: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("local_uint64")) as bigint | undefined }, - /** - * Get the current value of the local_bytes key in local state - */ - localBytes: async (): Promise => { return new BinaryStateValue((await this.appClient.state.local(encodedAddress).getValue("local_bytes")) as Uint8Array | undefined) }, - } - }, - } - - public newGroup(composerConfig?: TransactionComposerConfig): StateAppLocalContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_get_bytes(address,byte[])byte[] method call against the StateAppLocalContract contract - */ - verifyGetBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetBytes(params))) - return this - }, - /** - * Add a verify_get_uint64(address,byte[])uint64 method call against the StateAppLocalContract contract - */ - verifyGetUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetUint64(params))) - return this - }, - /** - * Add a verify_get_ex_bytes(address,uint64,byte[])byte[] method call against the StateAppLocalContract contract - */ - verifyGetExBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetExBytes(params))) - return this - }, - /** - * Add a verify_get_ex_uint64(address,uint64,byte[])uint64 method call against the StateAppLocalContract contract - */ - verifyGetExUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetExUint64(params))) - return this - }, - /** - * Add a verify_delete(address,byte[])void method call against the StateAppLocalContract contract - */ - verifyDelete(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyDelete(params))) - return this - }, - /** - * Add a verify_exists(address,byte[])bool method call against the StateAppLocalContract contract - */ - verifyExists(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExists(params))) - return this - }, - /** - * Add a verify_put_uint64(address,byte[],uint64)void method call against the StateAppLocalContract contract - */ - verifyPutUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyPutUint64(params))) - return this - }, - /** - * Add a verify_put_bytes(address,byte[],byte[])void method call against the StateAppLocalContract contract - */ - verifyPutBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyPutBytes(params))) - return this - }, - get optIn() { - return { - optIn: (params: CallParams) => { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn.optIn(params))) - return this - }, - } - }, - /** - * Add a clear state call to the StateAppLocalContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as StateAppLocalContractComposer - } -} -export type StateAppLocalContractComposer = { - /** - * Calls the verify_get_bytes(address,byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyGetBytes(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_get_bytes(address,byte[])byte[]'] | undefined]> - - /** - * Calls the verify_get_uint64(address,byte[])uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyGetUint64(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_get_uint64(address,byte[])uint64'] | undefined]> - - /** - * Calls the verify_get_ex_bytes(address,uint64,byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyGetExBytes(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_get_ex_bytes(address,uint64,byte[])byte[]'] | undefined]> - - /** - * Calls the verify_get_ex_uint64(address,uint64,byte[])uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyGetExUint64(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_get_ex_uint64(address,uint64,byte[])uint64'] | undefined]> - - /** - * Calls the verify_delete(address,byte[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyDelete(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_delete(address,byte[])void'] | undefined]> - - /** - * Calls the verify_exists(address,byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyExists(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_exists(address,byte[])bool'] | undefined]> - - /** - * Calls the verify_put_uint64(address,byte[],uint64)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyPutUint64(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_put_uint64(address,byte[],uint64)void'] | undefined]> - - /** - * Calls the verify_put_bytes(address,byte[],byte[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyPutBytes(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_put_bytes(address,byte[],byte[])void'] | undefined]> - - /** - * Gets available optIn methods - */ - readonly optIn: { - /** - * Opts the user into an existing instance of the StateAppLocalContract smart contract using the opt_in()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - optIn(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['opt_in()void'] | undefined]> - } - - /** - * Makes a clear_state call to an existing instance of the StateAppLocalContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): StateAppLocalContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppLocalContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type StateAppLocalContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalExContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalExContract.ts deleted file mode 100644 index 53a53bd..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalExContract.ts +++ /dev/null @@ -1,635 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"StateAppLocalExContract","structs":{},"methods":[{"name":"opt_in","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["OptIn"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":1,"bytes":2}},"keys":{"global":{},"local":{"local_uint64":{"keyType":"AVMString","valueType":"AVMUint64","key":"bG9jYWxfdWludDY0"},"local_bytes":{"keyType":"AVMString","valueType":"AVMBytes","key":"bG9jYWxfYnl0ZXM="},"local_arc4_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"bG9jYWxfYXJjNF9ieXRlcw=="}},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNDYKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxFeENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA3CiAgICBwdXNoYnl0ZXMgMHgzMGM2ZDU4YSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2luX3JvdXRlQDUKICAgIGVycgoKbWFpbl9vcHRfaW5fcm91dGVANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgMSAvLyBPcHRJbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIG9wdF9pbgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA3OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbEV4Q29udHJhY3Qub3B0X2luW3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM2NQogICAgLy8gc2VsZi5sb2NhbF9ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IEJ5dGVzKGIiZHVtbXlfYnl0ZXNfZnJvbV9leHRlcm5hbF9jb250cmFjdCIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIHB1c2hieXRlc3MgImxvY2FsX2J5dGVzIiAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzM1ZjY2NzI2ZjZkNWY2NTc4NzQ2NTcyNmU2MTZjNWY2MzZmNmU3NDcyNjE2Mzc0CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzY2CiAgICAvLyBzZWxmLmxvY2FsX3VpbnQ2NFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IFVJbnQ2NCg5OSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgcHVzaGJ5dGVzICJsb2NhbF91aW50NjQiCiAgICBwdXNoaW50IDk5CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzY3CiAgICAvLyBzZWxmLmxvY2FsX2FyYzRfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjctMzY5CiAgICAvLyBzZWxmLmxvY2FsX2FyYzRfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoCiAgICAvLyAgICAgYiJkdW1teV9hcmM0X2J5dGVzIgogICAgLy8gKQogICAgcHVzaGJ5dGVzcyAibG9jYWxfYXJjNF9ieXRlcyIgMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAagAQwxtWKNhoAjgEAAQAxGYEBEjEYEERCAAgxGRQxGBQQQzIJggILbG9jYWxfYnl0ZXMiZHVtbXlfYnl0ZXNfZnJvbV9leHRlcm5hbF9jb250cmFjdGYyCYAMbG9jYWxfdWludDY0gWNmMgmCAhBsb2NhbF9hcmM0X2J5dGVzEgAQZHVtbXlfYXJjNF9ieXRlc2aBAUM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the StateAppLocalExContract contract - */ -export type StateAppLocalExContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'opt_in()void': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'opt_in()void': [] - } -} - -/** - * The return type for each method - */ -export type StateAppLocalExContractReturns = { - 'opt_in()void': void -} - -/** - * Defines the types of available calls and state of the StateAppLocalExContract smart contract. - */ -export type StateAppLocalExContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'opt_in()void' | 'opt_in', { - argsObj: StateAppLocalExContractArgs['obj']['opt_in()void'] - argsTuple: StateAppLocalExContractArgs['tuple']['opt_in()void'] - returns: StateAppLocalExContractReturns['opt_in()void'] - }> - /** - * Defines the shape of the state of the application. - */ - state: { - local: { - keys: { - localUint64: bigint - localBytes: BinaryState - localArc4Bytes: Uint8Array - } - maps: {} - } - } -} - -/** - * Defines the possible abi call signatures. - */ -export type StateAppLocalExContractSignatures = keyof StateAppLocalExContractTypes['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the StateAppLocalExContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = StateAppLocalExContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the StateAppLocalExContract smart contract to the method's return type - */ -export type MethodReturn = StateAppLocalExContractTypes['methods'][TSignature]['returns'] - -/** - * Defines the shape of the keyed local state of the application. - */ -export type LocalKeysState = StateAppLocalExContractTypes['state']['local']['keys'] - - -/** - * Defines supported create method params for this smart contract - */ -export type StateAppLocalExContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type StateAppLocalExContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: StateAppLocalExContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppLocalExContract smart contract - */ -export abstract class StateAppLocalExContractParamsFactory { - /** - * Gets available optIn ABI call param factories - */ - static get optIn() { - return { - /** - * Constructs opt-in ABI call params for the StateAppLocalExContract smart contract using the opt_in()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - optIn(params: CallParams): AppClientMethodCallParams { - return { - ...params, - method: 'opt_in()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - }, - } - } - -} - -/** - * A factory to create and deploy one or more instance of the StateAppLocalExContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class StateAppLocalExContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `StateAppLocalExContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new StateAppLocalExContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new StateAppLocalExContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the StateAppLocalExContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: StateAppLocalExContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new StateAppLocalExContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppLocalExContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppLocalExContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppLocalExContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new StateAppLocalExContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the StateAppLocalExContract smart contract - */ -export class StateAppLocalExContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `StateAppLocalExContractClient` - * - * @param appClient An `AppClient` instance which has been created with the StateAppLocalExContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `StateAppLocalExContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `StateAppLocalExContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new StateAppLocalExContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `StateAppLocalExContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new StateAppLocalExContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the StateAppLocalExContract smart contract using the `opt_in()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The optIn params - */ - optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { - return this.appClient.params.optIn(StateAppLocalExContractParamsFactory.optIn.optIn(params)) - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the StateAppLocalExContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the StateAppLocalExContract smart contract using the `opt_in()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The optIn transaction - */ - optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { - return this.appClient.createTransaction.optIn(StateAppLocalExContractParamsFactory.optIn.optIn(params)) - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the StateAppLocalExContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the StateAppLocalExContract smart contract using the `opt_in()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The optIn result - */ - optIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { - const result = await this.appClient.send.optIn(StateAppLocalExContractParamsFactory.optIn.optIn(params)) - return {...result, return: result.return as unknown as (undefined | StateAppLocalExContractReturns['opt_in()void'])} - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the StateAppLocalExContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new StateAppLocalExContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current StateAppLocalExContract app - */ - state = { - /** - * Methods to access local state for the current StateAppLocalExContract app - */ - local: (address: string | Address) => { - const encodedAddress = typeof address === 'string' ? address : encodeAddress(address.publicKey) - return { - /** - * Get all current keyed values from local state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.local(encodedAddress).getAll() - return { - localUint64: result.local_uint64, - localBytes: new BinaryStateValue(result.local_bytes), - localArc4Bytes: result.local_arc4_bytes, - } - }, - /** - * Get the current value of the local_uint64 key in local state - */ - localUint64: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("local_uint64")) as bigint | undefined }, - /** - * Get the current value of the local_bytes key in local state - */ - localBytes: async (): Promise => { return new BinaryStateValue((await this.appClient.state.local(encodedAddress).getValue("local_bytes")) as Uint8Array | undefined) }, - /** - * Get the current value of the local_arc4_bytes key in local state - */ - localArc4Bytes: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("local_arc4_bytes")) as Uint8Array | undefined }, - } - }, - } - - public newGroup(composerConfig?: TransactionComposerConfig): StateAppLocalExContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - get optIn() { - return { - optIn: (params: CallParams) => { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn.optIn(params))) - return this - }, - } - }, - /** - * Add a clear state call to the StateAppLocalExContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as StateAppLocalExContractComposer - } -} -export type StateAppLocalExContractComposer = { - /** - * Gets available optIn methods - */ - readonly optIn: { - /** - * Opts the user into an existing instance of the StateAppLocalExContract smart contract using the opt_in()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - optIn(params?: CallParams): StateAppLocalExContractComposer<[...TReturns, StateAppLocalExContractReturns['opt_in()void'] | undefined]> - } - - /** - * Makes a clear_state call to an existing instance of the StateAppLocalExContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): StateAppLocalExContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppLocalExContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type StateAppLocalExContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppParamsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppParamsContract.ts deleted file mode 100644 index 182a6a4..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppParamsContract.ts +++ /dev/null @@ -1,1112 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"StateAppParamsContract","structs":{},"methods":[{"name":"verify_app_params_get_approval_program","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_clear_state_program","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_global_num_uint","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_global_num_byte_slice","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_local_num_uint","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_local_num_byte_slice","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_extra_program_pages","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_creator","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_address","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[121,155,189,216,243,270,297,324,350],"errorMessage":"expected exists by index to match"},{"pc":[119,153,187,214,241,268,295,322,348],"errorMessage":"expected value by index to match"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzIKICAgIC8vIGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhiOWQxM2MxYiAweGU1YzNjODg5IDB4ZWU0ZTdiMmEgMHg3ZmEyMzRjYiAweDE5Zjc3NDM5IDB4OTJjNTcyYWEgMHhhZTljNmVmYiAweGUzNmVkNzA1IDB4OGM2NmE4NDIgLy8gbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYXBwcm92YWxfcHJvZ3JhbSh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbSh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV91aW50KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZSh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlcyh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvcih1aW50NjQpYWRkcmVzcyIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FkZHJlc3ModWludDY0KWFkZHJlc3MiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYXBwcm92YWxfcHJvZ3JhbSB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbSB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50IHZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV91aW50IHZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZSB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlcyB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvciB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzcwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfYXBwcm92YWxfcHJvZ3JhbVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzUKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FwcHJvdmFsX3Byb2dyYW0oYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFwcHJvdmFsUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FwcHJvdmFsX3Byb2dyYW0oX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBcHByb3ZhbFByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3OAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NsZWFyX3N0YXRlX3Byb2dyYW1bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgzCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9jbGVhcl9zdGF0ZV9wcm9ncmFtKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDbGVhclN0YXRlUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODQKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2NsZWFyX3N0YXRlX3Byb2dyYW0oX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDbGVhclN0YXRlUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjg2CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkxCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX3VpbnQoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEdsb2JhbE51bVVpbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkyCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX3VpbnQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1VaW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOTQKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5OQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfZ2xvYmFsX251bV9ieXRlX3NsaWNlKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzAwCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDEKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwMgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwNwogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfbG9jYWxfbnVtX3VpbnQoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcExvY2FsTnVtVWludAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDgKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2xvY2FsX251bV91aW50KF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1VaW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzA5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTUKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2xvY2FsX251bV9ieXRlX3NsaWNlKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2xvY2FsX251bV9ieXRlX3NsaWNlKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxOAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjMKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2V4dHJhX3Byb2dyYW1fcGFnZXMoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyNAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFwcFBhcmFtc0dldC5hcHBfZXh0cmFfcHJvZ3JhbV9wYWdlcyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzI1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjYKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NyZWF0b3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzMxCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9jcmVhdG9yKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDcmVhdG9yCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzMgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFwcFBhcmFtc0dldC5hcHBfY3JlYXRvcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzNAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMzkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FkZHJlc3MoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQwCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9hZGRyZXNzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQyCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyABASYBBBUffHUxG0EATjEZFEQxGESCCQS50TwbBOXDyIkE7k57KgR/ojTLBBn3dDkEksVyqgSunG77BONu1wUEjGaoQjYaAI4JAAkAKwBNAGgAgwCeALkA1ADuADEZFDEYFBBDNhoBF3IANhoBF3IASwNPAhJEEkRJFRZXBgJMUChMULAiQzYaARdyATYaARdyAUsDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcgI2GgEXcgJLA08CEkQSRBYoTFCwIkM2GgEXcgM2GgEXcgNLA08CEkQSRBYoTFCwIkM2GgEXcgQ2GgEXcgRLA08CEkQSRBYoTFCwIkM2GgEXcgU2GgEXcgVLA08CEkQSRBYoTFCwIkM2GgEXcgY2GgEXcgZLA08CEkQSRBYoTFCwIkM2GgEXcgc2GgEXcgdLA08CEkQSRChMULAiQzYaARdyCDYaARdyCEsDTwISRBJEKExQsCJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the StateAppParamsContract contract - */ -export type StateAppParamsContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify_app_params_get_approval_program(uint64)byte[]': { - a: bigint | number - } - 'verify_app_params_get_clear_state_program(uint64)byte[]': { - a: bigint | number - } - 'verify_app_params_get_global_num_uint(uint64)uint64': { - a: bigint | number - } - 'verify_app_params_get_global_num_byte_slice(uint64)uint64': { - a: bigint | number - } - 'verify_app_params_get_local_num_uint(uint64)uint64': { - a: bigint | number - } - 'verify_app_params_get_local_num_byte_slice(uint64)uint64': { - a: bigint | number - } - 'verify_app_params_get_extra_program_pages(uint64)uint64': { - a: bigint | number - } - 'verify_app_params_get_creator(uint64)address': { - a: bigint | number - } - 'verify_app_params_get_address(uint64)address': { - a: bigint | number - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify_app_params_get_approval_program(uint64)byte[]': [a: bigint | number] - 'verify_app_params_get_clear_state_program(uint64)byte[]': [a: bigint | number] - 'verify_app_params_get_global_num_uint(uint64)uint64': [a: bigint | number] - 'verify_app_params_get_global_num_byte_slice(uint64)uint64': [a: bigint | number] - 'verify_app_params_get_local_num_uint(uint64)uint64': [a: bigint | number] - 'verify_app_params_get_local_num_byte_slice(uint64)uint64': [a: bigint | number] - 'verify_app_params_get_extra_program_pages(uint64)uint64': [a: bigint | number] - 'verify_app_params_get_creator(uint64)address': [a: bigint | number] - 'verify_app_params_get_address(uint64)address': [a: bigint | number] - } -} - -/** - * The return type for each method - */ -export type StateAppParamsContractReturns = { - 'verify_app_params_get_approval_program(uint64)byte[]': Uint8Array - 'verify_app_params_get_clear_state_program(uint64)byte[]': Uint8Array - 'verify_app_params_get_global_num_uint(uint64)uint64': bigint - 'verify_app_params_get_global_num_byte_slice(uint64)uint64': bigint - 'verify_app_params_get_local_num_uint(uint64)uint64': bigint - 'verify_app_params_get_local_num_byte_slice(uint64)uint64': bigint - 'verify_app_params_get_extra_program_pages(uint64)uint64': bigint - 'verify_app_params_get_creator(uint64)address': string - 'verify_app_params_get_address(uint64)address': string -} - -/** - * Defines the types of available calls and state of the StateAppParamsContract smart contract. - */ -export type StateAppParamsContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify_app_params_get_approval_program(uint64)byte[]' | 'verify_app_params_get_approval_program', { - argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_approval_program(uint64)byte[]'] - argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_approval_program(uint64)byte[]'] - returns: StateAppParamsContractReturns['verify_app_params_get_approval_program(uint64)byte[]'] - }> - & Record<'verify_app_params_get_clear_state_program(uint64)byte[]' | 'verify_app_params_get_clear_state_program', { - argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_clear_state_program(uint64)byte[]'] - argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_clear_state_program(uint64)byte[]'] - returns: StateAppParamsContractReturns['verify_app_params_get_clear_state_program(uint64)byte[]'] - }> - & Record<'verify_app_params_get_global_num_uint(uint64)uint64' | 'verify_app_params_get_global_num_uint', { - argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_global_num_uint(uint64)uint64'] - argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_global_num_uint(uint64)uint64'] - returns: StateAppParamsContractReturns['verify_app_params_get_global_num_uint(uint64)uint64'] - }> - & Record<'verify_app_params_get_global_num_byte_slice(uint64)uint64' | 'verify_app_params_get_global_num_byte_slice', { - argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_global_num_byte_slice(uint64)uint64'] - argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_global_num_byte_slice(uint64)uint64'] - returns: StateAppParamsContractReturns['verify_app_params_get_global_num_byte_slice(uint64)uint64'] - }> - & Record<'verify_app_params_get_local_num_uint(uint64)uint64' | 'verify_app_params_get_local_num_uint', { - argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_local_num_uint(uint64)uint64'] - argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_local_num_uint(uint64)uint64'] - returns: StateAppParamsContractReturns['verify_app_params_get_local_num_uint(uint64)uint64'] - }> - & Record<'verify_app_params_get_local_num_byte_slice(uint64)uint64' | 'verify_app_params_get_local_num_byte_slice', { - argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_local_num_byte_slice(uint64)uint64'] - argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_local_num_byte_slice(uint64)uint64'] - returns: StateAppParamsContractReturns['verify_app_params_get_local_num_byte_slice(uint64)uint64'] - }> - & Record<'verify_app_params_get_extra_program_pages(uint64)uint64' | 'verify_app_params_get_extra_program_pages', { - argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_extra_program_pages(uint64)uint64'] - argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_extra_program_pages(uint64)uint64'] - returns: StateAppParamsContractReturns['verify_app_params_get_extra_program_pages(uint64)uint64'] - }> - & Record<'verify_app_params_get_creator(uint64)address' | 'verify_app_params_get_creator', { - argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_creator(uint64)address'] - argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_creator(uint64)address'] - returns: StateAppParamsContractReturns['verify_app_params_get_creator(uint64)address'] - }> - & Record<'verify_app_params_get_address(uint64)address' | 'verify_app_params_get_address', { - argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_address(uint64)address'] - argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_address(uint64)address'] - returns: StateAppParamsContractReturns['verify_app_params_get_address(uint64)address'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type StateAppParamsContractSignatures = keyof StateAppParamsContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type StateAppParamsContractNonVoidMethodSignatures = keyof StateAppParamsContractTypes['methods'] extends infer T ? T extends keyof StateAppParamsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the StateAppParamsContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = StateAppParamsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the StateAppParamsContract smart contract to the method's return type - */ -export type MethodReturn = StateAppParamsContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type StateAppParamsContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type StateAppParamsContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: StateAppParamsContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppParamsContract smart contract - */ -export abstract class StateAppParamsContractParamsFactory { - /** - * Constructs a no op call for the verify_app_params_get_approval_program(uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAppParamsGetApprovalProgram(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_app_params_get_approval_program(uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_app_params_get_clear_state_program(uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAppParamsGetClearStateProgram(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_app_params_get_clear_state_program(uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_app_params_get_global_num_uint(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAppParamsGetGlobalNumUint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_app_params_get_global_num_uint(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_app_params_get_global_num_byte_slice(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAppParamsGetGlobalNumByteSlice(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_app_params_get_global_num_byte_slice(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_app_params_get_local_num_uint(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAppParamsGetLocalNumUint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_app_params_get_local_num_uint(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_app_params_get_local_num_byte_slice(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAppParamsGetLocalNumByteSlice(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_app_params_get_local_num_byte_slice(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_app_params_get_extra_program_pages(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAppParamsGetExtraProgramPages(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_app_params_get_extra_program_pages(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_app_params_get_creator(uint64)address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAppParamsGetCreator(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_app_params_get_creator(uint64)address' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_app_params_get_address(uint64)address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAppParamsGetAddress(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_app_params_get_address(uint64)address' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } -} - -/** - * A factory to create and deploy one or more instance of the StateAppParamsContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class StateAppParamsContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `StateAppParamsContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new StateAppParamsContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new StateAppParamsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the StateAppParamsContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: StateAppParamsContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new StateAppParamsContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppParamsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppParamsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppParamsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new StateAppParamsContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the StateAppParamsContract smart contract - */ -export class StateAppParamsContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `StateAppParamsContractClient` - * - * @param appClient An `AppClient` instance which has been created with the StateAppParamsContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `StateAppParamsContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `StateAppParamsContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new StateAppParamsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `StateAppParamsContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new StateAppParamsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the StateAppParamsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_approval_program(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAppParamsGetApprovalProgram: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetApprovalProgram(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_clear_state_program(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAppParamsGetClearStateProgram: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetClearStateProgram(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_uint(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAppParamsGetGlobalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumUint(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_byte_slice(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAppParamsGetGlobalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumByteSlice(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_uint(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAppParamsGetLocalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumUint(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_byte_slice(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAppParamsGetLocalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumByteSlice(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_extra_program_pages(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAppParamsGetExtraProgramPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetExtraProgramPages(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_creator(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAppParamsGetCreator: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetCreator(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_address(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAppParamsGetAddress: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetAddress(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the StateAppParamsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_approval_program(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAppParamsGetApprovalProgram: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetApprovalProgram(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_clear_state_program(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAppParamsGetClearStateProgram: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetClearStateProgram(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_uint(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAppParamsGetGlobalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumUint(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_byte_slice(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAppParamsGetGlobalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumByteSlice(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_uint(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAppParamsGetLocalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumUint(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_byte_slice(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAppParamsGetLocalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumByteSlice(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_extra_program_pages(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAppParamsGetExtraProgramPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetExtraProgramPages(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_creator(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAppParamsGetCreator: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetCreator(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_address(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAppParamsGetAddress: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetAddress(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the StateAppParamsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_approval_program(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAppParamsGetApprovalProgram: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetApprovalProgram(params)) - return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_approval_program(uint64)byte[]'])} - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_clear_state_program(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAppParamsGetClearStateProgram: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetClearStateProgram(params)) - return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_clear_state_program(uint64)byte[]'])} - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_uint(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAppParamsGetGlobalNumUint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumUint(params)) - return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_global_num_uint(uint64)uint64'])} - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_byte_slice(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAppParamsGetGlobalNumByteSlice: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumByteSlice(params)) - return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_global_num_byte_slice(uint64)uint64'])} - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_uint(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAppParamsGetLocalNumUint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumUint(params)) - return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_local_num_uint(uint64)uint64'])} - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_byte_slice(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAppParamsGetLocalNumByteSlice: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumByteSlice(params)) - return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_local_num_byte_slice(uint64)uint64'])} - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_extra_program_pages(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAppParamsGetExtraProgramPages: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetExtraProgramPages(params)) - return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_extra_program_pages(uint64)uint64'])} - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_creator(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAppParamsGetCreator: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetCreator(params)) - return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_creator(uint64)address'])} - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_address(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAppParamsGetAddress: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetAddress(params)) - return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_address(uint64)address'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new StateAppParamsContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current StateAppParamsContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): StateAppParamsContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_app_params_get_approval_program(uint64)byte[] method call against the StateAppParamsContract contract - */ - verifyAppParamsGetApprovalProgram(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetApprovalProgram(params))) - return this - }, - /** - * Add a verify_app_params_get_clear_state_program(uint64)byte[] method call against the StateAppParamsContract contract - */ - verifyAppParamsGetClearStateProgram(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetClearStateProgram(params))) - return this - }, - /** - * Add a verify_app_params_get_global_num_uint(uint64)uint64 method call against the StateAppParamsContract contract - */ - verifyAppParamsGetGlobalNumUint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetGlobalNumUint(params))) - return this - }, - /** - * Add a verify_app_params_get_global_num_byte_slice(uint64)uint64 method call against the StateAppParamsContract contract - */ - verifyAppParamsGetGlobalNumByteSlice(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetGlobalNumByteSlice(params))) - return this - }, - /** - * Add a verify_app_params_get_local_num_uint(uint64)uint64 method call against the StateAppParamsContract contract - */ - verifyAppParamsGetLocalNumUint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetLocalNumUint(params))) - return this - }, - /** - * Add a verify_app_params_get_local_num_byte_slice(uint64)uint64 method call against the StateAppParamsContract contract - */ - verifyAppParamsGetLocalNumByteSlice(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetLocalNumByteSlice(params))) - return this - }, - /** - * Add a verify_app_params_get_extra_program_pages(uint64)uint64 method call against the StateAppParamsContract contract - */ - verifyAppParamsGetExtraProgramPages(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetExtraProgramPages(params))) - return this - }, - /** - * Add a verify_app_params_get_creator(uint64)address method call against the StateAppParamsContract contract - */ - verifyAppParamsGetCreator(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetCreator(params))) - return this - }, - /** - * Add a verify_app_params_get_address(uint64)address method call against the StateAppParamsContract contract - */ - verifyAppParamsGetAddress(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetAddress(params))) - return this - }, - /** - * Add a clear state call to the StateAppParamsContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as StateAppParamsContractComposer - } -} -export type StateAppParamsContractComposer = { - /** - * Calls the verify_app_params_get_approval_program(uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAppParamsGetApprovalProgram(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_approval_program(uint64)byte[]'] | undefined]> - - /** - * Calls the verify_app_params_get_clear_state_program(uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAppParamsGetClearStateProgram(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_clear_state_program(uint64)byte[]'] | undefined]> - - /** - * Calls the verify_app_params_get_global_num_uint(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAppParamsGetGlobalNumUint(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_global_num_uint(uint64)uint64'] | undefined]> - - /** - * Calls the verify_app_params_get_global_num_byte_slice(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAppParamsGetGlobalNumByteSlice(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_global_num_byte_slice(uint64)uint64'] | undefined]> - - /** - * Calls the verify_app_params_get_local_num_uint(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAppParamsGetLocalNumUint(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_local_num_uint(uint64)uint64'] | undefined]> - - /** - * Calls the verify_app_params_get_local_num_byte_slice(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAppParamsGetLocalNumByteSlice(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_local_num_byte_slice(uint64)uint64'] | undefined]> - - /** - * Calls the verify_app_params_get_extra_program_pages(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAppParamsGetExtraProgramPages(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_extra_program_pages(uint64)uint64'] | undefined]> - - /** - * Calls the verify_app_params_get_creator(uint64)address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAppParamsGetCreator(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_creator(uint64)address'] | undefined]> - - /** - * Calls the verify_app_params_get_address(uint64)address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAppParamsGetAddress(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_address(uint64)address'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the StateAppParamsContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): StateAppParamsContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppParamsContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type StateAppParamsContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetHoldingContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetHoldingContract.ts deleted file mode 100644 index c46961a..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetHoldingContract.ts +++ /dev/null @@ -1,631 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"StateAssetHoldingContract","structs":{},"methods":[{"name":"verify_asset_holding_get","args":[{"type":"address","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_frozen_get","args":[{"type":"address","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gY2xhc3MgU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4OGY1MjM1YjQgMHhkZTdhMzlmNiAvLyBtZXRob2QgInZlcmlmeV9hc3NldF9ob2xkaW5nX2dldChhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hc3NldF9mcm96ZW5fZ2V0KGFkZHJlc3MsdWludDY0KWJvb2wiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXQgdmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXQKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdC52ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2NQogICAgLy8gYmFsYW5jZSwgX3ZhbCA9IG9wLkFzc2V0SG9sZGluZ0dldC5hc3NldF9iYWxhbmNlKGEsIGIpCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRIb2xkaW5nQ29udHJhY3QudmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfZnJvemVuX2dldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcwCiAgICAvLyBmcm96ZW4sIF92YWwgPSBvcC5Bc3NldEhvbGRpbmdHZXQuYXNzZXRfZnJvemVuKGEsIGIpCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEZyb3plbgogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIHB1c2hpbnQgMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyYBBBUffHUxG0EAHTEZFEQxGESCAgSPUjW0BN56OfY2GgCOAgAJABsAMRkUMRgUEEM2GgE2GgIXcABIFihMULCBAUM2GgE2GgIXcAFIgAEAgQBPAlQoTFCwgQFD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the StateAssetHoldingContract contract - */ -export type StateAssetHoldingContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify_asset_holding_get(address,uint64)uint64': { - a: string - b: bigint | number - } - 'verify_asset_frozen_get(address,uint64)bool': { - a: string - b: bigint | number - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify_asset_holding_get(address,uint64)uint64': [a: string, b: bigint | number] - 'verify_asset_frozen_get(address,uint64)bool': [a: string, b: bigint | number] - } -} - -/** - * The return type for each method - */ -export type StateAssetHoldingContractReturns = { - 'verify_asset_holding_get(address,uint64)uint64': bigint - 'verify_asset_frozen_get(address,uint64)bool': boolean -} - -/** - * Defines the types of available calls and state of the StateAssetHoldingContract smart contract. - */ -export type StateAssetHoldingContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify_asset_holding_get(address,uint64)uint64' | 'verify_asset_holding_get', { - argsObj: StateAssetHoldingContractArgs['obj']['verify_asset_holding_get(address,uint64)uint64'] - argsTuple: StateAssetHoldingContractArgs['tuple']['verify_asset_holding_get(address,uint64)uint64'] - returns: StateAssetHoldingContractReturns['verify_asset_holding_get(address,uint64)uint64'] - }> - & Record<'verify_asset_frozen_get(address,uint64)bool' | 'verify_asset_frozen_get', { - argsObj: StateAssetHoldingContractArgs['obj']['verify_asset_frozen_get(address,uint64)bool'] - argsTuple: StateAssetHoldingContractArgs['tuple']['verify_asset_frozen_get(address,uint64)bool'] - returns: StateAssetHoldingContractReturns['verify_asset_frozen_get(address,uint64)bool'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type StateAssetHoldingContractSignatures = keyof StateAssetHoldingContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type StateAssetHoldingContractNonVoidMethodSignatures = keyof StateAssetHoldingContractTypes['methods'] extends infer T ? T extends keyof StateAssetHoldingContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the StateAssetHoldingContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = StateAssetHoldingContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the StateAssetHoldingContract smart contract to the method's return type - */ -export type MethodReturn = StateAssetHoldingContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type StateAssetHoldingContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type StateAssetHoldingContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: StateAssetHoldingContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAssetHoldingContract smart contract - */ -export abstract class StateAssetHoldingContractParamsFactory { - /** - * Constructs a no op call for the verify_asset_holding_get(address,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetHoldingGet(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_holding_get(address,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_asset_frozen_get(address,uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetFrozenGet(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_frozen_get(address,uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } -} - -/** - * A factory to create and deploy one or more instance of the StateAssetHoldingContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class StateAssetHoldingContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `StateAssetHoldingContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new StateAssetHoldingContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new StateAssetHoldingContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the StateAssetHoldingContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: StateAssetHoldingContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new StateAssetHoldingContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAssetHoldingContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAssetHoldingContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAssetHoldingContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new StateAssetHoldingContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the StateAssetHoldingContract smart contract - */ -export class StateAssetHoldingContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `StateAssetHoldingContractClient` - * - * @param appClient An `AppClient` instance which has been created with the StateAssetHoldingContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `StateAssetHoldingContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `StateAssetHoldingContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new StateAssetHoldingContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `StateAssetHoldingContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new StateAssetHoldingContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the StateAssetHoldingContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_holding_get(address,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetHoldingGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetHoldingContractParamsFactory.verifyAssetHoldingGet(params)) - }, - - /** - * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_frozen_get(address,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetFrozenGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetHoldingContractParamsFactory.verifyAssetFrozenGet(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the StateAssetHoldingContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_holding_get(address,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetHoldingGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetHoldingContractParamsFactory.verifyAssetHoldingGet(params)) - }, - - /** - * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_frozen_get(address,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetFrozenGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetHoldingContractParamsFactory.verifyAssetFrozenGet(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the StateAssetHoldingContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_holding_get(address,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetHoldingGet: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetHoldingContractParamsFactory.verifyAssetHoldingGet(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetHoldingContractReturns['verify_asset_holding_get(address,uint64)uint64'])} - }, - - /** - * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_frozen_get(address,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetFrozenGet: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetHoldingContractParamsFactory.verifyAssetFrozenGet(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetHoldingContractReturns['verify_asset_frozen_get(address,uint64)bool'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new StateAssetHoldingContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current StateAssetHoldingContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): StateAssetHoldingContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_asset_holding_get(address,uint64)uint64 method call against the StateAssetHoldingContract contract - */ - verifyAssetHoldingGet(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetHoldingGet(params))) - return this - }, - /** - * Add a verify_asset_frozen_get(address,uint64)bool method call against the StateAssetHoldingContract contract - */ - verifyAssetFrozenGet(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetFrozenGet(params))) - return this - }, - /** - * Add a clear state call to the StateAssetHoldingContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as StateAssetHoldingContractComposer - } -} -export type StateAssetHoldingContractComposer = { - /** - * Calls the verify_asset_holding_get(address,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetHoldingGet(params?: CallParams): StateAssetHoldingContractComposer<[...TReturns, StateAssetHoldingContractReturns['verify_asset_holding_get(address,uint64)uint64'] | undefined]> - - /** - * Calls the verify_asset_frozen_get(address,uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetFrozenGet(params?: CallParams): StateAssetHoldingContractComposer<[...TReturns, StateAssetHoldingContractReturns['verify_asset_frozen_get(address,uint64)bool'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the StateAssetHoldingContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): StateAssetHoldingContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): StateAssetHoldingContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type StateAssetHoldingContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetParamsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetParamsContract.ts deleted file mode 100644 index b627ecf..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetParamsContract.ts +++ /dev/null @@ -1,1319 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"StateAssetParamsContract","structs":{},"methods":[{"name":"verify_asset_params_get_total","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_decimals","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_default_frozen","args":[{"type":"uint64","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_unit_name","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_name","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_url","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_metadata_hash","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_manager","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_reserve","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_freeze","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_clawback","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_creator","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[142,169,196,230,264,298,332,366,392,418,444,470],"errorMessage":"expected exists by index to match"},{"pc":[140,167,194,228,262,296,330,364,390,416,442,468],"errorMessage":"expected value by index to match"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzQKICAgIC8vIGNsYXNzIFN0YXRlQXNzZXRQYXJhbXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGYwNWRhN2E0IDB4YzBlOWMzMTUgMHhkODUyODI3MyAweGY0NDY4YWQ5IDB4MjI5ZDEyZjcgMHhkZjUzNGY3YiAweGUwNTBiNWE5IDB4OGIyYTJkNTggMHhlZTE1YzRmNyAweDE1NzU0NGZmIDB4MTA0OTJjMDcgMHg1MjI5ZmEzNyAvLyBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3RvdGFsKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlY2ltYWxzKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlZmF1bHRfZnJvemVuKHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWUodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbmFtZSh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmwodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaCh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyKHVpbnQ2NClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9yZXNlcnZlKHVpbnQ2NClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemUodWludDY0KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NsYXdiYWNrKHVpbnQ2NClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jcmVhdG9yKHVpbnQ2NClhZGRyZXNzIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWwgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVjaW1hbHMgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVmYXVsdF9mcm96ZW4gdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdW5pdF9uYW1lIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X25hbWUgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdXJsIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21ldGFkYXRhX2hhc2ggdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWFuYWdlciB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9yZXNlcnZlIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2ZyZWV6ZSB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jbGF3YmFjayB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jcmVhdG9yCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF90b3RhbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTc3CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfdG90YWwoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzgKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF90b3RhbChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3OQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTgwCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVjaW1hbHNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWNpbWFsczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTg1CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfZGVjaW1hbHMoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9kZWNpbWFscyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVmYXVsdF9mcm96ZW5bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTkzCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfZGVmYXVsdF9mcm96ZW4oYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWZhdWx0RnJvemVuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2RlZmF1bHRfZnJvemVuKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlZmF1bHRGcm96ZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxOTUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHB1c2hieXRlcyAweDAwCiAgICBwdXNoaW50IDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3VuaXRfbmFtZShhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3VuaXRfbmFtZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjA0CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X25hbWVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9uYW1lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9uYW1lKGEpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTAKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9uYW1lKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTEKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxMgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmw6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxNwogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3VybChhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTgKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF91cmwoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjE5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21ldGFkYXRhX2hhc2g6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X21ldGFkYXRhX2hhc2goYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNZXRhZGF0YUhhc2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjI2CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbWV0YWRhdGFfaGFzaChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNZXRhZGF0YUhhc2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWFuYWdlcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjMzCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbWFuYWdlcihhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1hbmFnZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjM0CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbWFuYWdlcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjM1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzYKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9yZXNlcnZlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfcmVzZXJ2ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQxCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfcmVzZXJ2ZShhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFJlc2VydmUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQyCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfcmVzZXJ2ZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRSZXNlcnZlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDQKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2ZyZWV6ZShhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldEZyZWV6ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTAKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9mcmVlemUoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTIKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jbGF3YmFja1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NsYXdiYWNrOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTcKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9jbGF3YmFjayhhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NsYXdiYWNrKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjU5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jcmVhdG9yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY3JlYXRvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjY1CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjY2CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjY3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjgKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyABASYBBBUffHUxG0EAYzEZFEQxGESCDATwXaekBMDpwxUE2FKCcwT0RorZBCKdEvcE31NPewTgULWpBIsqLVgE7hXE9wQVdUT/BBBJLAcEUin6NzYaAI4MAAkAJAA/AGEAgwClAMcA6QEDAR0BNwFRADEZFDEYFBBDNhoBF3EANhoBF3EASwNPAhJEEkQWKExQsCJDNhoBF3EBNhoBF3EBSwNPAhJEEkQWKExQsCJDNhoBF3ECNhoBF3ECSwNPAhJEEkSAAQCBAE8CVChMULAiQzYaARdxAzYaARdxA0sDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcQQ2GgEXcQRLA08CEkQSREkVFlcGAkxQKExQsCJDNhoBF3EFNhoBF3EFSwNPAhJEEkRJFRZXBgJMUChMULAiQzYaARdxBjYaARdxBksDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcQc2GgEXcQdLA08CEkQSRChMULAiQzYaARdxCDYaARdxCEsDTwISRBJEKExQsCJDNhoBF3EJNhoBF3EJSwNPAhJEEkQoTFCwIkM2GgEXcQo2GgEXcQpLA08CEkQSRChMULAiQzYaARdxCzYaARdxC0sDTwISRBJEKExQsCJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the StateAssetParamsContract contract - */ -export type StateAssetParamsContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify_asset_params_get_total(uint64)uint64': { - a: bigint | number - } - 'verify_asset_params_get_decimals(uint64)uint64': { - a: bigint | number - } - 'verify_asset_params_get_default_frozen(uint64)bool': { - a: bigint | number - } - 'verify_asset_params_get_unit_name(uint64)byte[]': { - a: bigint | number - } - 'verify_asset_params_get_name(uint64)byte[]': { - a: bigint | number - } - 'verify_asset_params_get_url(uint64)byte[]': { - a: bigint | number - } - 'verify_asset_params_get_metadata_hash(uint64)byte[]': { - a: bigint | number - } - 'verify_asset_params_get_manager(uint64)address': { - a: bigint | number - } - 'verify_asset_params_get_reserve(uint64)address': { - a: bigint | number - } - 'verify_asset_params_get_freeze(uint64)address': { - a: bigint | number - } - 'verify_asset_params_get_clawback(uint64)address': { - a: bigint | number - } - 'verify_asset_params_get_creator(uint64)address': { - a: bigint | number - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify_asset_params_get_total(uint64)uint64': [a: bigint | number] - 'verify_asset_params_get_decimals(uint64)uint64': [a: bigint | number] - 'verify_asset_params_get_default_frozen(uint64)bool': [a: bigint | number] - 'verify_asset_params_get_unit_name(uint64)byte[]': [a: bigint | number] - 'verify_asset_params_get_name(uint64)byte[]': [a: bigint | number] - 'verify_asset_params_get_url(uint64)byte[]': [a: bigint | number] - 'verify_asset_params_get_metadata_hash(uint64)byte[]': [a: bigint | number] - 'verify_asset_params_get_manager(uint64)address': [a: bigint | number] - 'verify_asset_params_get_reserve(uint64)address': [a: bigint | number] - 'verify_asset_params_get_freeze(uint64)address': [a: bigint | number] - 'verify_asset_params_get_clawback(uint64)address': [a: bigint | number] - 'verify_asset_params_get_creator(uint64)address': [a: bigint | number] - } -} - -/** - * The return type for each method - */ -export type StateAssetParamsContractReturns = { - 'verify_asset_params_get_total(uint64)uint64': bigint - 'verify_asset_params_get_decimals(uint64)uint64': bigint - 'verify_asset_params_get_default_frozen(uint64)bool': boolean - 'verify_asset_params_get_unit_name(uint64)byte[]': Uint8Array - 'verify_asset_params_get_name(uint64)byte[]': Uint8Array - 'verify_asset_params_get_url(uint64)byte[]': Uint8Array - 'verify_asset_params_get_metadata_hash(uint64)byte[]': Uint8Array - 'verify_asset_params_get_manager(uint64)address': string - 'verify_asset_params_get_reserve(uint64)address': string - 'verify_asset_params_get_freeze(uint64)address': string - 'verify_asset_params_get_clawback(uint64)address': string - 'verify_asset_params_get_creator(uint64)address': string -} - -/** - * Defines the types of available calls and state of the StateAssetParamsContract smart contract. - */ -export type StateAssetParamsContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify_asset_params_get_total(uint64)uint64' | 'verify_asset_params_get_total', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_total(uint64)uint64'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_total(uint64)uint64'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_total(uint64)uint64'] - }> - & Record<'verify_asset_params_get_decimals(uint64)uint64' | 'verify_asset_params_get_decimals', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_decimals(uint64)uint64'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_decimals(uint64)uint64'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_decimals(uint64)uint64'] - }> - & Record<'verify_asset_params_get_default_frozen(uint64)bool' | 'verify_asset_params_get_default_frozen', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_default_frozen(uint64)bool'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_default_frozen(uint64)bool'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_default_frozen(uint64)bool'] - }> - & Record<'verify_asset_params_get_unit_name(uint64)byte[]' | 'verify_asset_params_get_unit_name', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_unit_name(uint64)byte[]'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_unit_name(uint64)byte[]'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_unit_name(uint64)byte[]'] - }> - & Record<'verify_asset_params_get_name(uint64)byte[]' | 'verify_asset_params_get_name', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_name(uint64)byte[]'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_name(uint64)byte[]'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_name(uint64)byte[]'] - }> - & Record<'verify_asset_params_get_url(uint64)byte[]' | 'verify_asset_params_get_url', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_url(uint64)byte[]'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_url(uint64)byte[]'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_url(uint64)byte[]'] - }> - & Record<'verify_asset_params_get_metadata_hash(uint64)byte[]' | 'verify_asset_params_get_metadata_hash', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_metadata_hash(uint64)byte[]'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_metadata_hash(uint64)byte[]'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_metadata_hash(uint64)byte[]'] - }> - & Record<'verify_asset_params_get_manager(uint64)address' | 'verify_asset_params_get_manager', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_manager(uint64)address'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_manager(uint64)address'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_manager(uint64)address'] - }> - & Record<'verify_asset_params_get_reserve(uint64)address' | 'verify_asset_params_get_reserve', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_reserve(uint64)address'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_reserve(uint64)address'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_reserve(uint64)address'] - }> - & Record<'verify_asset_params_get_freeze(uint64)address' | 'verify_asset_params_get_freeze', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_freeze(uint64)address'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_freeze(uint64)address'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_freeze(uint64)address'] - }> - & Record<'verify_asset_params_get_clawback(uint64)address' | 'verify_asset_params_get_clawback', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_clawback(uint64)address'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_clawback(uint64)address'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_clawback(uint64)address'] - }> - & Record<'verify_asset_params_get_creator(uint64)address' | 'verify_asset_params_get_creator', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_creator(uint64)address'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_creator(uint64)address'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_creator(uint64)address'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type StateAssetParamsContractSignatures = keyof StateAssetParamsContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type StateAssetParamsContractNonVoidMethodSignatures = keyof StateAssetParamsContractTypes['methods'] extends infer T ? T extends keyof StateAssetParamsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the StateAssetParamsContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = StateAssetParamsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the StateAssetParamsContract smart contract to the method's return type - */ -export type MethodReturn = StateAssetParamsContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type StateAssetParamsContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type StateAssetParamsContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: StateAssetParamsContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAssetParamsContract smart contract - */ -export abstract class StateAssetParamsContractParamsFactory { - /** - * Constructs a no op call for the verify_asset_params_get_total(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetTotal(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_total(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_asset_params_get_decimals(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetDecimals(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_decimals(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_asset_params_get_default_frozen(uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetDefaultFrozen(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_default_frozen(uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_asset_params_get_unit_name(uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetUnitName(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_unit_name(uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_asset_params_get_name(uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetName(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_name(uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_asset_params_get_url(uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetUrl(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_url(uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_asset_params_get_metadata_hash(uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetMetadataHash(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_metadata_hash(uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_asset_params_get_manager(uint64)address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetManager(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_manager(uint64)address' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_asset_params_get_reserve(uint64)address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetReserve(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_reserve(uint64)address' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_asset_params_get_freeze(uint64)address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetFreeze(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_freeze(uint64)address' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_asset_params_get_clawback(uint64)address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetClawback(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_clawback(uint64)address' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_asset_params_get_creator(uint64)address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetCreator(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_creator(uint64)address' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } -} - -/** - * A factory to create and deploy one or more instance of the StateAssetParamsContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class StateAssetParamsContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `StateAssetParamsContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new StateAssetParamsContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new StateAssetParamsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the StateAssetParamsContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: StateAssetParamsContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new StateAssetParamsContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAssetParamsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAssetParamsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAssetParamsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new StateAssetParamsContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the StateAssetParamsContract smart contract - */ -export class StateAssetParamsContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `StateAssetParamsContractClient` - * - * @param appClient An `AppClient` instance which has been created with the StateAssetParamsContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `StateAssetParamsContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `StateAssetParamsContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new StateAssetParamsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `StateAssetParamsContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new StateAssetParamsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the StateAssetParamsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_total(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetTotal: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetTotal(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_decimals(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetDecimals: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDecimals(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_default_frozen(uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetDefaultFrozen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDefaultFrozen(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_unit_name(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetUnitName: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUnitName(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_name(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetName: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetName(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_url(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetUrl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUrl(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_metadata_hash(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetMetadataHash: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetMetadataHash(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_manager(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetManager: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetManager(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_reserve(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetReserve: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetReserve(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_freeze(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetFreeze: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetFreeze(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_clawback(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetClawback: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetClawback(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_creator(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetCreator: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetCreator(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the StateAssetParamsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_total(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetTotal: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetTotal(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_decimals(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetDecimals: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDecimals(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_default_frozen(uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetDefaultFrozen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDefaultFrozen(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_unit_name(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetUnitName: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUnitName(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_name(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetName: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetName(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_url(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetUrl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUrl(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_metadata_hash(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetMetadataHash: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetMetadataHash(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_manager(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetManager: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetManager(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_reserve(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetReserve: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetReserve(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_freeze(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetFreeze: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetFreeze(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_clawback(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetClawback: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetClawback(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_creator(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetCreator: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetCreator(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the StateAssetParamsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_total(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetTotal: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetTotal(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_total(uint64)uint64'])} - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_decimals(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetDecimals: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDecimals(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_decimals(uint64)uint64'])} - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_default_frozen(uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetDefaultFrozen: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDefaultFrozen(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_default_frozen(uint64)bool'])} - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_unit_name(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetUnitName: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUnitName(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_unit_name(uint64)byte[]'])} - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_name(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetName: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetName(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_name(uint64)byte[]'])} - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_url(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetUrl: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUrl(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_url(uint64)byte[]'])} - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_metadata_hash(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetMetadataHash: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetMetadataHash(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_metadata_hash(uint64)byte[]'])} - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_manager(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetManager: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetManager(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_manager(uint64)address'])} - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_reserve(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetReserve: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetReserve(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_reserve(uint64)address'])} - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_freeze(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetFreeze: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetFreeze(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_freeze(uint64)address'])} - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_clawback(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetClawback: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetClawback(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_clawback(uint64)address'])} - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_creator(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetCreator: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetCreator(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_creator(uint64)address'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new StateAssetParamsContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current StateAssetParamsContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): StateAssetParamsContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_asset_params_get_total(uint64)uint64 method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetTotal(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetTotal(params))) - return this - }, - /** - * Add a verify_asset_params_get_decimals(uint64)uint64 method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetDecimals(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetDecimals(params))) - return this - }, - /** - * Add a verify_asset_params_get_default_frozen(uint64)bool method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetDefaultFrozen(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetDefaultFrozen(params))) - return this - }, - /** - * Add a verify_asset_params_get_unit_name(uint64)byte[] method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetUnitName(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetUnitName(params))) - return this - }, - /** - * Add a verify_asset_params_get_name(uint64)byte[] method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetName(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetName(params))) - return this - }, - /** - * Add a verify_asset_params_get_url(uint64)byte[] method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetUrl(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetUrl(params))) - return this - }, - /** - * Add a verify_asset_params_get_metadata_hash(uint64)byte[] method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetMetadataHash(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetMetadataHash(params))) - return this - }, - /** - * Add a verify_asset_params_get_manager(uint64)address method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetManager(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetManager(params))) - return this - }, - /** - * Add a verify_asset_params_get_reserve(uint64)address method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetReserve(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetReserve(params))) - return this - }, - /** - * Add a verify_asset_params_get_freeze(uint64)address method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetFreeze(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetFreeze(params))) - return this - }, - /** - * Add a verify_asset_params_get_clawback(uint64)address method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetClawback(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetClawback(params))) - return this - }, - /** - * Add a verify_asset_params_get_creator(uint64)address method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetCreator(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetCreator(params))) - return this - }, - /** - * Add a clear state call to the StateAssetParamsContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as StateAssetParamsContractComposer - } -} -export type StateAssetParamsContractComposer = { - /** - * Calls the verify_asset_params_get_total(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetTotal(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_total(uint64)uint64'] | undefined]> - - /** - * Calls the verify_asset_params_get_decimals(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetDecimals(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_decimals(uint64)uint64'] | undefined]> - - /** - * Calls the verify_asset_params_get_default_frozen(uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetDefaultFrozen(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_default_frozen(uint64)bool'] | undefined]> - - /** - * Calls the verify_asset_params_get_unit_name(uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetUnitName(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_unit_name(uint64)byte[]'] | undefined]> - - /** - * Calls the verify_asset_params_get_name(uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetName(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_name(uint64)byte[]'] | undefined]> - - /** - * Calls the verify_asset_params_get_url(uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetUrl(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_url(uint64)byte[]'] | undefined]> - - /** - * Calls the verify_asset_params_get_metadata_hash(uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetMetadataHash(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_metadata_hash(uint64)byte[]'] | undefined]> - - /** - * Calls the verify_asset_params_get_manager(uint64)address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetManager(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_manager(uint64)address'] | undefined]> - - /** - * Calls the verify_asset_params_get_reserve(uint64)address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetReserve(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_reserve(uint64)address'] | undefined]> - - /** - * Calls the verify_asset_params_get_freeze(uint64)address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetFreeze(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_freeze(uint64)address'] | undefined]> - - /** - * Calls the verify_asset_params_get_clawback(uint64)address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetClawback(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_clawback(uint64)address'] | undefined]> - - /** - * Calls the verify_asset_params_get_creator(uint64)address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetCreator(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_creator(uint64)address'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the StateAssetParamsContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): StateAssetParamsContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): StateAssetParamsContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type StateAssetParamsContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateMutations.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateMutations.ts deleted file mode 100644 index 01c58bc..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/StateMutations.ts +++ /dev/null @@ -1,880 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"StateMutations","structs":{},"methods":[{"name":"append","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"modify","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get","args":[],"returns":{"type":"(uint64,string)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":3},"local":{"ints":0,"bytes":1}},"keys":{"global":{"no_proxy":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"bm9fcHJveHk="},"glob_assign":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"Z2xvYl9hc3NpZ24="},"glob":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"Z2xvYg=="}},"local":{"loc":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"bG9j"}},"box":{"box":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"Ym94"}}},"maps":{"global":{},"local":{},"box":{"map":{"keyType":"address","valueType":"(uint64,string)[]","prefix":"bWFw"}}}},"bareActions":{"create":["NoOp"],"call":["OptIn"]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[526,795,931],"errorMessage":"check self.box exists"},{"pc":[481,684,921],"errorMessage":"check self.glob exists"},{"pc":[440,577,916],"errorMessage":"check self.glob_assign exists"},{"pc":[506,742,928],"errorMessage":"check self.loc exists for account"},{"pc":[553,855,938],"errorMessage":"check self.map entry exists"},{"pc":[460,630,912],"errorMessage":"check self.no_proxy exists"},{"pc":[962],"errorMessage":"expected box == no_proxy"},{"pc":[950],"errorMessage":"expected global == no_proxy"},{"pc":[944],"errorMessage":"expected global assign == no_proxy"},{"pc":[956],"errorMessage":"expected local == no_proxy"},{"pc":[966],"errorMessage":"expected map == no_proxy"},{"pc":[593,619,646,672,700,726,758,784,811,837,871,897],"errorMessage":"index access is out of bounds"},{"pc":[585,638,692,750,803,863],"errorMessage":"invalid array length header"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA4CiAgICBieXRlY2Jsb2NrICJib3giICJub19wcm94eSIgMHgwMDAwICJnbG9iX2Fzc2lnbiIgImdsb2IiICJsb2MiIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YSAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0ICJtYXAiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MjQKICAgIC8vIHNlbGYubm9fcHJveHkgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weToyMgogICAgLy8gY2xhc3MgU3RhdGVNdXRhdGlvbnMoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AxMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NTI2ZThiYmYgMHg5NWZlZjEzZCAweDBjMjk0NDRiIC8vIG1ldGhvZCAiYXBwZW5kKCl2b2lkIiwgbWV0aG9kICJtb2RpZnkoKXZvaWQiLCBtZXRob2QgImdldCgpKHVpbnQ2NCxzdHJpbmcpW10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhcHBlbmQgbW9kaWZ5IGdldAogICAgZXJyCgptYWluX2JhcmVfcm91dGluZ0AxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weToyMgogICAgLy8gY2xhc3MgU3RhdGVNdXRhdGlvbnMoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHN3aXRjaCBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDEzIG1haW5fb3B0X2luQDE0CiAgICBlcnIKCm1haW5fb3B0X2luQDE0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMxCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18zIC8vICJnbG9iX2Fzc2lnbiIKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM0CiAgICAvLyBzZWxmLmdsb2IudmFsdWUgPSBNeUFycmF5KCkKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzMKICAgIC8vIHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzQKICAgIC8vIHNlbGYuZ2xvYi52YWx1ZSA9IE15QXJyYXkoKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNQogICAgLy8gc2VsZi5ib3gudmFsdWUgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM1CiAgICAvLyBzZWxmLmJveC52YWx1ZSA9IE15QXJyYXkoKQogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM2CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgdHhuIFNlbmRlcgogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM2CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM3CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM3CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMxCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMzoKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQoYXJyYXlfaXRlbXNfY291bnQ6IHVpbnQ2NCwgYXJyYXlfaGVhZF9hbmRfdGFpbDogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0LCBuZXdfaGVhZF9hbmRfdGFpbDogYnl0ZXMpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQ6CiAgICBwcm90byA0IDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzAgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQoc291cmNlOiBieXRlcywgbmV3X2l0ZW06IGJ5dGVzLCBpbmRleDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBzdWJzdHJpbmcgMCAyCiAgICBkdXAKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAyCiAgICBkaWcgMQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA1CiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZHVwCiAgICBkaWcgNAogICAgLQogICAgY292ZXIgNgogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGNvdmVyIDYKICAgIGRpZyA0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA1CiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgc3dhcAoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDUKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgMgogICAgc3dhcAogICAgcmVwbGFjZTMKICAgIGZyYW1lX2J1cnkgMwogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNQogICAgYiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU11dGF0aW9ucy5zdGF0ZW11dGF0aW9ucy5TdGF0ZU11dGF0aW9ucy5hcHBlbmRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBlbmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDIKICAgIC8vIGFyciA9IHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUuY29weSgpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYl9hc3NpZ24gZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDMKICAgIC8vIGFyci5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIGJ5dGVjIDYgLy8gMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMGEwMDAzNjI2MTdhCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ1CiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gYXJyLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ2CiAgICAvLyBzZWxmLm5vX3Byb3h5LmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vX3Byb3h5IGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQzCiAgICAvLyBhcnIuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBieXRlYyA2IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ2CiAgICAvLyBzZWxmLm5vX3Byb3h5LmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0NwogICAgLy8gc2VsZi5nbG9iLnZhbHVlLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYiBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0NwogICAgLy8gc2VsZi5nbG9iLnZhbHVlLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ4CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImxvYyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxvYyBleGlzdHMgZm9yIGFjY291bnQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0OAogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl0uYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgc3dhcAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ5CiAgICAvLyBzZWxmLmJveC52YWx1ZS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveCBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0OQogICAgLy8gc2VsZi5ib3gudmFsdWUuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18wIC8vICJib3giCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTAKICAgIC8vIHNlbGYubWFwW1R4bi5zZW5kZXJdLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hcCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1MAogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0uYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVNdXRhdGlvbnMuc3RhdGVtdXRhdGlvbnMuU3RhdGVNdXRhdGlvbnMubW9kaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKbW9kaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU2CiAgICAvLyBhcnIgPSBzZWxmLmdsb2JfYXNzaWduLnZhbHVlLmNvcHkoKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImdsb2JfYXNzaWduIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JfYXNzaWduIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU3CiAgICAvLyBhcnJbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NwogICAgLy8gYXJyWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU4CiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gYXJyLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYwCiAgICAvLyBzZWxmLm5vX3Byb3h5WzBdLmJheiA9IG1vZGlmaWVkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAibm9fcHJveHkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9fcHJveHkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NAogICAgLy8gbW9kaWZpZWQgPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgYnl0ZWMgNyAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjAKICAgIC8vIHNlbGYubm9fcHJveHlbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGNvbmNhdAogICAgc3dhcAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBieXRlY18xIC8vICJub19wcm94eSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjEKICAgIC8vIHNlbGYuZ2xvYi52YWx1ZVswXS5iYXogPSBtb2RpZmllZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYiBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MQogICAgLy8gc2VsZi5nbG9iLnZhbHVlWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNCAvLyAiZ2xvYiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjIKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdWzBdLmJheiA9IG1vZGlmaWVkCiAgICB0eG4gU2VuZGVyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJsb2MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sb2MgZXhpc3RzIGZvciBhY2NvdW50CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NAogICAgLy8gbW9kaWZpZWQgPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgYnl0ZWMgNyAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjIKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgc3dhcAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYzCiAgICAvLyBzZWxmLmJveC52YWx1ZVswXS5iYXogPSBtb2RpZmllZAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTQKICAgIC8vIG1vZGlmaWVkID0gYXJjNC5TdHJpbmcoIm1vZGlmaWVkIikKICAgIGJ5dGVjIDcgLy8gMHgwMDA4NmQ2ZjY0Njk2NjY5NjU2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYzCiAgICAvLyBzZWxmLmJveC52YWx1ZVswXS5iYXogPSBtb2RpZmllZAogICAgY29uY2F0CiAgICBzd2FwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjY0CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXVswXS5iYXogPSBtb2RpZmllZAogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hcCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2NAogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl1bMF0uYmF6ID0gbW9kaWZpZWQKICAgIGNvbmNhdAogICAgc3dhcAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU11dGF0aW9ucy5zdGF0ZW11dGF0aW9ucy5TdGF0ZU11dGF0aW9ucy5nZXRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjgKICAgIC8vIGEwID0gc2VsZi5ub19wcm94eS5jb3B5KCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJub19wcm94eSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub19wcm94eSBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2OQogICAgLy8gYTEgPSBzZWxmLmdsb2JfYXNzaWduLnZhbHVlLmNvcHkoKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImdsb2JfYXNzaWduIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JfYXNzaWduIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjcwCiAgICAvLyBhMiA9IHNlbGYuZ2xvYi52YWx1ZS5jb3B5KCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJnbG9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2IgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzEKICAgIC8vIGEzID0gc2VsZi5sb2NbVHhuLnNlbmRlcl0uY29weSgpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubG9jIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjcyCiAgICAvLyBhNCA9IHNlbGYuYm94LnZhbHVlLmNvcHkoKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjczCiAgICAvLyBhNSA9IHNlbGYubWFwW1R4bi5zZW5kZXJdLmNvcHkoKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXAgZW50cnkgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzUKICAgIC8vIGFzc2VydCBhMCA9PSBhMSwgImV4cGVjdGVkIGdsb2JhbCBhc3NpZ24gPT0gbm9fcHJveHkiCiAgICBkaWcgNQogICAgdW5jb3ZlciA1CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGdsb2JhbCBhc3NpZ24gPT0gbm9fcHJveHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3NgogICAgLy8gYXNzZXJ0IGEwID09IGEyLCAiZXhwZWN0ZWQgZ2xvYmFsID09IG5vX3Byb3h5IgogICAgZGlnIDQKICAgIHVuY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgPT0gbm9fcHJveHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3NwogICAgLy8gYXNzZXJ0IGEwID09IGEzLCAiZXhwZWN0ZWQgbG9jYWwgPT0gbm9fcHJveHkiCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxvY2FsID09IG5vX3Byb3h5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzgKICAgIC8vIGFzc2VydCBhMCA9PSBhNCwgImV4cGVjdGVkIGJveCA9PSBub19wcm94eSIKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYm94ID09IG5vX3Byb3h5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzkKICAgIC8vIGFzc2VydCBhMCA9PSBhNSwgImV4cGVjdGVkIG1hcCA9PSBub19wcm94eSIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG1hcCA9PSBub19wcm94eQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAAECCCYJA2JveAhub19wcm94eQIAAAtnbG9iX2Fzc2lnbgRnbG9iA2xvYxEAAgAAAAAAAAABAAoAA2JhegoACG1vZGlmaWVkA21hcDEYQAADKSpnMRtBACQxGRREMRhEggMEUm6LvwSV/vE9BAwpREs2GgCOAwE2Ab8DDgAxGY0CACMAAQAxGEQrKmcnBCpnKLxIKCq/MQAnBSpmJwgxAFBJvEgqvyNDMRgUQ4oEAYAASYv+JAuL/CQLIosEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAIowEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiYoDAYv9UQACSReL/VcCAIv/JAtLAUxZi/8jCCQLSwJLAVlLAxVLBYv/CSMJSwFPA08CTUlLBAlOBov+FU4GSwQiTwVSi/5QTwRPAk8DUlBOAkwkC0yLBYsEDEEAIIsDSYsFSU4DWYsCCIsBCRZXBgJLAkxdjAMkCIwFQv/YiwCLA1CMAIkiK2VESSJZTFcCACMnBoj+6StMZyIpZURJIllMVwIAIycGiP7VKUxnIicEZURJIllMVwIAIycGiP7AJwRMZzEASSInBWNESSJZTFcCACMnBoj+pycFTGYovkRJIllMVwIAIycGiP6TKLxIKEy/JwgxAFBJvkRJIllMVwIAIycGiP54SwG8SL8jQyIrZURJVwIASwEiWUsBIllLASMJSwMVSwQkWU8CTU8DTgJSSSVZIkxYJwdQTEQiiP7AK0xnIillRElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/ospTGciJwRlRElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/lUnBExnMQBJIicFY0RJVwIASwEiWUsBIllLASMJSwMVSwQkWU8CTU8DTgJSSSVZIkxYJwdQTEQiiP4bJwVMZii+RElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/eYovEgoTL8nCDEAUEm+RElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/apLAbxIvyNDIillRCIrZUQiJwRlRDEAIicFY0QovkQnCDEAUL5ESwVPBRJESwRPBBJESwNPAxJESwJPAhJESwESRIAEFR98dUxQsCND","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the StateMutations contract - */ -export type StateMutationsArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'append()void': Record - 'modify()void': Record - 'get()(uint64,string)[]': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'append()void': [] - 'modify()void': [] - 'get()(uint64,string)[]': [] - } -} - -/** - * The return type for each method - */ -export type StateMutationsReturns = { - 'append()void': void - 'modify()void': void - 'get()(uint64,string)[]': [bigint, string][] -} - -/** - * Defines the types of available calls and state of the StateMutations smart contract. - */ -export type StateMutationsTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'append()void' | 'append', { - argsObj: StateMutationsArgs['obj']['append()void'] - argsTuple: StateMutationsArgs['tuple']['append()void'] - returns: StateMutationsReturns['append()void'] - }> - & Record<'modify()void' | 'modify', { - argsObj: StateMutationsArgs['obj']['modify()void'] - argsTuple: StateMutationsArgs['tuple']['modify()void'] - returns: StateMutationsReturns['modify()void'] - }> - & Record<'get()(uint64,string)[]' | 'get', { - argsObj: StateMutationsArgs['obj']['get()(uint64,string)[]'] - argsTuple: StateMutationsArgs['tuple']['get()(uint64,string)[]'] - returns: StateMutationsReturns['get()(uint64,string)[]'] - }> - /** - * Defines the shape of the state of the application. - */ - state: { - global: { - keys: { - noProxy: [bigint, string][] - globAssign: [bigint, string][] - glob: [bigint, string][] - } - maps: {} - } - local: { - keys: { - loc: [bigint, string][] - } - maps: {} - } - box: { - keys: { - box: [bigint, string][] - } - maps: { - map: Map - } - } - } -} - -/** - * Defines the possible abi call signatures. - */ -export type StateMutationsSignatures = keyof StateMutationsTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type StateMutationsNonVoidMethodSignatures = keyof StateMutationsTypes['methods'] extends infer T ? T extends keyof StateMutationsTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the StateMutations smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = StateMutationsTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the StateMutations smart contract to the method's return type - */ -export type MethodReturn = StateMutationsTypes['methods'][TSignature]['returns'] - -/** - * Defines the shape of the keyed global state of the application. - */ -export type GlobalKeysState = StateMutationsTypes['state']['global']['keys'] - -/** - * Defines the shape of the keyed local state of the application. - */ -export type LocalKeysState = StateMutationsTypes['state']['local']['keys'] - -/** - * Defines the shape of the keyed box state of the application. - */ -export type BoxKeysState = StateMutationsTypes['state']['box']['keys'] - - -/** - * Defines supported create method params for this smart contract - */ -export type StateMutationsCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type StateMutationsDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: StateMutationsCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateMutations smart contract - */ -export abstract class StateMutationsParamsFactory { - /** - * Constructs a no op call for the append()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static append(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'append()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the modify()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static modify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'modify()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get()(uint64,string)[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static get(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get()(uint64,string)[]' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } -} - -/** - * A factory to create and deploy one or more instance of the StateMutations smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class StateMutationsFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `StateMutationsFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new StateMutationsClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new StateMutationsClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the StateMutations smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: StateMutationsDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new StateMutationsClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateMutations smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateMutations smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateMutations smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new StateMutationsClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the StateMutations smart contract - */ -export class StateMutationsClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `StateMutationsClient` - * - * @param appClient An `AppClient` instance which has been created with the StateMutations app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `StateMutationsClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `StateMutationsClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new StateMutationsClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `StateMutationsClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new StateMutationsClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the StateMutations smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The optIn result - */ - bare: (params?: Expand) => { - return this.appClient.params.bare.optIn(params) - }, - }, - - /** - * Makes a clear_state call to an existing instance of the StateMutations smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the StateMutations smart contract using the `append()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - append: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(StateMutationsParamsFactory.append(params)) - }, - - /** - * Makes a call to the StateMutations smart contract using the `modify()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - modify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(StateMutationsParamsFactory.modify(params)) - }, - - /** - * Makes a call to the StateMutations smart contract using the `get()(uint64,string)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - get: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(StateMutationsParamsFactory.get(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the StateMutations smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The optIn result - */ - bare: (params?: Expand) => { - return this.appClient.createTransaction.bare.optIn(params) - }, - }, - - /** - * Makes a clear_state call to an existing instance of the StateMutations smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the StateMutations smart contract using the `append()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - append: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(StateMutationsParamsFactory.append(params)) - }, - - /** - * Makes a call to the StateMutations smart contract using the `modify()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - modify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(StateMutationsParamsFactory.modify(params)) - }, - - /** - * Makes a call to the StateMutations smart contract using the `get()(uint64,string)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - get: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(StateMutationsParamsFactory.get(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the StateMutations smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The optIn result - */ - bare: (params?: Expand) => { - return this.appClient.send.bare.optIn(params) - }, - }, - - /** - * Makes a clear_state call to an existing instance of the StateMutations smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the StateMutations smart contract using the `append()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - append: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(StateMutationsParamsFactory.append(params)) - return {...result, return: result.return as unknown as (undefined | StateMutationsReturns['append()void'])} - }, - - /** - * Makes a call to the StateMutations smart contract using the `modify()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - modify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(StateMutationsParamsFactory.modify(params)) - return {...result, return: result.return as unknown as (undefined | StateMutationsReturns['modify()void'])} - }, - - /** - * Makes a call to the StateMutations smart contract using the `get()(uint64,string)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - get: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(StateMutationsParamsFactory.get(params)) - return {...result, return: result.return as unknown as (undefined | StateMutationsReturns['get()(uint64,string)[]'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new StateMutationsClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current StateMutations app - */ - state = { - /** - * Methods to access global state for the current StateMutations app - */ - global: { - /** - * Get all current keyed values from global state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.global.getAll() - return { - noProxy: result.no_proxy, - globAssign: result.glob_assign, - glob: result.glob, - } - }, - /** - * Get the current value of the no_proxy key in global state - */ - noProxy: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.global.getValue("no_proxy")) as [bigint, string][] | undefined }, - /** - * Get the current value of the glob_assign key in global state - */ - globAssign: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.global.getValue("glob_assign")) as [bigint, string][] | undefined }, - /** - * Get the current value of the glob key in global state - */ - glob: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.global.getValue("glob")) as [bigint, string][] | undefined }, - }, - /** - * Methods to access local state for the current StateMutations app - */ - local: (address: string | Address) => { - const encodedAddress = typeof address === 'string' ? address : encodeAddress(address.publicKey) - return { - /** - * Get all current keyed values from local state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.local(encodedAddress).getAll() - return { - loc: result.loc, - } - }, - /** - * Get the current value of the loc key in local state - */ - loc: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.local(encodedAddress).getValue("loc")) as [bigint, string][] | undefined }, - } - }, - /** - * Methods to access box state for the current StateMutations app - */ - box: { - /** - * Get all current keyed values from box state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.box.getAll() - return { - box: result.box, - } - }, - /** - * Get the current value of the box key in box state - */ - box: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.box.getValue("box")) as [bigint, string][] | undefined }, - /** - * Get values from the map map in box state - */ - map: { - /** - * Get all current values of the map map in box state - */ - getMap: async (): Promise> => { return (await this.appClient.state.box.getMap("map")) as Map }, - /** - * Get a current value of the map map by key from box state - */ - value: async (key: string): Promise<[bigint, string][] | undefined> => { return await this.appClient.state.box.getMapValue("map", key) as [bigint, string][] | undefined }, - }, - }, - } - - public newGroup(composerConfig?: TransactionComposerConfig): StateMutationsComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a append()void method call against the StateMutations contract - */ - append(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.append(params))) - return this - }, - /** - * Add a modify()void method call against the StateMutations contract - */ - modify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.modify(params))) - return this - }, - /** - * Add a get()(uint64,string)[] method call against the StateMutations contract - */ - get(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.get(params))) - return this - }, - get optIn() { - return { - bare: (params?: AppClientBareCallParams ) => { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.optIn.bare(params))) - return this - }, - } - }, - /** - * Add a clear state call to the StateMutations contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as StateMutationsComposer - } -} -export type StateMutationsComposer = { - /** - * Calls the append()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - append(params?: CallParams): StateMutationsComposer<[...TReturns, StateMutationsReturns['append()void'] | undefined]> - - /** - * Calls the modify()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - modify(params?: CallParams): StateMutationsComposer<[...TReturns, StateMutationsReturns['modify()void'] | undefined]> - - /** - * Calls the get()(uint64,string)[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - get(params?: CallParams): StateMutationsComposer<[...TReturns, StateMutationsReturns['get()(uint64,string)[]'] | undefined]> - - /** - * Gets available optIn methods - */ - readonly optIn: { - /** - * Opts the user into an existing instance of the StateMutations smart contract using a bare call. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - bare(params?: AppClientBareCallParams ): StateMutationsComposer - } - - /** - * Makes a clear_state call to an existing instance of the StateMutations smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): StateMutationsComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): StateMutationsComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type StateMutationsComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StaticSizeContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StaticSizeContract.ts deleted file mode 100644 index a0eb9be..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/StaticSizeContract.ts +++ /dev/null @@ -1,1009 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"StaticSizeContract","structs":{},"methods":[{"name":"test_array","args":[{"type":"uint64","name":"x1"},{"type":"uint64","name":"y1"},{"type":"uint64","name":"x2"},{"type":"uint64","name":"y2"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_extend_from_tuple","args":[{"type":"((uint64,uint64),(uint64,uint64))","name":"some_more"}],"returns":{"type":"(uint64,uint64)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_extend_from_arc4_tuple","args":[{"type":"((uint64,uint64),(uint64,uint64))","name":"some_more"}],"returns":{"type":"(uint64,uint64)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_bool_array","args":[{"type":"uint64","name":"length"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_arc4_conversion","args":[{"type":"uint64","name":"length"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"sum_array","args":[{"type":"uint64[]","name":"arc4_arr"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_arc4_bool","args":[],"returns":{"type":"bool[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":1,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{"count":{"keyType":"AVMString","valueType":"AVMUint64","key":"Y291bnQ="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[1188,1205,1215],"errorMessage":"check self.count exists"},{"pc":[1033],"errorMessage":"expected 3 bytes"},{"pc":[750,761,861,1026,1115],"errorMessage":"expected correct length"},{"pc":[1053,1128],"errorMessage":"expected correct value at 0"},{"pc":[1073,1141],"errorMessage":"expected correct value at 1"},{"pc":[1154],"errorMessage":"expected correct value at 2"},{"pc":[1166],"errorMessage":"expected correct value at 3"},{"pc":[403,478,517,637,665,784,883,1035,1056,1117,1130,1143,1155],"errorMessage":"index access is out of bounds"},{"pc":[653,1018],"errorMessage":"invalid array length header"},{"pc":[729,753,840,908,999,1098],"errorMessage":"max array length exceeded"},{"pc":[283,342,377],"errorMessage":"overflow"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAxNiAxNDQKICAgIGJ5dGVjYmxvY2sgMHggMHgxNTFmN2M3NSAiY291bnQiIDB4MDAgMHgwMDAwCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjM5CiAgICAvLyBzZWxmLmNvdW50ID0gVUludDY0KDApCiAgICBieXRlY18yIC8vICJjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjM3CiAgICAvLyBjbGFzcyBTdGF0aWNTaXplQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDI4ZDdjMWI4IDB4ZmE5Y2I5NzMgMHg2MDM5YTI0MCAweGY4ZmQ2OGE3IDB4MWYwMjhkYjEgMHgwOTZiM2E1OSAweDhkNmUzYTI1IC8vIG1ldGhvZCAidGVzdF9hcnJheSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2V4dGVuZF9mcm9tX3R1cGxlKCgodWludDY0LHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQpKSkodWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAidGVzdF9leHRlbmRfZnJvbV9hcmM0X3R1cGxlKCgodWludDY0LHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQpKSkodWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAidGVzdF9ib29sX2FycmF5KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRlc3RfYXJjNF9jb252ZXJzaW9uKHVpbnQ2NCl1aW50NjRbXSIsIG1ldGhvZCAic3VtX2FycmF5KHVpbnQ2NFtdKXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9hcmM0X2Jvb2woKWJvb2xbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHRlc3RfYXJyYXkgdGVzdF9leHRlbmRfZnJvbV90dXBsZSB0ZXN0X2V4dGVuZF9mcm9tX2FyYzRfdHVwbGUgdGVzdF9ib29sX2FycmF5IHRlc3RfYXJjNF9jb252ZXJzaW9uIHN1bV9hcnJheSB0ZXN0X2FyYzRfYm9vbAogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9iaXRzKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIHJlYWRfc3RlcDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYml0czoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiAyCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwbiAyCiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAtNAogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgY292ZXIgMgogICAgc3dhcAogICAgcHVzaGludCA3CiAgICArCiAgICBpbnRjXzIgLy8gOAogICAgLwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNwogICAgKwogICAgaW50Y18yIC8vIDgKICAgIC8KICAgIGR1cAogICAgY292ZXIgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl9pZl9lbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgLQogICAgYnplcm8KICAgIGZyYW1lX2RpZyA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgNAoKZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl9pZl9lbHNlQDI6CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDE2CiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBmcmFtZV9idXJ5IDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfd2hpbGVfdG9wQDM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfYWZ0ZXJfd2hpbGVANQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBnZXRiaXQKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX3doaWxlX3RvcEAzCgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX3doaWxlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC50ZXN0X2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcnJheToKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDMKICAgIC8vIHNlbGYuY291bnQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQ2CiAgICAvLyBQb2ludCh4PWFyYzQuVUludDY0KCksIHk9VUludDY0KCksIG90aGVyPXNlbGYueHRyYSgpKSwKICAgIGNhbGxzdWIgeHRyYQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0NwogICAgLy8gUG9pbnQoeD14MSwgeT15MSwgb3RoZXI9c2VsZi54dHJhKCkpLAogICAgY2FsbHN1YiB4dHJhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQ4CiAgICAvLyBQb2ludCh4PXgyLCB5PXkyLCBvdGhlcj1zZWxmLnh0cmEoKSksCiAgICBjYWxsc3ViIHh0cmEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDQtNTAKICAgIC8vIHBhdGggPSBSZWZlcmVuY2VBcnJheSgKICAgIC8vICAgICAoCiAgICAvLyAgICAgICAgIFBvaW50KHg9YXJjNC5VSW50NjQoKSwgeT1VSW50NjQoKSwgb3RoZXI9c2VsZi54dHJhKCkpLAogICAgLy8gICAgICAgICBQb2ludCh4PXgxLCB5PXkxLCBvdGhlcj1zZWxmLnh0cmEoKSksCiAgICAvLyAgICAgICAgIFBvaW50KHg9eDIsIHk9eTIsIG90aGVyPXNlbGYueHRyYSgpKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICBkaWcgMTEKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgcHVzaGludCA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMTIKICAgIGRpZyAxCiAgICBifAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTQKICAgIGl0b2IKICAgIHVuY292ZXIgMTUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgZGlnIDkKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgdW5jb3ZlciA5CiAgICBkaWcgNAogICAgYnwKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgdW5jb3ZlciA4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIGJ8CiAgICBjb25jYXQKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjUxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjUxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBkdXAKICAgIHB1c2hpbnQgMwogICAgPAogICAgYnogdGVzdF9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1MgogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuYiA9PSBpICsgMQogICAgZHVwMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjIDQgLy8gMTQ0CiAgICAqCiAgICBpbnRjIDQgLy8gMTQ0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGV4dHJhY3QgMTYgMTI4CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1MwogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuZC5mb28gPT0gaSArIDIKICAgIHN3YXAKICAgIGV4dHJhY3QgNDggMTYKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIHVuY292ZXIgMwogICAgcHVzaGludCAyCiAgICArCiAgICBpdG9iCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1NAogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuZC5iYXIgPT0gKGkgKyAxKSAqIChpICsgMSkKICAgIGV4dHJhY3QgOCA4CiAgICBkaWcgMQogICAgZGlnIDIKICAgICoKICAgIGl0b2IKICAgIGI9PQogICAgYXNzZXJ0CiAgICBidXJ5IDEKICAgIGIgdGVzdF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1NgogICAgLy8gQm94KEltbXV0YWJsZUFycmF5W1BvaW50XSwga2V5PSJhIikudmFsdWUgPSBwYXRoLmZyZWV6ZSgpCiAgICBkdXAKICAgIGxlbgogICAgaW50YyA0IC8vIDE0NAogICAgLwogICAgZHVwCiAgICBidXJ5IDEwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzICJhIgogICAgYm94X2RlbAogICAgcG9wCiAgICBwdXNoYnl0ZXMgImEiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2OAogICAgLy8gbGFzdF9wb2ludCA9IHBhdGhbMF0KICAgIGV4dHJhY3QgMCAxNDQgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIGJ1cnkgMTAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2OQogICAgLy8gbGVuZ3RoID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTcwCiAgICAvLyBmb3IgcG9pbnRfaWR4IGluIHVyYW5nZSgxLCBwYXRoLmxlbmd0aCk6CiAgICBpbnRjXzEgLy8gMQogICAgYnVyeSAzCgp0ZXN0X2FycmF5X2Zvcl9oZWFkZXJANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTcwCiAgICAvLyBmb3IgcG9pbnRfaWR4IGluIHVyYW5nZSgxLCBwYXRoLmxlbmd0aCk6CiAgICBkaWcgMgogICAgZGlnIDgKICAgIDwKICAgIGJ6IHRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDE1CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzEKICAgIC8vIHBvaW50ID0gcGF0aFtwb2ludF9pZHhdCiAgICBkaWcgMwogICAgaW50YyA0IC8vIDE0NAogICAgKgogICAgaW50YyA0IC8vIDE0NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXBuIDIKICAgIGV4dHJhY3QgMCA4CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzIKICAgIC8vIGlmIHBvaW50LnggPCBsYXN0X3BvaW50Lng6CiAgICBkaWcgMTAKICAgIGI8CiAgICBieiB0ZXN0X2FycmF5X2Vsc2VfYm9keUAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzMKICAgIC8vIGR4ID0gbGFzdF9wb2ludC54LmFzX3VpbnQ2NCgpIC0gcG9pbnQueC5hc191aW50NjQoKQogICAgZGlnIDEwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2OAogICAgLy8gbGFzdF9wb2ludCA9IHBhdGhbMF0KICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3MwogICAgLy8gZHggPSBsYXN0X3BvaW50LnguYXNfdWludDY0KCkgLSBwb2ludC54LmFzX3VpbnQ2NCgpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzEKICAgIC8vIHBvaW50ID0gcGF0aFtwb2ludF9pZHhdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzMKICAgIC8vIGR4ID0gbGFzdF9wb2ludC54LmFzX3VpbnQ2NCgpIC0gcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIGJ1cnkgNwoKdGVzdF9hcnJheV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzYKICAgIC8vIGlmIHBvaW50LnkgPCBsYXN0X3BvaW50Lnk6CiAgICBkaWcgMwogICAgZGlnIDYKICAgIDwKICAgIGJ6IHRlc3RfYXJyYXlfZWxzZV9ib2R5QDEzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3NwogICAgLy8gZHkgPSBsYXN0X3BvaW50LnkgLSBwb2ludC55CiAgICBkaWcgNQogICAgZGlnIDQKICAgIC0KCnRlc3RfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTgwCiAgICAvLyBsZW5ndGggKz0gb3Auc3FydChkeCAqIGR4ICsgZHkgKiBkeSkKICAgIGRpZyA3CiAgICBkdXAKICAgICoKICAgIHN3YXAKICAgIGR1cAogICAgKgogICAgKwogICAgc3FydAogICAgZGlnIDUKICAgICsKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzAKICAgIC8vIGZvciBwb2ludF9pZHggaW4gdXJhbmdlKDEsIHBhdGgubGVuZ3RoKToKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAzCiAgICBiIHRlc3RfYXJyYXlfZm9yX2hlYWRlckA3Cgp0ZXN0X2FycmF5X2Vsc2VfYm9keUAxMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTc5CiAgICAvLyBkeSA9IHBvaW50LnkgLSBsYXN0X3BvaW50LnkKICAgIGRpZyAzCiAgICBkaWcgNgogICAgLQogICAgYiB0ZXN0X2FycmF5X2FmdGVyX2lmX2Vsc2VAMTQKCnRlc3RfYXJyYXlfZWxzZV9ib2R5QDEwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzEKICAgIC8vIHBvaW50ID0gcGF0aFtwb2ludF9pZHhdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzUKICAgIC8vIGR4ID0gcG9pbnQueC5hc191aW50NjQoKSAtIGxhc3RfcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjgKICAgIC8vIGxhc3RfcG9pbnQgPSBwYXRoWzBdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzUKICAgIC8vIGR4ID0gcG9pbnQueC5hc191aW50NjQoKSAtIGxhc3RfcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIGJ1cnkgNwogICAgYiB0ZXN0X2FycmF5X2FmdGVyX2lmX2Vsc2VAMTEKCnRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyA0CiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QudGVzdF9leHRlbmRfZnJvbV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZXh0ZW5kX2Zyb21fdHVwbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgMTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMTYgMTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjIKICAgIC8vIGFyci5leHRlbmQoc29tZV9tb3JlKQogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2MwogICAgLy8gbGFzdCA9IGFyclstMV0KICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMTYKICAgIC8KICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyAxNgogICAgKgogICAgZGlnIDIKICAgIHN3YXAKICAgIGludGNfMyAvLyAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY0CiAgICAvLyBhc3NlcnQgbGFzdCA9PSBzb21lX21vcmVbMV0KICAgIGR1cAogICAgdW5jb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY1CiAgICAvLyByZXN1bHQgPSBhcnIuZnJlZXplKCkKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2NgogICAgLy8gYXNzZXJ0IHJlc3VsdFstMV0gPT0gbGFzdAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDE2CiAgICAqCiAgICBpbnRjXzMgLy8gMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfZXh0ZW5kX2Zyb21fYXJjNF90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZXh0ZW5kX2Zyb21fYXJjNF90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojc1CiAgICAvLyByZXR1cm4gYXJyLmZyZWV6ZSgpCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDE2CiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfYm9vbF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYm9vbF9hcnJheToKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3OQogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbYm9vbF0oKQogICAgYnl0ZWNfMCAvLyAweAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGludGNfMSAvLyAxCgp0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjgzCiAgICAvLyBhcnIuYXBwZW5kKGkgJSAyID09IDApCiAgICBkdXBuIDIKICAgIHB1c2hpbnQgMgogICAgJQogICAgIQogICAgZGlnIDQKICAgIHN3YXAKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMgogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojg0CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGgsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGxlbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6ODcKICAgIC8vIGFycjIuZXh0ZW5kKGFycikKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4OAogICAgLy8gYXNzZXJ0IGFycjIubGVuZ3RoID09IGxlbmd0aCAqIDIsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDIKICAgICoKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6OTAKICAgIC8vIGNvdW50ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjkxCiAgICAvLyBmb3IgdmFsIGluIGFycjoKICAgIGxlbgogICAgYnVyeSA3CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1Cgp0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5MQogICAgLy8gZm9yIHZhbCBpbiBhcnI6CiAgICBkaWcgNAogICAgZGlnIDcKICAgIDwKICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9mb3JAMTEKICAgIGRpZyAyCiAgICBkaWcgNQogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5MgogICAgLy8gaWYgdmFsOgogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5MwogICAgLy8gY291bnQgKz0gMQogICAgZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDYKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDk6CiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiB0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckA2Cgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfZm9yQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyA1CiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QudGVzdF9hcmM0X2NvbnZlcnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY29udmVyc2lvbjoKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5OAogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbYXJjNC5VSW50NjRdKCkKICAgIGJ5dGVjXzAgLy8gMHgKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTAxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMSwgbGVuZ3RoICsgMSk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaW50Y18xIC8vIDEKCnRlc3RfYXJjNF9jb252ZXJzaW9uX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTAxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMSwgbGVuZ3RoICsgMSk6CiAgICBkdXAKICAgIGRpZyAyCiAgICA8CiAgICBieiB0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDIKICAgIC8vIGFyci5hcHBlbmQoYXJjNC5VSW50NjQoaSkpCiAgICBkdXBuIDIKICAgIGl0b2IKICAgIGRpZyA0CiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDEKICAgIC8vIGZvciBpIGluIHVyYW5nZSgxLCBsZW5ndGggKyAxKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9hcmM0X2NvbnZlcnNpb25fZm9yX2hlYWRlckAyCgp0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9mb3JANToKICAgIGRpZyAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwMwogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gbGVuZ3RoLCAiZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgiCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBkdXAKICAgIGJ1cnkgOAogICAgZGlnIDQKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTA0CiAgICAvLyBjb3VudCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9hcmM0X2NvbnZlcnNpb25fZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDUKICAgIC8vIGZvciB2YWwgaW4gYXJyOgogICAgZGlnIDQKICAgIGRpZyA3CiAgICA8CiAgICBieiB0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9mb3JAMTEKICAgIGRpZyAyCiAgICBkaWcgNQogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTA2CiAgICAvLyBpZiB2YWw6CiAgICBieXRlY18wIC8vIDB4CiAgICBiIT0KICAgIGJ6IHRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDcKICAgIC8vIGNvdW50ICs9IDEKICAgIGRpZyA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA2Cgp0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9pZl9lbHNlQDk6CiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiB0ZXN0X2FyYzRfY29udmVyc2lvbl9mb3JfaGVhZGVyQDYKCnRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2ZvckAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTA5CiAgICAvLyBhcmM0X2FyciA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSgpCiAgICBieXRlYyA0IC8vIDB4MDAwMAogICAgZGlnIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTEwCiAgICAvLyBhcmM0X2Fyci5leHRlbmQoYXJyKQogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC5zdW1fYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgpzdW1fYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTE3CiAgICAvLyBhcnIuZXh0ZW5kKGFyYzRfYXJyKQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMTkKICAgIC8vIHRvdGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjAKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgIC8KICAgIGludGNfMCAvLyAwCgpzdW1fYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjAKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IHN1bV9hcnJheV9hZnRlcl9mb3JANQogICAgZGlnIDMKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEyMQogICAgLy8gdG90YWwgKz0gaXRlbS5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA0CiAgICArCiAgICBidXJ5IDQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgc3VtX2FycmF5X2Zvcl9oZWFkZXJAMgoKc3VtX2FycmF5X2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0MgogICAgLy8gYXJyLmFwcGVuZChhcmM0LkJvb2woVHhuLnNlbmRlciA9PSBUeG4ucmVjZWl2ZXIpKQogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICA9PQogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQzCiAgICAvLyBhcnIuYXBwZW5kKGFyYzQuQm9vbChUeG4uc2VuZGVyICE9IFR4bi5yZWNlaXZlcikpCiAgICB0eG4gU2VuZGVyCiAgICB0eG4gUmVjZWl2ZXIKICAgICE9CiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ2CiAgICAvLyBkeW5fYXJyLmV4dGVuZChhcnIpCiAgICBsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ1CiAgICAvLyBkeW5fYXJyID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5Cb29sXSgpCiAgICBieXRlYyA0IC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDYKICAgIC8vIGR5bl9hcnIuZXh0ZW5kKGFycikKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDcKICAgIC8vIGFzc2VydCBkeW5fYXJyLmxlbmd0aCA9PSAyLCAiZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgiCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGR1cAogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0OAogICAgLy8gYXNzZXJ0IGR5bl9hcnIuYnl0ZXMubGVuZ3RoID09IDMsICJleHBlY3RlZCAzIGJ5dGVzIgogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDMgYnl0ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ5CiAgICAvLyBhc3NlcnQgZHluX2FyclswXSA9PSAoVHhuLnNlbmRlciA9PSBUeG4ucmVjZWl2ZXIpLCAiZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAwIgogICAgZHVwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMTYKICAgIGdldGJpdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgPT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE1MAogICAgLy8gYXNzZXJ0IGR5bl9hcnJbMV0gPT0gKFR4bi5zZW5kZXIgIT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMSIKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hpbnQgMTcKICAgIGdldGJpdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxCiAgICBpbnRjXzAgLy8gMAoKdGVzdF9hcmM0X2Jvb2xfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTMtMTU1CiAgICAvLyAjIG5vdGU6IG5vdCBzdXBwb3J0ZWQgY3VycmVudGx5CiAgICAvLyAjIGFycjIuZXh0ZW5kKGR5bl9hcnJheSkKICAgIC8vIGZvciBiIGluIGR5bl9hcnI6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2FyYzRfYm9vbF9hZnRlcl9mb3JANQogICAgZHVwbiAyCiAgICBpbnRjXzMgLy8gMTYKICAgICsKICAgIGRpZyA1CiAgICBzd2FwCiAgICBnZXRiaXQKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTYKICAgIC8vIGFycjIuYXBwZW5kKGIpCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FyYzRfYm9vbF9mb3JfaGVhZGVyQDIKCnRlc3RfYXJjNF9ib29sX2FmdGVyX2ZvckA1OgogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTU3CiAgICAvLyBhc3NlcnQgYXJyMi5sZW5ndGggPT0gNCwgImV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoIgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTgKICAgIC8vIGFzc2VydCBhcnIyWzBdID09IChUeG4uc2VuZGVyID09IFR4bi5yZWNlaXZlciksICJleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDAiCiAgICBkdXAKICAgIGV4dHJhY3QgMCAxIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICA9PQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTU5CiAgICAvLyBhc3NlcnQgYXJyMlsxXSA9PSAoVHhuLnNlbmRlciAhPSBUeG4ucmVjZWl2ZXIpLCAiZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxIgogICAgZHVwCiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2MAogICAgLy8gYXNzZXJ0IGFycjJbMl0gPT0gKFR4bi5zZW5kZXIgPT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMiIKICAgIGR1cAogICAgZXh0cmFjdCAyIDEgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG4gU2VuZGVyCiAgICB0eG4gUmVjZWl2ZXIKICAgID09CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjEKICAgIC8vIGFzc2VydCBhcnIyWzNdID09IChUeG4uc2VuZGVyICE9IFR4bi5yZWNlaXZlciksICJleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDMiCiAgICBleHRyYWN0IDMgMSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAzCiAgICBkaWcgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjMKICAgIC8vIHJldHVybiBhcnIuZnJlZXplKCkKICAgIGR1cAogICAgbGVuCiAgICBieXRlYyA0IC8vIDB4MDAwMAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYml0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QueHRyYSgpIC0+IHVpbnQ2NCwgdWludDY0LCBieXRlcywgYnl0ZXMsIGJ5dGVzOgp4dHJhOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjYKICAgIC8vIHNlbGYuY291bnQgKz0gMQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEyOAogICAgLy8gYT1UeG4ubnVtX2FwcF9hcmdzLAogICAgdHhuIE51bUFwcEFyZ3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTMwCiAgICAvLyBjPVR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEzMQogICAgLy8gZD1zZWxmLm1vcmUoKSwKICAgIGNhbGxzdWIgbW9yZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMzIKICAgIC8vIGU9QmlnVUludChzZWxmLmNvdW50KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3VudCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTI3LTEzMwogICAgLy8gcmV0dXJuIFh0cmEoCiAgICAvLyAgICAgYT1UeG4ubnVtX2FwcF9hcmdzLAogICAgLy8gICAgIGI9c2VsZi5jb3VudCwKICAgIC8vICAgICBjPVR4bi5zZW5kZXIsCiAgICAvLyAgICAgZD1zZWxmLm1vcmUoKSwKICAgIC8vICAgICBlPUJpZ1VJbnQoc2VsZi5jb3VudCksCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0Lm1vcmUoKSAtPiBieXRlczoKbW9yZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTM3CiAgICAvLyByZXR1cm4gTW9yZShmb289YXJjNC5VSW50NjQoc2VsZi5jb3VudCArIDEpLCBiYXI9YXJjNC5VSW50NjQoc2VsZi5jb3VudCAqIHNlbGYuY291bnQpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50IGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZGlnIDEKICAgIHVuY292ZXIgMgogICAgKgogICAgaXRvYgogICAgY29uY2F0CiAgICByZXRzdWIK","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAFAAEIEJABJgUABBUffHUFY291bnQBAAIAADEYQAADKiJnMRtBAEAxGRREMRhEggcEKNfBuAT6nLlzBGA5okAE+P1opwQfAo2xBAlrOlkEjW46JTYaAI4HAIEB+QI8Ak8CxgM4A2sAMRkUMRgUEEOKBAEoRwKL/CJZRwKL/ghJFlcGAIv8TFwATgJMgQcIJApJTwKBBwgkCklOAgxBAAyLBosFCa+LBExQjAQijACLAyUISYwCi/4IjAGLAosBDEEAIIv9iwBJTgJTiwSLAklOA08CVIwEIwiMAov/CIwAQv/YiwSMAIkiSShHBTYaATYaAhc2GgM2GgQXKiJniAOfiAOciAOZTw4WTw4WUE8NUE8MUEsLFYFADkSBQK9PDEsBq08CTFCAEAAAAAAAAAAAAAAAAAAAAABMUE8OFk8PTFBPDBZPDBZQTwtQTwpQSwkVgUAORE8JSwSrUFBQTwcWTwhMUE8HFk8HFlBPBlBPBVBLBBWBQA5ETwRPBKtQUFAiSYEDDEEAOUpJTgIhBAshBFhXEIBJJFtLAiMITEsBEkRMVzAQSVcACE8DgQIIFqhEVwgISwFLAgsWqERFAUL/wEsBSRUhBApJRQoWVwYCSwFQgAFhvEiAAWFMv1cAkElFC0lXAAhFCiRbRQYiRQUjRQNLAksIDEEAXEsBSwMhBAshBFhHAlcACEwkW0UGSwqkQQA2SwoiW0wiWwlFB0sDSwYMQQAcSwVLBAlLB0kLTEkLCJJLBQhFBUsCIwhFA0L/sEsDSwYJQv/hIltLCiJbCUUHQv/ISwQWKUxQsCNDNhoBSVcAEExXEBBMSwFQSRUlCkkjCSULSwJMJVhJTwQSREwWVwYCTwJQSSJZIwlLAVcCAEwlCyVYTwISRClMULAjQzYaAUkVJQoWVwYCTFApTFCwI0MoRwI2GgEXSShMIwgjSUsCDEEAGEcCgQIYFEsETCsiTwJUUEUEIwhFAUL/4UsCRwIVSwZJTgQSREsBUBVPAoECCxJEIkUHFUUHIkUFSwRLBwxBABpLAksFI1giU0EABksFIwhFBksEIwhFBUL/3ksFFilMULAjQyhHAjYaARdJKEwjCCNJSwIMQQAQRwIWSwRMUEUEIwhFAUL/6UsCFSQKSUUISwQSRCJFBiJFBUsESwcMQQAcSwJLBSQLJFgoqUEABksFIwhFBksEIwhFBUL/3CcESwNQSVcCABUkChZXBgJcAClMULAjQzYaAVcCAEkiTBUkCiJJSwIMQQAWSwNLAUlOAiQLW0sECEUEIwhFAUL/40sCFilMULAjQzEAMQcSKyJPAlQxADEHEysiTwJUUEcCFScESwJPAiSI/HxJTgJJIllJTgNJgQISREsBFYEDEkRJREsBJVMrIk8CVCJTMQAxBxISRCMNRIERUysiTwJUIlMxADEHExJEIklLAwxBABpHAiUISwVMUysiTwJUSwNMUEUDIwhFAUL/30sBSRWBBBJESVcAASJTMQAxBxISRElXAQEiUzEAMQcTEkRJVwIBIlMxADEHEhJEVwMBIlMxADEHExJESwRJFScETgIkiPvWKUxQsCNDIiplRCMIKksBZzEbMQCIAAoiKmVEFk8DTgSJIiplREkjCBZLAU8CCxZQiQ==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the StaticSizeContract contract - */ -export type StaticSizeContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'test_array(uint64,uint64,uint64,uint64)uint64': { - x1: bigint | number - y1: bigint | number - x2: bigint | number - y2: bigint | number - } - 'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': { - someMore: [[bigint | number, bigint | number], [bigint | number, bigint | number]] - } - 'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': { - someMore: [[bigint | number, bigint | number], [bigint | number, bigint | number]] - } - 'test_bool_array(uint64)uint64': { - length: bigint | number - } - 'test_arc4_conversion(uint64)uint64[]': { - length: bigint | number - } - 'sum_array(uint64[])uint64': { - arc4Arr: bigint[] | number[] - } - 'test_arc4_bool()bool[]': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'test_array(uint64,uint64,uint64,uint64)uint64': [x1: bigint | number, y1: bigint | number, x2: bigint | number, y2: bigint | number] - 'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': [someMore: [[bigint | number, bigint | number], [bigint | number, bigint | number]]] - 'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': [someMore: [[bigint | number, bigint | number], [bigint | number, bigint | number]]] - 'test_bool_array(uint64)uint64': [length: bigint | number] - 'test_arc4_conversion(uint64)uint64[]': [length: bigint | number] - 'sum_array(uint64[])uint64': [arc4Arr: bigint[] | number[]] - 'test_arc4_bool()bool[]': [] - } -} - -/** - * The return type for each method - */ -export type StaticSizeContractReturns = { - 'test_array(uint64,uint64,uint64,uint64)uint64': bigint - 'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': [bigint, bigint][] - 'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': [bigint, bigint][] - 'test_bool_array(uint64)uint64': bigint - 'test_arc4_conversion(uint64)uint64[]': bigint[] - 'sum_array(uint64[])uint64': bigint - 'test_arc4_bool()bool[]': boolean[] -} - -/** - * Defines the types of available calls and state of the StaticSizeContract smart contract. - */ -export type StaticSizeContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'test_array(uint64,uint64,uint64,uint64)uint64' | 'test_array', { - argsObj: StaticSizeContractArgs['obj']['test_array(uint64,uint64,uint64,uint64)uint64'] - argsTuple: StaticSizeContractArgs['tuple']['test_array(uint64,uint64,uint64,uint64)uint64'] - returns: StaticSizeContractReturns['test_array(uint64,uint64,uint64,uint64)uint64'] - }> - & Record<'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]' | 'test_extend_from_tuple', { - argsObj: StaticSizeContractArgs['obj']['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] - argsTuple: StaticSizeContractArgs['tuple']['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] - returns: StaticSizeContractReturns['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] - }> - & Record<'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]' | 'test_extend_from_arc4_tuple', { - argsObj: StaticSizeContractArgs['obj']['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] - argsTuple: StaticSizeContractArgs['tuple']['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] - returns: StaticSizeContractReturns['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] - }> - & Record<'test_bool_array(uint64)uint64' | 'test_bool_array', { - argsObj: StaticSizeContractArgs['obj']['test_bool_array(uint64)uint64'] - argsTuple: StaticSizeContractArgs['tuple']['test_bool_array(uint64)uint64'] - returns: StaticSizeContractReturns['test_bool_array(uint64)uint64'] - }> - & Record<'test_arc4_conversion(uint64)uint64[]' | 'test_arc4_conversion', { - argsObj: StaticSizeContractArgs['obj']['test_arc4_conversion(uint64)uint64[]'] - argsTuple: StaticSizeContractArgs['tuple']['test_arc4_conversion(uint64)uint64[]'] - returns: StaticSizeContractReturns['test_arc4_conversion(uint64)uint64[]'] - }> - & Record<'sum_array(uint64[])uint64' | 'sum_array', { - argsObj: StaticSizeContractArgs['obj']['sum_array(uint64[])uint64'] - argsTuple: StaticSizeContractArgs['tuple']['sum_array(uint64[])uint64'] - returns: StaticSizeContractReturns['sum_array(uint64[])uint64'] - }> - & Record<'test_arc4_bool()bool[]' | 'test_arc4_bool', { - argsObj: StaticSizeContractArgs['obj']['test_arc4_bool()bool[]'] - argsTuple: StaticSizeContractArgs['tuple']['test_arc4_bool()bool[]'] - returns: StaticSizeContractReturns['test_arc4_bool()bool[]'] - }> - /** - * Defines the shape of the state of the application. - */ - state: { - global: { - keys: { - count: bigint - } - maps: {} - } - } -} - -/** - * Defines the possible abi call signatures. - */ -export type StaticSizeContractSignatures = keyof StaticSizeContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type StaticSizeContractNonVoidMethodSignatures = keyof StaticSizeContractTypes['methods'] extends infer T ? T extends keyof StaticSizeContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the StaticSizeContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = StaticSizeContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the StaticSizeContract smart contract to the method's return type - */ -export type MethodReturn = StaticSizeContractTypes['methods'][TSignature]['returns'] - -/** - * Defines the shape of the keyed global state of the application. - */ -export type GlobalKeysState = StaticSizeContractTypes['state']['global']['keys'] - - -/** - * Defines supported create method params for this smart contract - */ -export type StaticSizeContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type StaticSizeContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: StaticSizeContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the StaticSizeContract smart contract - */ -export abstract class StaticSizeContractParamsFactory { - /** - * Constructs a no op call for the test_array(uint64,uint64,uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_array(uint64,uint64,uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.x1, params.args.y1, params.args.x2, params.args.y2], - } - } - /** - * Constructs a no op call for the test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testExtendFromTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.someMore], - } - } - /** - * Constructs a no op call for the test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testExtendFromArc4Tuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.someMore], - } - } - /** - * Constructs a no op call for the test_bool_array(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testBoolArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_bool_array(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.length], - } - } - /** - * Constructs a no op call for the test_arc4_conversion(uint64)uint64[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testArc4Conversion(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_arc4_conversion(uint64)uint64[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.length], - } - } - /** - * Constructs a no op call for the sum_array(uint64[])uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static sumArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'sum_array(uint64[])uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.arc4Arr], - } - } - /** - * Constructs a no op call for the test_arc4_bool()bool[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_arc4_bool()bool[]' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } -} - -/** - * A factory to create and deploy one or more instance of the StaticSizeContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class StaticSizeContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `StaticSizeContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new StaticSizeContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new StaticSizeContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the StaticSizeContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: StaticSizeContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new StaticSizeContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StaticSizeContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StaticSizeContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StaticSizeContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new StaticSizeContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the StaticSizeContract smart contract - */ -export class StaticSizeContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `StaticSizeContractClient` - * - * @param appClient An `AppClient` instance which has been created with the StaticSizeContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `StaticSizeContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `StaticSizeContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new StaticSizeContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `StaticSizeContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new StaticSizeContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the StaticSizeContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_array(uint64,uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StaticSizeContractParamsFactory.testArray(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testExtendFromTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StaticSizeContractParamsFactory.testExtendFromTuple(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testExtendFromArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StaticSizeContractParamsFactory.testExtendFromArc4Tuple(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_bool_array(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testBoolArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StaticSizeContractParamsFactory.testBoolArray(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_arc4_conversion(uint64)uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testArc4Conversion: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StaticSizeContractParamsFactory.testArc4Conversion(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `sum_array(uint64[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - sumArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StaticSizeContractParamsFactory.sumArray(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_arc4_bool()bool[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(StaticSizeContractParamsFactory.testArc4Bool(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the StaticSizeContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_array(uint64,uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testArray(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testExtendFromTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testExtendFromTuple(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testExtendFromArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testExtendFromArc4Tuple(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_bool_array(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testBoolArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testBoolArray(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_arc4_conversion(uint64)uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testArc4Conversion: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testArc4Conversion(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `sum_array(uint64[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - sumArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.sumArray(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_arc4_bool()bool[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testArc4Bool(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the StaticSizeContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_array(uint64,uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testArray(params)) - return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_array(uint64,uint64,uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testExtendFromTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testExtendFromTuple(params)) - return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'])} - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testExtendFromArc4Tuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testExtendFromArc4Tuple(params)) - return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'])} - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_bool_array(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testBoolArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testBoolArray(params)) - return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_bool_array(uint64)uint64'])} - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_arc4_conversion(uint64)uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testArc4Conversion: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testArc4Conversion(params)) - return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_arc4_conversion(uint64)uint64[]'])} - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `sum_array(uint64[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - sumArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StaticSizeContractParamsFactory.sumArray(params)) - return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['sum_array(uint64[])uint64'])} - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_arc4_bool()bool[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testArc4Bool(params)) - return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_arc4_bool()bool[]'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new StaticSizeContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current StaticSizeContract app - */ - state = { - /** - * Methods to access global state for the current StaticSizeContract app - */ - global: { - /** - * Get all current keyed values from global state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.global.getAll() - return { - count: result.count, - } - }, - /** - * Get the current value of the count key in global state - */ - count: async (): Promise => { return (await this.appClient.state.global.getValue("count")) as bigint | undefined }, - }, - } - - public newGroup(composerConfig?: TransactionComposerConfig): StaticSizeContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a test_array(uint64,uint64,uint64,uint64)uint64 method call against the StaticSizeContract contract - */ - testArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testArray(params))) - return this - }, - /** - * Add a test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] method call against the StaticSizeContract contract - */ - testExtendFromTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testExtendFromTuple(params))) - return this - }, - /** - * Add a test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] method call against the StaticSizeContract contract - */ - testExtendFromArc4Tuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testExtendFromArc4Tuple(params))) - return this - }, - /** - * Add a test_bool_array(uint64)uint64 method call against the StaticSizeContract contract - */ - testBoolArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBoolArray(params))) - return this - }, - /** - * Add a test_arc4_conversion(uint64)uint64[] method call against the StaticSizeContract contract - */ - testArc4Conversion(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testArc4Conversion(params))) - return this - }, - /** - * Add a sum_array(uint64[])uint64 method call against the StaticSizeContract contract - */ - sumArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sumArray(params))) - return this - }, - /** - * Add a test_arc4_bool()bool[] method call against the StaticSizeContract contract - */ - testArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testArc4Bool(params))) - return this - }, - /** - * Add a clear state call to the StaticSizeContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as StaticSizeContractComposer - } -} -export type StaticSizeContractComposer = { - /** - * Calls the test_array(uint64,uint64,uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testArray(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_array(uint64,uint64,uint64,uint64)uint64'] | undefined]> - - /** - * Calls the test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testExtendFromTuple(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] | undefined]> - - /** - * Calls the test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testExtendFromArc4Tuple(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] | undefined]> - - /** - * Calls the test_bool_array(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testBoolArray(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_bool_array(uint64)uint64'] | undefined]> - - /** - * Calls the test_arc4_conversion(uint64)uint64[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testArc4Conversion(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_arc4_conversion(uint64)uint64[]'] | undefined]> - - /** - * Calls the sum_array(uint64[])uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - sumArray(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['sum_array(uint64[])uint64'] | undefined]> - - /** - * Calls the test_arc4_bool()bool[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testArc4Bool(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_arc4_bool()bool[]'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the StaticSizeContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): StaticSizeContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): StaticSizeContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type StaticSizeContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/TuplesContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/TuplesContract.ts deleted file mode 100644 index 1e2fe54..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/TuplesContract.ts +++ /dev/null @@ -1,558 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"TuplesContract","structs":{},"methods":[{"name":"test_tuple_with_primitive_type","args":[],"returns":{"type":"(uint64,bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9UdXBsZXMvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgVHVwbGVzQ29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHg3MjI5ZDc5YSAvLyBtZXRob2QgInRlc3RfdHVwbGVfd2l0aF9wcmltaXRpdmVfdHlwZSgpKHVpbnQ2NCxib29sKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdF90dXBsZV93aXRoX3ByaW1pdGl2ZV90eXBlX3JvdXRlQDMKICAgIGVycgoKbWFpbl90ZXN0X3R1cGxlX3dpdGhfcHJpbWl0aXZlX3R5cGVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9UdXBsZXMvY29udHJhY3QucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDAwMDA4MAogICAgbG9nCiAgICBwdXNoaW50IDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAogARyKdeaNhoAjgEAAQAxGRQxGBBEgA0VH3x1AAAAAAAAAACAsIEBQzEZFDEYFBBD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the TuplesContract contract - */ -export type TuplesContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'test_tuple_with_primitive_type()(uint64,bool)': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'test_tuple_with_primitive_type()(uint64,bool)': [] - } -} - -/** - * The return type for each method - */ -export type TuplesContractReturns = { - 'test_tuple_with_primitive_type()(uint64,bool)': [bigint, boolean] -} - -/** - * Defines the types of available calls and state of the TuplesContract smart contract. - */ -export type TuplesContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'test_tuple_with_primitive_type()(uint64,bool)' | 'test_tuple_with_primitive_type', { - argsObj: TuplesContractArgs['obj']['test_tuple_with_primitive_type()(uint64,bool)'] - argsTuple: TuplesContractArgs['tuple']['test_tuple_with_primitive_type()(uint64,bool)'] - returns: TuplesContractReturns['test_tuple_with_primitive_type()(uint64,bool)'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type TuplesContractSignatures = keyof TuplesContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type TuplesContractNonVoidMethodSignatures = keyof TuplesContractTypes['methods'] extends infer T ? T extends keyof TuplesContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the TuplesContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = TuplesContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the TuplesContract smart contract to the method's return type - */ -export type MethodReturn = TuplesContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type TuplesContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type TuplesContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: TuplesContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the TuplesContract smart contract - */ -export abstract class TuplesContractParamsFactory { - /** - * Constructs a no op call for the test_tuple_with_primitive_type()(uint64,bool) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testTupleWithPrimitiveType(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_tuple_with_primitive_type()(uint64,bool)' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } -} - -/** - * A factory to create and deploy one or more instance of the TuplesContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class TuplesContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `TuplesContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new TuplesContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new TuplesContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the TuplesContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: TuplesContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new TuplesContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the TuplesContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the TuplesContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the TuplesContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new TuplesContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the TuplesContract smart contract - */ -export class TuplesContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `TuplesContractClient` - * - * @param appClient An `AppClient` instance which has been created with the TuplesContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `TuplesContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `TuplesContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new TuplesContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `TuplesContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new TuplesContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the TuplesContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the TuplesContract smart contract using the `test_tuple_with_primitive_type()(uint64,bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testTupleWithPrimitiveType: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(TuplesContractParamsFactory.testTupleWithPrimitiveType(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the TuplesContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the TuplesContract smart contract using the `test_tuple_with_primitive_type()(uint64,bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testTupleWithPrimitiveType: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(TuplesContractParamsFactory.testTupleWithPrimitiveType(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the TuplesContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the TuplesContract smart contract using the `test_tuple_with_primitive_type()(uint64,bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testTupleWithPrimitiveType: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(TuplesContractParamsFactory.testTupleWithPrimitiveType(params)) - return {...result, return: result.return as unknown as (undefined | TuplesContractReturns['test_tuple_with_primitive_type()(uint64,bool)'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new TuplesContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current TuplesContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): TuplesContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a test_tuple_with_primitive_type()(uint64,bool) method call against the TuplesContract contract - */ - testTupleWithPrimitiveType(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testTupleWithPrimitiveType(params))) - return this - }, - /** - * Add a clear state call to the TuplesContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as TuplesContractComposer - } -} -export type TuplesContractComposer = { - /** - * Calls the test_tuple_with_primitive_type()(uint64,bool) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testTupleWithPrimitiveType(params?: CallParams): TuplesContractComposer<[...TReturns, TuplesContractReturns['test_tuple_with_primitive_type()(uint64,bool)'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the TuplesContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): TuplesContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): TuplesContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type TuplesContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/VerifierContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/VerifierContract.ts deleted file mode 100644 index 9633b90..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/VerifierContract.ts +++ /dev/null @@ -1,554 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"VerifierContract","structs":{},"methods":[{"name":"verify","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[56],"errorMessage":"Txn must be pay"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvdmVyaWZpZXIucHk6MTEKICAgIC8vIGNsYXNzIFZlcmlmaWVyQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweDY1YTlhZWNjIC8vIG1ldGhvZCAidmVyaWZ5KCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl92ZXJpZnlfcm91dGVAMwogICAgZXJyCgptYWluX3ZlcmlmeV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC92ZXJpZmllci5weToxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiB2ZXJpZnkKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLmR5bmFtaWNfaXR4bl9ncm91cC52ZXJpZmllci5WZXJpZmllckNvbnRyYWN0LnZlcmlmeVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvdmVyaWZpZXIucHk6MTQKICAgIC8vIGZvciBpIGluIHVyYW5nZShUeG4uZ3JvdXBfaW5kZXgpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIHB1c2hpbnQgMAoKdmVyaWZ5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvdmVyaWZpZXIucHk6MTQKICAgIC8vIGZvciBpIGluIHVyYW5nZShUeG4uZ3JvdXBfaW5kZXgpOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogdmVyaWZ5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL3ZlcmlmaWVyLnB5OjE2CiAgICAvLyBhc3NlcnQgdHhuLnR5cGUgPT0gVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQsICJUeG4gbXVzdCBiZSBwYXkiCiAgICBkdXBuIDIKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIFR4biBtdXN0IGJlIHBheQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC92ZXJpZmllci5weToxNAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKFR4bi5ncm91cF9pbmRleCk6CiAgICBwdXNoaW50IDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB2ZXJpZnlfZm9yX2hlYWRlckAyCgp2ZXJpZnlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL3ZlcmlmaWVyLnB5OjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgARlqa7MNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEMxFoEASUsCDEEAEEcCOBCBARJEgQEIRQFC/+mBAUM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the VerifierContract contract - */ -export type VerifierContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify()void': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify()void': [] - } -} - -/** - * The return type for each method - */ -export type VerifierContractReturns = { - 'verify()void': void -} - -/** - * Defines the types of available calls and state of the VerifierContract smart contract. - */ -export type VerifierContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify()void' | 'verify', { - argsObj: VerifierContractArgs['obj']['verify()void'] - argsTuple: VerifierContractArgs['tuple']['verify()void'] - returns: VerifierContractReturns['verify()void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type VerifierContractSignatures = keyof VerifierContractTypes['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the VerifierContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = VerifierContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the VerifierContract smart contract to the method's return type - */ -export type MethodReturn = VerifierContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type VerifierContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type VerifierContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: VerifierContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the VerifierContract smart contract - */ -export abstract class VerifierContractParamsFactory { - /** - * Constructs a no op call for the verify()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } -} - -/** - * A factory to create and deploy one or more instance of the VerifierContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class VerifierContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `VerifierContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new VerifierContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new VerifierContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the VerifierContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: VerifierContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new VerifierContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the VerifierContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the VerifierContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the VerifierContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new VerifierContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the VerifierContract smart contract - */ -export class VerifierContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `VerifierContractClient` - * - * @param appClient An `AppClient` instance which has been created with the VerifierContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `VerifierContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `VerifierContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new VerifierContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `VerifierContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new VerifierContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the VerifierContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the VerifierContract smart contract using the `verify()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(VerifierContractParamsFactory.verify(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the VerifierContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the VerifierContract smart contract using the `verify()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(VerifierContractParamsFactory.verify(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the VerifierContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the VerifierContract smart contract using the `verify()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(VerifierContractParamsFactory.verify(params)) - return {...result, return: result.return as unknown as (undefined | VerifierContractReturns['verify()void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new VerifierContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current VerifierContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): VerifierContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify()void method call against the VerifierContract contract - */ - verify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verify(params))) - return this - }, - /** - * Add a clear state call to the VerifierContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as VerifierContractComposer - } -} -export type VerifierContractComposer = { - /** - * Calls the verify()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verify(params?: CallParams): VerifierContractComposer<[...TReturns, VerifierContractReturns['verify()void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the VerifierContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): VerifierContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): VerifierContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type VerifierContractComposerResults = Expand - diff --git a/examples/p-tls/.algokit/.copier-answers.yml b/examples/p-tls/.algokit/.copier-answers.yml index f4161b3..b563fb3 100644 --- a/examples/p-tls/.algokit/.copier-answers.yml +++ b/examples/p-tls/.algokit/.copier-answers.yml @@ -1,6 +1,6 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: -_src_path: +_commit: 2.1.8-8-g954a453 +_src_path: .. author_email: None author_name: None cloud_provider: netlify diff --git a/examples/p-tls/projects/p-tls-contracts/contracts/clients/CalculatorClient.ts b/examples/p-tls/projects/p-tls-contracts/contracts/clients/CalculatorClient.ts deleted file mode 100644 index ef4d4eb..0000000 --- a/examples/p-tls/projects/p-tls-contracts/contracts/clients/CalculatorClient.ts +++ /dev/null @@ -1,742 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^7 - */ -import { AlgorandClientInterface } from '@algorandfoundation/algokit-utils/types/algorand-client-interface' -import { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app' -import { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56' -import { - AppClient as _AppClient, - AppClientMethodCallParams, - AppClientParams, - AppClientBareCallParams, - CallOnComplete, - AppClientCompilationParams, - ResolveAppClientByCreatorAndName, - ResolveAppClientByNetwork, - CloneAppClientParams, -} from '@algorandfoundation/algokit-utils/types/app-client' -import { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer' -import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' -import SimulateResponse = modelsv2.SimulateResponse - -export const APP_SPEC: Arc56Contract = {"name":"Calculator","desc":"","methods":[{"name":"doMath","desc":"A method that takes two numbers and does either addition or subtraction","args":[{"name":"a","type":"uint64","desc":"The first uint64"},{"name":"b","type":"uint64","desc":"The second uint64"},{"name":"operation","type":"string","desc":"The operation to perform. Can be either 'sum' or 'difference'"}],"returns":{"type":"uint64","desc":"The result of the operation"},"actions":{"create":[],"call":["NoOp"]}},{"name":"hello","desc":"A demonstration method used in the AlgoKit fullstack template.\nGreets the user by name.","args":[{"name":"name","type":"string","desc":"The name of the user to greet."}],"returns":{"type":"string","desc":"A greeting message to the user."},"actions":{"create":[],"call":["NoOp"]}},{"name":"createApplication","args":[],"returns":{"type":"void"},"actions":{"create":["NoOp"],"call":[]}}],"arcs":[4,56],"structs":{},"state":{"schema":{"global":{"bytes":0,"ints":0},"local":{"bytes":0,"ints":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":[],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"teal":1,"source":"contracts/Calculator.algo.ts:3","pc":[0]},{"teal":2,"source":"contracts/Calculator.algo.ts:3","pc":[1,2,3]},{"teal":3,"source":"contracts/Calculator.algo.ts:3","pc":[4,5,6,7,8,9,10]},{"teal":15,"source":"contracts/Calculator.algo.ts:3","pc":[11,12]},{"teal":16,"source":"contracts/Calculator.algo.ts:3","pc":[13]},{"teal":17,"source":"contracts/Calculator.algo.ts:3","pc":[14,15]},{"teal":18,"source":"contracts/Calculator.algo.ts:3","pc":[16]},{"teal":19,"source":"contracts/Calculator.algo.ts:3","pc":[17,18]},{"teal":20,"source":"contracts/Calculator.algo.ts:3","pc":[19]},{"teal":21,"source":"contracts/Calculator.algo.ts:3","pc":[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]},{"teal":25,"source":"contracts/Calculator.algo.ts:3","errorMessage":"The requested action is not implemented in this contract. Are you using the correct OnComplete? Did you set your app ID?","pc":[46]},{"teal":35,"source":"contracts/Calculator.algo.ts:11","pc":[47,48,49]},{"teal":39,"source":"contracts/Calculator.algo.ts:12","pc":[50,51]},{"teal":40,"source":"contracts/Calculator.algo.ts:12","pc":[52,53]},{"teal":41,"source":"contracts/Calculator.algo.ts:12","pc":[54]},{"teal":42,"source":"contracts/Calculator.algo.ts:11","pc":[55]},{"teal":52,"source":"contracts/Calculator.algo.ts:22","pc":[56,57,58]},{"teal":56,"source":"contracts/Calculator.algo.ts:23","pc":[59,60]},{"teal":57,"source":"contracts/Calculator.algo.ts:23","pc":[61,62]},{"teal":58,"source":"contracts/Calculator.algo.ts:23","pc":[63]},{"teal":59,"source":"contracts/Calculator.algo.ts:23","pc":[64,65,66]},{"teal":60,"source":"contracts/Calculator.algo.ts:23","pc":[67,68]},{"teal":61,"source":"contracts/Calculator.algo.ts:23","pc":[69,70]},{"teal":62,"source":"contracts/Calculator.algo.ts:23","pc":[71]},{"teal":63,"source":"contracts/Calculator.algo.ts:23","pc":[72,73,74]},{"teal":66,"source":"contracts/Calculator.algo.ts:23","pc":[75,76]},{"teal":67,"source":"contracts/Calculator.algo.ts:23","pc":[77,78]},{"teal":68,"source":"contracts/Calculator.algo.ts:23","pc":[79]},{"teal":71,"source":"contracts/Calculator.algo.ts:22","pc":[80]},{"teal":76,"source":"contracts/Calculator.algo.ts:35","pc":[81]},{"teal":79,"source":"contracts/Calculator.algo.ts:35","pc":[82,83,84]},{"teal":80,"source":"contracts/Calculator.algo.ts:35","pc":[85,86,87]},{"teal":83,"source":"contracts/Calculator.algo.ts:35","pc":[88,89,90]},{"teal":84,"source":"contracts/Calculator.algo.ts:35","pc":[91]},{"teal":87,"source":"contracts/Calculator.algo.ts:35","pc":[92,93,94]},{"teal":88,"source":"contracts/Calculator.algo.ts:35","pc":[95]},{"teal":91,"source":"contracts/Calculator.algo.ts:35","pc":[96,97,98]},{"teal":92,"source":"contracts/Calculator.algo.ts:35","pc":[99]},{"teal":93,"source":"contracts/Calculator.algo.ts:35","pc":[100]},{"teal":94,"source":"contracts/Calculator.algo.ts:35","pc":[101]},{"teal":95,"source":"contracts/Calculator.algo.ts:35","pc":[102]},{"teal":96,"source":"contracts/Calculator.algo.ts:35","pc":[103]},{"teal":108,"source":"contracts/Calculator.algo.ts:35","pc":[104,105,106]},{"teal":111,"source":"contracts/Calculator.algo.ts:35","pc":[107,108]},{"teal":116,"source":"contracts/Calculator.algo.ts:38","pc":[109,110]},{"teal":117,"source":"contracts/Calculator.algo.ts:38","pc":[111,112,113,114,115]},{"teal":118,"source":"contracts/Calculator.algo.ts:38","pc":[116]},{"teal":119,"source":"contracts/Calculator.algo.ts:38","pc":[117,118,119]},{"teal":124,"source":"contracts/Calculator.algo.ts:39","pc":[120,121]},{"teal":125,"source":"contracts/Calculator.algo.ts:39","pc":[122,123]},{"teal":126,"source":"contracts/Calculator.algo.ts:39","pc":[124,125,126]},{"teal":127,"source":"contracts/Calculator.algo.ts:39","pc":[127,128]},{"teal":128,"source":"contracts/Calculator.algo.ts:38","pc":[129,130,131]},{"teal":133,"source":"contracts/Calculator.algo.ts:40","pc":[132,133]},{"teal":134,"source":"contracts/Calculator.algo.ts:40","pc":[134,135,136,137,138,139,140,141,142,143,144,145]},{"teal":135,"source":"contracts/Calculator.algo.ts:40","pc":[146]},{"teal":136,"source":"contracts/Calculator.algo.ts:40","pc":[147,148,149]},{"teal":141,"source":"contracts/Calculator.algo.ts:41","pc":[150,151]},{"teal":142,"source":"contracts/Calculator.algo.ts:41","pc":[152,153]},{"teal":143,"source":"contracts/Calculator.algo.ts:41","pc":[154,155,156]},{"teal":144,"source":"contracts/Calculator.algo.ts:41","pc":[157,158]},{"teal":145,"source":"contracts/Calculator.algo.ts:40","pc":[159,160,161]},{"teal":149,"source":"contracts/Calculator.algo.ts:42","errorMessage":"Invalid operation","pc":[162]},{"teal":154,"source":"contracts/Calculator.algo.ts:44","pc":[163,164]},{"teal":157,"source":"contracts/Calculator.algo.ts:35","pc":[165,166]},{"teal":158,"source":"contracts/Calculator.algo.ts:35","pc":[167]},{"teal":163,"source":"contracts/Calculator.algo.ts:54","pc":[168]},{"teal":166,"source":"contracts/Calculator.algo.ts:54","pc":[169,170,171]},{"teal":167,"source":"contracts/Calculator.algo.ts:54","pc":[172,173,174]},{"teal":170,"source":"contracts/Calculator.algo.ts:54","pc":[175,176,177]},{"teal":171,"source":"contracts/Calculator.algo.ts:54","pc":[178]},{"teal":172,"source":"contracts/Calculator.algo.ts:54","pc":[179]},{"teal":173,"source":"contracts/Calculator.algo.ts:54","pc":[180]},{"teal":174,"source":"contracts/Calculator.algo.ts:54","pc":[181,182,183]},{"teal":175,"source":"contracts/Calculator.algo.ts:54","pc":[184]},{"teal":176,"source":"contracts/Calculator.algo.ts:54","pc":[185]},{"teal":177,"source":"contracts/Calculator.algo.ts:54","pc":[186]},{"teal":178,"source":"contracts/Calculator.algo.ts:54","pc":[187]},{"teal":179,"source":"contracts/Calculator.algo.ts:54","pc":[188]},{"teal":180,"source":"contracts/Calculator.algo.ts:54","pc":[189]},{"teal":190,"source":"contracts/Calculator.algo.ts:54","pc":[190,191,192]},{"teal":194,"source":"contracts/Calculator.algo.ts:55","pc":[193,194,195,196,197,198,199,200,201]},{"teal":195,"source":"contracts/Calculator.algo.ts:55","pc":[202,203]},{"teal":196,"source":"contracts/Calculator.algo.ts:55","pc":[204]},{"teal":197,"source":"contracts/Calculator.algo.ts:54","pc":[205]},{"teal":200,"source":"contracts/Calculator.algo.ts:3","pc":[206]},{"teal":201,"source":"contracts/Calculator.algo.ts:3","pc":[207]},{"teal":204,"source":"contracts/Calculator.algo.ts:3","pc":[208,209,210,211,212,213]},{"teal":205,"source":"contracts/Calculator.algo.ts:3","pc":[214,215,216]},{"teal":206,"source":"contracts/Calculator.algo.ts:3","pc":[217,218,219,220]},{"teal":209,"source":"contracts/Calculator.algo.ts:3","errorMessage":"this contract does not implement the given ABI method for create NoOp","pc":[221]},{"teal":212,"source":"contracts/Calculator.algo.ts:3","pc":[222,223,224,225,226,227]},{"teal":213,"source":"contracts/Calculator.algo.ts:3","pc":[228,229,230,231,232,233]},{"teal":214,"source":"contracts/Calculator.algo.ts:3","pc":[234,235,236]},{"teal":215,"source":"contracts/Calculator.algo.ts:3","pc":[237,238,239,240,241,242]},{"teal":218,"source":"contracts/Calculator.algo.ts:3","errorMessage":"this contract does not implement the given ABI method for call NoOp","pc":[243]}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCmludGNibG9jayAxCmJ5dGVjYmxvY2sgMHgxNTFmN2M3NQoKLy8gVGhpcyBURUFMIHdhcyBnZW5lcmF0ZWQgYnkgVEVBTFNjcmlwdCB2MC4xMDcuMQovLyBodHRwczovL2dpdGh1Yi5jb20vYWxnb3JhbmRmb3VuZGF0aW9uL1RFQUxTY3JpcHQKCi8vIFRoaXMgY29udHJhY3QgaXMgY29tcGxpYW50IHdpdGggYW5kL29yIGltcGxlbWVudHMgdGhlIGZvbGxvd2luZyBBUkNzOiBbIEFSQzQgXQoKLy8gVGhlIGZvbGxvd2luZyB0ZW4gbGluZXMgb2YgVEVBTCBoYW5kbGUgaW5pdGlhbCBwcm9ncmFtIGZsb3cKLy8gVGhpcyBwYXR0ZXJuIGlzIHVzZWQgdG8gbWFrZSBpdCBlYXN5IGZvciBhbnlvbmUgdG8gcGFyc2UgdGhlIHN0YXJ0IG9mIHRoZSBwcm9ncmFtIGFuZCBkZXRlcm1pbmUgaWYgYSBzcGVjaWZpYyBhY3Rpb24gaXMgYWxsb3dlZAovLyBIZXJlLCBhY3Rpb24gcmVmZXJzIHRvIHRoZSBPbkNvbXBsZXRlIGluIGNvbWJpbmF0aW9uIHdpdGggd2hldGhlciB0aGUgYXBwIGlzIGJlaW5nIGNyZWF0ZWQgb3IgY2FsbGVkCi8vIEV2ZXJ5IHBvc3NpYmxlIGFjdGlvbiBmb3IgdGhpcyBjb250cmFjdCBpcyByZXByZXNlbnRlZCBpbiB0aGUgc3dpdGNoIHN0YXRlbWVudAovLyBJZiB0aGUgYWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgY29udHJhY3QsIGl0cyByZXNwZWN0aXZlIGJyYW5jaCB3aWxsIGJlICIqTk9UX0lNUExFTUVOVEVEIiB3aGljaCBqdXN0IGNvbnRhaW5zICJlcnIiCnR4biBBcHBsaWNhdGlvbklECiEKcHVzaGludCA2CioKdHhuIE9uQ29tcGxldGlvbgorCnN3aXRjaCAqY2FsbF9Ob09wICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqY3JlYXRlX05vT3AgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVECgoqTk9UX0lNUExFTUVOVEVEOgoJLy8gVGhlIHJlcXVlc3RlZCBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoaXMgY29udHJhY3QuIEFyZSB5b3UgdXNpbmcgdGhlIGNvcnJlY3QgT25Db21wbGV0ZT8gRGlkIHlvdSBzZXQgeW91ciBhcHAgSUQ/CgllcnIKCi8vIGdldFN1bShhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NAovLwovLyBDYWxjdWxhdGVzIHRoZSBzdW0gb2YgdHdvIG51bWJlcnMKLy8KLy8gQHBhcmFtIGEKLy8gQHBhcmFtIGIKLy8gQHJldHVybnMgVGhlIHN1bSBvZiBhIGFuZCBiCmdldFN1bToKCXByb3RvIDIgMQoKCS8vIGNvbnRyYWN0cy9DYWxjdWxhdG9yLmFsZ28udHM6MTIKCS8vIHJldHVybiBhICsgYjsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCSsKCXJldHN1YgoKLy8gZ2V0RGlmZmVyZW5jZShhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NAovLwovLyBDYWxjdWxhdGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIG51bWJlcnMKLy8KLy8gQHBhcmFtIGEKLy8gQHBhcmFtIGIKLy8gQHJldHVybnMgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGFuZCBiLgpnZXREaWZmZXJlbmNlOgoJcHJvdG8gMiAxCgoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czoyMwoJLy8gcmV0dXJuIGEgPj0gYiA/IGEgLSBiIDogYiAtIGE7CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0Cgk+PQoJYnogKnRlcm5hcnkwX2ZhbHNlCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0CgktCgliICp0ZXJuYXJ5MF9lbmQKCip0ZXJuYXJ5MF9mYWxzZToKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCS0KCip0ZXJuYXJ5MF9lbmQ6CglyZXRzdWIKCi8vIGRvTWF0aCh1aW50NjQsdWludDY0LHN0cmluZyl1aW50NjQKKmFiaV9yb3V0ZV9kb01hdGg6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGVjIDAgLy8gMHgxNTFmN2M3NQoKCS8vIG9wZXJhdGlvbjogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglleHRyYWN0IDIgMAoKCS8vIGI6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJYnRvaQoKCS8vIGE6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZG9NYXRoKHVpbnQ2NCx1aW50NjQsc3RyaW5nKXVpbnQ2NAoJY2FsbHN1YiBkb01hdGgKCWl0b2IKCWNvbmNhdAoJbG9nCglpbnRjIDAgLy8gMQoJcmV0dXJuCgovLyBkb01hdGgoYTogdWludDY0LCBiOiB1aW50NjQsIG9wZXJhdGlvbjogc3RyaW5nKTogdWludDY0Ci8vCi8vIEEgbWV0aG9kIHRoYXQgdGFrZXMgdHdvIG51bWJlcnMgYW5kIGRvZXMgZWl0aGVyIGFkZGl0aW9uIG9yIHN1YnRyYWN0aW9uCi8vCi8vIEBwYXJhbSBhIFRoZSBmaXJzdCB1aW50NjQKLy8gQHBhcmFtIGIgVGhlIHNlY29uZCB1aW50NjQKLy8gQHBhcmFtIG9wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0uIENhbiBiZSBlaXRoZXIgJ3N1bScgb3IgJ2RpZmZlcmVuY2UnCi8vCi8vIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbgpkb01hdGg6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJcHVzaGJ5dGVzIDB4CgoJLy8gKmlmMF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy9DYWxjdWxhdG9yLmFsZ28udHM6MzgKCS8vIG9wZXJhdGlvbiA9PT0gJ3N1bScKCWZyYW1lX2RpZyAtMyAvLyBvcGVyYXRpb246IHN0cmluZwoJcHVzaGJ5dGVzIDB4NzM3NTZkIC8vICJzdW0iCgk9PQoJYnogKmlmMF9lbHNlaWYxX2NvbmRpdGlvbgoKCS8vICppZjBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czozOQoJLy8gcmVzdWx0ID0gdGhpcy5nZXRTdW0oYSwgYikKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCWNhbGxzdWIgZ2V0U3VtCglmcmFtZV9idXJ5IDAgLy8gcmVzdWx0OiB1aW50NjQKCWIgKmlmMF9lbmQKCippZjBfZWxzZWlmMV9jb25kaXRpb246CgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjQwCgkvLyBvcGVyYXRpb24gPT09ICdkaWZmZXJlbmNlJwoJZnJhbWVfZGlnIC0zIC8vIG9wZXJhdGlvbjogc3RyaW5nCglwdXNoYnl0ZXMgMHg2NDY5NjY2NjY1NzI2NTZlNjM2NSAvLyAiZGlmZmVyZW5jZSIKCT09CglieiAqaWYwX2Vsc2UKCgkvLyAqaWYwX2Vsc2VpZjFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czo0MQoJLy8gcmVzdWx0ID0gdGhpcy5nZXREaWZmZXJlbmNlKGEsIGIpCglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CgljYWxsc3ViIGdldERpZmZlcmVuY2UKCWZyYW1lX2J1cnkgMCAvLyByZXN1bHQ6IHVpbnQ2NAoJYiAqaWYwX2VuZAoKKmlmMF9lbHNlOgoJLy8gSW52YWxpZCBvcGVyYXRpb24KCWVycgoKKmlmMF9lbmQ6CgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjQ0CgkvLyByZXR1cm4gcmVzdWx0OwoJZnJhbWVfZGlnIDAgLy8gcmVzdWx0OiB1aW50NjQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gaGVsbG8oc3RyaW5nKXN0cmluZwoqYWJpX3JvdXRlX2hlbGxvOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlYyAwIC8vIDB4MTUxZjdjNzUKCgkvLyBuYW1lOiBzdHJpbmcKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgoJLy8gZXhlY3V0ZSBoZWxsbyhzdHJpbmcpc3RyaW5nCgljYWxsc3ViIGhlbGxvCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWludGMgMCAvLyAxCglyZXR1cm4KCi8vIGhlbGxvKG5hbWU6IHN0cmluZyk6IHN0cmluZwovLwovLyBBIGRlbW9uc3RyYXRpb24gbWV0aG9kIHVzZWQgaW4gdGhlIEFsZ29LaXQgZnVsbHN0YWNrIHRlbXBsYXRlLgovLyBHcmVldHMgdGhlIHVzZXIgYnkgbmFtZS4KLy8KLy8gQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHVzZXIgdG8gZ3JlZXQuCi8vIEByZXR1cm5zIEEgZ3JlZXRpbmcgbWVzc2FnZSB0byB0aGUgdXNlci4KaGVsbG86Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjU1CgkvLyByZXR1cm4gJ0hlbGxvLCAnICsgbmFtZTsKCXB1c2hieXRlcyAweDQ4NjU2YzZjNmYyYzIwIC8vICJIZWxsbywgIgoJZnJhbWVfZGlnIC0xIC8vIG5hbWU6IHN0cmluZwoJY29uY2F0CglyZXRzdWIKCiphYmlfcm91dGVfY3JlYXRlQXBwbGljYXRpb246CglpbnRjIDAgLy8gMQoJcmV0dXJuCgoqY3JlYXRlX05vT3A6CglwdXNoYnl0ZXMgMHhiODQ0N2IzNiAvLyBtZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKCl2b2lkIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9jcmVhdGVBcHBsaWNhdGlvbgoKCS8vIHRoaXMgY29udHJhY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBnaXZlbiBBQkkgbWV0aG9kIGZvciBjcmVhdGUgTm9PcAoJZXJyCgoqY2FsbF9Ob09wOgoJcHVzaGJ5dGVzIDB4NzZhN2VmMzMgLy8gbWV0aG9kICJkb01hdGgodWludDY0LHVpbnQ2NCxzdHJpbmcpdWludDY0IgoJcHVzaGJ5dGVzIDB4MDJiZWNlMTEgLy8gbWV0aG9kICJoZWxsbyhzdHJpbmcpc3RyaW5nIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9kb01hdGggKmFiaV9yb3V0ZV9oZWxsbwoKCS8vIHRoaXMgY29udHJhY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBnaXZlbiBBQkkgbWV0aG9kIGZvciBjYWxsIE5vT3AKCWVycg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEw"},"byteCode":{"approval":"CiABASYBBBUffHUxGBSBBgsxGQiNDACwAAAAAAAAAAAAAACiAAAAAAAAAAAAAACKAgGL/4v+CImKAgGL/4v+D0EACIv/i/4JQgAFi/6L/wmJKDYaA1cCADYaAhc2GgEXiAAFFlCwIkOKAwGAAIv9gANzdW0SQQAMi/6L/4j/sIwAQgAfi/2ACmRpZmZlcmVuY2USQQAMi/6L/4j/m4wAQgABAIsAjACJKDYaAVcCAIgADEkVFlcGAkxQULAiQ4oBAYAHSGVsbG8sIIv/UIkiQ4AEuER7NjYaAI4B//EAgAR2p+8zgAQCvs4RNhoAjgL/Xv+1AA==","clear":"Cg=="},"compilerInfo":{"compiler":"algod","compilerVersion":{"major":4,"minor":4,"patch":1,"commitHash":"7b607ce4"}}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the Calculator contract - */ -export type CalculatorArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'doMath(uint64,uint64,string)uint64': { - /** - * The first uint64 - */ - a: bigint | number - /** - * The second uint64 - */ - b: bigint | number - /** - * The operation to perform. Can be either 'sum' or 'difference' - */ - operation: string - } - 'hello(string)string': { - /** - * The name of the user to greet. - */ - name: string - } - 'createApplication()void': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'doMath(uint64,uint64,string)uint64': [a: bigint | number, b: bigint | number, operation: string] - 'hello(string)string': [name: string] - 'createApplication()void': [] - } -} - -/** - * The return type for each method - */ -export type CalculatorReturns = { - 'doMath(uint64,uint64,string)uint64': bigint - 'hello(string)string': string - 'createApplication()void': void -} - -/** - * Defines the types of available calls and state of the Calculator smart contract. - */ -export type CalculatorTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'doMath(uint64,uint64,string)uint64' | 'doMath', { - argsObj: CalculatorArgs['obj']['doMath(uint64,uint64,string)uint64'] - argsTuple: CalculatorArgs['tuple']['doMath(uint64,uint64,string)uint64'] - /** - * The result of the operation - */ - returns: CalculatorReturns['doMath(uint64,uint64,string)uint64'] - }> - & Record<'hello(string)string' | 'hello', { - argsObj: CalculatorArgs['obj']['hello(string)string'] - argsTuple: CalculatorArgs['tuple']['hello(string)string'] - /** - * A greeting message to the user. - */ - returns: CalculatorReturns['hello(string)string'] - }> - & Record<'createApplication()void' | 'createApplication', { - argsObj: CalculatorArgs['obj']['createApplication()void'] - argsTuple: CalculatorArgs['tuple']['createApplication()void'] - returns: CalculatorReturns['createApplication()void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type CalculatorSignatures = keyof CalculatorTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type CalculatorNonVoidMethodSignatures = keyof CalculatorTypes['methods'] extends infer T ? T extends keyof CalculatorTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the Calculator smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = CalculatorTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the Calculator smart contract to the method's return type - */ -export type MethodReturn = CalculatorTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type CalculatorCreateCallParams = - | Expand & {method: 'createApplication'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema> - | Expand & {method: 'createApplication()void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema> -/** - * Defines arguments required for the deploy method. - */ -export type CalculatorDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: CalculatorCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the Calculator smart contract - */ -export abstract class CalculatorParamsFactory { - /** - * Gets available create ABI call param factories - */ - static get create() { - return { - _resolveByMethod(params: TParams) { - switch(params.method) { - case 'createApplication': - case 'createApplication()void': - return CalculatorParamsFactory.create.createApplication(params) - } - throw new Error(`Unknown ' + verb + ' method`) - }, - - /** - * Constructs create ABI call params for the Calculator smart contract using the createApplication()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - createApplication(params: CallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} { - return { - ...params, - method: 'createApplication()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - }, - } - } - - /** - * Constructs a no op call for the doMath(uint64,uint64,string)uint64 ABI method - * - * A method that takes two numbers and does either addition or subtraction - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static doMath(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'doMath(uint64,uint64,string)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.operation], - } - } - /** - * Constructs a no op call for the hello(string)string ABI method - * - * A demonstration method used in the AlgoKit fullstack template. - Greets the user by name. - - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static hello(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'hello(string)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.name], - } - } -} - -/** - * A factory to create and deploy one or more instance of the Calculator smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class CalculatorFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `CalculatorFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClientInterface { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new CalculatorClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new CalculatorClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the Calculator smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: CalculatorDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - createParams: params.createParams?.method ? CalculatorParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (CalculatorCreateCallParams & { args: Uint8Array[] }) : undefined, - }) - return { result: result.result, appClient: new CalculatorClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Calculator smart contract using the createApplication()void ABI method. - * - * @param params The params for the smart contract call - * @returns The create params - */ - createApplication: (params: CallParams & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { - return this.appFactory.params.create(CalculatorParamsFactory.create.createApplication(params)) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Calculator smart contract using the createApplication()void ABI method. - * - * @param params The params for the smart contract call - * @returns The create transaction - */ - createApplication: (params: CallParams & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { - return this.appFactory.createTransaction.create(CalculatorParamsFactory.create.createApplication(params)) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Calculator smart contract using an ABI method call using the createApplication()void ABI method. - * - * @param params The params for the smart contract call - * @returns The create result - */ - createApplication: async (params: CallParams & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { - const result = await this.appFactory.send.create(CalculatorParamsFactory.create.createApplication(params)) - return { result: { ...result.result, return: result.result.return as unknown as (undefined | CalculatorReturns['createApplication()void']) }, appClient: new CalculatorClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the Calculator smart contract - */ -export class CalculatorClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `CalculatorClient` - * - * @param appClient An `AppClient` instance which has been created with the Calculator app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `CalculatorClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Checks for decode errors on the given return value and maps the return value to the return type for the given method - * @returns The typed return value or undefined if there was no value - */ - decodeReturnValue(method: TSignature, returnValue: ABIReturn | undefined) { - return returnValue !== undefined ? getArc56ReturnValue>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined - } - - /** - * Returns a new `CalculatorClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new CalculatorClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `CalculatorClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new CalculatorClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClientInterface { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the Calculator smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. - * - * A method that takes two numbers and does either addition or subtraction - * - * @param params The params for the smart contract call - * @returns The call params: The result of the operation - */ - doMath: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(CalculatorParamsFactory.doMath(params)) - }, - - /** - * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. - * - * A demonstration method used in the AlgoKit fullstack template. - Greets the user by name. - - * - * @param params The params for the smart contract call - * @returns The call params: A greeting message to the user. - */ - hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(CalculatorParamsFactory.hello(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the Calculator smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. - * - * A method that takes two numbers and does either addition or subtraction - * - * @param params The params for the smart contract call - * @returns The call transaction: The result of the operation - */ - doMath: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(CalculatorParamsFactory.doMath(params)) - }, - - /** - * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. - * - * A demonstration method used in the AlgoKit fullstack template. - Greets the user by name. - - * - * @param params The params for the smart contract call - * @returns The call transaction: A greeting message to the user. - */ - hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(CalculatorParamsFactory.hello(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the Calculator smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. - * - * A method that takes two numbers and does either addition or subtraction - * - * @param params The params for the smart contract call - * @returns The call result: The result of the operation - */ - doMath: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(CalculatorParamsFactory.doMath(params)) - return {...result, return: result.return as unknown as (undefined | CalculatorReturns['doMath(uint64,uint64,string)uint64'])} - }, - - /** - * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. - * - * A demonstration method used in the AlgoKit fullstack template. - Greets the user by name. - - * - * @param params The params for the smart contract call - * @returns The call result: A greeting message to the user. - */ - hello: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(CalculatorParamsFactory.hello(params)) - return {...result, return: result.return as unknown as (undefined | CalculatorReturns['hello(string)string'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new CalculatorClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current Calculator app - */ - state = { - } - - public newGroup(): CalculatorComposer { - const client = this - const composer = this.algorand.newGroup() - let promiseChain:Promise = Promise.resolve() - const resultMappers: Array any)> = [] - return { - /** - * Add a doMath(uint64,uint64,string)uint64 method call against the Calculator contract - */ - doMath(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.doMath(params))) - resultMappers.push((v) => client.decodeReturnValue('doMath(uint64,uint64,string)uint64', v)) - return this - }, - /** - * Add a hello(string)string method call against the Calculator contract - */ - hello(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hello(params))) - resultMappers.push((v) => client.decodeReturnValue('hello(string)string', v)) - return this - }, - /** - * Add a clear state call to the Calculator contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) - } - } - } as unknown as CalculatorComposer - } -} -export type CalculatorComposer = { - /** - * Calls the doMath(uint64,uint64,string)uint64 ABI method. - * - * A method that takes two numbers and does either addition or subtraction - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - doMath(params?: CallParams): CalculatorComposer<[...TReturns, CalculatorReturns['doMath(uint64,uint64,string)uint64'] | undefined]> - - /** - * Calls the hello(string)string ABI method. - * - * A demonstration method used in the AlgoKit fullstack template. - Greets the user by name. - - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - hello(params?: CallParams): CalculatorComposer<[...TReturns, CalculatorReturns['hello(string)string'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the Calculator smart contract. - * - * @param args The arguments for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): CalculatorComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): CalculatorComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type CalculatorComposerResults = Expand - diff --git a/examples/p-tls/projects/p-tls-frontend/.algokit/.copier-answers.yml b/examples/p-tls/projects/p-tls-frontend/.algokit/.copier-answers.yml index 0b7115b..63e63d9 100644 --- a/examples/p-tls/projects/p-tls-frontend/.algokit/.copier-answers.yml +++ b/examples/p-tls/projects/p-tls-frontend/.algokit/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 1.1.1 +_commit: 1.1.1-13-gc5abe59 _src_path: gh:algorandfoundation/algokit-react-frontend-template author_email: None author_name: None diff --git a/examples/p-tls/projects/p-tls-frontend/.env.template b/examples/p-tls/projects/p-tls-frontend/.env.template index eb4b229..5dfbb2d 100644 --- a/examples/p-tls/projects/p-tls-frontend/.env.template +++ b/examples/p-tls/projects/p-tls-frontend/.env.template @@ -65,3 +65,6 @@ VITE_KMD_PASSWORD="" # VITE_INDEXER_SERVER="https://mainnet-idx.algonode.cloud" # VITE_INDEXER_PORT="" + +# Add your Web3Auth Client ID here if you want to test Web3Auth integration on TestNet or Mainnet +# VITE_WEB3_AUTH_CLIENT_ID="" \ No newline at end of file diff --git a/examples/p-tls/projects/p-tls-frontend/package.json b/examples/p-tls/projects/p-tls-frontend/package.json index 15dcb19..82161d0 100644 --- a/examples/p-tls/projects/p-tls-frontend/package.json +++ b/examples/p-tls/projects/p-tls-frontend/package.json @@ -12,7 +12,7 @@ "npm": ">=9.0" }, "devDependencies": { - "@algorandfoundation/algokit-client-generator": "^5.0.0", + "@algorandfoundation/algokit-client-generator": "^7.0.0-alpha.5", "@types/node": "^18.17.14", "@types/react": "^18.2.11", "@types/react-dom": "^18.2.4", @@ -35,12 +35,12 @@ "vite-plugin-node-polyfills": "^0.22.0" }, "dependencies": { - "@algorandfoundation/algokit-utils": "^9.0.0", + "@algorandfoundation/algokit-utils": "^10.0.0-alpha.40", "@blockshake/defly-connect": "^1.2.1", "@perawallet/connect": "^1.4.1", - "@txnlab/use-wallet": "^4.0.0", - "@txnlab/use-wallet-react": "^4.0.0", - "algosdk": "^3.0.0", + "@txnlab/use-wallet": "^4.6.0", + "@txnlab/use-wallet-react": "^4.6.0", + "@web3auth/modal": "^9.7.0", "daisyui": "^4.0.0", "notistack": "^3.0.1", "react": "^18.2.0", diff --git a/examples/p-tls/projects/p-tls-frontend/src/components/Transact.tsx b/examples/p-tls/projects/p-tls-frontend/src/components/Transact.tsx index 2ba3e96..3f8191d 100644 --- a/examples/p-tls/projects/p-tls-frontend/src/components/Transact.tsx +++ b/examples/p-tls/projects/p-tls-frontend/src/components/Transact.tsx @@ -1,4 +1,5 @@ import { algo, AlgorandClient } from '@algorandfoundation/algokit-utils' +import { encodeTransactionRaw } from '@algorandfoundation/algokit-utils/transact' import { useWallet } from '@txnlab/use-wallet-react' import { useSnackbar } from 'notistack' import { useState } from 'react' @@ -18,12 +19,12 @@ const Transact = ({ openModal, setModalState }: TransactInterface) => { const { enqueueSnackbar } = useSnackbar() - const { transactionSigner, activeAddress } = useWallet() + const { signTransactions, activeAddress } = useWallet() const handleSubmitAlgo = async () => { setLoading(true) - if (!transactionSigner || !activeAddress) { + if (!signTransactions || !activeAddress) { enqueueSnackbar('Please connect wallet first', { variant: 'warning' }) return } @@ -31,7 +32,11 @@ const Transact = ({ openModal, setModalState }: TransactInterface) => { try { enqueueSnackbar('Sending transaction...', { variant: 'info' }) const result = await algorand.send.payment({ - signer: transactionSigner, + signer: async (txnGroup, indexesToSign) => { + const encoded = txnGroup.map((txn) => encodeTransactionRaw(txn)) + const signed = await signTransactions(encoded, indexesToSign) + return signed.filter((s): s is Uint8Array => s !== null) + }, sender: activeAddress, receiver: receiverAddress, amount: algo(1), diff --git a/examples/p-tls/projects/p-tls-frontend/src/contracts/Calculator.ts b/examples/p-tls/projects/p-tls-frontend/src/contracts/Calculator.ts deleted file mode 100644 index cc4657a..0000000 --- a/examples/p-tls/projects/p-tls-frontend/src/contracts/Calculator.ts +++ /dev/null @@ -1,742 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^7 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app' -import { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56' -import { - AppClient as _AppClient, - AppClientMethodCallParams, - AppClientParams, - AppClientBareCallParams, - CallOnComplete, - AppClientCompilationParams, - ResolveAppClientByCreatorAndName, - ResolveAppClientByNetwork, - CloneAppClientParams, -} from '@algorandfoundation/algokit-utils/types/app-client' -import { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer' -import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' -import SimulateResponse = modelsv2.SimulateResponse - -export const APP_SPEC: Arc56Contract = {"name":"Calculator","desc":"","methods":[{"name":"doMath","desc":"A method that takes two numbers and does either addition or subtraction","args":[{"name":"a","type":"uint64","desc":"The first uint64"},{"name":"b","type":"uint64","desc":"The second uint64"},{"name":"operation","type":"string","desc":"The operation to perform. Can be either 'sum' or 'difference'"}],"returns":{"type":"uint64","desc":"The result of the operation"},"actions":{"create":[],"call":["NoOp"]}},{"name":"hello","desc":"A demonstration method used in the AlgoKit fullstack template.\nGreets the user by name.","args":[{"name":"name","type":"string","desc":"The name of the user to greet."}],"returns":{"type":"string","desc":"A greeting message to the user."},"actions":{"create":[],"call":["NoOp"]}},{"name":"createApplication","args":[],"returns":{"type":"void"},"actions":{"create":["NoOp"],"call":[]}}],"arcs":[4,56],"structs":{},"state":{"schema":{"global":{"bytes":0,"ints":0},"local":{"bytes":0,"ints":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":[],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"teal":1,"source":"contracts/Calculator.algo.ts:3","pc":[0]},{"teal":2,"source":"contracts/Calculator.algo.ts:3","pc":[1,2,3]},{"teal":3,"source":"contracts/Calculator.algo.ts:3","pc":[4,5,6,7,8,9,10]},{"teal":15,"source":"contracts/Calculator.algo.ts:3","pc":[11,12]},{"teal":16,"source":"contracts/Calculator.algo.ts:3","pc":[13]},{"teal":17,"source":"contracts/Calculator.algo.ts:3","pc":[14,15]},{"teal":18,"source":"contracts/Calculator.algo.ts:3","pc":[16]},{"teal":19,"source":"contracts/Calculator.algo.ts:3","pc":[17,18]},{"teal":20,"source":"contracts/Calculator.algo.ts:3","pc":[19]},{"teal":21,"source":"contracts/Calculator.algo.ts:3","pc":[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]},{"teal":25,"source":"contracts/Calculator.algo.ts:3","errorMessage":"The requested action is not implemented in this contract. Are you using the correct OnComplete? Did you set your app ID?","pc":[46]},{"teal":35,"source":"contracts/Calculator.algo.ts:11","pc":[47,48,49]},{"teal":39,"source":"contracts/Calculator.algo.ts:12","pc":[50,51]},{"teal":40,"source":"contracts/Calculator.algo.ts:12","pc":[52,53]},{"teal":41,"source":"contracts/Calculator.algo.ts:12","pc":[54]},{"teal":42,"source":"contracts/Calculator.algo.ts:11","pc":[55]},{"teal":52,"source":"contracts/Calculator.algo.ts:22","pc":[56,57,58]},{"teal":56,"source":"contracts/Calculator.algo.ts:23","pc":[59,60]},{"teal":57,"source":"contracts/Calculator.algo.ts:23","pc":[61,62]},{"teal":58,"source":"contracts/Calculator.algo.ts:23","pc":[63]},{"teal":59,"source":"contracts/Calculator.algo.ts:23","pc":[64,65,66]},{"teal":60,"source":"contracts/Calculator.algo.ts:23","pc":[67,68]},{"teal":61,"source":"contracts/Calculator.algo.ts:23","pc":[69,70]},{"teal":62,"source":"contracts/Calculator.algo.ts:23","pc":[71]},{"teal":63,"source":"contracts/Calculator.algo.ts:23","pc":[72,73,74]},{"teal":66,"source":"contracts/Calculator.algo.ts:23","pc":[75,76]},{"teal":67,"source":"contracts/Calculator.algo.ts:23","pc":[77,78]},{"teal":68,"source":"contracts/Calculator.algo.ts:23","pc":[79]},{"teal":71,"source":"contracts/Calculator.algo.ts:22","pc":[80]},{"teal":76,"source":"contracts/Calculator.algo.ts:35","pc":[81]},{"teal":79,"source":"contracts/Calculator.algo.ts:35","pc":[82,83,84]},{"teal":80,"source":"contracts/Calculator.algo.ts:35","pc":[85,86,87]},{"teal":83,"source":"contracts/Calculator.algo.ts:35","pc":[88,89,90]},{"teal":84,"source":"contracts/Calculator.algo.ts:35","pc":[91]},{"teal":87,"source":"contracts/Calculator.algo.ts:35","pc":[92,93,94]},{"teal":88,"source":"contracts/Calculator.algo.ts:35","pc":[95]},{"teal":91,"source":"contracts/Calculator.algo.ts:35","pc":[96,97,98]},{"teal":92,"source":"contracts/Calculator.algo.ts:35","pc":[99]},{"teal":93,"source":"contracts/Calculator.algo.ts:35","pc":[100]},{"teal":94,"source":"contracts/Calculator.algo.ts:35","pc":[101]},{"teal":95,"source":"contracts/Calculator.algo.ts:35","pc":[102]},{"teal":96,"source":"contracts/Calculator.algo.ts:35","pc":[103]},{"teal":108,"source":"contracts/Calculator.algo.ts:35","pc":[104,105,106]},{"teal":111,"source":"contracts/Calculator.algo.ts:35","pc":[107,108]},{"teal":116,"source":"contracts/Calculator.algo.ts:38","pc":[109,110]},{"teal":117,"source":"contracts/Calculator.algo.ts:38","pc":[111,112,113,114,115]},{"teal":118,"source":"contracts/Calculator.algo.ts:38","pc":[116]},{"teal":119,"source":"contracts/Calculator.algo.ts:38","pc":[117,118,119]},{"teal":124,"source":"contracts/Calculator.algo.ts:39","pc":[120,121]},{"teal":125,"source":"contracts/Calculator.algo.ts:39","pc":[122,123]},{"teal":126,"source":"contracts/Calculator.algo.ts:39","pc":[124,125,126]},{"teal":127,"source":"contracts/Calculator.algo.ts:39","pc":[127,128]},{"teal":128,"source":"contracts/Calculator.algo.ts:38","pc":[129,130,131]},{"teal":133,"source":"contracts/Calculator.algo.ts:40","pc":[132,133]},{"teal":134,"source":"contracts/Calculator.algo.ts:40","pc":[134,135,136,137,138,139,140,141,142,143,144,145]},{"teal":135,"source":"contracts/Calculator.algo.ts:40","pc":[146]},{"teal":136,"source":"contracts/Calculator.algo.ts:40","pc":[147,148,149]},{"teal":141,"source":"contracts/Calculator.algo.ts:41","pc":[150,151]},{"teal":142,"source":"contracts/Calculator.algo.ts:41","pc":[152,153]},{"teal":143,"source":"contracts/Calculator.algo.ts:41","pc":[154,155,156]},{"teal":144,"source":"contracts/Calculator.algo.ts:41","pc":[157,158]},{"teal":145,"source":"contracts/Calculator.algo.ts:40","pc":[159,160,161]},{"teal":149,"source":"contracts/Calculator.algo.ts:42","errorMessage":"Invalid operation","pc":[162]},{"teal":154,"source":"contracts/Calculator.algo.ts:44","pc":[163,164]},{"teal":157,"source":"contracts/Calculator.algo.ts:35","pc":[165,166]},{"teal":158,"source":"contracts/Calculator.algo.ts:35","pc":[167]},{"teal":163,"source":"contracts/Calculator.algo.ts:54","pc":[168]},{"teal":166,"source":"contracts/Calculator.algo.ts:54","pc":[169,170,171]},{"teal":167,"source":"contracts/Calculator.algo.ts:54","pc":[172,173,174]},{"teal":170,"source":"contracts/Calculator.algo.ts:54","pc":[175,176,177]},{"teal":171,"source":"contracts/Calculator.algo.ts:54","pc":[178]},{"teal":172,"source":"contracts/Calculator.algo.ts:54","pc":[179]},{"teal":173,"source":"contracts/Calculator.algo.ts:54","pc":[180]},{"teal":174,"source":"contracts/Calculator.algo.ts:54","pc":[181,182,183]},{"teal":175,"source":"contracts/Calculator.algo.ts:54","pc":[184]},{"teal":176,"source":"contracts/Calculator.algo.ts:54","pc":[185]},{"teal":177,"source":"contracts/Calculator.algo.ts:54","pc":[186]},{"teal":178,"source":"contracts/Calculator.algo.ts:54","pc":[187]},{"teal":179,"source":"contracts/Calculator.algo.ts:54","pc":[188]},{"teal":180,"source":"contracts/Calculator.algo.ts:54","pc":[189]},{"teal":190,"source":"contracts/Calculator.algo.ts:54","pc":[190,191,192]},{"teal":194,"source":"contracts/Calculator.algo.ts:55","pc":[193,194,195,196,197,198,199,200,201]},{"teal":195,"source":"contracts/Calculator.algo.ts:55","pc":[202,203]},{"teal":196,"source":"contracts/Calculator.algo.ts:55","pc":[204]},{"teal":197,"source":"contracts/Calculator.algo.ts:54","pc":[205]},{"teal":200,"source":"contracts/Calculator.algo.ts:3","pc":[206]},{"teal":201,"source":"contracts/Calculator.algo.ts:3","pc":[207]},{"teal":204,"source":"contracts/Calculator.algo.ts:3","pc":[208,209,210,211,212,213]},{"teal":205,"source":"contracts/Calculator.algo.ts:3","pc":[214,215,216]},{"teal":206,"source":"contracts/Calculator.algo.ts:3","pc":[217,218,219,220]},{"teal":209,"source":"contracts/Calculator.algo.ts:3","errorMessage":"this contract does not implement the given ABI method for create NoOp","pc":[221]},{"teal":212,"source":"contracts/Calculator.algo.ts:3","pc":[222,223,224,225,226,227]},{"teal":213,"source":"contracts/Calculator.algo.ts:3","pc":[228,229,230,231,232,233]},{"teal":214,"source":"contracts/Calculator.algo.ts:3","pc":[234,235,236]},{"teal":215,"source":"contracts/Calculator.algo.ts:3","pc":[237,238,239,240,241,242]},{"teal":218,"source":"contracts/Calculator.algo.ts:3","errorMessage":"this contract does not implement the given ABI method for call NoOp","pc":[243]}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCmludGNibG9jayAxCmJ5dGVjYmxvY2sgMHgxNTFmN2M3NQoKLy8gVGhpcyBURUFMIHdhcyBnZW5lcmF0ZWQgYnkgVEVBTFNjcmlwdCB2MC4xMDcuMQovLyBodHRwczovL2dpdGh1Yi5jb20vYWxnb3JhbmRmb3VuZGF0aW9uL1RFQUxTY3JpcHQKCi8vIFRoaXMgY29udHJhY3QgaXMgY29tcGxpYW50IHdpdGggYW5kL29yIGltcGxlbWVudHMgdGhlIGZvbGxvd2luZyBBUkNzOiBbIEFSQzQgXQoKLy8gVGhlIGZvbGxvd2luZyB0ZW4gbGluZXMgb2YgVEVBTCBoYW5kbGUgaW5pdGlhbCBwcm9ncmFtIGZsb3cKLy8gVGhpcyBwYXR0ZXJuIGlzIHVzZWQgdG8gbWFrZSBpdCBlYXN5IGZvciBhbnlvbmUgdG8gcGFyc2UgdGhlIHN0YXJ0IG9mIHRoZSBwcm9ncmFtIGFuZCBkZXRlcm1pbmUgaWYgYSBzcGVjaWZpYyBhY3Rpb24gaXMgYWxsb3dlZAovLyBIZXJlLCBhY3Rpb24gcmVmZXJzIHRvIHRoZSBPbkNvbXBsZXRlIGluIGNvbWJpbmF0aW9uIHdpdGggd2hldGhlciB0aGUgYXBwIGlzIGJlaW5nIGNyZWF0ZWQgb3IgY2FsbGVkCi8vIEV2ZXJ5IHBvc3NpYmxlIGFjdGlvbiBmb3IgdGhpcyBjb250cmFjdCBpcyByZXByZXNlbnRlZCBpbiB0aGUgc3dpdGNoIHN0YXRlbWVudAovLyBJZiB0aGUgYWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgY29udHJhY3QsIGl0cyByZXNwZWN0aXZlIGJyYW5jaCB3aWxsIGJlICIqTk9UX0lNUExFTUVOVEVEIiB3aGljaCBqdXN0IGNvbnRhaW5zICJlcnIiCnR4biBBcHBsaWNhdGlvbklECiEKcHVzaGludCA2CioKdHhuIE9uQ29tcGxldGlvbgorCnN3aXRjaCAqY2FsbF9Ob09wICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqY3JlYXRlX05vT3AgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVECgoqTk9UX0lNUExFTUVOVEVEOgoJLy8gVGhlIHJlcXVlc3RlZCBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoaXMgY29udHJhY3QuIEFyZSB5b3UgdXNpbmcgdGhlIGNvcnJlY3QgT25Db21wbGV0ZT8gRGlkIHlvdSBzZXQgeW91ciBhcHAgSUQ/CgllcnIKCi8vIGdldFN1bShhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NAovLwovLyBDYWxjdWxhdGVzIHRoZSBzdW0gb2YgdHdvIG51bWJlcnMKLy8KLy8gQHBhcmFtIGEKLy8gQHBhcmFtIGIKLy8gQHJldHVybnMgVGhlIHN1bSBvZiBhIGFuZCBiCmdldFN1bToKCXByb3RvIDIgMQoKCS8vIGNvbnRyYWN0cy9DYWxjdWxhdG9yLmFsZ28udHM6MTIKCS8vIHJldHVybiBhICsgYjsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCSsKCXJldHN1YgoKLy8gZ2V0RGlmZmVyZW5jZShhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NAovLwovLyBDYWxjdWxhdGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIG51bWJlcnMKLy8KLy8gQHBhcmFtIGEKLy8gQHBhcmFtIGIKLy8gQHJldHVybnMgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGFuZCBiLgpnZXREaWZmZXJlbmNlOgoJcHJvdG8gMiAxCgoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czoyMwoJLy8gcmV0dXJuIGEgPj0gYiA/IGEgLSBiIDogYiAtIGE7CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0Cgk+PQoJYnogKnRlcm5hcnkwX2ZhbHNlCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0CgktCgliICp0ZXJuYXJ5MF9lbmQKCip0ZXJuYXJ5MF9mYWxzZToKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCS0KCip0ZXJuYXJ5MF9lbmQ6CglyZXRzdWIKCi8vIGRvTWF0aCh1aW50NjQsdWludDY0LHN0cmluZyl1aW50NjQKKmFiaV9yb3V0ZV9kb01hdGg6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGVjIDAgLy8gMHgxNTFmN2M3NQoKCS8vIG9wZXJhdGlvbjogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglleHRyYWN0IDIgMAoKCS8vIGI6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJYnRvaQoKCS8vIGE6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZG9NYXRoKHVpbnQ2NCx1aW50NjQsc3RyaW5nKXVpbnQ2NAoJY2FsbHN1YiBkb01hdGgKCWl0b2IKCWNvbmNhdAoJbG9nCglpbnRjIDAgLy8gMQoJcmV0dXJuCgovLyBkb01hdGgoYTogdWludDY0LCBiOiB1aW50NjQsIG9wZXJhdGlvbjogc3RyaW5nKTogdWludDY0Ci8vCi8vIEEgbWV0aG9kIHRoYXQgdGFrZXMgdHdvIG51bWJlcnMgYW5kIGRvZXMgZWl0aGVyIGFkZGl0aW9uIG9yIHN1YnRyYWN0aW9uCi8vCi8vIEBwYXJhbSBhIFRoZSBmaXJzdCB1aW50NjQKLy8gQHBhcmFtIGIgVGhlIHNlY29uZCB1aW50NjQKLy8gQHBhcmFtIG9wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0uIENhbiBiZSBlaXRoZXIgJ3N1bScgb3IgJ2RpZmZlcmVuY2UnCi8vCi8vIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbgpkb01hdGg6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJcHVzaGJ5dGVzIDB4CgoJLy8gKmlmMF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy9DYWxjdWxhdG9yLmFsZ28udHM6MzgKCS8vIG9wZXJhdGlvbiA9PT0gJ3N1bScKCWZyYW1lX2RpZyAtMyAvLyBvcGVyYXRpb246IHN0cmluZwoJcHVzaGJ5dGVzIDB4NzM3NTZkIC8vICJzdW0iCgk9PQoJYnogKmlmMF9lbHNlaWYxX2NvbmRpdGlvbgoKCS8vICppZjBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czozOQoJLy8gcmVzdWx0ID0gdGhpcy5nZXRTdW0oYSwgYikKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCWNhbGxzdWIgZ2V0U3VtCglmcmFtZV9idXJ5IDAgLy8gcmVzdWx0OiB1aW50NjQKCWIgKmlmMF9lbmQKCippZjBfZWxzZWlmMV9jb25kaXRpb246CgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjQwCgkvLyBvcGVyYXRpb24gPT09ICdkaWZmZXJlbmNlJwoJZnJhbWVfZGlnIC0zIC8vIG9wZXJhdGlvbjogc3RyaW5nCglwdXNoYnl0ZXMgMHg2NDY5NjY2NjY1NzI2NTZlNjM2NSAvLyAiZGlmZmVyZW5jZSIKCT09CglieiAqaWYwX2Vsc2UKCgkvLyAqaWYwX2Vsc2VpZjFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czo0MQoJLy8gcmVzdWx0ID0gdGhpcy5nZXREaWZmZXJlbmNlKGEsIGIpCglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CgljYWxsc3ViIGdldERpZmZlcmVuY2UKCWZyYW1lX2J1cnkgMCAvLyByZXN1bHQ6IHVpbnQ2NAoJYiAqaWYwX2VuZAoKKmlmMF9lbHNlOgoJLy8gSW52YWxpZCBvcGVyYXRpb24KCWVycgoKKmlmMF9lbmQ6CgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjQ0CgkvLyByZXR1cm4gcmVzdWx0OwoJZnJhbWVfZGlnIDAgLy8gcmVzdWx0OiB1aW50NjQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gaGVsbG8oc3RyaW5nKXN0cmluZwoqYWJpX3JvdXRlX2hlbGxvOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlYyAwIC8vIDB4MTUxZjdjNzUKCgkvLyBuYW1lOiBzdHJpbmcKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgoJLy8gZXhlY3V0ZSBoZWxsbyhzdHJpbmcpc3RyaW5nCgljYWxsc3ViIGhlbGxvCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWludGMgMCAvLyAxCglyZXR1cm4KCi8vIGhlbGxvKG5hbWU6IHN0cmluZyk6IHN0cmluZwovLwovLyBBIGRlbW9uc3RyYXRpb24gbWV0aG9kIHVzZWQgaW4gdGhlIEFsZ29LaXQgZnVsbHN0YWNrIHRlbXBsYXRlLgovLyBHcmVldHMgdGhlIHVzZXIgYnkgbmFtZS4KLy8KLy8gQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHVzZXIgdG8gZ3JlZXQuCi8vIEByZXR1cm5zIEEgZ3JlZXRpbmcgbWVzc2FnZSB0byB0aGUgdXNlci4KaGVsbG86Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjU1CgkvLyByZXR1cm4gJ0hlbGxvLCAnICsgbmFtZTsKCXB1c2hieXRlcyAweDQ4NjU2YzZjNmYyYzIwIC8vICJIZWxsbywgIgoJZnJhbWVfZGlnIC0xIC8vIG5hbWU6IHN0cmluZwoJY29uY2F0CglyZXRzdWIKCiphYmlfcm91dGVfY3JlYXRlQXBwbGljYXRpb246CglpbnRjIDAgLy8gMQoJcmV0dXJuCgoqY3JlYXRlX05vT3A6CglwdXNoYnl0ZXMgMHhiODQ0N2IzNiAvLyBtZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKCl2b2lkIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9jcmVhdGVBcHBsaWNhdGlvbgoKCS8vIHRoaXMgY29udHJhY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBnaXZlbiBBQkkgbWV0aG9kIGZvciBjcmVhdGUgTm9PcAoJZXJyCgoqY2FsbF9Ob09wOgoJcHVzaGJ5dGVzIDB4NzZhN2VmMzMgLy8gbWV0aG9kICJkb01hdGgodWludDY0LHVpbnQ2NCxzdHJpbmcpdWludDY0IgoJcHVzaGJ5dGVzIDB4MDJiZWNlMTEgLy8gbWV0aG9kICJoZWxsbyhzdHJpbmcpc3RyaW5nIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9kb01hdGggKmFiaV9yb3V0ZV9oZWxsbwoKCS8vIHRoaXMgY29udHJhY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBnaXZlbiBBQkkgbWV0aG9kIGZvciBjYWxsIE5vT3AKCWVycg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEw"},"byteCode":{"approval":"CiABASYBBBUffHUxGBSBBgsxGQiNDACwAAAAAAAAAAAAAACiAAAAAAAAAAAAAACKAgGL/4v+CImKAgGL/4v+D0EACIv/i/4JQgAFi/6L/wmJKDYaA1cCADYaAhc2GgEXiAAFFlCwIkOKAwGAAIv9gANzdW0SQQAMi/6L/4j/sIwAQgAfi/2ACmRpZmZlcmVuY2USQQAMi/6L/4j/m4wAQgABAIsAjACJKDYaAVcCAIgADEkVFlcGAkxQULAiQ4oBAYAHSGVsbG8sIIv/UIkiQ4AEuER7NjYaAI4B//EAgAR2p+8zgAQCvs4RNhoAjgL/Xv+1AA==","clear":"Cg=="},"compilerInfo":{"compiler":"algod","compilerVersion":{"major":4,"minor":4,"patch":1,"commitHash":"7b607ce4"}}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the Calculator contract - */ -export type CalculatorArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'doMath(uint64,uint64,string)uint64': { - /** - * The first uint64 - */ - a: bigint | number - /** - * The second uint64 - */ - b: bigint | number - /** - * The operation to perform. Can be either 'sum' or 'difference' - */ - operation: string - } - 'hello(string)string': { - /** - * The name of the user to greet. - */ - name: string - } - 'createApplication()void': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'doMath(uint64,uint64,string)uint64': [a: bigint | number, b: bigint | number, operation: string] - 'hello(string)string': [name: string] - 'createApplication()void': [] - } -} - -/** - * The return type for each method - */ -export type CalculatorReturns = { - 'doMath(uint64,uint64,string)uint64': bigint - 'hello(string)string': string - 'createApplication()void': void -} - -/** - * Defines the types of available calls and state of the Calculator smart contract. - */ -export type CalculatorTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'doMath(uint64,uint64,string)uint64' | 'doMath', { - argsObj: CalculatorArgs['obj']['doMath(uint64,uint64,string)uint64'] - argsTuple: CalculatorArgs['tuple']['doMath(uint64,uint64,string)uint64'] - /** - * The result of the operation - */ - returns: CalculatorReturns['doMath(uint64,uint64,string)uint64'] - }> - & Record<'hello(string)string' | 'hello', { - argsObj: CalculatorArgs['obj']['hello(string)string'] - argsTuple: CalculatorArgs['tuple']['hello(string)string'] - /** - * A greeting message to the user. - */ - returns: CalculatorReturns['hello(string)string'] - }> - & Record<'createApplication()void' | 'createApplication', { - argsObj: CalculatorArgs['obj']['createApplication()void'] - argsTuple: CalculatorArgs['tuple']['createApplication()void'] - returns: CalculatorReturns['createApplication()void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type CalculatorSignatures = keyof CalculatorTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type CalculatorNonVoidMethodSignatures = keyof CalculatorTypes['methods'] extends infer T ? T extends keyof CalculatorTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the Calculator smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = CalculatorTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the Calculator smart contract to the method's return type - */ -export type MethodReturn = CalculatorTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type CalculatorCreateCallParams = - | Expand & {method: 'createApplication'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema> - | Expand & {method: 'createApplication()void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema> -/** - * Defines arguments required for the deploy method. - */ -export type CalculatorDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: CalculatorCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the Calculator smart contract - */ -export abstract class CalculatorParamsFactory { - /** - * Gets available create ABI call param factories - */ - static get create() { - return { - _resolveByMethod(params: TParams) { - switch(params.method) { - case 'createApplication': - case 'createApplication()void': - return CalculatorParamsFactory.create.createApplication(params) - } - throw new Error(`Unknown ' + verb + ' method`) - }, - - /** - * Constructs create ABI call params for the Calculator smart contract using the createApplication()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - createApplication(params: CallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} { - return { - ...params, - method: 'createApplication()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - }, - } - } - - /** - * Constructs a no op call for the doMath(uint64,uint64,string)uint64 ABI method - * - * A method that takes two numbers and does either addition or subtraction - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static doMath(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'doMath(uint64,uint64,string)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.operation], - } - } - /** - * Constructs a no op call for the hello(string)string ABI method - * - * A demonstration method used in the AlgoKit fullstack template. - Greets the user by name. - - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static hello(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'hello(string)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.name], - } - } -} - -/** - * A factory to create and deploy one or more instance of the Calculator smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class CalculatorFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `CalculatorFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new CalculatorClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new CalculatorClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the Calculator smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: CalculatorDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - createParams: params.createParams?.method ? CalculatorParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (CalculatorCreateCallParams & { args: Uint8Array[] }) : undefined, - }) - return { result: result.result, appClient: new CalculatorClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Calculator smart contract using the createApplication()void ABI method. - * - * @param params The params for the smart contract call - * @returns The create params - */ - createApplication: (params: CallParams & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { - return this.appFactory.params.create(CalculatorParamsFactory.create.createApplication(params)) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Calculator smart contract using the createApplication()void ABI method. - * - * @param params The params for the smart contract call - * @returns The create transaction - */ - createApplication: (params: CallParams & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { - return this.appFactory.createTransaction.create(CalculatorParamsFactory.create.createApplication(params)) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Calculator smart contract using an ABI method call using the createApplication()void ABI method. - * - * @param params The params for the smart contract call - * @returns The create result - */ - createApplication: async (params: CallParams & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { - const result = await this.appFactory.send.create(CalculatorParamsFactory.create.createApplication(params)) - return { result: { ...result.result, return: result.result.return as unknown as (undefined | CalculatorReturns['createApplication()void']) }, appClient: new CalculatorClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the Calculator smart contract - */ -export class CalculatorClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `CalculatorClient` - * - * @param appClient An `AppClient` instance which has been created with the Calculator app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `CalculatorClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Checks for decode errors on the given return value and maps the return value to the return type for the given method - * @returns The typed return value or undefined if there was no value - */ - decodeReturnValue(method: TSignature, returnValue: ABIReturn | undefined) { - return returnValue !== undefined ? getArc56ReturnValue>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined - } - - /** - * Returns a new `CalculatorClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new CalculatorClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `CalculatorClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new CalculatorClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the Calculator smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. - * - * A method that takes two numbers and does either addition or subtraction - * - * @param params The params for the smart contract call - * @returns The call params: The result of the operation - */ - doMath: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(CalculatorParamsFactory.doMath(params)) - }, - - /** - * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. - * - * A demonstration method used in the AlgoKit fullstack template. - Greets the user by name. - - * - * @param params The params for the smart contract call - * @returns The call params: A greeting message to the user. - */ - hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(CalculatorParamsFactory.hello(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the Calculator smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. - * - * A method that takes two numbers and does either addition or subtraction - * - * @param params The params for the smart contract call - * @returns The call transaction: The result of the operation - */ - doMath: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(CalculatorParamsFactory.doMath(params)) - }, - - /** - * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. - * - * A demonstration method used in the AlgoKit fullstack template. - Greets the user by name. - - * - * @param params The params for the smart contract call - * @returns The call transaction: A greeting message to the user. - */ - hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(CalculatorParamsFactory.hello(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the Calculator smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. - * - * A method that takes two numbers and does either addition or subtraction - * - * @param params The params for the smart contract call - * @returns The call result: The result of the operation - */ - doMath: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(CalculatorParamsFactory.doMath(params)) - return {...result, return: result.return as unknown as (undefined | CalculatorReturns['doMath(uint64,uint64,string)uint64'])} - }, - - /** - * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. - * - * A demonstration method used in the AlgoKit fullstack template. - Greets the user by name. - - * - * @param params The params for the smart contract call - * @returns The call result: A greeting message to the user. - */ - hello: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(CalculatorParamsFactory.hello(params)) - return {...result, return: result.return as unknown as (undefined | CalculatorReturns['hello(string)string'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new CalculatorClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current Calculator app - */ - state = { - } - - public newGroup(): CalculatorComposer { - const client = this - const composer = this.algorand.newGroup() - let promiseChain:Promise = Promise.resolve() - const resultMappers: Array any)> = [] - return { - /** - * Add a doMath(uint64,uint64,string)uint64 method call against the Calculator contract - */ - doMath(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.doMath(params))) - resultMappers.push((v) => client.decodeReturnValue('doMath(uint64,uint64,string)uint64', v)) - return this - }, - /** - * Add a hello(string)string method call against the Calculator contract - */ - hello(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hello(params))) - resultMappers.push((v) => client.decodeReturnValue('hello(string)string', v)) - return this - }, - /** - * Add a clear state call to the Calculator contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) - } - } - } as unknown as CalculatorComposer - } -} -export type CalculatorComposer = { - /** - * Calls the doMath(uint64,uint64,string)uint64 ABI method. - * - * A method that takes two numbers and does either addition or subtraction - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - doMath(params?: CallParams): CalculatorComposer<[...TReturns, CalculatorReturns['doMath(uint64,uint64,string)uint64'] | undefined]> - - /** - * Calls the hello(string)string ABI method. - * - * A demonstration method used in the AlgoKit fullstack template. - Greets the user by name. - - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - hello(params?: CallParams): CalculatorComposer<[...TReturns, CalculatorReturns['hello(string)string'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the Calculator smart contract. - * - * @param args The arguments for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): CalculatorComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): CalculatorComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type CalculatorComposerResults = Expand - diff --git a/examples/p-tls/projects/p-tls-frontend/src/interfaces/network.ts b/examples/p-tls/projects/p-tls-frontend/src/interfaces/network.ts index a458edc..fdb97ae 100644 --- a/examples/p-tls/projects/p-tls-frontend/src/interfaces/network.ts +++ b/examples/p-tls/projects/p-tls-frontend/src/interfaces/network.ts @@ -1,5 +1,4 @@ -import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/types/network-client' -import type { TokenHeader } from 'algosdk/dist/types/client/urlTokenBaseHTTPClient' +import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/network-client' export interface AlgoViteClientConfig extends AlgoClientConfig { /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ @@ -7,7 +6,7 @@ export interface AlgoViteClientConfig extends AlgoClientConfig { /** The port to use e.g. 4001, 443, etc. */ port: string | number /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string | TokenHeader + token: string /** String representing current Algorand Network type (testnet/mainnet and etc) */ network: string } @@ -18,7 +17,7 @@ export interface AlgoViteKMDConfig extends AlgoClientConfig { /** The port to use e.g. 4001, 443, etc. */ port: string | number /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string | TokenHeader + token: string /** KMD wallet name */ wallet: string /** KMD wallet password */ diff --git a/examples/p-tls/projects/p-tls-frontend/tsconfig.json b/examples/p-tls/projects/p-tls-frontend/tsconfig.json index 5cde02a..855bfc3 100644 --- a/examples/p-tls/projects/p-tls-frontend/tsconfig.json +++ b/examples/p-tls/projects/p-tls-frontend/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, - "module": "ES2022" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + "module": "ESNext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, "declaration": true /* Generates corresponding '.d.ts' file. */, "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, "sourceMap": true /* Generates corresponding '.map' file. */, @@ -15,7 +15,7 @@ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, "allowJs": false, "allowSyntheticDefaultImports": true, - "moduleResolution": "Node", + "moduleResolution": "Bundler", "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, diff --git a/examples/p-tls/projects/p-tls-frontend/tsconfig.node.json b/examples/p-tls/projects/p-tls-frontend/tsconfig.node.json index 9d31e2a..e32f207 100644 --- a/examples/p-tls/projects/p-tls-frontend/tsconfig.node.json +++ b/examples/p-tls/projects/p-tls-frontend/tsconfig.node.json @@ -1,8 +1,8 @@ { "compilerOptions": { "composite": true, - "module": "ESNext", - "moduleResolution": "Node", + "module": "NodeNext", + "moduleResolution": "NodeNext", "allowSyntheticDefaultImports": true }, "include": ["vite.config.ts"] diff --git a/examples/p-ts/.algokit/.copier-answers.yml b/examples/p-ts/.algokit/.copier-answers.yml index 2f108ef..ca1e034 100644 --- a/examples/p-ts/.algokit/.copier-answers.yml +++ b/examples/p-ts/.algokit/.copier-answers.yml @@ -1,6 +1,6 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: -_src_path: +_commit: 2.1.8-8-g954a453 +_src_path: .. author_email: None author_name: None cloud_provider: netlify diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/.copier-answers.yml b/examples/p-ts/projects/p-ts-contracts/.algokit/.copier-answers.yml index 2741db7..3022c90 100644 --- a/examples/p-ts/projects/p-ts-contracts/.algokit/.copier-answers.yml +++ b/examples/p-ts/projects/p-ts-contracts/.algokit/.copier-answers.yml @@ -6,3 +6,4 @@ author_name: None contract_name: hello_world preset_name: production project_name: p-ts-contracts + diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/copier.yaml b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/copier.yaml index 67e3776..82f2c4a 100644 --- a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/copier.yaml +++ b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/copier.yaml @@ -4,12 +4,12 @@ _tasks: contract_name: type: str help: Name of your new contract. - placeholder: 'my-new-contract' - default: 'my-new-contract' + placeholder: "my-new-contract" + default: "my-new-contract" include_tests: type: bool help: Should we include testing files? default: 'yes' -_templates_suffix: '.j2' +_templates_suffix: ".j2" diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/copier.yaml b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/copier.yaml index dd81a7f..afa2cac 100644 --- a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/copier.yaml +++ b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/copier.yaml @@ -9,41 +9,41 @@ target_network: - testnet - localnet - custom - default: 'localnet' - when: '{{ not use_generic_env }}' + default: "localnet" + when: "{{ not use_generic_env }}" custom_network_name: type: str help: Name of your custom Algorand network. - placeholder: 'custom' + placeholder: "custom" when: "{{ not use_generic_env and target_network == 'custom' }}" is_localnet: type: bool help: Whether to deploy on localnet. - placeholder: 'true' + placeholder: "true" default: "{{ target_network == 'localnet' and not use_generic_env }}" when: 'false' is_testnet: type: bool help: Whether to deploy on testnet. - placeholder: 'true' + placeholder: "true" default: "{{ target_network == 'testnet' and not use_generic_env }}" when: 'false' is_mainnet: type: bool help: Whether to deploy on mainnet. - placeholder: 'true' + placeholder: "true" default: "{{ target_network == 'mainnet' and not use_generic_env }}" when: 'false' is_customnet: type: bool help: Whether to deploy on custom network. - placeholder: 'true' + placeholder: "true" default: "{{ target_network == 'custom' and not use_generic_env }}" when: 'false' -_templates_suffix: '.j2' +_templates_suffix: ".j2" diff --git a/examples/p-ts/projects/p-ts-contracts/.prettierrc.js b/examples/p-ts/projects/p-ts-contracts/.prettierrc.js index 87263da..a31787e 100644 --- a/examples/p-ts/projects/p-ts-contracts/.prettierrc.js +++ b/examples/p-ts/projects/p-ts-contracts/.prettierrc.js @@ -1,4 +1,4 @@ export default { singleQuote: true, jsxSingleQuote: true, -}; +} diff --git a/examples/p-ts/projects/p-ts-contracts/.vscode/launch.json b/examples/p-ts/projects/p-ts-contracts/.vscode/launch.json index 002556d..093ebb1 100644 --- a/examples/p-ts/projects/p-ts-contracts/.vscode/launch.json +++ b/examples/p-ts/projects/p-ts-contracts/.vscode/launch.json @@ -45,8 +45,8 @@ "runtimeArgs": ["run", "build"], "cwd": "${workspaceFolder}", "console": "integratedTerminal", - "skipFiles": ["/**", "node_modules/**"] - }, + "skipFiles": ["/**", "node_modules/**"], + }, { "type": "avm", "request": "launch", diff --git a/examples/p-ts/projects/p-ts-contracts/.vscode/settings.json b/examples/p-ts/projects/p-ts-contracts/.vscode/settings.json index e2a31a2..b60a0a2 100644 --- a/examples/p-ts/projects/p-ts-contracts/.vscode/settings.json +++ b/examples/p-ts/projects/p-ts-contracts/.vscode/settings.json @@ -16,4 +16,4 @@ "extensions": [".ts"] }, "eslint.workingDirectories": ["./smart_contracts"] -} + } diff --git a/examples/p-ts/projects/p-ts-contracts/.vscode/tasks.json b/examples/p-ts/projects/p-ts-contracts/.vscode/tasks.json index 808a8cb..55310ab 100644 --- a/examples/p-ts/projects/p-ts-contracts/.vscode/tasks.json +++ b/examples/p-ts/projects/p-ts-contracts/.vscode/tasks.json @@ -59,13 +59,7 @@ { "label": "Analyze TEAL contracts with AlgoKit Tealer integration", "command": "algokit", - "args": [ - "task", - "analyze", - "${workspaceFolder}/.algokit", - "--recursive", - "--force" - ], + "args": ["task", "analyze", "${workspaceFolder}/.algokit", "--recursive", "--force"], "options": { "cwd": "${workspaceFolder}" }, diff --git a/examples/p-ts/projects/p-ts-contracts/README.md b/examples/p-ts/projects/p-ts-contracts/README.md index 90a9ef6..e457562 100644 --- a/examples/p-ts/projects/p-ts-contracts/README.md +++ b/examples/p-ts/projects/p-ts-contracts/README.md @@ -16,18 +16,15 @@ This project has been generated using AlgoKit. See below for default getting sta ### Initial Setup #### 1. Clone the Repository - Start by cloning this repository to your local machine. #### 2. Install Pre-requisites - Ensure the following pre-requisites are installed and properly configured: - **Docker**: Required for running a local Algorand network. - **AlgoKit CLI**: Essential for project setup and operations. Verify installation with `algokit --version`, expecting `2.6.0` or later. #### 3. Bootstrap Your Local Environment - Run the following commands within the project folder: - **Setup Project**: Execute `algokit project bootstrap all` to install dependencies and setup npm dependencies. @@ -37,16 +34,14 @@ Run the following commands within the project folder: ### Development Workflow #### Terminal - Directly manage and interact with your project using AlgoKit commands: 1. **Build Contracts**: `algokit project run build` compiles all smart contracts. You can also specify a specific contract by passing the name of the contract folder as an extra argument. - For example: `algokit project run build -- hello_world` will only build the `hello_world` contract. +For example: `algokit project run build -- hello_world` will only build the `hello_world` contract. 2. **Deploy**: Use `algokit project deploy localnet` to deploy contracts to the local network. You can also specify a specific contract by passing the name of the contract folder as an extra argument. - For example: `algokit project deploy localnet -- hello_world` will only deploy the `hello_world` contract. - -#### VS Code +For example: `algokit project deploy localnet -- hello_world` will only deploy the `hello_world` contract. +#### VS Code For a seamless experience with breakpoint debugging and other features: 1. **Open Project**: In VS Code, open the repository root. @@ -55,7 +50,6 @@ For a seamless experience with breakpoint debugging and other features: - Use `F5` to start debugging. #### JetBrains IDEs - While primarily optimized for VS Code, JetBrains IDEs are supported: 1. **Open Project**: In your JetBrains IDE, open the repository root. @@ -63,14 +57,13 @@ While primarily optimized for VS Code, JetBrains IDEs are supported: 3. **Debugging**: Use `Shift+F10` or `Ctrl+R` to start debugging. Note: Windows users may encounter issues with pre-launch tasks due to a known bug. See [JetBrains forums](https://youtrack.jetbrains.com/issue/IDEA-277486/Shell-script-configuration-cannot-run-as-before-launch-task) for workarounds. ## AlgoKit Workspaces and Project Management - This project supports both standalone and monorepo setups through AlgoKit workspaces. Leverage [`algokit project run`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md) commands for efficient monorepo project orchestration and management across multiple projects within a workspace. ## AlgoKit Generators This template provides a set of [algokit generators](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md) that allow you to further modify the project instantiated from the template to fit your needs, as well as giving you a base to build your own extensions to invoke via the `algokit generate` command. -### Generate Smart Contract +### Generate Smart Contract By default the template creates a single `HelloWorld` contract under hello_world folder in the `smart_contracts` directory. To add a new contract: @@ -82,7 +75,7 @@ By default the template creates a single `HelloWorld` contract under hello_world ### Generate '.env' files -By default the template instance does not contain any env files to deploy to different networks. Using [`algokit project deploy`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/deploy.md) against `localnet` | `testnet` | `mainnet` will use default values for `algod` and `indexer` unless overwritten via `.env` or `.env.{target_network}`. +By default the template instance does not contain any env files to deploy to different networks. Using [`algokit project deploy`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/deploy.md) against `localnet` | `testnet` | `mainnet` will use default values for `algod` and `indexer` unless overwritten via `.env` or `.env.{target_network}`. To generate a new `.env` or `.env.{target_network}` file, run `algokit generate env-file` @@ -92,6 +85,7 @@ This project is optimized to work with AlgoKit AVM Debugger extension. To activa Refer to the commented header in the `index.ts` file in the `smart_contracts` folder.Since you have opted in to include VSCode launch configurations in your project, you can also use the `Debug TEAL via AlgoKit AVM Debugger` launch configuration to interactively select an available trace file and launch the debug session for your smart contract. + For information on using and setting up the `AlgoKit AVM Debugger` VSCode extension refer [here](https://github.com/algorandfoundation/algokit-avm-vscode-debugger). To install the extension from the VSCode Marketplace, use the following link: [AlgoKit AVM Debugger extension](https://marketplace.visualstudio.com/items?itemName=algorandfoundation.algokit-avm-vscode-debugger).### Continuous Integration / Continuous Deployment (CI/CD) This project uses [GitHub Actions](https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions) to define CI/CD workflows, which are located in the [.github/workflows](`../../.github/workflows`) folder. @@ -104,43 +98,41 @@ To define custom `algokit project run` commands refer to [documentation](https:/ #### Setting up GitHub for CI/CD workflow and TestNet deployment -1. Every time you have a change to your smart contract, and when you first initialize the project you need to [build the contract](#initial-setup) and then commit the `smart_contracts/artifacts` folder so the [output stability](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/articles/output_stability.md) tests pass -2. Decide what values you want to use for the `allowUpdate` and `allowDelete` parameters specified in [`deploy-config.ts`](./smart_contracts/hello_world/deploy-config.ts). - When deploying to LocalNet these values are both set to `true` for convenience. But for non-LocalNet networks - they are more conservative and use `false` - These default values will allow the smart contract to be deployed initially, but will not allow the app to be updated or deleted if is changed and the build will instead fail. - To help you decide it may be helpful to read the [AlgoKit Utils app deployment documentation](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/docs/capabilities/app-deploy.md) or the [AlgoKit smart contract deployment architecture](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/architecture-decisions/2023-01-12_smart-contract-deployment.md#upgradeable-and-deletable-contracts). -3. Create a [Github Environment](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#creating-an-environment) named `Test`. - Note: If you have a private repository and don't have GitHub Enterprise then Environments won't work and you'll need to convert the GitHub Action to use a different approach. Ignore this step if you picked `Starter` preset. -4. Create or obtain a mnemonic for an Algorand account for use on TestNet to deploy apps, referred to as the `DEPLOYER` account. -5. Store the mnemonic as a [secret](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#environment-secrets) `DEPLOYER_MNEMONIC` - in the Test environment created in step 3. -6. The account used to deploy the smart contract will require enough funds to create the app, and also fund it. There are two approaches available here: - - Either, ensure the account is funded outside of CI/CD. - In Testnet, funds can be obtained by using the [Algorand TestNet dispenser](https://bank.testnet.algorand.network/) and we recommend provisioning 50 ALGOs. - - Or, fund the account as part of the CI/CD process by using a `DISPENSER_MNEMONIC` GitHub Environment secret to point to a separate `DISPENSER` account that you maintain ALGOs in (similarly, you need to provision ALGOs into this account using the [TestNet dispenser](https://bank.testnet.algorand.network/)). + 1. Every time you have a change to your smart contract, and when you first initialize the project you need to [build the contract](#initial-setup) and then commit the `smart_contracts/artifacts` folder so the [output stability](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/articles/output_stability.md) tests pass + 2. Decide what values you want to use for the `allowUpdate` and `allowDelete` parameters specified in [`deploy-config.ts`](./smart_contracts/hello_world/deploy-config.ts). + When deploying to LocalNet these values are both set to `true` for convenience. But for non-LocalNet networks + they are more conservative and use `false` + These default values will allow the smart contract to be deployed initially, but will not allow the app to be updated or deleted if is changed and the build will instead fail. + To help you decide it may be helpful to read the [AlgoKit Utils app deployment documentation](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/docs/capabilities/app-deploy.md) or the [AlgoKit smart contract deployment architecture](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/architecture-decisions/2023-01-12_smart-contract-deployment.md#upgradeable-and-deletable-contracts). + 3. Create a [Github Environment](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#creating-an-environment) named `Test`. + Note: If you have a private repository and don't have GitHub Enterprise then Environments won't work and you'll need to convert the GitHub Action to use a different approach. Ignore this step if you picked `Starter` preset. + 4. Create or obtain a mnemonic for an Algorand account for use on TestNet to deploy apps, referred to as the `DEPLOYER` account. + 5. Store the mnemonic as a [secret](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#environment-secrets) `DEPLOYER_MNEMONIC` + in the Test environment created in step 3. + 6. The account used to deploy the smart contract will require enough funds to create the app, and also fund it. There are two approaches available here: + * Either, ensure the account is funded outside of CI/CD. + In Testnet, funds can be obtained by using the [Algorand TestNet dispenser](https://bank.testnet.algorand.network/) and we recommend provisioning 50 ALGOs. + * Or, fund the account as part of the CI/CD process by using a `DISPENSER_MNEMONIC` GitHub Environment secret to point to a separate `DISPENSER` account that you maintain ALGOs in (similarly, you need to provision ALGOs into this account using the [TestNet dispenser](https://bank.testnet.algorand.network/)). #### Continuous Integration For pull requests and pushes to `main` branch against this repository the following checks are automatically performed by GitHub Actions: - -- NPM dependencies are audited using [better-npm-audit](https://github.com/jeemok/better-npm-audit#readme) -- Code formatting is performed using [Prettier](https://prettier.io/) -- Linting is checked using [ESLint](https://eslint.org/) + - NPM dependencies are audited using [better-npm-audit](https://github.com/jeemok/better-npm-audit#readme) + - Code formatting is performed using [Prettier](https://prettier.io/) + - Linting is checked using [ESLint](https://eslint.org/) - The base framework for testing is [vitest](https://vitest.dev/), and the project includes two separate kinds of tests: - - `Algorand TypeScript` smart contract unit tests, that are run using [`algorand-typescript-testing`](https://github.com/algorandfoundation/algorand-typescript-testing), which are executed in a Node.js intepreter emulating major AVM behaviour - - End-to-end (e2e) `AppClient` tests that are run against `algokit localnet` and test the behaviour in a real network environment -- Smart contract artifacts are built -- Smart contract artifacts are checked for [output stability](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/articles/output_stability.md). -- Smart contract is deployed to a AlgoKit LocalNet instance + - Smart contract artifacts are built + - Smart contract artifacts are checked for [output stability](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/articles/output_stability.md). + - Smart contract is deployed to a AlgoKit LocalNet instance > NOTE: By default smart contract artifacts are compiled with `--debug-level` set to 0, to change this, modify the compiler invocation under the `build` script in `package.json` #### Continuous Deployment For pushes to `main` branch, after the above checks pass, the following deployment actions are performed: - -- The smart contract(s) are deployed to TestNet using [AlgoNode](https://algonode.io). + - The smart contract(s) are deployed to TestNet using [AlgoNode](https://algonode.io). > Please note deployment is also performed via `algokit deploy` command which can be invoked both via CI as seen on this project, or locally. For more information on how to use `algokit deploy` please see [AlgoKit documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/deploy.md). @@ -158,4 +150,8 @@ This project makes use of Algorand TypeScript to build Algorand smart contracts. - [vitest](https://vitest.dev/): Automated testing. - [better-npm-audit](https://github.com/jeemok/better-npm-audit#readme): Tool for scanning JavaScript / TypeScript environments for packages with known vulnerabilities. + It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. + + + diff --git a/examples/p-ts/projects/p-ts-contracts/eslint.config.mjs b/examples/p-ts/projects/p-ts-contracts/eslint.config.mjs index 8147a69..4d2428a 100644 --- a/examples/p-ts/projects/p-ts-contracts/eslint.config.mjs +++ b/examples/p-ts/projects/p-ts-contracts/eslint.config.mjs @@ -1,6 +1,6 @@ -import eslint from '@eslint/js'; -import tseslint from 'typescript-eslint'; -import globals from 'globals'; +import eslint from '@eslint/js' +import tseslint from 'typescript-eslint' +import globals from 'globals' export default tseslint.config( eslint.configs.recommended, diff --git a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.spec.ts b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.spec.ts index 3cf33c3..664eb72 100644 --- a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.spec.ts +++ b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.spec.ts @@ -1,14 +1,14 @@ -import { TestExecutionContext } from '@algorandfoundation/algorand-typescript-testing'; -import { describe, expect, it } from 'vitest'; -import { HelloWorld } from './contract.algo'; +import { TestExecutionContext } from '@algorandfoundation/algorand-typescript-testing' +import { describe, expect, it } from 'vitest' +import { HelloWorld } from './contract.algo' describe('HelloWorld contract', () => { - const ctx = new TestExecutionContext(); + const ctx = new TestExecutionContext() it('Logs the returned value when sayHello is called', () => { - const contract = ctx.contract.create(HelloWorld); + const contract = ctx.contract.create(HelloWorld) - const result = contract.hello('Sally'); + const result = contract.hello('Sally') - expect(result).toBe('Hello, Sally'); - }); -}); + expect(result).toBe('Hello, Sally') + }) +}) diff --git a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.ts b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.ts index 099d3f5..5e2fcfe 100644 --- a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.ts +++ b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.ts @@ -1,7 +1,7 @@ -import { Contract } from '@algorandfoundation/algorand-typescript'; +import { Contract } from '@algorandfoundation/algorand-typescript' export class HelloWorld extends Contract { public hello(name: string): string { - return `Hello, ${name}`; + return `Hello, ${name}` } } diff --git a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.e2e.spec.ts b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.e2e.spec.ts index 2c6db91..5a19a9a 100644 --- a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.e2e.spec.ts +++ b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.e2e.spec.ts @@ -1,57 +1,52 @@ -import { Config, Address } from '@algorandfoundation/algokit-utils'; -import { registerDebugEventHandlers } from '@algorandfoundation/algokit-utils-debug'; -import { algorandFixture } from '@algorandfoundation/algokit-utils/testing'; -import { beforeAll, beforeEach, describe, expect, test } from 'vitest'; -import { HelloWorldFactory } from '../artifacts/hello_world/HelloWorldClient'; +import { Config, Address } from '@algorandfoundation/algokit-utils' +import { registerDebugEventHandlers } from '@algorandfoundation/algokit-utils-debug' +import { algorandFixture } from '@algorandfoundation/algokit-utils/testing' +import { beforeAll, beforeEach, describe, expect, test } from 'vitest' +import { HelloWorldFactory } from '../artifacts/hello_world/HelloWorldClient' describe('HelloWorld contract', () => { - const localnet = algorandFixture(); + const localnet = algorandFixture() beforeAll(() => { Config.configure({ debug: true, // traceAll: true, - }); - registerDebugEventHandlers(); - }); - beforeEach(localnet.newScope); + }) + registerDebugEventHandlers() + }) + beforeEach(localnet.newScope) const deploy = async (account: Address) => { - const factory = localnet.algorand.client.getTypedAppFactory( - HelloWorldFactory, - { - defaultSender: account, - }, - ); + const factory = localnet.algorand.client.getTypedAppFactory(HelloWorldFactory, { + defaultSender: account, + }) const { appClient } = await factory.deploy({ onUpdate: 'append', onSchemaBreak: 'append', - }); - return { client: appClient }; - }; + }) + return { client: appClient } + } test('says hello', async () => { - const { testAccount } = localnet.context; - const { client } = await deploy(testAccount); + const { testAccount } = localnet.context + const { client } = await deploy(testAccount) - const result = await client.send.hello({ args: { name: 'World' } }); + const result = await client.send.hello({ args: { name: 'World' } }) - expect(result.return).toBe('Hello, World'); - }); + expect(result.return).toBe('Hello, World') + }) test('simulate says hello with correct budget consumed', async () => { - const { testAccount } = localnet.context; - const { client } = await deploy(testAccount); + const { testAccount } = localnet.context + const { client } = await deploy(testAccount) const result = await client .newGroup() .hello({ args: { name: 'World' } }) .hello({ args: { name: 'Jane' } }) - .simulate(); - - expect(result.returns[0]).toBe('Hello, World'); - expect(result.returns[1]).toBe('Hello, Jane'); - expect(result.simulateResponse.txnGroups[0].appBudgetConsumed).toBeLessThan( - 100, - ); - }); -}); + .simulate() + + expect(result.returns[0]).toBe('Hello, World') + expect(result.returns[1]).toBe('Hello, Jane') + expect(result.simulateResponse.txnGroups[0].appBudgetConsumed).toBeLessThan(100) + }) +}) diff --git a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/deploy-config.ts b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/deploy-config.ts index 8dd48e0..6cf7f14 100644 --- a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/deploy-config.ts +++ b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/deploy-config.ts @@ -1,21 +1,18 @@ -import { AlgorandClient } from '@algorandfoundation/algokit-utils'; -import { HelloWorldFactory } from '../artifacts/hello_world/HelloWorldClient'; +import { AlgorandClient } from '@algorandfoundation/algokit-utils' +import { HelloWorldFactory } from '../artifacts/hello_world/HelloWorldClient' // Below is a showcase of various deployment options you can use in TypeScript Client export async function deploy() { - console.log('=== Deploying HelloWorld ==='); + console.log('=== Deploying HelloWorld ===') - const algorand = AlgorandClient.fromEnvironment(); - const deployer = await algorand.account.fromEnvironment('DEPLOYER'); + const algorand = AlgorandClient.fromEnvironment() + const deployer = await algorand.account.fromEnvironment('DEPLOYER') const factory = algorand.client.getTypedAppFactory(HelloWorldFactory, { defaultSender: deployer.addr, - }); + }) - const { appClient, result } = await factory.deploy({ - onUpdate: 'append', - onSchemaBreak: 'append', - }); + const { appClient, result } = await factory.deploy({ onUpdate: 'append', onSchemaBreak: 'append' }) // If app was just created fund the app account if (['create', 'replace'].includes(result.operationPerformed)) { @@ -23,14 +20,14 @@ export async function deploy() { amount: (1).algo(), sender: deployer.addr, receiver: appClient.appAddress, - }); + }) } - const method = 'hello'; + const method = 'hello' const response = await appClient.send.hello({ args: { name: 'world' }, - }); + }) console.log( `Called ${method} on ${appClient.appClient.appName} (${appClient.appClient.appId}) with name = world, received: ${response.return}`, - ); + ) } diff --git a/examples/p-ts/projects/p-ts-contracts/smart_contracts/index.ts b/examples/p-ts/projects/p-ts-contracts/smart_contracts/index.ts index ccc455f..d643cd8 100644 --- a/examples/p-ts/projects/p-ts-contracts/smart_contracts/index.ts +++ b/examples/p-ts/projects/p-ts-contracts/smart_contracts/index.ts @@ -1,9 +1,9 @@ -import { Config } from '@algorandfoundation/algokit-utils'; -import { registerDebugEventHandlers } from '@algorandfoundation/algokit-utils-debug'; -import { consoleLogger } from '@algorandfoundation/algokit-utils/logging'; -import * as fs from 'node:fs'; -import * as path from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { Config } from '@algorandfoundation/algokit-utils' +import { registerDebugEventHandlers } from '@algorandfoundation/algokit-utils-debug' +import { consoleLogger } from '@algorandfoundation/algokit-utils/logging' +import * as fs from 'node:fs' +import * as path from 'node:path' +import { fileURLToPath } from 'node:url' // Uncomment the traceAll option to enable auto generation of AVM Debugger compliant sourceMap and simulation trace file for all AVM calls. // Learn more about using AlgoKit AVM Debugger to debug your TEAL source codes and inspect various kinds of Algorand transactions in atomic groups -> https://github.com/algorandfoundation/algokit-avm-vscode-Debugger @@ -12,23 +12,20 @@ Config.configure({ logger: consoleLogger, debug: true, // traceAll: true, -}); -registerDebugEventHandlers(); +}) +registerDebugEventHandlers() // base directory -const baseDir = path.dirname(fileURLToPath(import.meta.url)); +const baseDir = path.dirname(fileURLToPath(import.meta.url)) // function to validate and dynamically import a module async function importDeployerIfExists(dir: string) { - const deployerPath = path.resolve(dir, 'deploy-config'); - if ( - fs.existsSync(deployerPath + '.ts') || - fs.existsSync(deployerPath + '.js') - ) { - const deployer = await import(deployerPath); - return { ...deployer, name: path.basename(dir) }; + const deployerPath = path.resolve(dir, 'deploy-config') + if (fs.existsSync(deployerPath + '.ts') || fs.existsSync(deployerPath + '.js')) { + const deployer = await import(deployerPath) + return { ...deployer, name: path.basename(dir) } } - return null; + return null } // get a list of all deployers from the subdirectories @@ -36,31 +33,31 @@ async function getDeployers() { const directories = fs .readdirSync(baseDir, { withFileTypes: true }) .filter((dirent) => dirent.isDirectory()) - .map((dirent) => path.resolve(baseDir, dirent.name)); + .map((dirent) => path.resolve(baseDir, dirent.name)) - const deployers = await Promise.all(directories.map(importDeployerIfExists)); - return deployers.filter((deployer) => deployer !== null); // Filter out null values + const deployers = await Promise.all(directories.map(importDeployerIfExists)) + return deployers.filter((deployer) => deployer !== null) // Filter out null values } // execute all the deployers (async () => { - const contractName = process.argv.length > 2 ? process.argv[2] : undefined; - const contractDeployers = await getDeployers(); + const contractName = process.argv.length > 2 ? process.argv[2] : undefined + const contractDeployers = await getDeployers() const filteredDeployers = contractName ? contractDeployers.filter((deployer) => deployer.name === contractName) - : contractDeployers; + : contractDeployers if (contractName && filteredDeployers.length === 0) { - console.warn(`No deployer found for contract name: ${contractName}`); - return; + console.warn(`No deployer found for contract name: ${contractName}`) + return } for (const deployer of filteredDeployers) { try { - await deployer.deploy(); + await deployer.deploy() } catch (e) { - console.error(`Error deploying ${deployer.name}:`, e); + console.error(`Error deploying ${deployer.name}:`, e) } } -})(); +})() diff --git a/examples/p-ts/projects/p-ts-contracts/vitest.config.mts b/examples/p-ts/projects/p-ts-contracts/vitest.config.mts index 6d6b97d..644b9cc 100644 --- a/examples/p-ts/projects/p-ts-contracts/vitest.config.mts +++ b/examples/p-ts/projects/p-ts-contracts/vitest.config.mts @@ -1,10 +1,10 @@ -import { puyaTsTransformer } from '@algorandfoundation/algorand-typescript-testing/vitest-transformer'; -import typescript from '@rollup/plugin-typescript'; -import { defineConfig } from 'vitest/config'; +import { puyaTsTransformer } from '@algorandfoundation/algorand-typescript-testing/vitest-transformer' +import typescript from '@rollup/plugin-typescript' +import { defineConfig } from 'vitest/config' export default defineConfig({ esbuild: {}, - test: { + test: { testTimeout: 10000, coverage: { provider: 'v8', @@ -18,4 +18,4 @@ export default defineConfig({ }, }), ], -}); +}) diff --git a/examples/p-ts/projects/p-ts-frontend/src/contracts/HelloWorld.ts b/examples/p-ts/projects/p-ts-frontend/src/contracts/HelloWorld.ts deleted file mode 100644 index 3165097..0000000 --- a/examples/p-ts/projects/p-ts-frontend/src/contracts/HelloWorld.ts +++ /dev/null @@ -1,560 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"HelloWorld","structs":{},"methods":[{"name":"hello","args":[{"type":"string","name":"name"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[37],"errorMessage":"OnCompletion must be NoOp && can only call when creating"},{"pc":[26],"errorMessage":"OnCompletion must be NoOp && can only call when not creating"},{"pc":[47],"errorMessage":"invalid array length header"},{"pc":[55],"errorMessage":"invalid number of bytes for arc4.dynamic_array"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgSGVsbG9Xb3JsZCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2hlbGxvX3JvdXRlQDMKICAgIGVycgoKbWFpbl9oZWxsb19yb3V0ZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gcHVibGljIGhlbGxvKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGIgaGVsbG8KCm1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgSGVsbG9Xb3JsZCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LmFsZ28udHM6OkhlbGxvV29ybGQuaGVsbG9bcm91dGluZ10oKSAtPiB2b2lkOgpoZWxsbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIHB1YmxpYyBoZWxsbyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBwdXNoaW50IDAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5hbGdvLnRzOjUKICAgIC8vIHJldHVybiBgSGVsbG8sICR7bmFtZX1gCiAgICBwdXNoYnl0ZXMgIkhlbGxvLCAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIHB1YmxpYyBoZWxsbyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcgewogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgAQCvs4RNhoAjgEAAQAxGRQxGBBEQgALMRkUMRgUEESBAUM2GgFJgQBZgQIISwEVEkRXAgCAB0hlbGxvLCBMUEkVFlcGAkxQgAQVH3x1TFCwgQFD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the HelloWorld contract - */ -export type HelloWorldArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'hello(string)string': { - name: string - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'hello(string)string': [name: string] - } -} - -/** - * The return type for each method - */ -export type HelloWorldReturns = { - 'hello(string)string': string -} - -/** - * Defines the types of available calls and state of the HelloWorld smart contract. - */ -export type HelloWorldTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'hello(string)string' | 'hello', { - argsObj: HelloWorldArgs['obj']['hello(string)string'] - argsTuple: HelloWorldArgs['tuple']['hello(string)string'] - returns: HelloWorldReturns['hello(string)string'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type HelloWorldSignatures = keyof HelloWorldTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type HelloWorldNonVoidMethodSignatures = keyof HelloWorldTypes['methods'] extends infer T ? T extends keyof HelloWorldTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the HelloWorld smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = HelloWorldTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the HelloWorld smart contract to the method's return type - */ -export type MethodReturn = HelloWorldTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type HelloWorldCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type HelloWorldDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: HelloWorldCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the HelloWorld smart contract - */ -export abstract class HelloWorldParamsFactory { - /** - * Constructs a no op call for the hello(string)string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static hello(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'hello(string)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.name], - } - } -} - -/** - * A factory to create and deploy one or more instance of the HelloWorld smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class HelloWorldFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `HelloWorldFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new HelloWorldClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new HelloWorldClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the HelloWorld smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: HelloWorldDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new HelloWorldClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the HelloWorld smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the HelloWorld smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the HelloWorld smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new HelloWorldClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the HelloWorld smart contract - */ -export class HelloWorldClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `HelloWorldClient` - * - * @param appClient An `AppClient` instance which has been created with the HelloWorld app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `HelloWorldClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `HelloWorldClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new HelloWorldClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `HelloWorldClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new HelloWorldClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the HelloWorld smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - hello: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(HelloWorldParamsFactory.hello(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the HelloWorld smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - hello: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(HelloWorldParamsFactory.hello(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the HelloWorld smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - hello: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(HelloWorldParamsFactory.hello(params)) - return {...result, return: result.return as unknown as (undefined | HelloWorldReturns['hello(string)string'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new HelloWorldClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current HelloWorld app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): HelloWorldComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a hello(string)string method call against the HelloWorld contract - */ - hello(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hello(params))) - return this - }, - /** - * Add a clear state call to the HelloWorld contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as HelloWorldComposer - } -} -export type HelloWorldComposer = { - /** - * Calls the hello(string)string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - hello(params?: CallParams): HelloWorldComposer<[...TReturns, HelloWorldReturns['hello(string)string'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the HelloWorld smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): HelloWorldComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): HelloWorldComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type HelloWorldComposerResults = Expand - diff --git a/examples/s-py/.algokit/.copier-answers.yml b/examples/s-py/.algokit/.copier-answers.yml index ec84665..da992b7 100644 --- a/examples/s-py/.algokit/.copier-answers.yml +++ b/examples/s-py/.algokit/.copier-answers.yml @@ -1,6 +1,6 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: -_src_path: +_commit: 2.1.8-8-g954a453 +_src_path: .. author_email: None author_name: None contract_name: hello_world diff --git a/examples/s-py/projects/s-py-contracts/.algokit/.copier-answers.yml b/examples/s-py/projects/s-py-contracts/.algokit/.copier-answers.yml index 6c2b784..820c129 100644 --- a/examples/s-py/projects/s-py-contracts/.algokit/.copier-answers.yml +++ b/examples/s-py/projects/s-py-contracts/.algokit/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 1.8.1 +_commit: 1.8.1-13-g270c4a5 _src_path: gh:algorandfoundation/algokit-python-template author_email: None author_name: None diff --git a/examples/s-py/projects/s-py-contracts/README.md b/examples/s-py/projects/s-py-contracts/README.md index 5634432..3afcb30 100644 --- a/examples/s-py/projects/s-py-contracts/README.md +++ b/examples/s-py/projects/s-py-contracts/README.md @@ -100,7 +100,7 @@ This project makes use of Algorand Python to build Algorand smart contracts. The - [Poetry](https://python-poetry.org/): Python packaging and dependency management. - [npm](https://www.npmjs.com/): Node.js package manager - [TypeScript](https://www.typescriptlang.org/): Strongly typed programming language that builds on JavaScript -- [ts-node-dev](https://github.com/wclr/ts-node-dev): TypeScript development execution environment +- [tsx](https://github.com/wclr/tsx): TypeScript development execution environment It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. diff --git a/examples/s-py/projects/s-py-contracts/package.json b/examples/s-py/projects/s-py-contracts/package.json index d612e63..c4c2bfb 100644 --- a/examples/s-py/projects/s-py-contracts/package.json +++ b/examples/s-py/projects/s-py-contracts/package.json @@ -3,9 +3,10 @@ "version": "1.0.0", "description": "Smart contract deployer", "main": "index.ts", + "type": "module", "scripts": { - "deploy": "ts-node-dev --transpile-only --watch .env -r dotenv/config smart_contracts/index.ts", - "deploy:ci": "ts-node --transpile-only -r dotenv/config smart_contracts/index.ts", + "deploy": "tsx watch --watch .env -r dotenv/config smart_contracts/index.ts", + "deploy:ci": "tsx -r dotenv/config smart_contracts/index.ts", "format": "prettier --write ." }, "engines": { @@ -13,15 +14,14 @@ "npm": ">=9.0" }, "dependencies": { - "@algorandfoundation/algokit-utils": "^9.0.0", - "@algorandfoundation/algokit-utils-debug": "^1.0.2", - "algosdk": "^3.0.0" + "@algorandfoundation/algokit-utils": "^10.0.0-alpha.40", + "@algorandfoundation/algokit-utils-debug": "^2.0.0-alpha.2" }, "devDependencies": { - "@algorandfoundation/algokit-client-generator": "^6.0.0", + "@algorandfoundation/algokit-client-generator": "^7.0.0-alpha.5", "dotenv": "^16.0.3", "prettier": "^2.8.4", - "ts-node-dev": "^2.0.0", - "typescript": "^4.9.5" + "tsx": "^4.19.3", + "typescript": "^5.7.3" } } diff --git a/examples/s-py/projects/s-py-contracts/pyproject.toml b/examples/s-py/projects/s-py-contracts/pyproject.toml index 3fe51a5..4afb32d 100644 --- a/examples/s-py/projects/s-py-contracts/pyproject.toml +++ b/examples/s-py/projects/s-py-contracts/pyproject.toml @@ -8,10 +8,10 @@ package-mode = false [tool.poetry.dependencies] python = "^3.12" -algokit-utils = "^4.0.0" +algokit-utils = "^5.0.0a13" python-dotenv = "^1.0.0" algorand-python = "^3" -algorand-python-testing = "^1" +algorand-python-testing = {git = "https://github.com/algorandfoundation/algorand-python-testing.git", branch = "refactor/util-v5"} [tool.poetry.group.dev.dependencies] puyapy = "*" diff --git a/examples/s-py/projects/s-py-contracts/smart_contracts/index.ts b/examples/s-py/projects/s-py-contracts/smart_contracts/index.ts index bebecc6..4a14ad5 100644 --- a/examples/s-py/projects/s-py-contracts/smart_contracts/index.ts +++ b/examples/s-py/projects/s-py-contracts/smart_contracts/index.ts @@ -1,5 +1,6 @@ import * as fs from 'fs' import * as path from 'path' +import { fileURLToPath, pathToFileURL } from 'url' import { consoleLogger } from '@algorandfoundation/algokit-utils/types/logging' import { Config } from '@algorandfoundation/algokit-utils' // import { registerDebugEventHandlers } from '@algorandfoundation/algokit-utils-debug' // Uncomment to enable persisting artifacts required by AlgoKit AVM Debugger @@ -15,13 +16,16 @@ Config.configure({ // registerDebugEventHandlers() // Uncomment to enable persisting artifacts required by AlgoKit AVM Debugger // base directory -const baseDir = path.resolve(__dirname) +const baseDir = path.dirname(fileURLToPath(import.meta.url)) // function to validate and dynamically import a module async function importDeployerIfExists(dir: string) { - const deployerPath = path.resolve(dir, 'deploy-config') - if (fs.existsSync(deployerPath + '.ts') || fs.existsSync(deployerPath + '.js')) { - const deployer = await import(deployerPath) + const tsPath = path.resolve(dir, 'deploy-config.ts') + const jsPath = path.resolve(dir, 'deploy-config.js') + const deployerPath = fs.existsSync(tsPath) ? tsPath : fs.existsSync(jsPath) ? jsPath : undefined + + if (deployerPath) { + const deployer = await import(pathToFileURL(deployerPath).href) return { ...deployer, name: path.basename(dir) } } return null diff --git a/examples/s-py/projects/s-py-contracts/tsconfig.json b/examples/s-py/projects/s-py-contracts/tsconfig.json index fc75893..5b195eb 100644 --- a/examples/s-py/projects/s-py-contracts/tsconfig.json +++ b/examples/s-py/projects/s-py-contracts/tsconfig.json @@ -14,8 +14,8 @@ "forceConsistentCasingInFileNames": true, "allowJs": false, "allowSyntheticDefaultImports": true, - "module": "CommonJS", - "moduleResolution": "Node", + "module": "NodeNext", + "moduleResolution": "NodeNext", "resolveJsonModule": true, "isolatedModules": true, "noEmit": true diff --git a/examples/s-py/projects/s-py-frontend/.algokit/.copier-answers.yml b/examples/s-py/projects/s-py-frontend/.algokit/.copier-answers.yml index f585cc5..8440898 100644 --- a/examples/s-py/projects/s-py-frontend/.algokit/.copier-answers.yml +++ b/examples/s-py/projects/s-py-frontend/.algokit/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 1.1.1 +_commit: 1.1.1-13-gc5abe59 _src_path: gh:algorandfoundation/algokit-react-frontend-template author_email: None author_name: None diff --git a/examples/s-py/projects/s-py-frontend/.env.template b/examples/s-py/projects/s-py-frontend/.env.template index eb4b229..5dfbb2d 100644 --- a/examples/s-py/projects/s-py-frontend/.env.template +++ b/examples/s-py/projects/s-py-frontend/.env.template @@ -65,3 +65,6 @@ VITE_KMD_PASSWORD="" # VITE_INDEXER_SERVER="https://mainnet-idx.algonode.cloud" # VITE_INDEXER_PORT="" + +# Add your Web3Auth Client ID here if you want to test Web3Auth integration on TestNet or Mainnet +# VITE_WEB3_AUTH_CLIENT_ID="" \ No newline at end of file diff --git a/examples/s-py/projects/s-py-frontend/package.json b/examples/s-py/projects/s-py-frontend/package.json index a372747..37b1664 100644 --- a/examples/s-py/projects/s-py-frontend/package.json +++ b/examples/s-py/projects/s-py-frontend/package.json @@ -12,7 +12,7 @@ "npm": ">=9.0" }, "devDependencies": { - "@algorandfoundation/algokit-client-generator": "^5.0.0", + "@algorandfoundation/algokit-client-generator": "^7.0.0-alpha.5", "@types/node": "^18.17.14", "@types/react": "^18.2.11", "@types/react-dom": "^18.2.4", @@ -24,12 +24,12 @@ "vite-plugin-node-polyfills": "^0.22.0" }, "dependencies": { - "@algorandfoundation/algokit-utils": "^9.0.0", + "@algorandfoundation/algokit-utils": "^10.0.0-alpha.40", "@blockshake/defly-connect": "^1.2.1", "@perawallet/connect": "^1.4.1", - "@txnlab/use-wallet": "^4.0.0", - "@txnlab/use-wallet-react": "^4.0.0", - "algosdk": "^3.0.0", + "@txnlab/use-wallet": "^4.6.0", + "@txnlab/use-wallet-react": "^4.6.0", + "@web3auth/modal": "^9.7.0", "notistack": "^3.0.1", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/examples/s-py/projects/s-py-frontend/src/components/Transact.tsx b/examples/s-py/projects/s-py-frontend/src/components/Transact.tsx index 59d7cdd..36b1ec7 100644 --- a/examples/s-py/projects/s-py-frontend/src/components/Transact.tsx +++ b/examples/s-py/projects/s-py-frontend/src/components/Transact.tsx @@ -1,4 +1,5 @@ import { algo, AlgorandClient } from '@algorandfoundation/algokit-utils' +import { encodeTransactionRaw } from '@algorandfoundation/algokit-utils/transact' import { useWallet } from '@txnlab/use-wallet-react' import { useSnackbar } from 'notistack' import { useState } from 'react' @@ -18,12 +19,12 @@ const Transact = ({ openModal, setModalState }: TransactInterface) => { const { enqueueSnackbar } = useSnackbar() - const { transactionSigner, activeAddress } = useWallet() + const { signTransactions, activeAddress } = useWallet() const handleSubmitAlgo = async () => { setLoading(true) - if (!transactionSigner || !activeAddress) { + if (!signTransactions || !activeAddress) { enqueueSnackbar('Please connect wallet first', { variant: 'warning' }) return } @@ -31,7 +32,11 @@ const Transact = ({ openModal, setModalState }: TransactInterface) => { try { enqueueSnackbar('Sending transaction...', { variant: 'info' }) const result = await algorand.send.payment({ - signer: transactionSigner, + signer: async (txnGroup, indexesToSign) => { + const encoded = txnGroup.map((txn) => encodeTransactionRaw(txn)) + const signed = await signTransactions(encoded, indexesToSign) + return signed.filter((s): s is Uint8Array => s !== null) + }, sender: activeAddress, receiver: receiverAddress, amount: algo(1), diff --git a/examples/s-py/projects/s-py-frontend/src/contracts/HelloWorld.ts b/examples/s-py/projects/s-py-frontend/src/contracts/HelloWorld.ts deleted file mode 100644 index 1fc6caf..0000000 --- a/examples/s-py/projects/s-py-frontend/src/contracts/HelloWorld.ts +++ /dev/null @@ -1,581 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^7 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app' -import { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56' -import { - AppClient as _AppClient, - AppClientMethodCallParams, - AppClientParams, - AppClientBareCallParams, - CallOnComplete, - AppClientCompilationParams, - ResolveAppClientByCreatorAndName, - ResolveAppClientByNetwork, - CloneAppClientParams, -} from '@algorandfoundation/algokit-utils/types/app-client' -import { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer' -import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' -import SimulateResponse = modelsv2.SimulateResponse - -export const APP_SPEC: Arc56Contract = {"name":"HelloWorld","structs":{},"methods":[{"name":"hello","args":[{"type":"string","name":"name"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[37],"errorMessage":"OnCompletion must be NoOp && can only call when creating"},{"pc":[26],"errorMessage":"OnCompletion must be NoOp && can only call when not creating"},{"pc":[47],"errorMessage":"invalid array length header"},{"pc":[55],"errorMessage":"invalid number of bytes for arc4.dynamic_array"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5weTo1CiAgICAvLyBjbGFzcyBIZWxsb1dvcmxkKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2hlbGxvX3JvdXRlQDMKICAgIGVycgoKbWFpbl9oZWxsb19yb3V0ZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LnB5OjYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBiIGhlbGxvCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5oZWxsb193b3JsZC5jb250cmFjdC5IZWxsb1dvcmxkLmhlbGxvW3JvdXRpbmddKCkgLT4gdm9pZDoKaGVsbG86CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QucHk6NgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIHB1c2hpbnQgMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LnB5OjgKICAgIC8vIHJldHVybiAiSGVsbG8sICIgKyBuYW1lCiAgICBwdXNoYnl0ZXMgIkhlbGxvLCAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5weTo2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"byteCode":{"approval":"CzEbQQAYgAQCvs4RNhoAjgEAAQAxGRQxGBBEQgALMRkUMRgUEESBAUM2GgFJgQBZgQIISwEVEkRXAgCAB0hlbGxvLCBMUEkVFlcGAkxQgAQVH3x1TFCwgQFD","clear":"C4EBQw=="},"compilerInfo":{"compiler":"puya","compilerVersion":{"major":5,"minor":4,"patch":0}},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the HelloWorld contract - */ -export type HelloWorldArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'hello(string)string': { - name: string - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'hello(string)string': [name: string] - } -} - -/** - * The return type for each method - */ -export type HelloWorldReturns = { - 'hello(string)string': string -} - -/** - * Defines the types of available calls and state of the HelloWorld smart contract. - */ -export type HelloWorldTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'hello(string)string' | 'hello', { - argsObj: HelloWorldArgs['obj']['hello(string)string'] - argsTuple: HelloWorldArgs['tuple']['hello(string)string'] - returns: HelloWorldReturns['hello(string)string'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type HelloWorldSignatures = keyof HelloWorldTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type HelloWorldNonVoidMethodSignatures = keyof HelloWorldTypes['methods'] extends infer T ? T extends keyof HelloWorldTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the HelloWorld smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = HelloWorldTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the HelloWorld smart contract to the method's return type - */ -export type MethodReturn = HelloWorldTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type HelloWorldCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type HelloWorldDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: HelloWorldCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the HelloWorld smart contract - */ -export abstract class HelloWorldParamsFactory { - /** - * Constructs a no op call for the hello(string)string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static hello(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'hello(string)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.name], - } - } -} - -/** - * A factory to create and deploy one or more instance of the HelloWorld smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class HelloWorldFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `HelloWorldFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new HelloWorldClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new HelloWorldClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the HelloWorld smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: HelloWorldDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new HelloWorldClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the HelloWorld smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the HelloWorld smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the HelloWorld smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new HelloWorldClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the HelloWorld smart contract - */ -export class HelloWorldClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `HelloWorldClient` - * - * @param appClient An `AppClient` instance which has been created with the HelloWorld app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `HelloWorldClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Checks for decode errors on the given return value and maps the return value to the return type for the given method - * @returns The typed return value or undefined if there was no value - */ - decodeReturnValue(method: TSignature, returnValue: ABIReturn | undefined) { - return returnValue !== undefined ? getArc56ReturnValue>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined - } - - /** - * Returns a new `HelloWorldClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new HelloWorldClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `HelloWorldClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new HelloWorldClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the HelloWorld smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(HelloWorldParamsFactory.hello(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the HelloWorld smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(HelloWorldParamsFactory.hello(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the HelloWorld smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - hello: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(HelloWorldParamsFactory.hello(params)) - return {...result, return: result.return as unknown as (undefined | HelloWorldReturns['hello(string)string'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new HelloWorldClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current HelloWorld app - */ - state = { - } - - public newGroup(): HelloWorldComposer { - const client = this - const composer = this.algorand.newGroup() - let promiseChain:Promise = Promise.resolve() - const resultMappers: Array any)> = [] - return { - /** - * Add a hello(string)string method call against the HelloWorld contract - */ - hello(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hello(params))) - resultMappers.push((v) => client.decodeReturnValue('hello(string)string', v)) - return this - }, - /** - * Add a clear state call to the HelloWorld contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) - } - } - } as unknown as HelloWorldComposer - } -} -export type HelloWorldComposer = { - /** - * Calls the hello(string)string ABI method. - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - hello(params?: CallParams): HelloWorldComposer<[...TReturns, HelloWorldReturns['hello(string)string'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the HelloWorld smart contract. - * - * @param args The arguments for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): HelloWorldComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): HelloWorldComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type HelloWorldComposerResults = Expand - diff --git a/examples/s-py/projects/s-py-frontend/src/interfaces/network.ts b/examples/s-py/projects/s-py-frontend/src/interfaces/network.ts index a458edc..fdb97ae 100644 --- a/examples/s-py/projects/s-py-frontend/src/interfaces/network.ts +++ b/examples/s-py/projects/s-py-frontend/src/interfaces/network.ts @@ -1,5 +1,4 @@ -import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/types/network-client' -import type { TokenHeader } from 'algosdk/dist/types/client/urlTokenBaseHTTPClient' +import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/network-client' export interface AlgoViteClientConfig extends AlgoClientConfig { /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ @@ -7,7 +6,7 @@ export interface AlgoViteClientConfig extends AlgoClientConfig { /** The port to use e.g. 4001, 443, etc. */ port: string | number /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string | TokenHeader + token: string /** String representing current Algorand Network type (testnet/mainnet and etc) */ network: string } @@ -18,7 +17,7 @@ export interface AlgoViteKMDConfig extends AlgoClientConfig { /** The port to use e.g. 4001, 443, etc. */ port: string | number /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string | TokenHeader + token: string /** KMD wallet name */ wallet: string /** KMD wallet password */ diff --git a/examples/s-py/projects/s-py-frontend/tsconfig.json b/examples/s-py/projects/s-py-frontend/tsconfig.json index 443b6bd..a0f5661 100644 --- a/examples/s-py/projects/s-py-frontend/tsconfig.json +++ b/examples/s-py/projects/s-py-frontend/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, - "module": "ES2022" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + "module": "ESNext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, "declaration": true /* Generates corresponding '.d.ts' file. */, "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, "sourceMap": true /* Generates corresponding '.map' file. */, @@ -15,7 +15,7 @@ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, "allowJs": false, "allowSyntheticDefaultImports": true, - "moduleResolution": "Node", + "moduleResolution": "Bundler", "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, diff --git a/examples/s-py/projects/s-py-frontend/tsconfig.node.json b/examples/s-py/projects/s-py-frontend/tsconfig.node.json index 9d31e2a..e32f207 100644 --- a/examples/s-py/projects/s-py-frontend/tsconfig.node.json +++ b/examples/s-py/projects/s-py-frontend/tsconfig.node.json @@ -1,8 +1,8 @@ { "compilerOptions": { "composite": true, - "module": "ESNext", - "moduleResolution": "Node", + "module": "NodeNext", + "moduleResolution": "NodeNext", "allowSyntheticDefaultImports": true }, "include": ["vite.config.ts"] diff --git a/examples/s-tls/.algokit/.copier-answers.yml b/examples/s-tls/.algokit/.copier-answers.yml index 2a5df3e..6a47aa5 100644 --- a/examples/s-tls/.algokit/.copier-answers.yml +++ b/examples/s-tls/.algokit/.copier-answers.yml @@ -1,6 +1,6 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: -_src_path: +_commit: 2.1.8-8-g954a453 +_src_path: .. author_email: None author_name: None contract_name: Calculator diff --git a/examples/s-tls/projects/s-tls-contracts/contracts/clients/CalculatorClient.ts b/examples/s-tls/projects/s-tls-contracts/contracts/clients/CalculatorClient.ts deleted file mode 100644 index ef4d4eb..0000000 --- a/examples/s-tls/projects/s-tls-contracts/contracts/clients/CalculatorClient.ts +++ /dev/null @@ -1,742 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^7 - */ -import { AlgorandClientInterface } from '@algorandfoundation/algokit-utils/types/algorand-client-interface' -import { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app' -import { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56' -import { - AppClient as _AppClient, - AppClientMethodCallParams, - AppClientParams, - AppClientBareCallParams, - CallOnComplete, - AppClientCompilationParams, - ResolveAppClientByCreatorAndName, - ResolveAppClientByNetwork, - CloneAppClientParams, -} from '@algorandfoundation/algokit-utils/types/app-client' -import { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer' -import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' -import SimulateResponse = modelsv2.SimulateResponse - -export const APP_SPEC: Arc56Contract = {"name":"Calculator","desc":"","methods":[{"name":"doMath","desc":"A method that takes two numbers and does either addition or subtraction","args":[{"name":"a","type":"uint64","desc":"The first uint64"},{"name":"b","type":"uint64","desc":"The second uint64"},{"name":"operation","type":"string","desc":"The operation to perform. Can be either 'sum' or 'difference'"}],"returns":{"type":"uint64","desc":"The result of the operation"},"actions":{"create":[],"call":["NoOp"]}},{"name":"hello","desc":"A demonstration method used in the AlgoKit fullstack template.\nGreets the user by name.","args":[{"name":"name","type":"string","desc":"The name of the user to greet."}],"returns":{"type":"string","desc":"A greeting message to the user."},"actions":{"create":[],"call":["NoOp"]}},{"name":"createApplication","args":[],"returns":{"type":"void"},"actions":{"create":["NoOp"],"call":[]}}],"arcs":[4,56],"structs":{},"state":{"schema":{"global":{"bytes":0,"ints":0},"local":{"bytes":0,"ints":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":[],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"teal":1,"source":"contracts/Calculator.algo.ts:3","pc":[0]},{"teal":2,"source":"contracts/Calculator.algo.ts:3","pc":[1,2,3]},{"teal":3,"source":"contracts/Calculator.algo.ts:3","pc":[4,5,6,7,8,9,10]},{"teal":15,"source":"contracts/Calculator.algo.ts:3","pc":[11,12]},{"teal":16,"source":"contracts/Calculator.algo.ts:3","pc":[13]},{"teal":17,"source":"contracts/Calculator.algo.ts:3","pc":[14,15]},{"teal":18,"source":"contracts/Calculator.algo.ts:3","pc":[16]},{"teal":19,"source":"contracts/Calculator.algo.ts:3","pc":[17,18]},{"teal":20,"source":"contracts/Calculator.algo.ts:3","pc":[19]},{"teal":21,"source":"contracts/Calculator.algo.ts:3","pc":[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]},{"teal":25,"source":"contracts/Calculator.algo.ts:3","errorMessage":"The requested action is not implemented in this contract. Are you using the correct OnComplete? Did you set your app ID?","pc":[46]},{"teal":35,"source":"contracts/Calculator.algo.ts:11","pc":[47,48,49]},{"teal":39,"source":"contracts/Calculator.algo.ts:12","pc":[50,51]},{"teal":40,"source":"contracts/Calculator.algo.ts:12","pc":[52,53]},{"teal":41,"source":"contracts/Calculator.algo.ts:12","pc":[54]},{"teal":42,"source":"contracts/Calculator.algo.ts:11","pc":[55]},{"teal":52,"source":"contracts/Calculator.algo.ts:22","pc":[56,57,58]},{"teal":56,"source":"contracts/Calculator.algo.ts:23","pc":[59,60]},{"teal":57,"source":"contracts/Calculator.algo.ts:23","pc":[61,62]},{"teal":58,"source":"contracts/Calculator.algo.ts:23","pc":[63]},{"teal":59,"source":"contracts/Calculator.algo.ts:23","pc":[64,65,66]},{"teal":60,"source":"contracts/Calculator.algo.ts:23","pc":[67,68]},{"teal":61,"source":"contracts/Calculator.algo.ts:23","pc":[69,70]},{"teal":62,"source":"contracts/Calculator.algo.ts:23","pc":[71]},{"teal":63,"source":"contracts/Calculator.algo.ts:23","pc":[72,73,74]},{"teal":66,"source":"contracts/Calculator.algo.ts:23","pc":[75,76]},{"teal":67,"source":"contracts/Calculator.algo.ts:23","pc":[77,78]},{"teal":68,"source":"contracts/Calculator.algo.ts:23","pc":[79]},{"teal":71,"source":"contracts/Calculator.algo.ts:22","pc":[80]},{"teal":76,"source":"contracts/Calculator.algo.ts:35","pc":[81]},{"teal":79,"source":"contracts/Calculator.algo.ts:35","pc":[82,83,84]},{"teal":80,"source":"contracts/Calculator.algo.ts:35","pc":[85,86,87]},{"teal":83,"source":"contracts/Calculator.algo.ts:35","pc":[88,89,90]},{"teal":84,"source":"contracts/Calculator.algo.ts:35","pc":[91]},{"teal":87,"source":"contracts/Calculator.algo.ts:35","pc":[92,93,94]},{"teal":88,"source":"contracts/Calculator.algo.ts:35","pc":[95]},{"teal":91,"source":"contracts/Calculator.algo.ts:35","pc":[96,97,98]},{"teal":92,"source":"contracts/Calculator.algo.ts:35","pc":[99]},{"teal":93,"source":"contracts/Calculator.algo.ts:35","pc":[100]},{"teal":94,"source":"contracts/Calculator.algo.ts:35","pc":[101]},{"teal":95,"source":"contracts/Calculator.algo.ts:35","pc":[102]},{"teal":96,"source":"contracts/Calculator.algo.ts:35","pc":[103]},{"teal":108,"source":"contracts/Calculator.algo.ts:35","pc":[104,105,106]},{"teal":111,"source":"contracts/Calculator.algo.ts:35","pc":[107,108]},{"teal":116,"source":"contracts/Calculator.algo.ts:38","pc":[109,110]},{"teal":117,"source":"contracts/Calculator.algo.ts:38","pc":[111,112,113,114,115]},{"teal":118,"source":"contracts/Calculator.algo.ts:38","pc":[116]},{"teal":119,"source":"contracts/Calculator.algo.ts:38","pc":[117,118,119]},{"teal":124,"source":"contracts/Calculator.algo.ts:39","pc":[120,121]},{"teal":125,"source":"contracts/Calculator.algo.ts:39","pc":[122,123]},{"teal":126,"source":"contracts/Calculator.algo.ts:39","pc":[124,125,126]},{"teal":127,"source":"contracts/Calculator.algo.ts:39","pc":[127,128]},{"teal":128,"source":"contracts/Calculator.algo.ts:38","pc":[129,130,131]},{"teal":133,"source":"contracts/Calculator.algo.ts:40","pc":[132,133]},{"teal":134,"source":"contracts/Calculator.algo.ts:40","pc":[134,135,136,137,138,139,140,141,142,143,144,145]},{"teal":135,"source":"contracts/Calculator.algo.ts:40","pc":[146]},{"teal":136,"source":"contracts/Calculator.algo.ts:40","pc":[147,148,149]},{"teal":141,"source":"contracts/Calculator.algo.ts:41","pc":[150,151]},{"teal":142,"source":"contracts/Calculator.algo.ts:41","pc":[152,153]},{"teal":143,"source":"contracts/Calculator.algo.ts:41","pc":[154,155,156]},{"teal":144,"source":"contracts/Calculator.algo.ts:41","pc":[157,158]},{"teal":145,"source":"contracts/Calculator.algo.ts:40","pc":[159,160,161]},{"teal":149,"source":"contracts/Calculator.algo.ts:42","errorMessage":"Invalid operation","pc":[162]},{"teal":154,"source":"contracts/Calculator.algo.ts:44","pc":[163,164]},{"teal":157,"source":"contracts/Calculator.algo.ts:35","pc":[165,166]},{"teal":158,"source":"contracts/Calculator.algo.ts:35","pc":[167]},{"teal":163,"source":"contracts/Calculator.algo.ts:54","pc":[168]},{"teal":166,"source":"contracts/Calculator.algo.ts:54","pc":[169,170,171]},{"teal":167,"source":"contracts/Calculator.algo.ts:54","pc":[172,173,174]},{"teal":170,"source":"contracts/Calculator.algo.ts:54","pc":[175,176,177]},{"teal":171,"source":"contracts/Calculator.algo.ts:54","pc":[178]},{"teal":172,"source":"contracts/Calculator.algo.ts:54","pc":[179]},{"teal":173,"source":"contracts/Calculator.algo.ts:54","pc":[180]},{"teal":174,"source":"contracts/Calculator.algo.ts:54","pc":[181,182,183]},{"teal":175,"source":"contracts/Calculator.algo.ts:54","pc":[184]},{"teal":176,"source":"contracts/Calculator.algo.ts:54","pc":[185]},{"teal":177,"source":"contracts/Calculator.algo.ts:54","pc":[186]},{"teal":178,"source":"contracts/Calculator.algo.ts:54","pc":[187]},{"teal":179,"source":"contracts/Calculator.algo.ts:54","pc":[188]},{"teal":180,"source":"contracts/Calculator.algo.ts:54","pc":[189]},{"teal":190,"source":"contracts/Calculator.algo.ts:54","pc":[190,191,192]},{"teal":194,"source":"contracts/Calculator.algo.ts:55","pc":[193,194,195,196,197,198,199,200,201]},{"teal":195,"source":"contracts/Calculator.algo.ts:55","pc":[202,203]},{"teal":196,"source":"contracts/Calculator.algo.ts:55","pc":[204]},{"teal":197,"source":"contracts/Calculator.algo.ts:54","pc":[205]},{"teal":200,"source":"contracts/Calculator.algo.ts:3","pc":[206]},{"teal":201,"source":"contracts/Calculator.algo.ts:3","pc":[207]},{"teal":204,"source":"contracts/Calculator.algo.ts:3","pc":[208,209,210,211,212,213]},{"teal":205,"source":"contracts/Calculator.algo.ts:3","pc":[214,215,216]},{"teal":206,"source":"contracts/Calculator.algo.ts:3","pc":[217,218,219,220]},{"teal":209,"source":"contracts/Calculator.algo.ts:3","errorMessage":"this contract does not implement the given ABI method for create NoOp","pc":[221]},{"teal":212,"source":"contracts/Calculator.algo.ts:3","pc":[222,223,224,225,226,227]},{"teal":213,"source":"contracts/Calculator.algo.ts:3","pc":[228,229,230,231,232,233]},{"teal":214,"source":"contracts/Calculator.algo.ts:3","pc":[234,235,236]},{"teal":215,"source":"contracts/Calculator.algo.ts:3","pc":[237,238,239,240,241,242]},{"teal":218,"source":"contracts/Calculator.algo.ts:3","errorMessage":"this contract does not implement the given ABI method for call NoOp","pc":[243]}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCmludGNibG9jayAxCmJ5dGVjYmxvY2sgMHgxNTFmN2M3NQoKLy8gVGhpcyBURUFMIHdhcyBnZW5lcmF0ZWQgYnkgVEVBTFNjcmlwdCB2MC4xMDcuMQovLyBodHRwczovL2dpdGh1Yi5jb20vYWxnb3JhbmRmb3VuZGF0aW9uL1RFQUxTY3JpcHQKCi8vIFRoaXMgY29udHJhY3QgaXMgY29tcGxpYW50IHdpdGggYW5kL29yIGltcGxlbWVudHMgdGhlIGZvbGxvd2luZyBBUkNzOiBbIEFSQzQgXQoKLy8gVGhlIGZvbGxvd2luZyB0ZW4gbGluZXMgb2YgVEVBTCBoYW5kbGUgaW5pdGlhbCBwcm9ncmFtIGZsb3cKLy8gVGhpcyBwYXR0ZXJuIGlzIHVzZWQgdG8gbWFrZSBpdCBlYXN5IGZvciBhbnlvbmUgdG8gcGFyc2UgdGhlIHN0YXJ0IG9mIHRoZSBwcm9ncmFtIGFuZCBkZXRlcm1pbmUgaWYgYSBzcGVjaWZpYyBhY3Rpb24gaXMgYWxsb3dlZAovLyBIZXJlLCBhY3Rpb24gcmVmZXJzIHRvIHRoZSBPbkNvbXBsZXRlIGluIGNvbWJpbmF0aW9uIHdpdGggd2hldGhlciB0aGUgYXBwIGlzIGJlaW5nIGNyZWF0ZWQgb3IgY2FsbGVkCi8vIEV2ZXJ5IHBvc3NpYmxlIGFjdGlvbiBmb3IgdGhpcyBjb250cmFjdCBpcyByZXByZXNlbnRlZCBpbiB0aGUgc3dpdGNoIHN0YXRlbWVudAovLyBJZiB0aGUgYWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgY29udHJhY3QsIGl0cyByZXNwZWN0aXZlIGJyYW5jaCB3aWxsIGJlICIqTk9UX0lNUExFTUVOVEVEIiB3aGljaCBqdXN0IGNvbnRhaW5zICJlcnIiCnR4biBBcHBsaWNhdGlvbklECiEKcHVzaGludCA2CioKdHhuIE9uQ29tcGxldGlvbgorCnN3aXRjaCAqY2FsbF9Ob09wICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqY3JlYXRlX05vT3AgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVECgoqTk9UX0lNUExFTUVOVEVEOgoJLy8gVGhlIHJlcXVlc3RlZCBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoaXMgY29udHJhY3QuIEFyZSB5b3UgdXNpbmcgdGhlIGNvcnJlY3QgT25Db21wbGV0ZT8gRGlkIHlvdSBzZXQgeW91ciBhcHAgSUQ/CgllcnIKCi8vIGdldFN1bShhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NAovLwovLyBDYWxjdWxhdGVzIHRoZSBzdW0gb2YgdHdvIG51bWJlcnMKLy8KLy8gQHBhcmFtIGEKLy8gQHBhcmFtIGIKLy8gQHJldHVybnMgVGhlIHN1bSBvZiBhIGFuZCBiCmdldFN1bToKCXByb3RvIDIgMQoKCS8vIGNvbnRyYWN0cy9DYWxjdWxhdG9yLmFsZ28udHM6MTIKCS8vIHJldHVybiBhICsgYjsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCSsKCXJldHN1YgoKLy8gZ2V0RGlmZmVyZW5jZShhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NAovLwovLyBDYWxjdWxhdGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIG51bWJlcnMKLy8KLy8gQHBhcmFtIGEKLy8gQHBhcmFtIGIKLy8gQHJldHVybnMgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGFuZCBiLgpnZXREaWZmZXJlbmNlOgoJcHJvdG8gMiAxCgoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czoyMwoJLy8gcmV0dXJuIGEgPj0gYiA/IGEgLSBiIDogYiAtIGE7CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0Cgk+PQoJYnogKnRlcm5hcnkwX2ZhbHNlCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0CgktCgliICp0ZXJuYXJ5MF9lbmQKCip0ZXJuYXJ5MF9mYWxzZToKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCS0KCip0ZXJuYXJ5MF9lbmQ6CglyZXRzdWIKCi8vIGRvTWF0aCh1aW50NjQsdWludDY0LHN0cmluZyl1aW50NjQKKmFiaV9yb3V0ZV9kb01hdGg6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGVjIDAgLy8gMHgxNTFmN2M3NQoKCS8vIG9wZXJhdGlvbjogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglleHRyYWN0IDIgMAoKCS8vIGI6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJYnRvaQoKCS8vIGE6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZG9NYXRoKHVpbnQ2NCx1aW50NjQsc3RyaW5nKXVpbnQ2NAoJY2FsbHN1YiBkb01hdGgKCWl0b2IKCWNvbmNhdAoJbG9nCglpbnRjIDAgLy8gMQoJcmV0dXJuCgovLyBkb01hdGgoYTogdWludDY0LCBiOiB1aW50NjQsIG9wZXJhdGlvbjogc3RyaW5nKTogdWludDY0Ci8vCi8vIEEgbWV0aG9kIHRoYXQgdGFrZXMgdHdvIG51bWJlcnMgYW5kIGRvZXMgZWl0aGVyIGFkZGl0aW9uIG9yIHN1YnRyYWN0aW9uCi8vCi8vIEBwYXJhbSBhIFRoZSBmaXJzdCB1aW50NjQKLy8gQHBhcmFtIGIgVGhlIHNlY29uZCB1aW50NjQKLy8gQHBhcmFtIG9wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0uIENhbiBiZSBlaXRoZXIgJ3N1bScgb3IgJ2RpZmZlcmVuY2UnCi8vCi8vIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbgpkb01hdGg6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJcHVzaGJ5dGVzIDB4CgoJLy8gKmlmMF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy9DYWxjdWxhdG9yLmFsZ28udHM6MzgKCS8vIG9wZXJhdGlvbiA9PT0gJ3N1bScKCWZyYW1lX2RpZyAtMyAvLyBvcGVyYXRpb246IHN0cmluZwoJcHVzaGJ5dGVzIDB4NzM3NTZkIC8vICJzdW0iCgk9PQoJYnogKmlmMF9lbHNlaWYxX2NvbmRpdGlvbgoKCS8vICppZjBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czozOQoJLy8gcmVzdWx0ID0gdGhpcy5nZXRTdW0oYSwgYikKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCWNhbGxzdWIgZ2V0U3VtCglmcmFtZV9idXJ5IDAgLy8gcmVzdWx0OiB1aW50NjQKCWIgKmlmMF9lbmQKCippZjBfZWxzZWlmMV9jb25kaXRpb246CgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjQwCgkvLyBvcGVyYXRpb24gPT09ICdkaWZmZXJlbmNlJwoJZnJhbWVfZGlnIC0zIC8vIG9wZXJhdGlvbjogc3RyaW5nCglwdXNoYnl0ZXMgMHg2NDY5NjY2NjY1NzI2NTZlNjM2NSAvLyAiZGlmZmVyZW5jZSIKCT09CglieiAqaWYwX2Vsc2UKCgkvLyAqaWYwX2Vsc2VpZjFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czo0MQoJLy8gcmVzdWx0ID0gdGhpcy5nZXREaWZmZXJlbmNlKGEsIGIpCglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CgljYWxsc3ViIGdldERpZmZlcmVuY2UKCWZyYW1lX2J1cnkgMCAvLyByZXN1bHQ6IHVpbnQ2NAoJYiAqaWYwX2VuZAoKKmlmMF9lbHNlOgoJLy8gSW52YWxpZCBvcGVyYXRpb24KCWVycgoKKmlmMF9lbmQ6CgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjQ0CgkvLyByZXR1cm4gcmVzdWx0OwoJZnJhbWVfZGlnIDAgLy8gcmVzdWx0OiB1aW50NjQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gaGVsbG8oc3RyaW5nKXN0cmluZwoqYWJpX3JvdXRlX2hlbGxvOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlYyAwIC8vIDB4MTUxZjdjNzUKCgkvLyBuYW1lOiBzdHJpbmcKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgoJLy8gZXhlY3V0ZSBoZWxsbyhzdHJpbmcpc3RyaW5nCgljYWxsc3ViIGhlbGxvCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWludGMgMCAvLyAxCglyZXR1cm4KCi8vIGhlbGxvKG5hbWU6IHN0cmluZyk6IHN0cmluZwovLwovLyBBIGRlbW9uc3RyYXRpb24gbWV0aG9kIHVzZWQgaW4gdGhlIEFsZ29LaXQgZnVsbHN0YWNrIHRlbXBsYXRlLgovLyBHcmVldHMgdGhlIHVzZXIgYnkgbmFtZS4KLy8KLy8gQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHVzZXIgdG8gZ3JlZXQuCi8vIEByZXR1cm5zIEEgZ3JlZXRpbmcgbWVzc2FnZSB0byB0aGUgdXNlci4KaGVsbG86Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjU1CgkvLyByZXR1cm4gJ0hlbGxvLCAnICsgbmFtZTsKCXB1c2hieXRlcyAweDQ4NjU2YzZjNmYyYzIwIC8vICJIZWxsbywgIgoJZnJhbWVfZGlnIC0xIC8vIG5hbWU6IHN0cmluZwoJY29uY2F0CglyZXRzdWIKCiphYmlfcm91dGVfY3JlYXRlQXBwbGljYXRpb246CglpbnRjIDAgLy8gMQoJcmV0dXJuCgoqY3JlYXRlX05vT3A6CglwdXNoYnl0ZXMgMHhiODQ0N2IzNiAvLyBtZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKCl2b2lkIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9jcmVhdGVBcHBsaWNhdGlvbgoKCS8vIHRoaXMgY29udHJhY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBnaXZlbiBBQkkgbWV0aG9kIGZvciBjcmVhdGUgTm9PcAoJZXJyCgoqY2FsbF9Ob09wOgoJcHVzaGJ5dGVzIDB4NzZhN2VmMzMgLy8gbWV0aG9kICJkb01hdGgodWludDY0LHVpbnQ2NCxzdHJpbmcpdWludDY0IgoJcHVzaGJ5dGVzIDB4MDJiZWNlMTEgLy8gbWV0aG9kICJoZWxsbyhzdHJpbmcpc3RyaW5nIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9kb01hdGggKmFiaV9yb3V0ZV9oZWxsbwoKCS8vIHRoaXMgY29udHJhY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBnaXZlbiBBQkkgbWV0aG9kIGZvciBjYWxsIE5vT3AKCWVycg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEw"},"byteCode":{"approval":"CiABASYBBBUffHUxGBSBBgsxGQiNDACwAAAAAAAAAAAAAACiAAAAAAAAAAAAAACKAgGL/4v+CImKAgGL/4v+D0EACIv/i/4JQgAFi/6L/wmJKDYaA1cCADYaAhc2GgEXiAAFFlCwIkOKAwGAAIv9gANzdW0SQQAMi/6L/4j/sIwAQgAfi/2ACmRpZmZlcmVuY2USQQAMi/6L/4j/m4wAQgABAIsAjACJKDYaAVcCAIgADEkVFlcGAkxQULAiQ4oBAYAHSGVsbG8sIIv/UIkiQ4AEuER7NjYaAI4B//EAgAR2p+8zgAQCvs4RNhoAjgL/Xv+1AA==","clear":"Cg=="},"compilerInfo":{"compiler":"algod","compilerVersion":{"major":4,"minor":4,"patch":1,"commitHash":"7b607ce4"}}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the Calculator contract - */ -export type CalculatorArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'doMath(uint64,uint64,string)uint64': { - /** - * The first uint64 - */ - a: bigint | number - /** - * The second uint64 - */ - b: bigint | number - /** - * The operation to perform. Can be either 'sum' or 'difference' - */ - operation: string - } - 'hello(string)string': { - /** - * The name of the user to greet. - */ - name: string - } - 'createApplication()void': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'doMath(uint64,uint64,string)uint64': [a: bigint | number, b: bigint | number, operation: string] - 'hello(string)string': [name: string] - 'createApplication()void': [] - } -} - -/** - * The return type for each method - */ -export type CalculatorReturns = { - 'doMath(uint64,uint64,string)uint64': bigint - 'hello(string)string': string - 'createApplication()void': void -} - -/** - * Defines the types of available calls and state of the Calculator smart contract. - */ -export type CalculatorTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'doMath(uint64,uint64,string)uint64' | 'doMath', { - argsObj: CalculatorArgs['obj']['doMath(uint64,uint64,string)uint64'] - argsTuple: CalculatorArgs['tuple']['doMath(uint64,uint64,string)uint64'] - /** - * The result of the operation - */ - returns: CalculatorReturns['doMath(uint64,uint64,string)uint64'] - }> - & Record<'hello(string)string' | 'hello', { - argsObj: CalculatorArgs['obj']['hello(string)string'] - argsTuple: CalculatorArgs['tuple']['hello(string)string'] - /** - * A greeting message to the user. - */ - returns: CalculatorReturns['hello(string)string'] - }> - & Record<'createApplication()void' | 'createApplication', { - argsObj: CalculatorArgs['obj']['createApplication()void'] - argsTuple: CalculatorArgs['tuple']['createApplication()void'] - returns: CalculatorReturns['createApplication()void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type CalculatorSignatures = keyof CalculatorTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type CalculatorNonVoidMethodSignatures = keyof CalculatorTypes['methods'] extends infer T ? T extends keyof CalculatorTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the Calculator smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = CalculatorTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the Calculator smart contract to the method's return type - */ -export type MethodReturn = CalculatorTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type CalculatorCreateCallParams = - | Expand & {method: 'createApplication'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema> - | Expand & {method: 'createApplication()void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema> -/** - * Defines arguments required for the deploy method. - */ -export type CalculatorDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: CalculatorCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the Calculator smart contract - */ -export abstract class CalculatorParamsFactory { - /** - * Gets available create ABI call param factories - */ - static get create() { - return { - _resolveByMethod(params: TParams) { - switch(params.method) { - case 'createApplication': - case 'createApplication()void': - return CalculatorParamsFactory.create.createApplication(params) - } - throw new Error(`Unknown ' + verb + ' method`) - }, - - /** - * Constructs create ABI call params for the Calculator smart contract using the createApplication()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - createApplication(params: CallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} { - return { - ...params, - method: 'createApplication()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - }, - } - } - - /** - * Constructs a no op call for the doMath(uint64,uint64,string)uint64 ABI method - * - * A method that takes two numbers and does either addition or subtraction - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static doMath(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'doMath(uint64,uint64,string)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.operation], - } - } - /** - * Constructs a no op call for the hello(string)string ABI method - * - * A demonstration method used in the AlgoKit fullstack template. - Greets the user by name. - - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static hello(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'hello(string)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.name], - } - } -} - -/** - * A factory to create and deploy one or more instance of the Calculator smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class CalculatorFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `CalculatorFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClientInterface { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new CalculatorClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new CalculatorClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the Calculator smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: CalculatorDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - createParams: params.createParams?.method ? CalculatorParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (CalculatorCreateCallParams & { args: Uint8Array[] }) : undefined, - }) - return { result: result.result, appClient: new CalculatorClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Calculator smart contract using the createApplication()void ABI method. - * - * @param params The params for the smart contract call - * @returns The create params - */ - createApplication: (params: CallParams & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { - return this.appFactory.params.create(CalculatorParamsFactory.create.createApplication(params)) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Calculator smart contract using the createApplication()void ABI method. - * - * @param params The params for the smart contract call - * @returns The create transaction - */ - createApplication: (params: CallParams & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { - return this.appFactory.createTransaction.create(CalculatorParamsFactory.create.createApplication(params)) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Calculator smart contract using an ABI method call using the createApplication()void ABI method. - * - * @param params The params for the smart contract call - * @returns The create result - */ - createApplication: async (params: CallParams & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { - const result = await this.appFactory.send.create(CalculatorParamsFactory.create.createApplication(params)) - return { result: { ...result.result, return: result.result.return as unknown as (undefined | CalculatorReturns['createApplication()void']) }, appClient: new CalculatorClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the Calculator smart contract - */ -export class CalculatorClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `CalculatorClient` - * - * @param appClient An `AppClient` instance which has been created with the Calculator app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `CalculatorClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Checks for decode errors on the given return value and maps the return value to the return type for the given method - * @returns The typed return value or undefined if there was no value - */ - decodeReturnValue(method: TSignature, returnValue: ABIReturn | undefined) { - return returnValue !== undefined ? getArc56ReturnValue>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined - } - - /** - * Returns a new `CalculatorClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new CalculatorClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `CalculatorClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new CalculatorClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClientInterface { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the Calculator smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. - * - * A method that takes two numbers and does either addition or subtraction - * - * @param params The params for the smart contract call - * @returns The call params: The result of the operation - */ - doMath: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(CalculatorParamsFactory.doMath(params)) - }, - - /** - * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. - * - * A demonstration method used in the AlgoKit fullstack template. - Greets the user by name. - - * - * @param params The params for the smart contract call - * @returns The call params: A greeting message to the user. - */ - hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(CalculatorParamsFactory.hello(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the Calculator smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. - * - * A method that takes two numbers and does either addition or subtraction - * - * @param params The params for the smart contract call - * @returns The call transaction: The result of the operation - */ - doMath: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(CalculatorParamsFactory.doMath(params)) - }, - - /** - * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. - * - * A demonstration method used in the AlgoKit fullstack template. - Greets the user by name. - - * - * @param params The params for the smart contract call - * @returns The call transaction: A greeting message to the user. - */ - hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(CalculatorParamsFactory.hello(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the Calculator smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. - * - * A method that takes two numbers and does either addition or subtraction - * - * @param params The params for the smart contract call - * @returns The call result: The result of the operation - */ - doMath: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(CalculatorParamsFactory.doMath(params)) - return {...result, return: result.return as unknown as (undefined | CalculatorReturns['doMath(uint64,uint64,string)uint64'])} - }, - - /** - * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. - * - * A demonstration method used in the AlgoKit fullstack template. - Greets the user by name. - - * - * @param params The params for the smart contract call - * @returns The call result: A greeting message to the user. - */ - hello: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(CalculatorParamsFactory.hello(params)) - return {...result, return: result.return as unknown as (undefined | CalculatorReturns['hello(string)string'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new CalculatorClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current Calculator app - */ - state = { - } - - public newGroup(): CalculatorComposer { - const client = this - const composer = this.algorand.newGroup() - let promiseChain:Promise = Promise.resolve() - const resultMappers: Array any)> = [] - return { - /** - * Add a doMath(uint64,uint64,string)uint64 method call against the Calculator contract - */ - doMath(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.doMath(params))) - resultMappers.push((v) => client.decodeReturnValue('doMath(uint64,uint64,string)uint64', v)) - return this - }, - /** - * Add a hello(string)string method call against the Calculator contract - */ - hello(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hello(params))) - resultMappers.push((v) => client.decodeReturnValue('hello(string)string', v)) - return this - }, - /** - * Add a clear state call to the Calculator contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) - } - } - } as unknown as CalculatorComposer - } -} -export type CalculatorComposer = { - /** - * Calls the doMath(uint64,uint64,string)uint64 ABI method. - * - * A method that takes two numbers and does either addition or subtraction - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - doMath(params?: CallParams): CalculatorComposer<[...TReturns, CalculatorReturns['doMath(uint64,uint64,string)uint64'] | undefined]> - - /** - * Calls the hello(string)string ABI method. - * - * A demonstration method used in the AlgoKit fullstack template. - Greets the user by name. - - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - hello(params?: CallParams): CalculatorComposer<[...TReturns, CalculatorReturns['hello(string)string'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the Calculator smart contract. - * - * @param args The arguments for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): CalculatorComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): CalculatorComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type CalculatorComposerResults = Expand - diff --git a/examples/s-tls/projects/s-tls-frontend/.algokit/.copier-answers.yml b/examples/s-tls/projects/s-tls-frontend/.algokit/.copier-answers.yml index 2682fb5..c7dc6c9 100644 --- a/examples/s-tls/projects/s-tls-frontend/.algokit/.copier-answers.yml +++ b/examples/s-tls/projects/s-tls-frontend/.algokit/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 1.1.1 +_commit: 1.1.1-13-gc5abe59 _src_path: gh:algorandfoundation/algokit-react-frontend-template author_email: None author_name: None diff --git a/examples/s-tls/projects/s-tls-frontend/.env.template b/examples/s-tls/projects/s-tls-frontend/.env.template index eb4b229..5dfbb2d 100644 --- a/examples/s-tls/projects/s-tls-frontend/.env.template +++ b/examples/s-tls/projects/s-tls-frontend/.env.template @@ -65,3 +65,6 @@ VITE_KMD_PASSWORD="" # VITE_INDEXER_SERVER="https://mainnet-idx.algonode.cloud" # VITE_INDEXER_PORT="" + +# Add your Web3Auth Client ID here if you want to test Web3Auth integration on TestNet or Mainnet +# VITE_WEB3_AUTH_CLIENT_ID="" \ No newline at end of file diff --git a/examples/s-tls/projects/s-tls-frontend/package.json b/examples/s-tls/projects/s-tls-frontend/package.json index 7d3fb81..87e6657 100644 --- a/examples/s-tls/projects/s-tls-frontend/package.json +++ b/examples/s-tls/projects/s-tls-frontend/package.json @@ -12,7 +12,7 @@ "npm": ">=9.0" }, "devDependencies": { - "@algorandfoundation/algokit-client-generator": "^5.0.0", + "@algorandfoundation/algokit-client-generator": "^7.0.0-alpha.5", "@types/node": "^18.17.14", "@types/react": "^18.2.11", "@types/react-dom": "^18.2.4", @@ -24,12 +24,12 @@ "vite-plugin-node-polyfills": "^0.22.0" }, "dependencies": { - "@algorandfoundation/algokit-utils": "^9.0.0", + "@algorandfoundation/algokit-utils": "^10.0.0-alpha.40", "@blockshake/defly-connect": "^1.2.1", "@perawallet/connect": "^1.4.1", - "@txnlab/use-wallet": "^4.0.0", - "@txnlab/use-wallet-react": "^4.0.0", - "algosdk": "^3.0.0", + "@txnlab/use-wallet": "^4.6.0", + "@txnlab/use-wallet-react": "^4.6.0", + "@web3auth/modal": "^9.7.0", "notistack": "^3.0.1", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/examples/s-tls/projects/s-tls-frontend/src/components/Transact.tsx b/examples/s-tls/projects/s-tls-frontend/src/components/Transact.tsx index 59d7cdd..36b1ec7 100644 --- a/examples/s-tls/projects/s-tls-frontend/src/components/Transact.tsx +++ b/examples/s-tls/projects/s-tls-frontend/src/components/Transact.tsx @@ -1,4 +1,5 @@ import { algo, AlgorandClient } from '@algorandfoundation/algokit-utils' +import { encodeTransactionRaw } from '@algorandfoundation/algokit-utils/transact' import { useWallet } from '@txnlab/use-wallet-react' import { useSnackbar } from 'notistack' import { useState } from 'react' @@ -18,12 +19,12 @@ const Transact = ({ openModal, setModalState }: TransactInterface) => { const { enqueueSnackbar } = useSnackbar() - const { transactionSigner, activeAddress } = useWallet() + const { signTransactions, activeAddress } = useWallet() const handleSubmitAlgo = async () => { setLoading(true) - if (!transactionSigner || !activeAddress) { + if (!signTransactions || !activeAddress) { enqueueSnackbar('Please connect wallet first', { variant: 'warning' }) return } @@ -31,7 +32,11 @@ const Transact = ({ openModal, setModalState }: TransactInterface) => { try { enqueueSnackbar('Sending transaction...', { variant: 'info' }) const result = await algorand.send.payment({ - signer: transactionSigner, + signer: async (txnGroup, indexesToSign) => { + const encoded = txnGroup.map((txn) => encodeTransactionRaw(txn)) + const signed = await signTransactions(encoded, indexesToSign) + return signed.filter((s): s is Uint8Array => s !== null) + }, sender: activeAddress, receiver: receiverAddress, amount: algo(1), diff --git a/examples/s-tls/projects/s-tls-frontend/src/contracts/Calculator.ts b/examples/s-tls/projects/s-tls-frontend/src/contracts/Calculator.ts deleted file mode 100644 index cc4657a..0000000 --- a/examples/s-tls/projects/s-tls-frontend/src/contracts/Calculator.ts +++ /dev/null @@ -1,742 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^7 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app' -import { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56' -import { - AppClient as _AppClient, - AppClientMethodCallParams, - AppClientParams, - AppClientBareCallParams, - CallOnComplete, - AppClientCompilationParams, - ResolveAppClientByCreatorAndName, - ResolveAppClientByNetwork, - CloneAppClientParams, -} from '@algorandfoundation/algokit-utils/types/app-client' -import { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer' -import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' -import SimulateResponse = modelsv2.SimulateResponse - -export const APP_SPEC: Arc56Contract = {"name":"Calculator","desc":"","methods":[{"name":"doMath","desc":"A method that takes two numbers and does either addition or subtraction","args":[{"name":"a","type":"uint64","desc":"The first uint64"},{"name":"b","type":"uint64","desc":"The second uint64"},{"name":"operation","type":"string","desc":"The operation to perform. Can be either 'sum' or 'difference'"}],"returns":{"type":"uint64","desc":"The result of the operation"},"actions":{"create":[],"call":["NoOp"]}},{"name":"hello","desc":"A demonstration method used in the AlgoKit fullstack template.\nGreets the user by name.","args":[{"name":"name","type":"string","desc":"The name of the user to greet."}],"returns":{"type":"string","desc":"A greeting message to the user."},"actions":{"create":[],"call":["NoOp"]}},{"name":"createApplication","args":[],"returns":{"type":"void"},"actions":{"create":["NoOp"],"call":[]}}],"arcs":[4,56],"structs":{},"state":{"schema":{"global":{"bytes":0,"ints":0},"local":{"bytes":0,"ints":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":[],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"teal":1,"source":"contracts/Calculator.algo.ts:3","pc":[0]},{"teal":2,"source":"contracts/Calculator.algo.ts:3","pc":[1,2,3]},{"teal":3,"source":"contracts/Calculator.algo.ts:3","pc":[4,5,6,7,8,9,10]},{"teal":15,"source":"contracts/Calculator.algo.ts:3","pc":[11,12]},{"teal":16,"source":"contracts/Calculator.algo.ts:3","pc":[13]},{"teal":17,"source":"contracts/Calculator.algo.ts:3","pc":[14,15]},{"teal":18,"source":"contracts/Calculator.algo.ts:3","pc":[16]},{"teal":19,"source":"contracts/Calculator.algo.ts:3","pc":[17,18]},{"teal":20,"source":"contracts/Calculator.algo.ts:3","pc":[19]},{"teal":21,"source":"contracts/Calculator.algo.ts:3","pc":[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]},{"teal":25,"source":"contracts/Calculator.algo.ts:3","errorMessage":"The requested action is not implemented in this contract. Are you using the correct OnComplete? Did you set your app ID?","pc":[46]},{"teal":35,"source":"contracts/Calculator.algo.ts:11","pc":[47,48,49]},{"teal":39,"source":"contracts/Calculator.algo.ts:12","pc":[50,51]},{"teal":40,"source":"contracts/Calculator.algo.ts:12","pc":[52,53]},{"teal":41,"source":"contracts/Calculator.algo.ts:12","pc":[54]},{"teal":42,"source":"contracts/Calculator.algo.ts:11","pc":[55]},{"teal":52,"source":"contracts/Calculator.algo.ts:22","pc":[56,57,58]},{"teal":56,"source":"contracts/Calculator.algo.ts:23","pc":[59,60]},{"teal":57,"source":"contracts/Calculator.algo.ts:23","pc":[61,62]},{"teal":58,"source":"contracts/Calculator.algo.ts:23","pc":[63]},{"teal":59,"source":"contracts/Calculator.algo.ts:23","pc":[64,65,66]},{"teal":60,"source":"contracts/Calculator.algo.ts:23","pc":[67,68]},{"teal":61,"source":"contracts/Calculator.algo.ts:23","pc":[69,70]},{"teal":62,"source":"contracts/Calculator.algo.ts:23","pc":[71]},{"teal":63,"source":"contracts/Calculator.algo.ts:23","pc":[72,73,74]},{"teal":66,"source":"contracts/Calculator.algo.ts:23","pc":[75,76]},{"teal":67,"source":"contracts/Calculator.algo.ts:23","pc":[77,78]},{"teal":68,"source":"contracts/Calculator.algo.ts:23","pc":[79]},{"teal":71,"source":"contracts/Calculator.algo.ts:22","pc":[80]},{"teal":76,"source":"contracts/Calculator.algo.ts:35","pc":[81]},{"teal":79,"source":"contracts/Calculator.algo.ts:35","pc":[82,83,84]},{"teal":80,"source":"contracts/Calculator.algo.ts:35","pc":[85,86,87]},{"teal":83,"source":"contracts/Calculator.algo.ts:35","pc":[88,89,90]},{"teal":84,"source":"contracts/Calculator.algo.ts:35","pc":[91]},{"teal":87,"source":"contracts/Calculator.algo.ts:35","pc":[92,93,94]},{"teal":88,"source":"contracts/Calculator.algo.ts:35","pc":[95]},{"teal":91,"source":"contracts/Calculator.algo.ts:35","pc":[96,97,98]},{"teal":92,"source":"contracts/Calculator.algo.ts:35","pc":[99]},{"teal":93,"source":"contracts/Calculator.algo.ts:35","pc":[100]},{"teal":94,"source":"contracts/Calculator.algo.ts:35","pc":[101]},{"teal":95,"source":"contracts/Calculator.algo.ts:35","pc":[102]},{"teal":96,"source":"contracts/Calculator.algo.ts:35","pc":[103]},{"teal":108,"source":"contracts/Calculator.algo.ts:35","pc":[104,105,106]},{"teal":111,"source":"contracts/Calculator.algo.ts:35","pc":[107,108]},{"teal":116,"source":"contracts/Calculator.algo.ts:38","pc":[109,110]},{"teal":117,"source":"contracts/Calculator.algo.ts:38","pc":[111,112,113,114,115]},{"teal":118,"source":"contracts/Calculator.algo.ts:38","pc":[116]},{"teal":119,"source":"contracts/Calculator.algo.ts:38","pc":[117,118,119]},{"teal":124,"source":"contracts/Calculator.algo.ts:39","pc":[120,121]},{"teal":125,"source":"contracts/Calculator.algo.ts:39","pc":[122,123]},{"teal":126,"source":"contracts/Calculator.algo.ts:39","pc":[124,125,126]},{"teal":127,"source":"contracts/Calculator.algo.ts:39","pc":[127,128]},{"teal":128,"source":"contracts/Calculator.algo.ts:38","pc":[129,130,131]},{"teal":133,"source":"contracts/Calculator.algo.ts:40","pc":[132,133]},{"teal":134,"source":"contracts/Calculator.algo.ts:40","pc":[134,135,136,137,138,139,140,141,142,143,144,145]},{"teal":135,"source":"contracts/Calculator.algo.ts:40","pc":[146]},{"teal":136,"source":"contracts/Calculator.algo.ts:40","pc":[147,148,149]},{"teal":141,"source":"contracts/Calculator.algo.ts:41","pc":[150,151]},{"teal":142,"source":"contracts/Calculator.algo.ts:41","pc":[152,153]},{"teal":143,"source":"contracts/Calculator.algo.ts:41","pc":[154,155,156]},{"teal":144,"source":"contracts/Calculator.algo.ts:41","pc":[157,158]},{"teal":145,"source":"contracts/Calculator.algo.ts:40","pc":[159,160,161]},{"teal":149,"source":"contracts/Calculator.algo.ts:42","errorMessage":"Invalid operation","pc":[162]},{"teal":154,"source":"contracts/Calculator.algo.ts:44","pc":[163,164]},{"teal":157,"source":"contracts/Calculator.algo.ts:35","pc":[165,166]},{"teal":158,"source":"contracts/Calculator.algo.ts:35","pc":[167]},{"teal":163,"source":"contracts/Calculator.algo.ts:54","pc":[168]},{"teal":166,"source":"contracts/Calculator.algo.ts:54","pc":[169,170,171]},{"teal":167,"source":"contracts/Calculator.algo.ts:54","pc":[172,173,174]},{"teal":170,"source":"contracts/Calculator.algo.ts:54","pc":[175,176,177]},{"teal":171,"source":"contracts/Calculator.algo.ts:54","pc":[178]},{"teal":172,"source":"contracts/Calculator.algo.ts:54","pc":[179]},{"teal":173,"source":"contracts/Calculator.algo.ts:54","pc":[180]},{"teal":174,"source":"contracts/Calculator.algo.ts:54","pc":[181,182,183]},{"teal":175,"source":"contracts/Calculator.algo.ts:54","pc":[184]},{"teal":176,"source":"contracts/Calculator.algo.ts:54","pc":[185]},{"teal":177,"source":"contracts/Calculator.algo.ts:54","pc":[186]},{"teal":178,"source":"contracts/Calculator.algo.ts:54","pc":[187]},{"teal":179,"source":"contracts/Calculator.algo.ts:54","pc":[188]},{"teal":180,"source":"contracts/Calculator.algo.ts:54","pc":[189]},{"teal":190,"source":"contracts/Calculator.algo.ts:54","pc":[190,191,192]},{"teal":194,"source":"contracts/Calculator.algo.ts:55","pc":[193,194,195,196,197,198,199,200,201]},{"teal":195,"source":"contracts/Calculator.algo.ts:55","pc":[202,203]},{"teal":196,"source":"contracts/Calculator.algo.ts:55","pc":[204]},{"teal":197,"source":"contracts/Calculator.algo.ts:54","pc":[205]},{"teal":200,"source":"contracts/Calculator.algo.ts:3","pc":[206]},{"teal":201,"source":"contracts/Calculator.algo.ts:3","pc":[207]},{"teal":204,"source":"contracts/Calculator.algo.ts:3","pc":[208,209,210,211,212,213]},{"teal":205,"source":"contracts/Calculator.algo.ts:3","pc":[214,215,216]},{"teal":206,"source":"contracts/Calculator.algo.ts:3","pc":[217,218,219,220]},{"teal":209,"source":"contracts/Calculator.algo.ts:3","errorMessage":"this contract does not implement the given ABI method for create NoOp","pc":[221]},{"teal":212,"source":"contracts/Calculator.algo.ts:3","pc":[222,223,224,225,226,227]},{"teal":213,"source":"contracts/Calculator.algo.ts:3","pc":[228,229,230,231,232,233]},{"teal":214,"source":"contracts/Calculator.algo.ts:3","pc":[234,235,236]},{"teal":215,"source":"contracts/Calculator.algo.ts:3","pc":[237,238,239,240,241,242]},{"teal":218,"source":"contracts/Calculator.algo.ts:3","errorMessage":"this contract does not implement the given ABI method for call NoOp","pc":[243]}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCmludGNibG9jayAxCmJ5dGVjYmxvY2sgMHgxNTFmN2M3NQoKLy8gVGhpcyBURUFMIHdhcyBnZW5lcmF0ZWQgYnkgVEVBTFNjcmlwdCB2MC4xMDcuMQovLyBodHRwczovL2dpdGh1Yi5jb20vYWxnb3JhbmRmb3VuZGF0aW9uL1RFQUxTY3JpcHQKCi8vIFRoaXMgY29udHJhY3QgaXMgY29tcGxpYW50IHdpdGggYW5kL29yIGltcGxlbWVudHMgdGhlIGZvbGxvd2luZyBBUkNzOiBbIEFSQzQgXQoKLy8gVGhlIGZvbGxvd2luZyB0ZW4gbGluZXMgb2YgVEVBTCBoYW5kbGUgaW5pdGlhbCBwcm9ncmFtIGZsb3cKLy8gVGhpcyBwYXR0ZXJuIGlzIHVzZWQgdG8gbWFrZSBpdCBlYXN5IGZvciBhbnlvbmUgdG8gcGFyc2UgdGhlIHN0YXJ0IG9mIHRoZSBwcm9ncmFtIGFuZCBkZXRlcm1pbmUgaWYgYSBzcGVjaWZpYyBhY3Rpb24gaXMgYWxsb3dlZAovLyBIZXJlLCBhY3Rpb24gcmVmZXJzIHRvIHRoZSBPbkNvbXBsZXRlIGluIGNvbWJpbmF0aW9uIHdpdGggd2hldGhlciB0aGUgYXBwIGlzIGJlaW5nIGNyZWF0ZWQgb3IgY2FsbGVkCi8vIEV2ZXJ5IHBvc3NpYmxlIGFjdGlvbiBmb3IgdGhpcyBjb250cmFjdCBpcyByZXByZXNlbnRlZCBpbiB0aGUgc3dpdGNoIHN0YXRlbWVudAovLyBJZiB0aGUgYWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgY29udHJhY3QsIGl0cyByZXNwZWN0aXZlIGJyYW5jaCB3aWxsIGJlICIqTk9UX0lNUExFTUVOVEVEIiB3aGljaCBqdXN0IGNvbnRhaW5zICJlcnIiCnR4biBBcHBsaWNhdGlvbklECiEKcHVzaGludCA2CioKdHhuIE9uQ29tcGxldGlvbgorCnN3aXRjaCAqY2FsbF9Ob09wICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqY3JlYXRlX05vT3AgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVECgoqTk9UX0lNUExFTUVOVEVEOgoJLy8gVGhlIHJlcXVlc3RlZCBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoaXMgY29udHJhY3QuIEFyZSB5b3UgdXNpbmcgdGhlIGNvcnJlY3QgT25Db21wbGV0ZT8gRGlkIHlvdSBzZXQgeW91ciBhcHAgSUQ/CgllcnIKCi8vIGdldFN1bShhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NAovLwovLyBDYWxjdWxhdGVzIHRoZSBzdW0gb2YgdHdvIG51bWJlcnMKLy8KLy8gQHBhcmFtIGEKLy8gQHBhcmFtIGIKLy8gQHJldHVybnMgVGhlIHN1bSBvZiBhIGFuZCBiCmdldFN1bToKCXByb3RvIDIgMQoKCS8vIGNvbnRyYWN0cy9DYWxjdWxhdG9yLmFsZ28udHM6MTIKCS8vIHJldHVybiBhICsgYjsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCSsKCXJldHN1YgoKLy8gZ2V0RGlmZmVyZW5jZShhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NAovLwovLyBDYWxjdWxhdGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIG51bWJlcnMKLy8KLy8gQHBhcmFtIGEKLy8gQHBhcmFtIGIKLy8gQHJldHVybnMgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGFuZCBiLgpnZXREaWZmZXJlbmNlOgoJcHJvdG8gMiAxCgoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czoyMwoJLy8gcmV0dXJuIGEgPj0gYiA/IGEgLSBiIDogYiAtIGE7CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0Cgk+PQoJYnogKnRlcm5hcnkwX2ZhbHNlCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0CgktCgliICp0ZXJuYXJ5MF9lbmQKCip0ZXJuYXJ5MF9mYWxzZToKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCS0KCip0ZXJuYXJ5MF9lbmQ6CglyZXRzdWIKCi8vIGRvTWF0aCh1aW50NjQsdWludDY0LHN0cmluZyl1aW50NjQKKmFiaV9yb3V0ZV9kb01hdGg6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGVjIDAgLy8gMHgxNTFmN2M3NQoKCS8vIG9wZXJhdGlvbjogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglleHRyYWN0IDIgMAoKCS8vIGI6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJYnRvaQoKCS8vIGE6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZG9NYXRoKHVpbnQ2NCx1aW50NjQsc3RyaW5nKXVpbnQ2NAoJY2FsbHN1YiBkb01hdGgKCWl0b2IKCWNvbmNhdAoJbG9nCglpbnRjIDAgLy8gMQoJcmV0dXJuCgovLyBkb01hdGgoYTogdWludDY0LCBiOiB1aW50NjQsIG9wZXJhdGlvbjogc3RyaW5nKTogdWludDY0Ci8vCi8vIEEgbWV0aG9kIHRoYXQgdGFrZXMgdHdvIG51bWJlcnMgYW5kIGRvZXMgZWl0aGVyIGFkZGl0aW9uIG9yIHN1YnRyYWN0aW9uCi8vCi8vIEBwYXJhbSBhIFRoZSBmaXJzdCB1aW50NjQKLy8gQHBhcmFtIGIgVGhlIHNlY29uZCB1aW50NjQKLy8gQHBhcmFtIG9wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0uIENhbiBiZSBlaXRoZXIgJ3N1bScgb3IgJ2RpZmZlcmVuY2UnCi8vCi8vIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbgpkb01hdGg6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJcHVzaGJ5dGVzIDB4CgoJLy8gKmlmMF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy9DYWxjdWxhdG9yLmFsZ28udHM6MzgKCS8vIG9wZXJhdGlvbiA9PT0gJ3N1bScKCWZyYW1lX2RpZyAtMyAvLyBvcGVyYXRpb246IHN0cmluZwoJcHVzaGJ5dGVzIDB4NzM3NTZkIC8vICJzdW0iCgk9PQoJYnogKmlmMF9lbHNlaWYxX2NvbmRpdGlvbgoKCS8vICppZjBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czozOQoJLy8gcmVzdWx0ID0gdGhpcy5nZXRTdW0oYSwgYikKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCWNhbGxzdWIgZ2V0U3VtCglmcmFtZV9idXJ5IDAgLy8gcmVzdWx0OiB1aW50NjQKCWIgKmlmMF9lbmQKCippZjBfZWxzZWlmMV9jb25kaXRpb246CgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjQwCgkvLyBvcGVyYXRpb24gPT09ICdkaWZmZXJlbmNlJwoJZnJhbWVfZGlnIC0zIC8vIG9wZXJhdGlvbjogc3RyaW5nCglwdXNoYnl0ZXMgMHg2NDY5NjY2NjY1NzI2NTZlNjM2NSAvLyAiZGlmZmVyZW5jZSIKCT09CglieiAqaWYwX2Vsc2UKCgkvLyAqaWYwX2Vsc2VpZjFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czo0MQoJLy8gcmVzdWx0ID0gdGhpcy5nZXREaWZmZXJlbmNlKGEsIGIpCglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CgljYWxsc3ViIGdldERpZmZlcmVuY2UKCWZyYW1lX2J1cnkgMCAvLyByZXN1bHQ6IHVpbnQ2NAoJYiAqaWYwX2VuZAoKKmlmMF9lbHNlOgoJLy8gSW52YWxpZCBvcGVyYXRpb24KCWVycgoKKmlmMF9lbmQ6CgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjQ0CgkvLyByZXR1cm4gcmVzdWx0OwoJZnJhbWVfZGlnIDAgLy8gcmVzdWx0OiB1aW50NjQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gaGVsbG8oc3RyaW5nKXN0cmluZwoqYWJpX3JvdXRlX2hlbGxvOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlYyAwIC8vIDB4MTUxZjdjNzUKCgkvLyBuYW1lOiBzdHJpbmcKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgoJLy8gZXhlY3V0ZSBoZWxsbyhzdHJpbmcpc3RyaW5nCgljYWxsc3ViIGhlbGxvCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWludGMgMCAvLyAxCglyZXR1cm4KCi8vIGhlbGxvKG5hbWU6IHN0cmluZyk6IHN0cmluZwovLwovLyBBIGRlbW9uc3RyYXRpb24gbWV0aG9kIHVzZWQgaW4gdGhlIEFsZ29LaXQgZnVsbHN0YWNrIHRlbXBsYXRlLgovLyBHcmVldHMgdGhlIHVzZXIgYnkgbmFtZS4KLy8KLy8gQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHVzZXIgdG8gZ3JlZXQuCi8vIEByZXR1cm5zIEEgZ3JlZXRpbmcgbWVzc2FnZSB0byB0aGUgdXNlci4KaGVsbG86Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjU1CgkvLyByZXR1cm4gJ0hlbGxvLCAnICsgbmFtZTsKCXB1c2hieXRlcyAweDQ4NjU2YzZjNmYyYzIwIC8vICJIZWxsbywgIgoJZnJhbWVfZGlnIC0xIC8vIG5hbWU6IHN0cmluZwoJY29uY2F0CglyZXRzdWIKCiphYmlfcm91dGVfY3JlYXRlQXBwbGljYXRpb246CglpbnRjIDAgLy8gMQoJcmV0dXJuCgoqY3JlYXRlX05vT3A6CglwdXNoYnl0ZXMgMHhiODQ0N2IzNiAvLyBtZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKCl2b2lkIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9jcmVhdGVBcHBsaWNhdGlvbgoKCS8vIHRoaXMgY29udHJhY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBnaXZlbiBBQkkgbWV0aG9kIGZvciBjcmVhdGUgTm9PcAoJZXJyCgoqY2FsbF9Ob09wOgoJcHVzaGJ5dGVzIDB4NzZhN2VmMzMgLy8gbWV0aG9kICJkb01hdGgodWludDY0LHVpbnQ2NCxzdHJpbmcpdWludDY0IgoJcHVzaGJ5dGVzIDB4MDJiZWNlMTEgLy8gbWV0aG9kICJoZWxsbyhzdHJpbmcpc3RyaW5nIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9kb01hdGggKmFiaV9yb3V0ZV9oZWxsbwoKCS8vIHRoaXMgY29udHJhY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBnaXZlbiBBQkkgbWV0aG9kIGZvciBjYWxsIE5vT3AKCWVycg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEw"},"byteCode":{"approval":"CiABASYBBBUffHUxGBSBBgsxGQiNDACwAAAAAAAAAAAAAACiAAAAAAAAAAAAAACKAgGL/4v+CImKAgGL/4v+D0EACIv/i/4JQgAFi/6L/wmJKDYaA1cCADYaAhc2GgEXiAAFFlCwIkOKAwGAAIv9gANzdW0SQQAMi/6L/4j/sIwAQgAfi/2ACmRpZmZlcmVuY2USQQAMi/6L/4j/m4wAQgABAIsAjACJKDYaAVcCAIgADEkVFlcGAkxQULAiQ4oBAYAHSGVsbG8sIIv/UIkiQ4AEuER7NjYaAI4B//EAgAR2p+8zgAQCvs4RNhoAjgL/Xv+1AA==","clear":"Cg=="},"compilerInfo":{"compiler":"algod","compilerVersion":{"major":4,"minor":4,"patch":1,"commitHash":"7b607ce4"}}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the Calculator contract - */ -export type CalculatorArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'doMath(uint64,uint64,string)uint64': { - /** - * The first uint64 - */ - a: bigint | number - /** - * The second uint64 - */ - b: bigint | number - /** - * The operation to perform. Can be either 'sum' or 'difference' - */ - operation: string - } - 'hello(string)string': { - /** - * The name of the user to greet. - */ - name: string - } - 'createApplication()void': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'doMath(uint64,uint64,string)uint64': [a: bigint | number, b: bigint | number, operation: string] - 'hello(string)string': [name: string] - 'createApplication()void': [] - } -} - -/** - * The return type for each method - */ -export type CalculatorReturns = { - 'doMath(uint64,uint64,string)uint64': bigint - 'hello(string)string': string - 'createApplication()void': void -} - -/** - * Defines the types of available calls and state of the Calculator smart contract. - */ -export type CalculatorTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'doMath(uint64,uint64,string)uint64' | 'doMath', { - argsObj: CalculatorArgs['obj']['doMath(uint64,uint64,string)uint64'] - argsTuple: CalculatorArgs['tuple']['doMath(uint64,uint64,string)uint64'] - /** - * The result of the operation - */ - returns: CalculatorReturns['doMath(uint64,uint64,string)uint64'] - }> - & Record<'hello(string)string' | 'hello', { - argsObj: CalculatorArgs['obj']['hello(string)string'] - argsTuple: CalculatorArgs['tuple']['hello(string)string'] - /** - * A greeting message to the user. - */ - returns: CalculatorReturns['hello(string)string'] - }> - & Record<'createApplication()void' | 'createApplication', { - argsObj: CalculatorArgs['obj']['createApplication()void'] - argsTuple: CalculatorArgs['tuple']['createApplication()void'] - returns: CalculatorReturns['createApplication()void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type CalculatorSignatures = keyof CalculatorTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type CalculatorNonVoidMethodSignatures = keyof CalculatorTypes['methods'] extends infer T ? T extends keyof CalculatorTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the Calculator smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = CalculatorTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the Calculator smart contract to the method's return type - */ -export type MethodReturn = CalculatorTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type CalculatorCreateCallParams = - | Expand & {method: 'createApplication'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema> - | Expand & {method: 'createApplication()void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema> -/** - * Defines arguments required for the deploy method. - */ -export type CalculatorDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: CalculatorCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the Calculator smart contract - */ -export abstract class CalculatorParamsFactory { - /** - * Gets available create ABI call param factories - */ - static get create() { - return { - _resolveByMethod(params: TParams) { - switch(params.method) { - case 'createApplication': - case 'createApplication()void': - return CalculatorParamsFactory.create.createApplication(params) - } - throw new Error(`Unknown ' + verb + ' method`) - }, - - /** - * Constructs create ABI call params for the Calculator smart contract using the createApplication()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - createApplication(params: CallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} { - return { - ...params, - method: 'createApplication()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - }, - } - } - - /** - * Constructs a no op call for the doMath(uint64,uint64,string)uint64 ABI method - * - * A method that takes two numbers and does either addition or subtraction - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static doMath(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'doMath(uint64,uint64,string)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.operation], - } - } - /** - * Constructs a no op call for the hello(string)string ABI method - * - * A demonstration method used in the AlgoKit fullstack template. - Greets the user by name. - - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static hello(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'hello(string)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.name], - } - } -} - -/** - * A factory to create and deploy one or more instance of the Calculator smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class CalculatorFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `CalculatorFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new CalculatorClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new CalculatorClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the Calculator smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: CalculatorDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - createParams: params.createParams?.method ? CalculatorParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (CalculatorCreateCallParams & { args: Uint8Array[] }) : undefined, - }) - return { result: result.result, appClient: new CalculatorClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Calculator smart contract using the createApplication()void ABI method. - * - * @param params The params for the smart contract call - * @returns The create params - */ - createApplication: (params: CallParams & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { - return this.appFactory.params.create(CalculatorParamsFactory.create.createApplication(params)) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Calculator smart contract using the createApplication()void ABI method. - * - * @param params The params for the smart contract call - * @returns The create transaction - */ - createApplication: (params: CallParams & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { - return this.appFactory.createTransaction.create(CalculatorParamsFactory.create.createApplication(params)) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Calculator smart contract using an ABI method call using the createApplication()void ABI method. - * - * @param params The params for the smart contract call - * @returns The create result - */ - createApplication: async (params: CallParams & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { - const result = await this.appFactory.send.create(CalculatorParamsFactory.create.createApplication(params)) - return { result: { ...result.result, return: result.result.return as unknown as (undefined | CalculatorReturns['createApplication()void']) }, appClient: new CalculatorClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the Calculator smart contract - */ -export class CalculatorClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `CalculatorClient` - * - * @param appClient An `AppClient` instance which has been created with the Calculator app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `CalculatorClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Checks for decode errors on the given return value and maps the return value to the return type for the given method - * @returns The typed return value or undefined if there was no value - */ - decodeReturnValue(method: TSignature, returnValue: ABIReturn | undefined) { - return returnValue !== undefined ? getArc56ReturnValue>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined - } - - /** - * Returns a new `CalculatorClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new CalculatorClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `CalculatorClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new CalculatorClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the Calculator smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. - * - * A method that takes two numbers and does either addition or subtraction - * - * @param params The params for the smart contract call - * @returns The call params: The result of the operation - */ - doMath: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(CalculatorParamsFactory.doMath(params)) - }, - - /** - * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. - * - * A demonstration method used in the AlgoKit fullstack template. - Greets the user by name. - - * - * @param params The params for the smart contract call - * @returns The call params: A greeting message to the user. - */ - hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(CalculatorParamsFactory.hello(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the Calculator smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. - * - * A method that takes two numbers and does either addition or subtraction - * - * @param params The params for the smart contract call - * @returns The call transaction: The result of the operation - */ - doMath: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(CalculatorParamsFactory.doMath(params)) - }, - - /** - * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. - * - * A demonstration method used in the AlgoKit fullstack template. - Greets the user by name. - - * - * @param params The params for the smart contract call - * @returns The call transaction: A greeting message to the user. - */ - hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(CalculatorParamsFactory.hello(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the Calculator smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. - * - * A method that takes two numbers and does either addition or subtraction - * - * @param params The params for the smart contract call - * @returns The call result: The result of the operation - */ - doMath: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(CalculatorParamsFactory.doMath(params)) - return {...result, return: result.return as unknown as (undefined | CalculatorReturns['doMath(uint64,uint64,string)uint64'])} - }, - - /** - * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. - * - * A demonstration method used in the AlgoKit fullstack template. - Greets the user by name. - - * - * @param params The params for the smart contract call - * @returns The call result: A greeting message to the user. - */ - hello: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(CalculatorParamsFactory.hello(params)) - return {...result, return: result.return as unknown as (undefined | CalculatorReturns['hello(string)string'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new CalculatorClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current Calculator app - */ - state = { - } - - public newGroup(): CalculatorComposer { - const client = this - const composer = this.algorand.newGroup() - let promiseChain:Promise = Promise.resolve() - const resultMappers: Array any)> = [] - return { - /** - * Add a doMath(uint64,uint64,string)uint64 method call against the Calculator contract - */ - doMath(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.doMath(params))) - resultMappers.push((v) => client.decodeReturnValue('doMath(uint64,uint64,string)uint64', v)) - return this - }, - /** - * Add a hello(string)string method call against the Calculator contract - */ - hello(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hello(params))) - resultMappers.push((v) => client.decodeReturnValue('hello(string)string', v)) - return this - }, - /** - * Add a clear state call to the Calculator contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) - } - } - } as unknown as CalculatorComposer - } -} -export type CalculatorComposer = { - /** - * Calls the doMath(uint64,uint64,string)uint64 ABI method. - * - * A method that takes two numbers and does either addition or subtraction - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - doMath(params?: CallParams): CalculatorComposer<[...TReturns, CalculatorReturns['doMath(uint64,uint64,string)uint64'] | undefined]> - - /** - * Calls the hello(string)string ABI method. - * - * A demonstration method used in the AlgoKit fullstack template. - Greets the user by name. - - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - hello(params?: CallParams): CalculatorComposer<[...TReturns, CalculatorReturns['hello(string)string'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the Calculator smart contract. - * - * @param args The arguments for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): CalculatorComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): CalculatorComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type CalculatorComposerResults = Expand - diff --git a/examples/s-tls/projects/s-tls-frontend/src/interfaces/network.ts b/examples/s-tls/projects/s-tls-frontend/src/interfaces/network.ts index a458edc..fdb97ae 100644 --- a/examples/s-tls/projects/s-tls-frontend/src/interfaces/network.ts +++ b/examples/s-tls/projects/s-tls-frontend/src/interfaces/network.ts @@ -1,5 +1,4 @@ -import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/types/network-client' -import type { TokenHeader } from 'algosdk/dist/types/client/urlTokenBaseHTTPClient' +import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/network-client' export interface AlgoViteClientConfig extends AlgoClientConfig { /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ @@ -7,7 +6,7 @@ export interface AlgoViteClientConfig extends AlgoClientConfig { /** The port to use e.g. 4001, 443, etc. */ port: string | number /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string | TokenHeader + token: string /** String representing current Algorand Network type (testnet/mainnet and etc) */ network: string } @@ -18,7 +17,7 @@ export interface AlgoViteKMDConfig extends AlgoClientConfig { /** The port to use e.g. 4001, 443, etc. */ port: string | number /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string | TokenHeader + token: string /** KMD wallet name */ wallet: string /** KMD wallet password */ diff --git a/examples/s-tls/projects/s-tls-frontend/tsconfig.json b/examples/s-tls/projects/s-tls-frontend/tsconfig.json index 443b6bd..a0f5661 100644 --- a/examples/s-tls/projects/s-tls-frontend/tsconfig.json +++ b/examples/s-tls/projects/s-tls-frontend/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, - "module": "ES2022" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + "module": "ESNext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, "declaration": true /* Generates corresponding '.d.ts' file. */, "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, "sourceMap": true /* Generates corresponding '.map' file. */, @@ -15,7 +15,7 @@ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, "allowJs": false, "allowSyntheticDefaultImports": true, - "moduleResolution": "Node", + "moduleResolution": "Bundler", "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, diff --git a/examples/s-tls/projects/s-tls-frontend/tsconfig.node.json b/examples/s-tls/projects/s-tls-frontend/tsconfig.node.json index 9d31e2a..e32f207 100644 --- a/examples/s-tls/projects/s-tls-frontend/tsconfig.node.json +++ b/examples/s-tls/projects/s-tls-frontend/tsconfig.node.json @@ -1,8 +1,8 @@ { "compilerOptions": { "composite": true, - "module": "ESNext", - "moduleResolution": "Node", + "module": "NodeNext", + "moduleResolution": "NodeNext", "allowSyntheticDefaultImports": true }, "include": ["vite.config.ts"] diff --git a/examples/s-ts/.algokit/.copier-answers.yml b/examples/s-ts/.algokit/.copier-answers.yml index 4c23afb..1b02299 100644 --- a/examples/s-ts/.algokit/.copier-answers.yml +++ b/examples/s-ts/.algokit/.copier-answers.yml @@ -1,6 +1,6 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: -_src_path: +_commit: 2.1.8-8-g954a453 +_src_path: .. author_email: None author_name: None contract_name: hello_world diff --git a/examples/s-ts/projects/s-ts-frontend/src/contracts/HelloWorld.ts b/examples/s-ts/projects/s-ts-frontend/src/contracts/HelloWorld.ts deleted file mode 100644 index df17c1b..0000000 --- a/examples/s-ts/projects/s-ts-frontend/src/contracts/HelloWorld.ts +++ /dev/null @@ -1,560 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"HelloWorld","structs":{},"methods":[{"name":"hello","args":[{"type":"string","name":"name"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[37],"errorMessage":"OnCompletion must be NoOp && can only call when creating"},{"pc":[26],"errorMessage":"OnCompletion must be NoOp && can only call when not creating"},{"pc":[47],"errorMessage":"invalid array length header"},{"pc":[55],"errorMessage":"invalid number of bytes for arc4.dynamic_array"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgSGVsbG9Xb3JsZCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2hlbGxvX3JvdXRlQDMKICAgIGVycgoKbWFpbl9oZWxsb19yb3V0ZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gaGVsbG8obmFtZTogc3RyaW5nKTogc3RyaW5nIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiBoZWxsbwoKbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBIZWxsb1dvcmxkIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czo6SGVsbG9Xb3JsZC5oZWxsb1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmhlbGxvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gaGVsbG8obmFtZTogc3RyaW5nKTogc3RyaW5nIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgcHVzaGludCAwIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czo1CiAgICAvLyByZXR1cm4gYEhlbGxvLCAke25hbWV9YAogICAgcHVzaGJ5dGVzICJIZWxsbywgIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBoZWxsbyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcgewogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgAQCvs4RNhoAjgEAAQAxGRQxGBBEQgALMRkUMRgUEESBAUM2GgFJgQBZgQIISwEVEkRXAgCAB0hlbGxvLCBMUEkVFlcGAkxQgAQVH3x1TFCwgQFD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the HelloWorld contract - */ -export type HelloWorldArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'hello(string)string': { - name: string - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'hello(string)string': [name: string] - } -} - -/** - * The return type for each method - */ -export type HelloWorldReturns = { - 'hello(string)string': string -} - -/** - * Defines the types of available calls and state of the HelloWorld smart contract. - */ -export type HelloWorldTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'hello(string)string' | 'hello', { - argsObj: HelloWorldArgs['obj']['hello(string)string'] - argsTuple: HelloWorldArgs['tuple']['hello(string)string'] - returns: HelloWorldReturns['hello(string)string'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type HelloWorldSignatures = keyof HelloWorldTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type HelloWorldNonVoidMethodSignatures = keyof HelloWorldTypes['methods'] extends infer T ? T extends keyof HelloWorldTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the HelloWorld smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = HelloWorldTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the HelloWorld smart contract to the method's return type - */ -export type MethodReturn = HelloWorldTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type HelloWorldCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type HelloWorldDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: HelloWorldCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the HelloWorld smart contract - */ -export abstract class HelloWorldParamsFactory { - /** - * Constructs a no op call for the hello(string)string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static hello(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'hello(string)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.name], - } - } -} - -/** - * A factory to create and deploy one or more instance of the HelloWorld smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class HelloWorldFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `HelloWorldFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new HelloWorldClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new HelloWorldClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the HelloWorld smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: HelloWorldDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new HelloWorldClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the HelloWorld smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the HelloWorld smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the HelloWorld smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new HelloWorldClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the HelloWorld smart contract - */ -export class HelloWorldClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `HelloWorldClient` - * - * @param appClient An `AppClient` instance which has been created with the HelloWorld app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `HelloWorldClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `HelloWorldClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new HelloWorldClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `HelloWorldClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new HelloWorldClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the HelloWorld smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - hello: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(HelloWorldParamsFactory.hello(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the HelloWorld smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - hello: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(HelloWorldParamsFactory.hello(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the HelloWorld smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - hello: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(HelloWorldParamsFactory.hello(params)) - return {...result, return: result.return as unknown as (undefined | HelloWorldReturns['hello(string)string'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new HelloWorldClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current HelloWorld app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): HelloWorldComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a hello(string)string method call against the HelloWorld contract - */ - hello(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hello(params))) - return this - }, - /** - * Add a clear state call to the HelloWorld contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as HelloWorldComposer - } -} -export type HelloWorldComposer = { - /** - * Calls the hello(string)string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - hello(params?: CallParams): HelloWorldComposer<[...TReturns, HelloWorldReturns['hello(string)string'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the HelloWorld smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): HelloWorldComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): HelloWorldComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type HelloWorldComposerResults = Expand - From 72c45aedce0e6c4e6b0371722ff3e54d241af76b Mon Sep 17 00:00:00 2001 From: p2arthur Date: Mon, 9 Mar 2026 19:06:20 -0700 Subject: [PATCH 10/12] chore: add newly generated templates --- examples/p-py/.algokit/.copier-answers.yml | 4 +- .../p-py-frontend/src/contracts/AppCall.ts | 558 ++ .../src/contracts/AppExpectingEffects.ts | 630 +++ .../src/contracts/Arc4InnerTxnsContract.ts | 556 ++ .../src/contracts/Arc4PrimitiveOpsContract.ts | 3982 ++++++++++++++ .../src/contracts/BoxContract.ts | 2352 +++++++++ .../p-py-frontend/src/contracts/Contract.ts | 621 +++ .../p-py-frontend/src/contracts/ContractV0.ts | 621 +++ .../p-py-frontend/src/contracts/ContractV1.ts | 621 +++ .../src/contracts/CryptoOpsContract.ts | 1422 +++++ .../src/contracts/DynamicArrayInitContract.ts | 755 +++ .../src/contracts/DynamicItxnGroup.ts | 629 +++ .../src/contracts/GlobalStateContract.ts | 2649 ++++++++++ .../src/contracts/GlobalStateValidator.ts | 557 ++ .../p-py-frontend/src/contracts/HelloWorld.ts | 560 ++ .../src/contracts/ITxnOpsContract.ts | 554 ++ .../src/contracts/ImmutableArrayContract.ts | 2231 ++++++++ .../contracts/ImmutableArrayInitContract.ts | 755 +++ .../src/contracts/LocalStateContract.ts | 1746 ++++++ .../src/contracts/MiscellaneousOpsContract.ts | 3082 +++++++++++ .../src/contracts/PrimitiveOpsContract.ts | 4701 +++++++++++++++++ .../src/contracts/SignaturesContract.ts | 1203 +++++ .../src/contracts/StateAcctParamsGet.ts | 1319 +++++ .../contracts/StateAcctParamsGetContract.ts | 1526 ++++++ .../src/contracts/StateAppGlobalContract.ts | 1018 ++++ .../src/contracts/StateAppGlobalExContract.ts | 551 ++ .../src/contracts/StateAppLocalContract.ts | 1197 +++++ .../src/contracts/StateAppLocalExContract.ts | 635 +++ .../src/contracts/StateAppParamsContract.ts | 1112 ++++ .../contracts/StateAssetHoldingContract.ts | 631 +++ .../src/contracts/StateAssetParamsContract.ts | 1319 +++++ .../src/contracts/StateMutations.ts | 880 +++ .../src/contracts/StaticSizeContract.ts | 1009 ++++ .../src/contracts/TuplesContract.ts | 558 ++ .../src/contracts/VerifierContract.ts | 554 ++ pytest-junit.xml | 1 + 36 files changed, 43097 insertions(+), 2 deletions(-) create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/AppCall.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/AppExpectingEffects.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/Arc4InnerTxnsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/Arc4PrimitiveOpsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/BoxContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/Contract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ContractV0.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ContractV1.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/CryptoOpsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/DynamicArrayInitContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/DynamicItxnGroup.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateValidator.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/HelloWorld.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ITxnOpsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayInitContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/LocalStateContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/MiscellaneousOpsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/PrimitiveOpsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/SignaturesContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGet.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGetContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalExContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalExContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppParamsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAssetHoldingContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAssetParamsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateMutations.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StaticSizeContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/TuplesContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/VerifierContract.ts create mode 100644 pytest-junit.xml diff --git a/examples/p-py/.algokit/.copier-answers.yml b/examples/p-py/.algokit/.copier-answers.yml index 2869b87..a833cc8 100644 --- a/examples/p-py/.algokit/.copier-answers.yml +++ b/examples/p-py/.algokit/.copier-answers.yml @@ -1,6 +1,6 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 2.1.8-8-g954a453 -_src_path: .. +_commit: 2.1.8-9-g7d7ad4b +_src_path: /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpu5fp3052/template author_email: None author_name: None cloud_provider: netlify diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/AppCall.ts b/examples/p-py/projects/p-py-frontend/src/contracts/AppCall.ts new file mode 100644 index 0000000..c61e144 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/AppCall.ts @@ -0,0 +1,558 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"AppCall","structs":{},"methods":[{"name":"some_value","args":[],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NAogICAgLy8gY2xhc3MgQXBwQ2FsbChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANQogICAgcHVzaGJ5dGVzIDB4ZDM0NzllNjUgLy8gbWV0aG9kICJzb21lX3ZhbHVlKCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3NvbWVfdmFsdWVfcm91dGVAMwogICAgZXJyCgptYWluX3NvbWVfdmFsdWVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIHNvbWVfdmFsdWUKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyZWF0ZWRBcHBBc3NldC5vdGhlci5BcHBDYWxsLnNvbWVfdmFsdWVbcm91dGluZ10oKSAtPiB2b2lkOgpzb21lX3ZhbHVlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9vdGhlci5weTo3CiAgICAvLyByZXR1cm4gR2xvYmFsLmdyb3VwX3NpemUgKiAoVHhuLmdyb3VwX2luZGV4ICsgMSkKICAgIGdsb2JhbCBHcm91cFNpemUKICAgIHR4biBHcm91cEluZGV4CiAgICBwdXNoaW50IDEKICAgICsKICAgICoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcHVzaGludCAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgATTR55lNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEMyBDEWgQEICxaABBUffHVMULCBAUM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the AppCall contract + */ +export type AppCallArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'some_value()uint64': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'some_value()uint64': [] + } +} + +/** + * The return type for each method + */ +export type AppCallReturns = { + 'some_value()uint64': bigint +} + +/** + * Defines the types of available calls and state of the AppCall smart contract. + */ +export type AppCallTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'some_value()uint64' | 'some_value', { + argsObj: AppCallArgs['obj']['some_value()uint64'] + argsTuple: AppCallArgs['tuple']['some_value()uint64'] + returns: AppCallReturns['some_value()uint64'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type AppCallSignatures = keyof AppCallTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type AppCallNonVoidMethodSignatures = keyof AppCallTypes['methods'] extends infer T ? T extends keyof AppCallTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the AppCall smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = AppCallTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the AppCall smart contract to the method's return type + */ +export type MethodReturn = AppCallTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type AppCallCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type AppCallDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: AppCallCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the AppCall smart contract + */ +export abstract class AppCallParamsFactory { + /** + * Constructs a no op call for the some_value()uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static someValue(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'some_value()uint64' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the AppCall smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class AppCallFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `AppCallFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new AppCallClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new AppCallClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the AppCall smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: AppCallDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new AppCallClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AppCall smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AppCall smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AppCall smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new AppCallClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the AppCall smart contract + */ +export class AppCallClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `AppCallClient` + * + * @param appClient An `AppClient` instance which has been created with the AppCall app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `AppCallClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `AppCallClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new AppCallClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `AppCallClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new AppCallClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the AppCall smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the AppCall smart contract using the `some_value()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + someValue: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(AppCallParamsFactory.someValue(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the AppCall smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the AppCall smart contract using the `some_value()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + someValue: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(AppCallParamsFactory.someValue(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the AppCall smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the AppCall smart contract using the `some_value()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + someValue: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(AppCallParamsFactory.someValue(params)) + return {...result, return: result.return as unknown as (undefined | AppCallReturns['some_value()uint64'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new AppCallClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current AppCall app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): AppCallComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a some_value()uint64 method call against the AppCall contract + */ + someValue(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.someValue(params))) + return this + }, + /** + * Add a clear state call to the AppCall contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as AppCallComposer + } +} +export type AppCallComposer = { + /** + * Calls the some_value()uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + someValue(params?: CallParams): AppCallComposer<[...TReturns, AppCallReturns['some_value()uint64'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the AppCall smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): AppCallComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): AppCallComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type AppCallComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/AppExpectingEffects.ts b/examples/p-py/projects/p-py-frontend/src/contracts/AppExpectingEffects.ts new file mode 100644 index 0000000..1a953ef --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/AppExpectingEffects.ts @@ -0,0 +1,630 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"AppExpectingEffects","structs":{},"methods":[{"name":"create_group","args":[{"type":"acfg","name":"asset_create"},{"type":"appl","name":"app_create"}],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"log_group","args":[{"type":"appl","name":"app_call"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[159],"errorMessage":"application log value is not the result of an ABI return"},{"pc":[96],"errorMessage":"expected app created"},{"pc":[81],"errorMessage":"expected asset created"},{"pc":[105],"errorMessage":"expected correct app id"},{"pc":[90],"errorMessage":"expected correct asset id"},{"pc":[139],"errorMessage":"expected correct method called"},{"pc":[145],"errorMessage":"expected logs"},{"pc":[65],"errorMessage":"transaction type is acfg"},{"pc":[75,126],"errorMessage":"transaction type is appl"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBBcHBFeHBlY3RpbmdFZmZlY3RzKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg2ZDNhMDQzOSAweDYyYTBlZjYyIC8vIG1ldGhvZCAiY3JlYXRlX2dyb3VwKGFjZmcsYXBwbCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19ncm91cChhcHBsKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGVfZ3JvdXAgbG9nX2dyb3VwCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyZWF0ZWRBcHBBc3NldC5jb250cmFjdC5BcHBFeHBlY3RpbmdFZmZlY3RzLmNyZWF0ZV9ncm91cFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZV9ncm91cDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFjZmcKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjExCiAgICAvLyBhc3NlcnQgYXNzZXRfY3JlYXRlLmNyZWF0ZWRfYXNzZXQuaWQsICJleHBlY3RlZCBhc3NldCBjcmVhdGVkIgogICAgZGlnIDEKICAgIGd0eG5zIENyZWF0ZWRBc3NldElECiAgICBkdXAKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCBjcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjEzCiAgICAvLyBvcC5nYWlkKGFzc2V0X2NyZWF0ZS5ncm91cF9pbmRleCkgPT0gYXNzZXRfY3JlYXRlLmNyZWF0ZWRfYXNzZXQuaWQKICAgIHVuY292ZXIgMgogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgZ2FpZHMKICAgIGRpZyAxCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToxMi0xNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5nYWlkKGFzc2V0X2NyZWF0ZS5ncm91cF9pbmRleCkgPT0gYXNzZXRfY3JlYXRlLmNyZWF0ZWRfYXNzZXQuaWQKICAgIC8vICksICJleHBlY3RlZCBjb3JyZWN0IGFzc2V0IGlkIgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgYXNzZXQgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MTUKICAgIC8vIGFzc2VydCBhcHBfY3JlYXRlLmNyZWF0ZWRfYXBwLmlkLCAiZXhwZWN0ZWQgYXBwIGNyZWF0ZWQiCiAgICBkaWcgMQogICAgZ3R4bnMgQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcCBjcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjE3CiAgICAvLyBvcC5nYWlkKGFwcF9jcmVhdGUuZ3JvdXBfaW5kZXgpID09IGFwcF9jcmVhdGUuY3JlYXRlZF9hcHAuaWQKICAgIHVuY292ZXIgMgogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgZ2FpZHMKICAgIGRpZyAxCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToxNi0xOAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5nYWlkKGFwcF9jcmVhdGUuZ3JvdXBfaW5kZXgpID09IGFwcF9jcmVhdGUuY3JlYXRlZF9hcHAuaWQKICAgIC8vICksICJleHBlY3RlZCBjb3JyZWN0IGFwcCBpZCIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGFwcCBpZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcmVhdGVkQXBwQXNzZXQuY29udHJhY3QuQXBwRXhwZWN0aW5nRWZmZWN0cy5sb2dfZ3JvdXBbcm91dGluZ10oKSAtPiB2b2lkOgpsb2dfZ3JvdXA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgYXBwX2NhbGwuYXBwX2FyZ3MoMCkgPT0gYXJjNC5hcmM0X3NpZ25hdHVyZSgKICAgIGR1cAogICAgcHVzaGludCAwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToyNC0yNgogICAgLy8gYXNzZXJ0IGFwcF9jYWxsLmFwcF9hcmdzKDApID09IGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgInNvbWVfdmFsdWUoKXVpbnQ2NCIKICAgIC8vICksICJleHBlY3RlZCBjb3JyZWN0IG1ldGhvZCBjYWxsZWQiCiAgICBwdXNoYnl0ZXMgMHhkMzQ3OWU2NSAvLyBtZXRob2QgInNvbWVfdmFsdWUoKXVpbnQ2NCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBtZXRob2QgY2FsbGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjI3CiAgICAvLyBhc3NlcnQgYXBwX2NhbGwubnVtX2xvZ3MgPT0gMSwgImV4cGVjdGVkIGxvZ3MiCiAgICBkdXAKICAgIGd0eG5zIE51bUxvZ3MKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxvZ3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MjkKICAgIC8vIGFyYzQuVUludDY0LmZyb21fbG9nKGFwcF9jYWxsLmxhc3RfbG9nKQogICAgZHVwCiAgICBndHhucyBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjMwCiAgICAvLyA9PSAoYXBwX2NhbGwuZ3JvdXBfaW5kZXggKyAxKSAqIEdsb2JhbC5ncm91cF9zaXplCiAgICBzd2FwCiAgICBndHhucyBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgKgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToyOS0zMAogICAgLy8gYXJjNC5VSW50NjQuZnJvbV9sb2coYXBwX2NhbGwubGFzdF9sb2cpCiAgICAvLyA9PSAoYXBwX2NhbGwuZ3JvdXBfaW5kZXggKyAxKSAqIEdsb2JhbC5ncm91cF9zaXplCiAgICBpdG9iCiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MjgtMzEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgYXJjNC5VSW50NjQuZnJvbV9sb2coYXBwX2NhbGwubGFzdF9sb2cpCiAgICAvLyAgICAgPT0gKGFwcF9jYWxsLmdyb3VwX2luZGV4ICsgMSkgKiBHbG9iYWwuZ3JvdXBfc2l6ZQogICAgLy8gKQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQYmAQQVH3x1MRtBAB0xGRREMRhEggIEbToEOQRioO9iNhoAjgIACQBIADEZFDEYFBBDMRaBAglJOBCBAxJEMRYiCUk4ECMSREsBODxJRE8COBY9SwESREsBOD1JRE8COBY9SwESREwWTBZQKExQsCJDMRYiCUk4ECMSREmBAMIagATTR55lEkRJODsiEkRJOD5JVwQATFcABCgSREw4FiIIMgQLFqhEIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the AppExpectingEffects contract + */ +export type AppExpectingEffectsArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'create_group(acfg,appl)(uint64,uint64)': { + assetCreate?: AppMethodCallTransactionArgument + appCreate: AppMethodCallTransactionArgument + } + 'log_group(appl)void': { + appCall: AppMethodCallTransactionArgument + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'create_group(acfg,appl)(uint64,uint64)': [assetCreate: AppMethodCallTransactionArgument | undefined, appCreate: AppMethodCallTransactionArgument] + 'log_group(appl)void': [appCall: AppMethodCallTransactionArgument] + } +} + +/** + * The return type for each method + */ +export type AppExpectingEffectsReturns = { + 'create_group(acfg,appl)(uint64,uint64)': [bigint, bigint] + 'log_group(appl)void': void +} + +/** + * Defines the types of available calls and state of the AppExpectingEffects smart contract. + */ +export type AppExpectingEffectsTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'create_group(acfg,appl)(uint64,uint64)' | 'create_group', { + argsObj: AppExpectingEffectsArgs['obj']['create_group(acfg,appl)(uint64,uint64)'] + argsTuple: AppExpectingEffectsArgs['tuple']['create_group(acfg,appl)(uint64,uint64)'] + returns: AppExpectingEffectsReturns['create_group(acfg,appl)(uint64,uint64)'] + }> + & Record<'log_group(appl)void' | 'log_group', { + argsObj: AppExpectingEffectsArgs['obj']['log_group(appl)void'] + argsTuple: AppExpectingEffectsArgs['tuple']['log_group(appl)void'] + returns: AppExpectingEffectsReturns['log_group(appl)void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type AppExpectingEffectsSignatures = keyof AppExpectingEffectsTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type AppExpectingEffectsNonVoidMethodSignatures = keyof AppExpectingEffectsTypes['methods'] extends infer T ? T extends keyof AppExpectingEffectsTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the AppExpectingEffects smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = AppExpectingEffectsTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the AppExpectingEffects smart contract to the method's return type + */ +export type MethodReturn = AppExpectingEffectsTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type AppExpectingEffectsCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type AppExpectingEffectsDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: AppExpectingEffectsCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the AppExpectingEffects smart contract + */ +export abstract class AppExpectingEffectsParamsFactory { + /** + * Constructs a no op call for the create_group(acfg,appl)(uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static createGroup(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'create_group(acfg,appl)(uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.assetCreate, params.args.appCreate], + } + } + /** + * Constructs a no op call for the log_group(appl)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static logGroup(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'log_group(appl)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.appCall], + } + } +} + +/** + * A factory to create and deploy one or more instance of the AppExpectingEffects smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class AppExpectingEffectsFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `AppExpectingEffectsFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new AppExpectingEffectsClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new AppExpectingEffectsClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the AppExpectingEffects smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: AppExpectingEffectsDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new AppExpectingEffectsClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AppExpectingEffects smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AppExpectingEffects smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AppExpectingEffects smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new AppExpectingEffectsClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the AppExpectingEffects smart contract + */ +export class AppExpectingEffectsClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `AppExpectingEffectsClient` + * + * @param appClient An `AppClient` instance which has been created with the AppExpectingEffects app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `AppExpectingEffectsClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `AppExpectingEffectsClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new AppExpectingEffectsClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `AppExpectingEffectsClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new AppExpectingEffectsClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the AppExpectingEffects smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the AppExpectingEffects smart contract using the `create_group(acfg,appl)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + createGroup: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(AppExpectingEffectsParamsFactory.createGroup(params)) + }, + + /** + * Makes a call to the AppExpectingEffects smart contract using the `log_group(appl)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + logGroup: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(AppExpectingEffectsParamsFactory.logGroup(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the AppExpectingEffects smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the AppExpectingEffects smart contract using the `create_group(acfg,appl)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + createGroup: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(AppExpectingEffectsParamsFactory.createGroup(params)) + }, + + /** + * Makes a call to the AppExpectingEffects smart contract using the `log_group(appl)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + logGroup: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(AppExpectingEffectsParamsFactory.logGroup(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the AppExpectingEffects smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the AppExpectingEffects smart contract using the `create_group(acfg,appl)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + createGroup: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(AppExpectingEffectsParamsFactory.createGroup(params)) + return {...result, return: result.return as unknown as (undefined | AppExpectingEffectsReturns['create_group(acfg,appl)(uint64,uint64)'])} + }, + + /** + * Makes a call to the AppExpectingEffects smart contract using the `log_group(appl)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + logGroup: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(AppExpectingEffectsParamsFactory.logGroup(params)) + return {...result, return: result.return as unknown as (undefined | AppExpectingEffectsReturns['log_group(appl)void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new AppExpectingEffectsClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current AppExpectingEffects app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): AppExpectingEffectsComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a create_group(acfg,appl)(uint64,uint64) method call against the AppExpectingEffects contract + */ + createGroup(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createGroup(params))) + return this + }, + /** + * Add a log_group(appl)void method call against the AppExpectingEffects contract + */ + logGroup(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.logGroup(params))) + return this + }, + /** + * Add a clear state call to the AppExpectingEffects contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as AppExpectingEffectsComposer + } +} +export type AppExpectingEffectsComposer = { + /** + * Calls the create_group(acfg,appl)(uint64,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + createGroup(params?: CallParams): AppExpectingEffectsComposer<[...TReturns, AppExpectingEffectsReturns['create_group(acfg,appl)(uint64,uint64)'] | undefined]> + + /** + * Calls the log_group(appl)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + logGroup(params?: CallParams): AppExpectingEffectsComposer<[...TReturns, AppExpectingEffectsReturns['log_group(appl)void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the AppExpectingEffects smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): AppExpectingEffectsComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): AppExpectingEffectsComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type AppExpectingEffectsComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/Arc4InnerTxnsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/Arc4InnerTxnsContract.ts new file mode 100644 index 0000000..afe3303 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/Arc4InnerTxnsContract.ts @@ -0,0 +1,556 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"Arc4InnerTxnsContract","structs":{},"methods":[{"name":"opt_in_dummy_asset","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0SW5uZXJUeG5zL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIEFyYzRJbm5lclR4bnNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANQogICAgcHVzaGJ5dGVzIDB4YWIzOWM1NWEgLy8gbWV0aG9kICJvcHRfaW5fZHVtbXlfYXNzZXQodWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX29wdF9pbl9kdW1teV9hc3NldF9yb3V0ZUAzCiAgICBlcnIKCm1haW5fb3B0X2luX2R1bW15X2Fzc2V0X3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIG9wdF9pbl9kdW1teV9hc3NldAoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNElubmVyVHhucy5jb250cmFjdC5BcmM0SW5uZXJUeG5zQ29udHJhY3Qub3B0X2luX2R1bW15X2Fzc2V0W3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luX2R1bW15X2Fzc2V0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRJbm5lclR4bnMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo3LTExCiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0SW5uZXJUeG5zL2NvbnRyYWN0LnB5OjkKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRJbm5lclR4bnMvY29udHJhY3QucHk6Ny04CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo3LTExCiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgASrOcVaNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEM2GgEXsTIKshSyEYEEshCBALIBs4EBQw==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the Arc4InnerTxnsContract contract + */ +export type Arc4InnerTxnsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'opt_in_dummy_asset(uint64)void': { + asset: bigint | number + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'opt_in_dummy_asset(uint64)void': [asset: bigint | number] + } +} + +/** + * The return type for each method + */ +export type Arc4InnerTxnsContractReturns = { + 'opt_in_dummy_asset(uint64)void': void +} + +/** + * Defines the types of available calls and state of the Arc4InnerTxnsContract smart contract. + */ +export type Arc4InnerTxnsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'opt_in_dummy_asset(uint64)void' | 'opt_in_dummy_asset', { + argsObj: Arc4InnerTxnsContractArgs['obj']['opt_in_dummy_asset(uint64)void'] + argsTuple: Arc4InnerTxnsContractArgs['tuple']['opt_in_dummy_asset(uint64)void'] + returns: Arc4InnerTxnsContractReturns['opt_in_dummy_asset(uint64)void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type Arc4InnerTxnsContractSignatures = keyof Arc4InnerTxnsContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the Arc4InnerTxnsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = Arc4InnerTxnsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the Arc4InnerTxnsContract smart contract to the method's return type + */ +export type MethodReturn = Arc4InnerTxnsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type Arc4InnerTxnsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type Arc4InnerTxnsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: Arc4InnerTxnsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the Arc4InnerTxnsContract smart contract + */ +export abstract class Arc4InnerTxnsContractParamsFactory { + /** + * Constructs a no op call for the opt_in_dummy_asset(uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static optInDummyAsset(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'opt_in_dummy_asset(uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset], + } + } +} + +/** + * A factory to create and deploy one or more instance of the Arc4InnerTxnsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class Arc4InnerTxnsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `Arc4InnerTxnsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new Arc4InnerTxnsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new Arc4InnerTxnsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the Arc4InnerTxnsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: Arc4InnerTxnsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new Arc4InnerTxnsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Arc4InnerTxnsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Arc4InnerTxnsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Arc4InnerTxnsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new Arc4InnerTxnsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the Arc4InnerTxnsContract smart contract + */ +export class Arc4InnerTxnsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `Arc4InnerTxnsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the Arc4InnerTxnsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `Arc4InnerTxnsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `Arc4InnerTxnsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new Arc4InnerTxnsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `Arc4InnerTxnsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new Arc4InnerTxnsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the Arc4InnerTxnsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the Arc4InnerTxnsContract smart contract using the `opt_in_dummy_asset(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + optInDummyAsset: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4InnerTxnsContractParamsFactory.optInDummyAsset(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the Arc4InnerTxnsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the Arc4InnerTxnsContract smart contract using the `opt_in_dummy_asset(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + optInDummyAsset: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4InnerTxnsContractParamsFactory.optInDummyAsset(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the Arc4InnerTxnsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the Arc4InnerTxnsContract smart contract using the `opt_in_dummy_asset(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + optInDummyAsset: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4InnerTxnsContractParamsFactory.optInDummyAsset(params)) + return {...result, return: result.return as unknown as (undefined | Arc4InnerTxnsContractReturns['opt_in_dummy_asset(uint64)void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new Arc4InnerTxnsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current Arc4InnerTxnsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): Arc4InnerTxnsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a opt_in_dummy_asset(uint64)void method call against the Arc4InnerTxnsContract contract + */ + optInDummyAsset(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optInDummyAsset(params))) + return this + }, + /** + * Add a clear state call to the Arc4InnerTxnsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as Arc4InnerTxnsContractComposer + } +} +export type Arc4InnerTxnsContractComposer = { + /** + * Calls the opt_in_dummy_asset(uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + optInDummyAsset(params?: CallParams): Arc4InnerTxnsContractComposer<[...TReturns, Arc4InnerTxnsContractReturns['opt_in_dummy_asset(uint64)void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the Arc4InnerTxnsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): Arc4InnerTxnsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): Arc4InnerTxnsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type Arc4InnerTxnsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/Arc4PrimitiveOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/Arc4PrimitiveOpsContract.ts new file mode 100644 index 0000000..355f633 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/Arc4PrimitiveOpsContract.ts @@ -0,0 +1,3982 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"Arc4PrimitiveOpsContract","structs":{},"methods":[{"name":"verify_uintn_uintn_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_init","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint32"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_init","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint256"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint32"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint256"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint32"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint256"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_as_uint64","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_as_biguint","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint512"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn64_as_uint64","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn64_as_biguint","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint512"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ufixednxm_bytes","args":[{"type":"ufixed32x8","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bigufixednxm_bytes","args":[{"type":"ufixed256x16","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ufixednxm_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"ufixed32x8"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bigufixednxm_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"ufixed256x16"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ufixednxm_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"ufixed32x8"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bigufixednxm_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"ufixed256x16"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_init","args":[{"type":"string","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_add","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_eq","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_bytes","args":[{"type":"string","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bool_bytes","args":[{"type":"bool","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bool_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bool_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_emit","args":[{"type":"string","name":"a"},{"type":"uint512","name":"b"},{"type":"uint64","name":"c"},{"type":"byte[]","name":"d"},{"type":"uint64","name":"e"},{"type":"bool","name":"f"},{"type":"byte[]","name":"g"},{"type":"string","name":"h"},{"type":"uint64","name":"m"},{"type":"uint256","name":"n"},{"type":"ufixed32x8","name":"o"},{"type":"ufixed256x16","name":"p"},{"type":"bool","name":"q"},{"type":"byte[]","name":"r"},{"type":"byte[]","name":"s"},{"type":"byte[]","name":"t"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[{"name":"SwappedArc4","args":[{"type":"uint64","name":"m"},{"type":"uint256","name":"n"},{"type":"ufixed32x8","name":"o"},{"type":"ufixed256x16","name":"p"},{"type":"bool","name":"q"},{"type":"uint8[3]","name":"r"},{"type":"uint16[]","name":"s"},{"type":"(uint32,uint64,string)","name":"t"}]},{"name":"Swapped","args":[{"type":"string","name":"field1"},{"type":"uint512","name":"field2"},{"type":"uint64","name":"field3"},{"type":"byte[]","name":"field4"},{"type":"uint64","name":"field5"},{"type":"bool","name":"field6"},{"type":"byte[]","name":"field7"},{"type":"string","name":"field8"},{"type":"uint64","name":"field9"},{"type":"uint256","name":"field10"},{"type":"ufixed32x8","name":"field11"},{"type":"ufixed256x16","name":"field12"},{"type":"bool","name":"field13"},{"type":"uint8[3]","name":"field14"},{"type":"uint16[]","name":"field15"},{"type":"(uint32,uint64,string)","name":"field16"}]}],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[1579,1599,1788,1808,1933,1982],"errorMessage":"application log value is not the result of an ABI return"},{"pc":[1855],"errorMessage":"max array length exceeded"},{"pc":[411,424,457,468,503,514,549,562,595,608,641,652,687,698,733,746,779,792,825,836,871,882,917,930,963,976,1009,1020,1055,1066,1101,1114,1147,1160,1193,1204,1239,1250,1285,1298,1331,1344,1377,1388,1423,1434,1469,1482,1509,1531,1617,1626,1650,1659,1679,1699,1707],"errorMessage":"overflow"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDggNjQgMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4MDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjYKICAgIC8vIGNsYXNzIEFyYzRQcmltaXRpdmVPcHNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANTcKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDk2ZjE0MTE2IDB4ZWQ2NjYwOTYgMHgyY2EwMzUyYiAweDg1OTA3ZDQwIDB4MmNiZWM0NWIgMHgwNzY2NmZkOSAweDM3MGJhYmQzIDB4MmI2YjNlZjAgMHgzMzlkYTk3YyAweDc4OThlZDk3IDB4MWYxMzBjZWMgMHhjNzQ4NjY0ZSAweDdhNDYwY2IxIDB4ZGNhYjFmMDEgMHg5N2Q5MDY0ZCAweGNlMDZjMmEwIDB4ZGNkYmNlZTAgMHg3N2E0YjY4ZCAweDRmNTQwNjI2IDB4MDk1YWVkNDEgMHhlM2I3ZTkxOCAweDU1MzM3MDA4IDB4OWJiMWNkNjYgMHg4MTQ4NGQ5ZCAweDlhMDNkZjEwIDB4ZDNmMGU0NGIgMHg5ODJkYjIzMyAweGFmZmJkZjBlIDB4Mjg4YWY3NmUgMHg4YmQ4NGEwNCAweDMwMmI4YTBhIDB4MzM3YWUyMGIgMHg2ZTI1OTI3MCAweDc5ZTM1Zjc3IDB4MGYxNTc0ZmUgMHhiMmNiMTNiZSAweGQwNTllZWE3IDB4NGNjNGMxNTcgMHgzZDE3YWM2ZSAweGY3ZjNkNWZjIDB4ZjhjOGY4ZDUgMHg0M2Y3MTYyYSAweDQyZTA5MDc1IDB4ZDk1NmY1NzUgMHg2YzAxNjBkZiAweGE4OTAxNTBiIDB4MGIyZjRjM2YgMHg5ZGI5ZDMyNyAweGU0ZDk1MGExIDB4YjYwNWU4MGMgLy8gbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5faW5pdChieXRlW10pdWludDMyIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5faW5pdChieXRlW10pdWludDI1NiIsIG1ldGhvZCAidmVyaWZ5X3VpbnRuX2Zyb21fYnl0ZXMoYnl0ZVtdKXVpbnQzMiIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRuX2Zyb21fYnl0ZXMoYnl0ZVtdKXVpbnQyNTYiLCBtZXRob2QgInZlcmlmeV91aW50bl9mcm9tX2xvZyhieXRlW10pdWludDMyIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fZnJvbV9sb2coYnl0ZVtdKXVpbnQyNTYiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl9hc191aW50NjQoYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRuX2FzX2JpZ3VpbnQoYnl0ZVtdKXVpbnQ1MTIiLCBtZXRob2QgInZlcmlmeV91aW50bjY0X2FzX3VpbnQ2NChieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludG42NF9hc19iaWd1aW50KGJ5dGVbXSl1aW50NTEyIiwgbWV0aG9kICJ2ZXJpZnlfdWZpeGVkbnhtX2J5dGVzKHVmaXhlZDMyeDgpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWZpeGVkbnhtX2J5dGVzKHVmaXhlZDI1NngxNilieXRlW10iLCBtZXRob2QgInZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlcyhieXRlW10pdWZpeGVkMzJ4OCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VmaXhlZG54bV9mcm9tX2J5dGVzKGJ5dGVbXSl1Zml4ZWQyNTZ4MTYiLCBtZXRob2QgInZlcmlmeV91Zml4ZWRueG1fZnJvbV9sb2coYnl0ZVtdKXVmaXhlZDMyeDgiLCBtZXRob2QgInZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9sb2coYnl0ZVtdKXVmaXhlZDI1NngxNiIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19pbml0KHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfYWRkKHN0cmluZyxzdHJpbmcpc3RyaW5nIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2VxKHN0cmluZyxzdHJpbmcpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19ieXRlcyhzdHJpbmcpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2Zyb21fYnl0ZXMoYnl0ZVtdKXN0cmluZyIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19mcm9tX2xvZyhieXRlW10pc3RyaW5nIiwgbWV0aG9kICJ2ZXJpZnlfYm9vbF9ieXRlcyhib29sKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Jvb2xfZnJvbV9ieXRlcyhieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2Jvb2xfZnJvbV9sb2coYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9lbWl0KHN0cmluZyx1aW50NTEyLHVpbnQ2NCxieXRlW10sdWludDY0LGJvb2wsYnl0ZVtdLHN0cmluZyx1aW50NjQsdWludDI1Nix1Zml4ZWQzMng4LHVmaXhlZDI1NngxNixib29sLGJ5dGVbXSxieXRlW10sYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfdWludG5fdWludG5fZXEgdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2VxIHZlcmlmeV91aW50bl9iaWd1aW50bl9lcSB2ZXJpZnlfYmlndWludG5fYmlndWludG5fZXEgdmVyaWZ5X3VpbnRuX3VpbnRuX25lIHZlcmlmeV9iaWd1aW50bl91aW50bl9uZSB2ZXJpZnlfdWludG5fYmlndWludG5fbmUgdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX25lIHZlcmlmeV91aW50bl91aW50bl9sdCB2ZXJpZnlfYmlndWludG5fdWludG5fbHQgdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX2x0IHZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9sdCB2ZXJpZnlfdWludG5fdWludG5fbGUgdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2xlIHZlcmlmeV91aW50bl9iaWd1aW50bl9sZSB2ZXJpZnlfYmlndWludG5fYmlndWludG5fbGUgdmVyaWZ5X3VpbnRuX3VpbnRuX2d0IHZlcmlmeV9iaWd1aW50bl91aW50bl9ndCB2ZXJpZnlfdWludG5fYmlndWludG5fZ3QgdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX2d0IHZlcmlmeV91aW50bl91aW50bl9nZSB2ZXJpZnlfYmlndWludG5fdWludG5fZ2UgdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX2dlIHZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9nZSB2ZXJpZnlfdWludG5faW5pdCB2ZXJpZnlfYmlndWludG5faW5pdCB2ZXJpZnlfdWludG5fZnJvbV9ieXRlcyB2ZXJpZnlfYmlndWludG5fZnJvbV9ieXRlcyB2ZXJpZnlfdWludG5fZnJvbV9sb2cgdmVyaWZ5X2JpZ3VpbnRuX2Zyb21fbG9nIHZlcmlmeV9iaWd1aW50bl9hc191aW50NjQgdmVyaWZ5X2JpZ3VpbnRuX2FzX2JpZ3VpbnQgdmVyaWZ5X3VpbnRuNjRfYXNfdWludDY0IHZlcmlmeV91aW50bjY0X2FzX2JpZ3VpbnQgdmVyaWZ5X3VmaXhlZG54bV9ieXRlcyB2ZXJpZnlfYmlndWZpeGVkbnhtX2J5dGVzIHZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlcyB2ZXJpZnlfYmlndWZpeGVkbnhtX2Zyb21fYnl0ZXMgdmVyaWZ5X3VmaXhlZG54bV9mcm9tX2xvZyB2ZXJpZnlfYmlndWZpeGVkbnhtX2Zyb21fbG9nIHZlcmlmeV9zdHJpbmdfaW5pdCB2ZXJpZnlfc3RyaW5nX2FkZCB2ZXJpZnlfc3RyaW5nX2VxIHZlcmlmeV9zdHJpbmdfYnl0ZXMgdmVyaWZ5X3N0cmluZ19mcm9tX2J5dGVzIHZlcmlmeV9zdHJpbmdfZnJvbV9sb2cgdmVyaWZ5X2Jvb2xfYnl0ZXMgdmVyaWZ5X2Jvb2xfZnJvbV9ieXRlcyB2ZXJpZnlfYm9vbF9mcm9tX2xvZyB2ZXJpZnlfZW1pdAogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU3OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX3VpbnRuX2VxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX3VpbnRuX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTEKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpID09IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl91aW50bl9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl91aW50bl9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID09IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPT0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOQogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID09IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSAhPSBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBifAogICAgZGlnIDIKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgIT0gYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSAhPSBhcmM0LlVJbnQ1MTIoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjUzCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgIT0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGIhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fbHQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpIDwgYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBjb3ZlciAyCiAgICBifAogICAgYjwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2x0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgPCBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9sdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9sdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPCBhcmM0LlVJbnQ1MTIoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiPAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fbHQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzcKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA8IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODMKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpIDw9IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fdWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fdWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA8PSBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fYmlndWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fYmlndWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpIDw9IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgPD0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fZ3Rbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPiBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBifAogICAgZGlnIDIKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2d0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2d0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTMKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA+IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9ndFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9ndDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTE5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSA+IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fZ3Rbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID4gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPj0gYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBjb3ZlciAyCiAgICBifAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fdWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fdWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID49IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fYmlndWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fYmlndWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPj0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID49IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPj0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX2luaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTU0CiAgICAvLyByZXR1cm4gYXJjNC5VSW50MzIoYV9iaWd1aW50KQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgcHVzaGludCA0CiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2luaXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5faW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQyNTYoYV9iaWd1aW50KQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHB1c2hpbnQgMzIKICAgIGJ6ZXJvCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fZnJvbV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9mcm9tX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2Zyb21fYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9mcm9tX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDMyLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl9mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl9mcm9tX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gcmV0dXJuIGFyYzQuVUludDI1Ni5mcm9tX2xvZyhhKQogICAgZHVwCiAgICBleHRyYWN0IDYgMAogICAgc3dhcAogICAgZXh0cmFjdCAyIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBsb2cgdmFsdWUgaXMgbm90IHRoZSByZXN1bHQgb2YgYW4gQUJJIHJldHVybgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYXNfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX2FzX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxODAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQyNTYoYV9iaWd1aW50KS5hc191aW50NjQoKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHB1c2hpbnQgMzIKICAgIGJ6ZXJvCiAgICBifAogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAtCiAgICBpbnRjXzEgLy8gOAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZXh0cmFjdDMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2FzX2JpZ3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYXNfYmlndWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxODUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQyNTYoYV9iaWd1aW50KS5hc19iaWd1aW50KCkKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBwdXNoaW50IDMyCiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIGJ8CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bjY0X2FzX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bjY0X2FzX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuNjRfYXNfYmlndWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bjY0X2FzX2JpZ3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KS5hc19iaWd1aW50KCkKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgYnwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VmaXhlZG54bV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91Zml4ZWRueG1fYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWZpeGVkbnhtX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VmaXhlZG54bV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91Zml4ZWRueG1fZnJvbV9sb2dbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWZpeGVkbnhtX2Zyb21fbG9nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI1CiAgICAvLyByZXR1cm4gYXJjNC5VRml4ZWROeE1bdHlwaW5nLkxpdGVyYWxbMzJdLCB0eXBpbmcuTGl0ZXJhbFs4XV0uZnJvbV9sb2coYSkKICAgIGR1cAogICAgZXh0cmFjdCA2IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMiA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gbG9nIHZhbHVlIGlzIG5vdCB0aGUgcmVzdWx0IG9mIGFuIEFCSSByZXR1cm4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VmaXhlZG54bV9mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzEKICAgIC8vIHJldHVybiBhcmM0LkJpZ1VGaXhlZE54TVt0eXBpbmcuTGl0ZXJhbFsyNTZdLCB0eXBpbmcuTGl0ZXJhbFsxNl1dLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjM1CiAgICAvLyByZXN1bHQgPSBhcmM0LlN0cmluZyhTdHJpbmcoIkhlbGxvLCAiKSArIGEpCiAgICBwdXNoYnl0ZXMgIkhlbGxvLCAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2FkZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfYWRkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0MAogICAgLy8gcmVzdWx0ID0gYSArIGIKICAgIGV4dHJhY3QgMiAwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfZXFbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQ1CiAgICAvLyByZXR1cm4gYSA9PSBiCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2Zyb21fYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2Zyb21fYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2Zyb21fbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N0cmluZ19mcm9tX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gcmV0dXJuIGFyYzQuU3RyaW5nLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ib29sX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jvb2xfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYm9vbF9mcm9tX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jvb2xfZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ib29sX2Zyb21fbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jvb2xfZnJvbV9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNzAKICAgIC8vIHJldHVybiBhcmM0LkJvb2wuZnJvbV9sb2coYSkKICAgIGR1cAogICAgZXh0cmFjdCA2IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMiA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gbG9nIHZhbHVlIGlzIG5vdCB0aGUgcmVzdWx0IG9mIGFuIEFCSSByZXR1cm4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2VtaXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZW1pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50MTYKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZHVwCiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk2CiAgICAvLyBhcmM0LmVtaXQoU3dhcHBlZEFyYzQobSwgbiwgbywgcCwgcSwgYXJjNF9yLCBhcmM0X3MsIGFyYzRfdCkpCiAgICBkaWcgNwogICAgZGlnIDcKICAgIGNvbmNhdAogICAgZGlnIDYKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDA1NAogICAgY29uY2F0CiAgICBkaWcgMgogICAgbGVuCiAgICBwdXNoaW50IDg0CiAgICBkaWcgMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHg2NmJiMDMzMyAvLyBtZXRob2QgIlN3YXBwZWRBcmM0KHVpbnQ2NCx1aW50MjU2LHVmaXhlZDMyeDgsdWZpeGVkMjU2eDE2LGJvb2wsdWludDhbM10sdWludDE2W10sKHVpbnQzMix1aW50NjQsc3RyaW5nKSkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk3LTMxNQogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgICJTd2FwcGVkIiwKICAgIC8vICAgICBhLAogICAgLy8gICAgIGIsCiAgICAvLyAgICAgYywKICAgIC8vICAgICBkLmNvcHkoKSwKICAgIC8vICAgICBlLAogICAgLy8gICAgIGYsCiAgICAvLyAgICAgZy5jb3B5KCksCiAgICAvLyAgICAgaCwKICAgIC8vICAgICBtLAogICAgLy8gICAgIG4sCiAgICAvLyAgICAgbywKICAgIC8vICAgICBwLAogICAgLy8gICAgIHEsCiAgICAvLyAgICAgYXJjNF9yLmNvcHkoKSwKICAgIC8vICAgICBhcmM0X3MuY29weSgpLAogICAgLy8gICAgIGFyYzRfdCwKICAgIC8vICkKICAgIGRpZyAxNgogICAgbGVuCiAgICBwdXNoaW50IDE3MwogICAgKwogICAgcHVzaGJ5dGVzIDB4MDBhZAogICAgdW5jb3ZlciAxNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDE2CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBkaWcgMTUKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDE0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIGRpZyAxMgogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMTEKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweGVjMzMxOWJiIC8vIG1ldGhvZCAiU3dhcHBlZChzdHJpbmcsdWludDUxMix1aW50NjQsYnl0ZVtdLHVpbnQ2NCxib29sLGJ5dGVbXSxzdHJpbmcsdWludDY0LHVpbnQyNTYsdWZpeGVkMzJ4OCx1Zml4ZWQyNTZ4MTYsYm9vbCx1aW50OFszXSx1aW50MTZbXSwodWludDMyLHVpbnQ2NCxzdHJpbmcpKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxNi0zMzQKICAgIC8vIGFyYzQuZW1pdCgKICAgIC8vICAgICAiU3dhcHBlZChzdHJpbmcsdWludDUxMix1aW50NjQsYnl0ZVtdLHVpbnQ2NCxib29sLGJ5dGVbXSxzdHJpbmcsdWludDY0LHVpbnQyNTYsdWZpeGVkMzJ4OCx1Zml4ZWQyNTZ4MTYsYm9vbCx1aW50OFszXSx1aW50MTZbXSwodWludDMyLHVpbnQ2NCxzdHJpbmcpKSIsCiAgICAvLyAgICAgYSwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGMsCiAgICAvLyAgICAgZC5jb3B5KCksCiAgICAvLyAgICAgZSwKICAgIC8vICAgICBmLAogICAgLy8gICAgIGcuY29weSgpLAogICAgLy8gICAgIGgsCiAgICAvLyAgICAgbSwKICAgIC8vICAgICBuLAogICAgLy8gICAgIG8sCiAgICAvLyAgICAgcCwKICAgIC8vICAgICBxLAogICAgLy8gICAgIGFyYzRfci5jb3B5KCksCiAgICAvLyAgICAgYXJjNF9zLmNvcHkoKSwKICAgIC8vICAgICBhcmM0X3QsCiAgICAvLyApCiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAQhAACYCBBUffHUBADEbQQFtMRkURDEYRIIyBJbxQRYE7WZglgQsoDUrBIWQfUAELL7EWwQHZm/ZBDcLq9MEK2s+8AQznal8BHiY7ZcEHxMM7ATHSGZOBHpGDLEE3KsfAQSX2QZNBM4GwqAE3NvO4AR3pLaNBE9UBiYECVrtQQTjt+kYBFUzcAgEm7HNZgSBSE2dBJoD3xAE0/DkSwSYLbIzBK/73w4EKIr3bgSL2EoEBDArigoEM3riCwRuJZJwBHnjX3cEDxV0/gSyyxO+BNBZ7qcETMTBVwQ9F6xuBPfz1fwE+Mj41QRD9xYqBELgkHUE2Vb1dQRsAWDfBKiQFQsECy9MPwSdudMnBOTZUKEEtgXoDDYaAI4yAAkANwBlAJMAwQDvAR0BSwF5AacB1QIDAjECXwKNArsC6QMXA0UDcwOhA88D/QQrBFkEbwSFBJEEnQSxBMUE5gUEBRgFNAVFBVYFYgVuBYIFlgW1BdAF4gXzBf8GEwYkBjAGRAAxGRQxGBQQQzYaAVcCADYaAlcCAEsBFSMORCOvTwJLAatLAhUjDkROAquoKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08Cq0sBFSMORCOvTwKrqCklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAqtLARUkDkQkr08Cq6gpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwJLAatLAhUkDkROAquoKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08CSwGrSwIVIw5ETgKrqSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAqtLARUjDkQjr08Cq6kpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwKrSwEVJA5EJK9PAqupKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08CSwGrSwIVJA5ETgKrqSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAksBq0sCFSMORE4Cq6QpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwKrSwEVIw5EI69PAqukKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08Cq0sBFSQORCSvTwKrpCklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAksBq0sCFSQORE4Cq6QpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwJLAatLAhUjDkROAqumKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08Cq0sBFSMORCOvTwKrpiklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAqtLARUkDkQkr08Cq6YpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwJLAatLAhUkDkROAqumKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08CSwGrSwIVIw5ETgKrpSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAqtLARUjDkQjr08Cq6UpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwKrSwEVJA5EJK9PAqulKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08CSwGrSwIVJA5ETgKrpSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAksBq0sCFSMORE4Cq6cpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwKrSwEVIw5EI69PAqunKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08Cq0sBFSQORCSvTwKrpyklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAksBq0sCFSQORE4Cq6cpJU8CVChMULAiQzYaAVcCAEkVgQQORIEEr6soTFCwIkM2GgFXAgBJFYEgDkSBIK+rKExQsCJDNhoBVwIAKExQsCJDNhoBVwIAKExQsCJDNhoBSVcGAExXAgQoEkQoTFCwIkM2GgFJVwYATFcCBCgSRChMULAiQzYaAVcCAEkVgSAORIEgr6tJkyQOREkVIwkjWChMULAiQzYaAVcCAEkVgSAORIEgr6tJFSQORCSvqyhMULAiQzYaAVcCAEkVIw5EI6+rKExQsCJDNhoBVwIASRUjDkQjr6tJFSQORCSvqyhMULAiQzYaAUkVFlcGAkxQKExQsCJDNhoBSRUWVwYCTFAoTFCwIkM2GgFXAgAoTFCwIkM2GgFXAgAoTFCwIkM2GgFJVwYATFcCBCgSRChMULAiQzYaAUlXBgBMVwIEKBJEKExQsCJDNhoBVwIAgAdIZWxsbywgTFBJFRZXBgJMUChMULAiQzYaATYaAlcCAFBJVwIAFRZXBgJcAChMULAiQzYaATYaAhIpJU8CVChMULAiQzYaAUkVFlcGAkxQKExQsCJDNhoBVwIAKExQsCJDNhoBSVcGAExXAgQoEkQoTFCwIkM2GgFJFRZXBgJMUChMULAiQzYaAVcCAChMULAiQzYaAUlXBgBMVwIEKBJEKExQsCJDNhoBNhoCNhoDNhoENhoFNhoGNhoHNhoINhoJNhoKNhoLNhoMNhoNNhoOVwIANhoPSSVZSwGBAllSVwIANhoPSYECWUsBFVJXAgBLB0sHUEsGUEsFUEsEUEsDUIACAFRQSwIVgVRLAQgWVwYCTwJMUEsDUEsCUIAEZrsDM0xQsEsQFYGtAQiAAgCtTxFQTxBQSwEWVwYCUEsPFU8CCExPDlBPDVBLARZXBgJQSwwVTwIISRZXBgJPAkxQSwsVTwIITE8KUE8JUE8IUE8HUE8GUE8FUEsBFlcGAlBMTwIIFlcGAlBPBlBPBVBPBFBPA1BPAlBMUIAE7DMZu0xQSbCwIkM=","clear":"C4EBQw=="},"events":[{"name":"SwappedArc4","args":[{"type":"uint64","name":"m"},{"type":"uint256","name":"n"},{"type":"ufixed32x8","name":"o"},{"type":"ufixed256x16","name":"p"},{"type":"bool","name":"q"},{"type":"uint8[3]","name":"r"},{"type":"uint16[]","name":"s"},{"type":"(uint32,uint64,string)","name":"t"}]},{"name":"Swapped","args":[{"type":"string","name":"field1"},{"type":"uint512","name":"field2"},{"type":"uint64","name":"field3"},{"type":"byte[]","name":"field4"},{"type":"uint64","name":"field5"},{"type":"bool","name":"field6"},{"type":"byte[]","name":"field7"},{"type":"string","name":"field8"},{"type":"uint64","name":"field9"},{"type":"uint256","name":"field10"},{"type":"ufixed32x8","name":"field11"},{"type":"ufixed256x16","name":"field12"},{"type":"bool","name":"field13"},{"type":"uint8[3]","name":"field14"},{"type":"uint16[]","name":"field15"},{"type":"(uint32,uint64,string)","name":"field16"}]}],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the Arc4PrimitiveOpsContract contract + */ +export type Arc4PrimitiveOpsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_uintn_uintn_eq(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_uintn_eq(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_biguintn_eq(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_biguintn_eq(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_uintn_ne(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_uintn_ne(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_biguintn_ne(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_biguintn_ne(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_uintn_lt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_uintn_lt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_biguintn_lt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_biguintn_lt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_uintn_le(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_uintn_le(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_biguintn_le(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_biguintn_le(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_uintn_gt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_uintn_gt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_biguintn_gt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_biguintn_gt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_uintn_ge(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_uintn_ge(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_biguintn_ge(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_biguintn_ge(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_init(byte[])uint32': { + a: Uint8Array + } + 'verify_biguintn_init(byte[])uint256': { + a: Uint8Array + } + 'verify_uintn_from_bytes(byte[])uint32': { + a: Uint8Array + } + 'verify_biguintn_from_bytes(byte[])uint256': { + a: Uint8Array + } + 'verify_uintn_from_log(byte[])uint32': { + a: Uint8Array + } + 'verify_biguintn_from_log(byte[])uint256': { + a: Uint8Array + } + 'verify_biguintn_as_uint64(byte[])uint64': { + a: Uint8Array + } + 'verify_biguintn_as_biguint(byte[])uint512': { + a: Uint8Array + } + 'verify_uintn64_as_uint64(byte[])uint64': { + a: Uint8Array + } + 'verify_uintn64_as_biguint(byte[])uint512': { + a: Uint8Array + } + 'verify_ufixednxm_bytes(ufixed32x8)byte[]': { + a: number + } + 'verify_bigufixednxm_bytes(ufixed256x16)byte[]': { + a: number + } + 'verify_ufixednxm_from_bytes(byte[])ufixed32x8': { + a: Uint8Array + } + 'verify_bigufixednxm_from_bytes(byte[])ufixed256x16': { + a: Uint8Array + } + 'verify_ufixednxm_from_log(byte[])ufixed32x8': { + a: Uint8Array + } + 'verify_bigufixednxm_from_log(byte[])ufixed256x16': { + a: Uint8Array + } + 'verify_string_init(string)string': { + a: string + } + 'verify_string_add(string,string)string': { + a: string + b: string + } + 'verify_string_eq(string,string)bool': { + a: string + b: string + } + 'verify_string_bytes(string)byte[]': { + a: string + } + 'verify_string_from_bytes(byte[])string': { + a: Uint8Array + } + 'verify_string_from_log(byte[])string': { + a: Uint8Array + } + 'verify_bool_bytes(bool)byte[]': { + a: boolean + } + 'verify_bool_from_bytes(byte[])bool': { + a: Uint8Array + } + 'verify_bool_from_log(byte[])bool': { + a: Uint8Array + } + 'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void': { + a: string + b: bigint | number + c: bigint | number + d: Uint8Array + e: bigint | number + f: boolean + g: Uint8Array + h: string + m: bigint | number + n: bigint | number + o: number + p: number + q: boolean + r: Uint8Array + s: Uint8Array + t: Uint8Array + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_uintn_uintn_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_uintn_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_biguintn_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_biguintn_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_uintn_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_uintn_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_biguintn_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_biguintn_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_uintn_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_uintn_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_biguintn_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_biguintn_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_uintn_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_uintn_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_biguintn_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_biguintn_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_uintn_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_uintn_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_biguintn_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_biguintn_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_uintn_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_uintn_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_biguintn_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_biguintn_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_init(byte[])uint32': [a: Uint8Array] + 'verify_biguintn_init(byte[])uint256': [a: Uint8Array] + 'verify_uintn_from_bytes(byte[])uint32': [a: Uint8Array] + 'verify_biguintn_from_bytes(byte[])uint256': [a: Uint8Array] + 'verify_uintn_from_log(byte[])uint32': [a: Uint8Array] + 'verify_biguintn_from_log(byte[])uint256': [a: Uint8Array] + 'verify_biguintn_as_uint64(byte[])uint64': [a: Uint8Array] + 'verify_biguintn_as_biguint(byte[])uint512': [a: Uint8Array] + 'verify_uintn64_as_uint64(byte[])uint64': [a: Uint8Array] + 'verify_uintn64_as_biguint(byte[])uint512': [a: Uint8Array] + 'verify_ufixednxm_bytes(ufixed32x8)byte[]': [a: number] + 'verify_bigufixednxm_bytes(ufixed256x16)byte[]': [a: number] + 'verify_ufixednxm_from_bytes(byte[])ufixed32x8': [a: Uint8Array] + 'verify_bigufixednxm_from_bytes(byte[])ufixed256x16': [a: Uint8Array] + 'verify_ufixednxm_from_log(byte[])ufixed32x8': [a: Uint8Array] + 'verify_bigufixednxm_from_log(byte[])ufixed256x16': [a: Uint8Array] + 'verify_string_init(string)string': [a: string] + 'verify_string_add(string,string)string': [a: string, b: string] + 'verify_string_eq(string,string)bool': [a: string, b: string] + 'verify_string_bytes(string)byte[]': [a: string] + 'verify_string_from_bytes(byte[])string': [a: Uint8Array] + 'verify_string_from_log(byte[])string': [a: Uint8Array] + 'verify_bool_bytes(bool)byte[]': [a: boolean] + 'verify_bool_from_bytes(byte[])bool': [a: Uint8Array] + 'verify_bool_from_log(byte[])bool': [a: Uint8Array] + 'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void': [a: string, b: bigint | number, c: bigint | number, d: Uint8Array, e: bigint | number, f: boolean, g: Uint8Array, h: string, m: bigint | number, n: bigint | number, o: number, p: number, q: boolean, r: Uint8Array, s: Uint8Array, t: Uint8Array] + } +} + +/** + * The return type for each method + */ +export type Arc4PrimitiveOpsContractReturns = { + 'verify_uintn_uintn_eq(byte[],byte[])bool': boolean + 'verify_biguintn_uintn_eq(byte[],byte[])bool': boolean + 'verify_uintn_biguintn_eq(byte[],byte[])bool': boolean + 'verify_biguintn_biguintn_eq(byte[],byte[])bool': boolean + 'verify_uintn_uintn_ne(byte[],byte[])bool': boolean + 'verify_biguintn_uintn_ne(byte[],byte[])bool': boolean + 'verify_uintn_biguintn_ne(byte[],byte[])bool': boolean + 'verify_biguintn_biguintn_ne(byte[],byte[])bool': boolean + 'verify_uintn_uintn_lt(byte[],byte[])bool': boolean + 'verify_biguintn_uintn_lt(byte[],byte[])bool': boolean + 'verify_uintn_biguintn_lt(byte[],byte[])bool': boolean + 'verify_biguintn_biguintn_lt(byte[],byte[])bool': boolean + 'verify_uintn_uintn_le(byte[],byte[])bool': boolean + 'verify_biguintn_uintn_le(byte[],byte[])bool': boolean + 'verify_uintn_biguintn_le(byte[],byte[])bool': boolean + 'verify_biguintn_biguintn_le(byte[],byte[])bool': boolean + 'verify_uintn_uintn_gt(byte[],byte[])bool': boolean + 'verify_biguintn_uintn_gt(byte[],byte[])bool': boolean + 'verify_uintn_biguintn_gt(byte[],byte[])bool': boolean + 'verify_biguintn_biguintn_gt(byte[],byte[])bool': boolean + 'verify_uintn_uintn_ge(byte[],byte[])bool': boolean + 'verify_biguintn_uintn_ge(byte[],byte[])bool': boolean + 'verify_uintn_biguintn_ge(byte[],byte[])bool': boolean + 'verify_biguintn_biguintn_ge(byte[],byte[])bool': boolean + 'verify_uintn_init(byte[])uint32': number + 'verify_biguintn_init(byte[])uint256': bigint + 'verify_uintn_from_bytes(byte[])uint32': number + 'verify_biguintn_from_bytes(byte[])uint256': bigint + 'verify_uintn_from_log(byte[])uint32': number + 'verify_biguintn_from_log(byte[])uint256': bigint + 'verify_biguintn_as_uint64(byte[])uint64': bigint + 'verify_biguintn_as_biguint(byte[])uint512': bigint + 'verify_uintn64_as_uint64(byte[])uint64': bigint + 'verify_uintn64_as_biguint(byte[])uint512': bigint + 'verify_ufixednxm_bytes(ufixed32x8)byte[]': Uint8Array + 'verify_bigufixednxm_bytes(ufixed256x16)byte[]': Uint8Array + 'verify_ufixednxm_from_bytes(byte[])ufixed32x8': number + 'verify_bigufixednxm_from_bytes(byte[])ufixed256x16': number + 'verify_ufixednxm_from_log(byte[])ufixed32x8': number + 'verify_bigufixednxm_from_log(byte[])ufixed256x16': number + 'verify_string_init(string)string': string + 'verify_string_add(string,string)string': string + 'verify_string_eq(string,string)bool': boolean + 'verify_string_bytes(string)byte[]': Uint8Array + 'verify_string_from_bytes(byte[])string': string + 'verify_string_from_log(byte[])string': string + 'verify_bool_bytes(bool)byte[]': Uint8Array + 'verify_bool_from_bytes(byte[])bool': boolean + 'verify_bool_from_log(byte[])bool': boolean + 'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void': void +} + +/** + * Defines the types of available calls and state of the Arc4PrimitiveOpsContract smart contract. + */ +export type Arc4PrimitiveOpsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_uintn_uintn_eq(byte[],byte[])bool' | 'verify_uintn_uintn_eq', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_eq(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_eq(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_eq(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_uintn_eq(byte[],byte[])bool' | 'verify_biguintn_uintn_eq', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_eq(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_eq(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_eq(byte[],byte[])bool'] + }> + & Record<'verify_uintn_biguintn_eq(byte[],byte[])bool' | 'verify_uintn_biguintn_eq', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_eq(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_eq(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_eq(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_biguintn_eq(byte[],byte[])bool' | 'verify_biguintn_biguintn_eq', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_eq(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_eq(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_eq(byte[],byte[])bool'] + }> + & Record<'verify_uintn_uintn_ne(byte[],byte[])bool' | 'verify_uintn_uintn_ne', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_ne(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_ne(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ne(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_uintn_ne(byte[],byte[])bool' | 'verify_biguintn_uintn_ne', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_ne(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_ne(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ne(byte[],byte[])bool'] + }> + & Record<'verify_uintn_biguintn_ne(byte[],byte[])bool' | 'verify_uintn_biguintn_ne', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_ne(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_ne(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ne(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_biguintn_ne(byte[],byte[])bool' | 'verify_biguintn_biguintn_ne', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_ne(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_ne(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ne(byte[],byte[])bool'] + }> + & Record<'verify_uintn_uintn_lt(byte[],byte[])bool' | 'verify_uintn_uintn_lt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_lt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_lt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_lt(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_uintn_lt(byte[],byte[])bool' | 'verify_biguintn_uintn_lt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_lt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_lt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_lt(byte[],byte[])bool'] + }> + & Record<'verify_uintn_biguintn_lt(byte[],byte[])bool' | 'verify_uintn_biguintn_lt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_lt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_lt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_lt(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_biguintn_lt(byte[],byte[])bool' | 'verify_biguintn_biguintn_lt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_lt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_lt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_lt(byte[],byte[])bool'] + }> + & Record<'verify_uintn_uintn_le(byte[],byte[])bool' | 'verify_uintn_uintn_le', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_le(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_le(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_le(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_uintn_le(byte[],byte[])bool' | 'verify_biguintn_uintn_le', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_le(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_le(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_le(byte[],byte[])bool'] + }> + & Record<'verify_uintn_biguintn_le(byte[],byte[])bool' | 'verify_uintn_biguintn_le', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_le(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_le(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_le(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_biguintn_le(byte[],byte[])bool' | 'verify_biguintn_biguintn_le', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_le(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_le(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_le(byte[],byte[])bool'] + }> + & Record<'verify_uintn_uintn_gt(byte[],byte[])bool' | 'verify_uintn_uintn_gt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_gt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_gt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_gt(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_uintn_gt(byte[],byte[])bool' | 'verify_biguintn_uintn_gt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_gt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_gt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_gt(byte[],byte[])bool'] + }> + & Record<'verify_uintn_biguintn_gt(byte[],byte[])bool' | 'verify_uintn_biguintn_gt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_gt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_gt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_gt(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_biguintn_gt(byte[],byte[])bool' | 'verify_biguintn_biguintn_gt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_gt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_gt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_gt(byte[],byte[])bool'] + }> + & Record<'verify_uintn_uintn_ge(byte[],byte[])bool' | 'verify_uintn_uintn_ge', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_ge(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_ge(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ge(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_uintn_ge(byte[],byte[])bool' | 'verify_biguintn_uintn_ge', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_ge(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_ge(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ge(byte[],byte[])bool'] + }> + & Record<'verify_uintn_biguintn_ge(byte[],byte[])bool' | 'verify_uintn_biguintn_ge', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_ge(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_ge(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ge(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_biguintn_ge(byte[],byte[])bool' | 'verify_biguintn_biguintn_ge', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_ge(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_ge(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ge(byte[],byte[])bool'] + }> + & Record<'verify_uintn_init(byte[])uint32' | 'verify_uintn_init', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_init(byte[])uint32'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_init(byte[])uint32'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_init(byte[])uint32'] + }> + & Record<'verify_biguintn_init(byte[])uint256' | 'verify_biguintn_init', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_init(byte[])uint256'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_init(byte[])uint256'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_init(byte[])uint256'] + }> + & Record<'verify_uintn_from_bytes(byte[])uint32' | 'verify_uintn_from_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_from_bytes(byte[])uint32'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_from_bytes(byte[])uint32'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_from_bytes(byte[])uint32'] + }> + & Record<'verify_biguintn_from_bytes(byte[])uint256' | 'verify_biguintn_from_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_from_bytes(byte[])uint256'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_from_bytes(byte[])uint256'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_from_bytes(byte[])uint256'] + }> + & Record<'verify_uintn_from_log(byte[])uint32' | 'verify_uintn_from_log', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_from_log(byte[])uint32'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_from_log(byte[])uint32'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_from_log(byte[])uint32'] + }> + & Record<'verify_biguintn_from_log(byte[])uint256' | 'verify_biguintn_from_log', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_from_log(byte[])uint256'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_from_log(byte[])uint256'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_from_log(byte[])uint256'] + }> + & Record<'verify_biguintn_as_uint64(byte[])uint64' | 'verify_biguintn_as_uint64', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_as_uint64(byte[])uint64'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_as_uint64(byte[])uint64'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_as_uint64(byte[])uint64'] + }> + & Record<'verify_biguintn_as_biguint(byte[])uint512' | 'verify_biguintn_as_biguint', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_as_biguint(byte[])uint512'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_as_biguint(byte[])uint512'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_as_biguint(byte[])uint512'] + }> + & Record<'verify_uintn64_as_uint64(byte[])uint64' | 'verify_uintn64_as_uint64', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn64_as_uint64(byte[])uint64'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn64_as_uint64(byte[])uint64'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn64_as_uint64(byte[])uint64'] + }> + & Record<'verify_uintn64_as_biguint(byte[])uint512' | 'verify_uintn64_as_biguint', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn64_as_biguint(byte[])uint512'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn64_as_biguint(byte[])uint512'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn64_as_biguint(byte[])uint512'] + }> + & Record<'verify_ufixednxm_bytes(ufixed32x8)byte[]' | 'verify_ufixednxm_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_ufixednxm_bytes(ufixed32x8)byte[]'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_ufixednxm_bytes(ufixed32x8)byte[]'] + returns: Arc4PrimitiveOpsContractReturns['verify_ufixednxm_bytes(ufixed32x8)byte[]'] + }> + & Record<'verify_bigufixednxm_bytes(ufixed256x16)byte[]' | 'verify_bigufixednxm_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bigufixednxm_bytes(ufixed256x16)byte[]'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bigufixednxm_bytes(ufixed256x16)byte[]'] + returns: Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_bytes(ufixed256x16)byte[]'] + }> + & Record<'verify_ufixednxm_from_bytes(byte[])ufixed32x8' | 'verify_ufixednxm_from_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_ufixednxm_from_bytes(byte[])ufixed32x8'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_ufixednxm_from_bytes(byte[])ufixed32x8'] + returns: Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_bytes(byte[])ufixed32x8'] + }> + & Record<'verify_bigufixednxm_from_bytes(byte[])ufixed256x16' | 'verify_bigufixednxm_from_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'] + returns: Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'] + }> + & Record<'verify_ufixednxm_from_log(byte[])ufixed32x8' | 'verify_ufixednxm_from_log', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_ufixednxm_from_log(byte[])ufixed32x8'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_ufixednxm_from_log(byte[])ufixed32x8'] + returns: Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_log(byte[])ufixed32x8'] + }> + & Record<'verify_bigufixednxm_from_log(byte[])ufixed256x16' | 'verify_bigufixednxm_from_log', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bigufixednxm_from_log(byte[])ufixed256x16'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bigufixednxm_from_log(byte[])ufixed256x16'] + returns: Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_log(byte[])ufixed256x16'] + }> + & Record<'verify_string_init(string)string' | 'verify_string_init', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_init(string)string'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_init(string)string'] + returns: Arc4PrimitiveOpsContractReturns['verify_string_init(string)string'] + }> + & Record<'verify_string_add(string,string)string' | 'verify_string_add', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_add(string,string)string'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_add(string,string)string'] + returns: Arc4PrimitiveOpsContractReturns['verify_string_add(string,string)string'] + }> + & Record<'verify_string_eq(string,string)bool' | 'verify_string_eq', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_eq(string,string)bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_eq(string,string)bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_string_eq(string,string)bool'] + }> + & Record<'verify_string_bytes(string)byte[]' | 'verify_string_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_bytes(string)byte[]'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_bytes(string)byte[]'] + returns: Arc4PrimitiveOpsContractReturns['verify_string_bytes(string)byte[]'] + }> + & Record<'verify_string_from_bytes(byte[])string' | 'verify_string_from_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_from_bytes(byte[])string'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_from_bytes(byte[])string'] + returns: Arc4PrimitiveOpsContractReturns['verify_string_from_bytes(byte[])string'] + }> + & Record<'verify_string_from_log(byte[])string' | 'verify_string_from_log', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_from_log(byte[])string'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_from_log(byte[])string'] + returns: Arc4PrimitiveOpsContractReturns['verify_string_from_log(byte[])string'] + }> + & Record<'verify_bool_bytes(bool)byte[]' | 'verify_bool_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bool_bytes(bool)byte[]'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bool_bytes(bool)byte[]'] + returns: Arc4PrimitiveOpsContractReturns['verify_bool_bytes(bool)byte[]'] + }> + & Record<'verify_bool_from_bytes(byte[])bool' | 'verify_bool_from_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bool_from_bytes(byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bool_from_bytes(byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_bool_from_bytes(byte[])bool'] + }> + & Record<'verify_bool_from_log(byte[])bool' | 'verify_bool_from_log', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bool_from_log(byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bool_from_log(byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_bool_from_log(byte[])bool'] + }> + & Record<'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void' | 'verify_emit', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'] + returns: Arc4PrimitiveOpsContractReturns['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type Arc4PrimitiveOpsContractSignatures = keyof Arc4PrimitiveOpsContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type Arc4PrimitiveOpsContractNonVoidMethodSignatures = keyof Arc4PrimitiveOpsContractTypes['methods'] extends infer T ? T extends keyof Arc4PrimitiveOpsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the Arc4PrimitiveOpsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = Arc4PrimitiveOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the Arc4PrimitiveOpsContract smart contract to the method's return type + */ +export type MethodReturn = Arc4PrimitiveOpsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type Arc4PrimitiveOpsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type Arc4PrimitiveOpsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: Arc4PrimitiveOpsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the Arc4PrimitiveOpsContract smart contract + */ +export abstract class Arc4PrimitiveOpsContractParamsFactory { + /** + * Constructs a no op call for the verify_uintn_uintn_eq(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnUintnEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_uintn_eq(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_uintn_eq(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnUintnEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_uintn_eq(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_biguintn_eq(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnBiguintnEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_biguintn_eq(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_biguintn_eq(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnBiguintnEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_biguintn_eq(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_uintn_ne(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnUintnNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_uintn_ne(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_uintn_ne(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnUintnNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_uintn_ne(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_biguintn_ne(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnBiguintnNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_biguintn_ne(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_biguintn_ne(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnBiguintnNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_biguintn_ne(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_uintn_lt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnUintnLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_uintn_lt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_uintn_lt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnUintnLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_uintn_lt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_biguintn_lt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnBiguintnLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_biguintn_lt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_biguintn_lt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnBiguintnLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_biguintn_lt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_uintn_le(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnUintnLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_uintn_le(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_uintn_le(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnUintnLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_uintn_le(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_biguintn_le(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnBiguintnLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_biguintn_le(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_biguintn_le(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnBiguintnLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_biguintn_le(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_uintn_gt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnUintnGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_uintn_gt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_uintn_gt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnUintnGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_uintn_gt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_biguintn_gt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnBiguintnGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_biguintn_gt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_biguintn_gt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnBiguintnGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_biguintn_gt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_uintn_ge(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnUintnGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_uintn_ge(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_uintn_ge(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnUintnGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_uintn_ge(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_biguintn_ge(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnBiguintnGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_biguintn_ge(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_biguintn_ge(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnBiguintnGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_biguintn_ge(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_init(byte[])uint32 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_init(byte[])uint32' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_biguintn_init(byte[])uint256 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_init(byte[])uint256' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_uintn_from_bytes(byte[])uint32 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_from_bytes(byte[])uint32' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_biguintn_from_bytes(byte[])uint256 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_from_bytes(byte[])uint256' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_uintn_from_log(byte[])uint32 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_from_log(byte[])uint32' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_biguintn_from_log(byte[])uint256 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_from_log(byte[])uint256' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_biguintn_as_uint64(byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnAsUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_as_uint64(byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_biguintn_as_biguint(byte[])uint512 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnAsBiguint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_as_biguint(byte[])uint512' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_uintn64_as_uint64(byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintn64AsUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn64_as_uint64(byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_uintn64_as_biguint(byte[])uint512 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintn64AsBiguint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn64_as_biguint(byte[])uint512' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_ufixednxm_bytes(ufixed32x8)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUfixednxmBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ufixednxm_bytes(ufixed32x8)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bigufixednxm_bytes(ufixed256x16)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBigufixednxmBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bigufixednxm_bytes(ufixed256x16)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_ufixednxm_from_bytes(byte[])ufixed32x8 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUfixednxmFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ufixednxm_from_bytes(byte[])ufixed32x8' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bigufixednxm_from_bytes(byte[])ufixed256x16 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBigufixednxmFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bigufixednxm_from_bytes(byte[])ufixed256x16' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_ufixednxm_from_log(byte[])ufixed32x8 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUfixednxmFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ufixednxm_from_log(byte[])ufixed32x8' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bigufixednxm_from_log(byte[])ufixed256x16 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBigufixednxmFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bigufixednxm_from_log(byte[])ufixed256x16' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_string_init(string)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_init(string)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_string_add(string,string)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringAdd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_add(string,string)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_string_eq(string,string)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_eq(string,string)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_string_bytes(string)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_bytes(string)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_string_from_bytes(byte[])string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_from_bytes(byte[])string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_string_from_log(byte[])string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_from_log(byte[])string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bool_bytes(bool)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBoolBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bool_bytes(bool)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bool_from_bytes(byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBoolFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bool_from_bytes(byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bool_from_log(byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBoolFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bool_from_log(byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEmit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d, params.args.e, params.args.f, params.args.g, params.args.h, params.args.m, params.args.n, params.args.o, params.args.p, params.args.q, params.args.r, params.args.s, params.args.t], + } + } +} + +/** + * A factory to create and deploy one or more instance of the Arc4PrimitiveOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class Arc4PrimitiveOpsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `Arc4PrimitiveOpsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new Arc4PrimitiveOpsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new Arc4PrimitiveOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the Arc4PrimitiveOpsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: Arc4PrimitiveOpsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new Arc4PrimitiveOpsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Arc4PrimitiveOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Arc4PrimitiveOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Arc4PrimitiveOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new Arc4PrimitiveOpsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the Arc4PrimitiveOpsContract smart contract + */ +export class Arc4PrimitiveOpsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `Arc4PrimitiveOpsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the Arc4PrimitiveOpsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `Arc4PrimitiveOpsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `Arc4PrimitiveOpsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new Arc4PrimitiveOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `Arc4PrimitiveOpsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new Arc4PrimitiveOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the Arc4PrimitiveOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnUintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnUintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnBiguintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnBiguintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnUintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnUintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnBiguintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnBiguintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnUintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnUintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnBiguintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnBiguintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnUintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnUintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnBiguintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnBiguintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnUintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnUintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnBiguintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnBiguintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnUintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnUintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnBiguintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnBiguintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_init(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnInit(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_init(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnInit(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_bytes(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_bytes(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_log(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_log(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnAsUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsUint64(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_biguint(byte[])uint512` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnAsBiguint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsBiguint(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintn64AsUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsUint64(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_biguint(byte[])uint512` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintn64AsBiguint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsBiguint(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_bytes(ufixed32x8)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUfixednxmBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_bytes(ufixed256x16)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBigufixednxmBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_bytes(byte[])ufixed32x8` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUfixednxmFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_bytes(byte[])ufixed256x16` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBigufixednxmFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_log(byte[])ufixed32x8` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUfixednxmFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_log(byte[])ufixed256x16` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBigufixednxmFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringInit(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_add(string,string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringAdd(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_eq(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_bytes(string)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_bytes(byte[])string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_log(byte[])string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_bytes(bool)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBoolBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_bytes(byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBoolFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_log(byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBoolFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEmit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyEmit(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the Arc4PrimitiveOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnUintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnUintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnBiguintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnBiguintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnUintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnUintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnBiguintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnBiguintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnUintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnUintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnBiguintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnBiguintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnUintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnUintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnBiguintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnBiguintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnUintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnUintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnBiguintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnBiguintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnUintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnUintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnBiguintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnBiguintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_init(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnInit(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_init(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnInit(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_bytes(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_bytes(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_log(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_log(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnAsUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsUint64(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_biguint(byte[])uint512` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnAsBiguint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsBiguint(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintn64AsUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsUint64(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_biguint(byte[])uint512` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintn64AsBiguint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsBiguint(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_bytes(ufixed32x8)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUfixednxmBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_bytes(ufixed256x16)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBigufixednxmBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_bytes(byte[])ufixed32x8` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUfixednxmFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_bytes(byte[])ufixed256x16` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBigufixednxmFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_log(byte[])ufixed32x8` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUfixednxmFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_log(byte[])ufixed256x16` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBigufixednxmFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringInit(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_add(string,string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringAdd(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_eq(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_bytes(string)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_bytes(byte[])string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_log(byte[])string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_bytes(bool)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBoolBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_bytes(byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBoolFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_log(byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBoolFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEmit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyEmit(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the Arc4PrimitiveOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnUintnEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnEq(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_eq(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnUintnEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnEq(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_eq(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnBiguintnEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnEq(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_eq(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnBiguintnEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnEq(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_eq(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnUintnNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnNe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ne(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnUintnNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnNe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ne(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnBiguintnNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnNe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ne(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnBiguintnNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnNe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ne(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnUintnLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_lt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnUintnLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_lt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnBiguintnLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_lt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnBiguintnLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_lt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnUintnLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_le(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnUintnLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_le(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnBiguintnLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_le(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnBiguintnLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_le(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnUintnGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_gt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnUintnGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_gt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnBiguintnGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_gt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnBiguintnGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_gt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnUintnGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ge(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnUintnGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ge(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnBiguintnGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ge(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnBiguintnGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ge(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_init(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnInit(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_init(byte[])uint32'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_init(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnInit(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_init(byte[])uint256'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_bytes(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_from_bytes(byte[])uint32'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_bytes(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_from_bytes(byte[])uint256'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_log(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromLog(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_from_log(byte[])uint32'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_log(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromLog(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_from_log(byte[])uint256'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnAsUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsUint64(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_as_uint64(byte[])uint64'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_biguint(byte[])uint512` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnAsBiguint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsBiguint(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_as_biguint(byte[])uint512'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintn64AsUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsUint64(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn64_as_uint64(byte[])uint64'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_biguint(byte[])uint512` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintn64AsBiguint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsBiguint(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn64_as_biguint(byte[])uint512'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_bytes(ufixed32x8)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUfixednxmBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_ufixednxm_bytes(ufixed32x8)byte[]'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_bytes(ufixed256x16)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBigufixednxmBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_bytes(ufixed256x16)byte[]'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_bytes(byte[])ufixed32x8` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUfixednxmFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_bytes(byte[])ufixed32x8'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_bytes(byte[])ufixed256x16` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBigufixednxmFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_log(byte[])ufixed32x8` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUfixednxmFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromLog(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_log(byte[])ufixed32x8'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_log(byte[])ufixed256x16` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBigufixednxmFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromLog(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_log(byte[])ufixed256x16'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringInit(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_init(string)string'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_add(string,string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringAdd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringAdd(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_add(string,string)string'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_eq(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringEq(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_eq(string,string)bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_bytes(string)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_bytes(string)byte[]'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_bytes(byte[])string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_from_bytes(byte[])string'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_log(byte[])string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromLog(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_from_log(byte[])string'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_bytes(bool)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBoolBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bool_bytes(bool)byte[]'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_bytes(byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBoolFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bool_from_bytes(byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_log(byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBoolFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromLog(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bool_from_log(byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEmit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyEmit(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new Arc4PrimitiveOpsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current Arc4PrimitiveOpsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): Arc4PrimitiveOpsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_uintn_uintn_eq(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnUintnEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnEq(params))) + return this + }, + /** + * Add a verify_biguintn_uintn_eq(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnUintnEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnEq(params))) + return this + }, + /** + * Add a verify_uintn_biguintn_eq(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnBiguintnEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnEq(params))) + return this + }, + /** + * Add a verify_biguintn_biguintn_eq(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnBiguintnEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnEq(params))) + return this + }, + /** + * Add a verify_uintn_uintn_ne(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnUintnNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnNe(params))) + return this + }, + /** + * Add a verify_biguintn_uintn_ne(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnUintnNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnNe(params))) + return this + }, + /** + * Add a verify_uintn_biguintn_ne(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnBiguintnNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnNe(params))) + return this + }, + /** + * Add a verify_biguintn_biguintn_ne(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnBiguintnNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnNe(params))) + return this + }, + /** + * Add a verify_uintn_uintn_lt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnUintnLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnLt(params))) + return this + }, + /** + * Add a verify_biguintn_uintn_lt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnUintnLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnLt(params))) + return this + }, + /** + * Add a verify_uintn_biguintn_lt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnBiguintnLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnLt(params))) + return this + }, + /** + * Add a verify_biguintn_biguintn_lt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnBiguintnLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnLt(params))) + return this + }, + /** + * Add a verify_uintn_uintn_le(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnUintnLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnLe(params))) + return this + }, + /** + * Add a verify_biguintn_uintn_le(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnUintnLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnLe(params))) + return this + }, + /** + * Add a verify_uintn_biguintn_le(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnBiguintnLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnLe(params))) + return this + }, + /** + * Add a verify_biguintn_biguintn_le(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnBiguintnLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnLe(params))) + return this + }, + /** + * Add a verify_uintn_uintn_gt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnUintnGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnGt(params))) + return this + }, + /** + * Add a verify_biguintn_uintn_gt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnUintnGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnGt(params))) + return this + }, + /** + * Add a verify_uintn_biguintn_gt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnBiguintnGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnGt(params))) + return this + }, + /** + * Add a verify_biguintn_biguintn_gt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnBiguintnGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnGt(params))) + return this + }, + /** + * Add a verify_uintn_uintn_ge(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnUintnGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnGe(params))) + return this + }, + /** + * Add a verify_biguintn_uintn_ge(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnUintnGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnGe(params))) + return this + }, + /** + * Add a verify_uintn_biguintn_ge(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnBiguintnGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnGe(params))) + return this + }, + /** + * Add a verify_biguintn_biguintn_ge(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnBiguintnGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnGe(params))) + return this + }, + /** + * Add a verify_uintn_init(byte[])uint32 method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnInit(params))) + return this + }, + /** + * Add a verify_biguintn_init(byte[])uint256 method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnInit(params))) + return this + }, + /** + * Add a verify_uintn_from_bytes(byte[])uint32 method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnFromBytes(params))) + return this + }, + /** + * Add a verify_biguintn_from_bytes(byte[])uint256 method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnFromBytes(params))) + return this + }, + /** + * Add a verify_uintn_from_log(byte[])uint32 method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnFromLog(params))) + return this + }, + /** + * Add a verify_biguintn_from_log(byte[])uint256 method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnFromLog(params))) + return this + }, + /** + * Add a verify_biguintn_as_uint64(byte[])uint64 method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnAsUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnAsUint64(params))) + return this + }, + /** + * Add a verify_biguintn_as_biguint(byte[])uint512 method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnAsBiguint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnAsBiguint(params))) + return this + }, + /** + * Add a verify_uintn64_as_uint64(byte[])uint64 method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintn64AsUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintn64AsUint64(params))) + return this + }, + /** + * Add a verify_uintn64_as_biguint(byte[])uint512 method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintn64AsBiguint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintn64AsBiguint(params))) + return this + }, + /** + * Add a verify_ufixednxm_bytes(ufixed32x8)byte[] method call against the Arc4PrimitiveOpsContract contract + */ + verifyUfixednxmBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUfixednxmBytes(params))) + return this + }, + /** + * Add a verify_bigufixednxm_bytes(ufixed256x16)byte[] method call against the Arc4PrimitiveOpsContract contract + */ + verifyBigufixednxmBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBigufixednxmBytes(params))) + return this + }, + /** + * Add a verify_ufixednxm_from_bytes(byte[])ufixed32x8 method call against the Arc4PrimitiveOpsContract contract + */ + verifyUfixednxmFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUfixednxmFromBytes(params))) + return this + }, + /** + * Add a verify_bigufixednxm_from_bytes(byte[])ufixed256x16 method call against the Arc4PrimitiveOpsContract contract + */ + verifyBigufixednxmFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBigufixednxmFromBytes(params))) + return this + }, + /** + * Add a verify_ufixednxm_from_log(byte[])ufixed32x8 method call against the Arc4PrimitiveOpsContract contract + */ + verifyUfixednxmFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUfixednxmFromLog(params))) + return this + }, + /** + * Add a verify_bigufixednxm_from_log(byte[])ufixed256x16 method call against the Arc4PrimitiveOpsContract contract + */ + verifyBigufixednxmFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBigufixednxmFromLog(params))) + return this + }, + /** + * Add a verify_string_init(string)string method call against the Arc4PrimitiveOpsContract contract + */ + verifyStringInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringInit(params))) + return this + }, + /** + * Add a verify_string_add(string,string)string method call against the Arc4PrimitiveOpsContract contract + */ + verifyStringAdd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringAdd(params))) + return this + }, + /** + * Add a verify_string_eq(string,string)bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyStringEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringEq(params))) + return this + }, + /** + * Add a verify_string_bytes(string)byte[] method call against the Arc4PrimitiveOpsContract contract + */ + verifyStringBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringBytes(params))) + return this + }, + /** + * Add a verify_string_from_bytes(byte[])string method call against the Arc4PrimitiveOpsContract contract + */ + verifyStringFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringFromBytes(params))) + return this + }, + /** + * Add a verify_string_from_log(byte[])string method call against the Arc4PrimitiveOpsContract contract + */ + verifyStringFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringFromLog(params))) + return this + }, + /** + * Add a verify_bool_bytes(bool)byte[] method call against the Arc4PrimitiveOpsContract contract + */ + verifyBoolBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBoolBytes(params))) + return this + }, + /** + * Add a verify_bool_from_bytes(byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBoolFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBoolFromBytes(params))) + return this + }, + /** + * Add a verify_bool_from_log(byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBoolFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBoolFromLog(params))) + return this + }, + /** + * Add a verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void method call against the Arc4PrimitiveOpsContract contract + */ + verifyEmit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEmit(params))) + return this + }, + /** + * Add a clear state call to the Arc4PrimitiveOpsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as Arc4PrimitiveOpsContractComposer + } +} +export type Arc4PrimitiveOpsContractComposer = { + /** + * Calls the verify_uintn_uintn_eq(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnUintnEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_eq(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_uintn_eq(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnUintnEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_eq(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_biguintn_eq(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnBiguintnEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_eq(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_biguintn_eq(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnBiguintnEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_eq(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_uintn_ne(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnUintnNe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ne(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_uintn_ne(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnUintnNe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ne(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_biguintn_ne(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnBiguintnNe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ne(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_biguintn_ne(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnBiguintnNe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ne(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_uintn_lt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnUintnLt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_lt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_uintn_lt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnUintnLt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_lt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_biguintn_lt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnBiguintnLt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_lt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_biguintn_lt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnBiguintnLt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_lt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_uintn_le(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnUintnLe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_le(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_uintn_le(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnUintnLe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_le(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_biguintn_le(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnBiguintnLe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_le(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_biguintn_le(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnBiguintnLe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_le(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_uintn_gt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnUintnGt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_gt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_uintn_gt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnUintnGt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_gt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_biguintn_gt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnBiguintnGt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_gt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_biguintn_gt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnBiguintnGt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_gt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_uintn_ge(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnUintnGe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ge(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_uintn_ge(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnUintnGe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ge(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_biguintn_ge(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnBiguintnGe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ge(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_biguintn_ge(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnBiguintnGe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ge(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_init(byte[])uint32 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnInit(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_init(byte[])uint32'] | undefined]> + + /** + * Calls the verify_biguintn_init(byte[])uint256 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnInit(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_init(byte[])uint256'] | undefined]> + + /** + * Calls the verify_uintn_from_bytes(byte[])uint32 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_from_bytes(byte[])uint32'] | undefined]> + + /** + * Calls the verify_biguintn_from_bytes(byte[])uint256 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_from_bytes(byte[])uint256'] | undefined]> + + /** + * Calls the verify_uintn_from_log(byte[])uint32 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_from_log(byte[])uint32'] | undefined]> + + /** + * Calls the verify_biguintn_from_log(byte[])uint256 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_from_log(byte[])uint256'] | undefined]> + + /** + * Calls the verify_biguintn_as_uint64(byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnAsUint64(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_as_uint64(byte[])uint64'] | undefined]> + + /** + * Calls the verify_biguintn_as_biguint(byte[])uint512 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnAsBiguint(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_as_biguint(byte[])uint512'] | undefined]> + + /** + * Calls the verify_uintn64_as_uint64(byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintn64AsUint64(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn64_as_uint64(byte[])uint64'] | undefined]> + + /** + * Calls the verify_uintn64_as_biguint(byte[])uint512 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintn64AsBiguint(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn64_as_biguint(byte[])uint512'] | undefined]> + + /** + * Calls the verify_ufixednxm_bytes(ufixed32x8)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUfixednxmBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_ufixednxm_bytes(ufixed32x8)byte[]'] | undefined]> + + /** + * Calls the verify_bigufixednxm_bytes(ufixed256x16)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBigufixednxmBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_bytes(ufixed256x16)byte[]'] | undefined]> + + /** + * Calls the verify_ufixednxm_from_bytes(byte[])ufixed32x8 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUfixednxmFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_bytes(byte[])ufixed32x8'] | undefined]> + + /** + * Calls the verify_bigufixednxm_from_bytes(byte[])ufixed256x16 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBigufixednxmFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'] | undefined]> + + /** + * Calls the verify_ufixednxm_from_log(byte[])ufixed32x8 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUfixednxmFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_log(byte[])ufixed32x8'] | undefined]> + + /** + * Calls the verify_bigufixednxm_from_log(byte[])ufixed256x16 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBigufixednxmFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_log(byte[])ufixed256x16'] | undefined]> + + /** + * Calls the verify_string_init(string)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringInit(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_init(string)string'] | undefined]> + + /** + * Calls the verify_string_add(string,string)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringAdd(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_add(string,string)string'] | undefined]> + + /** + * Calls the verify_string_eq(string,string)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_eq(string,string)bool'] | undefined]> + + /** + * Calls the verify_string_bytes(string)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_bytes(string)byte[]'] | undefined]> + + /** + * Calls the verify_string_from_bytes(byte[])string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_from_bytes(byte[])string'] | undefined]> + + /** + * Calls the verify_string_from_log(byte[])string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_from_log(byte[])string'] | undefined]> + + /** + * Calls the verify_bool_bytes(bool)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBoolBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bool_bytes(bool)byte[]'] | undefined]> + + /** + * Calls the verify_bool_from_bytes(byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBoolFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bool_from_bytes(byte[])bool'] | undefined]> + + /** + * Calls the verify_bool_from_log(byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBoolFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bool_from_log(byte[])bool'] | undefined]> + + /** + * Calls the verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEmit(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the Arc4PrimitiveOpsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): Arc4PrimitiveOpsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type Arc4PrimitiveOpsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/BoxContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/BoxContract.ts new file mode 100644 index 0000000..146a2d5 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/BoxContract.ts @@ -0,0 +1,2352 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"BoxContract","structs":{"InnerStruct":[{"name":"c","type":"uint64"},{"name":"arrArr","type":"uint64[][]"},{"name":"d","type":"uint64"}],"LargeStruct":[{"name":"a","type":"byte[1024]"},{"name":"b","type":"byte[1024]"},{"name":"c","type":"byte[1024]"},{"name":"d","type":"byte[1024]"},{"name":"e","type":"uint64"},{"name":"f","type":"byte[1024]"},{"name":"g","type":"byte[1024]"},{"name":"h","type":"uint64"}],"NestedStruct":[{"name":"a","type":"uint64"},{"name":"inner","type":"InnerStruct"},{"name":"woah","type":"(uint64,uint64[][],uint64)[]"},{"name":"b","type":"uint64"}]},"methods":[{"name":"store_enums","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"read_enums","args":[],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_boxes","args":[{"type":"uint64","name":"a"},{"type":"byte[]","name":"b"},{"type":"string","name":"c"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"boxes_exist","args":[],"returns":{"type":"(bool,bool,bool,bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"check_keys","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"read_boxes","args":[],"returns":{"type":"(uint64,byte[],string,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"indirect_extract_and_replace","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"delete_boxes","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"slice_box","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"arc4_box","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"create_many_ints","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_many_ints","args":[{"type":"uint64","name":"index"},{"type":"uint64","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"sum_many_ints","args":[],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_box_ref","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_nested_struct","args":[{"type":"(uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64)","struct":"NestedStruct","name":"struct"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"nested_write","args":[{"type":"uint64","name":"index"},{"type":"uint64","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"nested_read","args":[{"type":"uint64","name":"i1"},{"type":"uint64","name":"i2"},{"type":"uint64","name":"i3"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"create_bools","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_bool","args":[{"type":"uint64","name":"index"},{"type":"bool","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"sum_bools","args":[{"type":"uint64","name":"stop_at_total"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_test","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_set","args":[{"type":"uint64","name":"key"},{"type":"string","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_get","args":[{"type":"uint64","name":"key"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_del","args":[{"type":"uint64","name":"key"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_exists","args":[{"type":"uint64","name":"key"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{"oca":{"keyType":"AVMString","valueType":"uint64","key":"b2Nh"},"txn":{"keyType":"AVMString","valueType":"uint64","key":"dHhu"},"box_a":{"keyType":"AVMString","valueType":"uint64","key":"Ym94X2E="},"box_b":{"keyType":"AVMString","valueType":"byte[]","key":"Yg=="},"box_c":{"keyType":"AVMBytes","valueType":"string","key":"Qk9YX0M="},"box_d":{"keyType":"AVMString","valueType":"AVMBytes","key":"Ym94X2Q="},"many_ints":{"keyType":"AVMString","valueType":"uint64[513]","key":"bWFueV9pbnRz"},"box_ref":{"keyType":"AVMString","valueType":"AVMBytes","key":"Ym94X3JlZg=="},"box_large":{"keyType":"AVMString","valueType":"LargeStruct","key":"Ym94X2xhcmdl"},"too_many_bools":{"keyType":"AVMString","valueType":"bool[33000]","key":"dG9vX21hbnlfYm9vbHM="}}},"maps":{"global":{},"local":{},"box":{"box_map":{"keyType":"uint64","valueType":"AVMString","prefix":""}}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[842],"errorMessage":"check Box exists"},{"pc":[486],"errorMessage":"check self.box_a exists"},{"pc":[851],"errorMessage":"check self.box_b exists"},{"pc":[514,857],"errorMessage":"check self.box_c exists"},{"pc":[1932],"errorMessage":"check self.box_map entry exists"},{"pc":[1178],"errorMessage":"check self.many_ints exists"},{"pc":[378],"errorMessage":"check self.oca exists"},{"pc":[1795],"errorMessage":"check self.too_many_bools exists"},{"pc":[390],"errorMessage":"check self.txn exists"},{"pc":[1773],"errorMessage":"index access is out of bounds"},{"pc":[1398,1425,1492,1517,1539,1587,1614,1660,1685,1710],"errorMessage":"index out of bounds"},{"pc":[1228],"errorMessage":"no data"},{"pc":[1329],"errorMessage":"struct.a is truthy"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDIgMCA4IDQwOTYgNDA5OCA0MTM4CiAgICBieXRlY2Jsb2NrICJib3giIDB4NDI0ZjU4NWY0MyAiYmxvYiIgImJveF9sYXJnZSIgMHgxNTFmN2M3NSAiYm94X2EiICJib3hfZCIgImIiICJ0b29fbWFueV9ib29scyIgIm1hbnlfaW50cyIgIjAiIDB4MDAwMjM0MzIgMHg2ODY1NmM2YzZmIDB4NmY2MzYxIDB4NzQ3ODZlIDB4MDY4MTAxICJib3hfcmVmIiAiZGVmYXVsdCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo1OQogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDM0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhmMjZjNmQ0MiAweGVmMTg2Y2Y3IDB4N2QzNzI5NmUgMHhmMTNkZDkzNyAweDMzMzI1ZDNkIDB4YTYxNzQ4MTIgMHhmYWJjYjg4NSAweGQ1NjZjNjMyIDB4MDRlZjQ5NzEgMHgyM2VjYjMyYyAweDAxOTk0MDhkIDB4NzcyMDU5Y2EgMHgwMTI2M2RmNiAweGVlZjc1ODE2IDB4OTk2NDk3YWUgMHg2Y2VjNzJmZiAweDZmOWQxMDc1IDB4NTllZjM3NjAgMHhhYTY2NmI5NiAweGRmYmRkNjM2IDB4YjUzMjkxM2EgMHhjMjlmMTY2OSAweDljODg4YzA5IDB4ZTZmNjg1MDYgMHg4ZWUyYzM2NCAvLyBtZXRob2QgInN0b3JlX2VudW1zKCl2b2lkIiwgbWV0aG9kICJyZWFkX2VudW1zKCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInNldF9ib3hlcyh1aW50NjQsYnl0ZVtdLHN0cmluZyl2b2lkIiwgbWV0aG9kICJib3hlc19leGlzdCgpKGJvb2wsYm9vbCxib29sLGJvb2wpIiwgbWV0aG9kICJjaGVja19rZXlzKCl2b2lkIiwgbWV0aG9kICJyZWFkX2JveGVzKCkodWludDY0LGJ5dGVbXSxzdHJpbmcsdWludDY0KSIsIG1ldGhvZCAiaW5kaXJlY3RfZXh0cmFjdF9hbmRfcmVwbGFjZSgpdm9pZCIsIG1ldGhvZCAiZGVsZXRlX2JveGVzKCl2b2lkIiwgbWV0aG9kICJzbGljZV9ib3goKXZvaWQiLCBtZXRob2QgImFyYzRfYm94KCl2b2lkIiwgbWV0aG9kICJjcmVhdGVfbWFueV9pbnRzKCl2b2lkIiwgbWV0aG9kICJzZXRfbWFueV9pbnRzKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAic3VtX21hbnlfaW50cygpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2JveF9yZWYoKXZvaWQiLCBtZXRob2QgInNldF9uZXN0ZWRfc3RydWN0KCh1aW50NjQsKHVpbnQ2NCx1aW50NjRbXVtdLHVpbnQ2NCksKHVpbnQ2NCx1aW50NjRbXVtdLHVpbnQ2NClbXSx1aW50NjQpKXZvaWQiLCBtZXRob2QgIm5lc3RlZF93cml0ZSh1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgIm5lc3RlZF9yZWFkKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiY3JlYXRlX2Jvb2xzKCl2b2lkIiwgbWV0aG9kICJzZXRfYm9vbCh1aW50NjQsYm9vbCl2b2lkIiwgbWV0aG9kICJzdW1fYm9vbHModWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiYm94X21hcF90ZXN0KCl2b2lkIiwgbWV0aG9kICJib3hfbWFwX3NldCh1aW50NjQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImJveF9tYXBfZ2V0KHVpbnQ2NClzdHJpbmciLCBtZXRob2QgImJveF9tYXBfZGVsKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJib3hfbWFwX2V4aXN0cyh1aW50NjQpYm9vbCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHN0b3JlX2VudW1zIHJlYWRfZW51bXMgc2V0X2JveGVzIGJveGVzX2V4aXN0IG1haW5fY2hlY2tfa2V5c19yb3V0ZUAxMCByZWFkX2JveGVzIGluZGlyZWN0X2V4dHJhY3RfYW5kX3JlcGxhY2UgZGVsZXRlX2JveGVzIHNsaWNlX2JveCBtYWluX2FyYzRfYm94X3JvdXRlQDE1IG1haW5fY3JlYXRlX21hbnlfaW50c19yb3V0ZUAxNiBzZXRfbWFueV9pbnRzIHN1bV9tYW55X2ludHMgdGVzdF9ib3hfcmVmIHNldF9uZXN0ZWRfc3RydWN0IG5lc3RlZF93cml0ZSBuZXN0ZWRfcmVhZCBtYWluX2NyZWF0ZV9ib29sc19yb3V0ZUAyMyBzZXRfYm9vbCBzdW1fYm9vbHMgYm94X21hcF90ZXN0IGJveF9tYXBfc2V0IGJveF9tYXBfZ2V0IGJveF9tYXBfZGVsIGJveF9tYXBfZXhpc3RzCiAgICBlcnIKCm1haW5fY3JlYXRlX2Jvb2xzX3JvdXRlQDIzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI4MQogICAgLy8gc2VsZi50b29fbWFueV9ib29scy5jcmVhdGUoKQogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICBwdXNoaW50IDQxMjUKICAgIGJveF9jcmVhdGUKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NyZWF0ZV9tYW55X2ludHNfcm91dGVAMTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTgxCiAgICAvLyBzZWxmLm1hbnlfaW50cy5jcmVhdGUoKQogICAgYnl0ZWMgOSAvLyAibWFueV9pbnRzIgogICAgcHVzaGludCA0MTA0CiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzRfYm94X3JvdXRlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE3MS0xNzIKICAgIC8vIGJveF9kID0gQm94KFN0YXRpY0ludHMsIGtleT1CeXRlcyhiImQiKSkKICAgIC8vIGJveF9kLnZhbHVlID0gU3RhdGljSW50cyhhcmM0LlVJbnQ4KDApLCBhcmM0LlVJbnQ4KDEpLCBhcmM0LlVJbnQ4KDIpLCBhcmM0LlVJbnQ4KDMpKQogICAgcHVzaGJ5dGVzcyAweDY0IDB4MDAwMTAyMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNzIKICAgIC8vIGJveF9kLnZhbHVlID0gU3RhdGljSW50cyhhcmM0LlVJbnQ4KDApLCBhcmM0LlVJbnQ4KDEpLCBhcmM0LlVJbnQ4KDIpLCBhcmM0LlVJbnQ4KDMpKQogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoZWNrX2tleXNfcm91dGVAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMzQ6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdG9yZV9lbnVtc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnN0b3JlX2VudW1zOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBzZWxmLm9jYS52YWx1ZSA9IE9uQ29tcGxldGVBY3Rpb24uT3B0SW4KICAgIGludGNfMCAvLyBPcHRJbgogICAgaXRvYgogICAgYnl0ZWMgMTMgLy8gIm9jYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3NgogICAgLy8gc2VsZi50eG4udmFsdWUgPSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXRvYgogICAgYnl0ZWMgMTQgLy8gInR4biIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QucmVhZF9lbnVtc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlYWRfZW51bXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODAKICAgIC8vIGFzc2VydCBvcC5Cb3guZ2V0KGIib2NhIilbMF0gPT0gb3AuaXRvYihzZWxmLm9jYS52YWx1ZSkKICAgIGJ5dGVjIDEzIC8vIDB4NmY2MzYxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vY2EgZXhpc3RzCiAgICBkdXAKICAgIGJ0b2kKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODEKICAgIC8vIGFzc2VydCBvcC5Cb3guZ2V0KGIidHhuIilbMF0gPT0gb3AuaXRvYihzZWxmLnR4bi52YWx1ZSkKICAgIGJ5dGVjIDE0IC8vIDB4NzQ3ODZlCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50eG4gZXhpc3RzCiAgICBkdXAKICAgIGJ0b2kKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODMKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKChhcmM0LlVJbnQ2NChzZWxmLm9jYS52YWx1ZSksIGFyYzQuVUludDY0KHNlbGYudHhuLnZhbHVlKSkpCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3Quc2V0X2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2JveGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4NwogICAgLy8gc2VsZi5ib3hfYS52YWx1ZSA9IGEKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgYnl0ZWMgNSAvLyAiYm94X2EiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODgKICAgIC8vIHNlbGYuYm94X2IudmFsdWUgPSBiLmNvcHkoKQogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODkKICAgIC8vIHNlbGYuYm94X2MudmFsdWUgPSBjCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5MAogICAgLy8gc2VsZi5ib3hfZC52YWx1ZSA9IGIubmF0aXZlCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyA2IC8vICJib3hfZCIKICAgIGRpZyAxCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6OTEKICAgIC8vIHNlbGYuYm94X2xhcmdlLmNyZWF0ZSgpCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBwdXNoaW50IDYxNjAKICAgIGJveF9jcmVhdGUKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjkyCiAgICAvLyBzZWxmLmJveF9sYXJnZS52YWx1ZS5lID0gVUludDY0KDQyKQogICAgcHVzaGludCA0MgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgaW50YyA0IC8vIDQwOTYKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5MwogICAgLy8gc2VsZi5ib3hfbGFyZ2UucmVwbGFjZShzaXplX29mKEJ5dGVzMTAyNCkgKiA0LCBhcmM0LlVJbnQ2NCg0MikuYnl0ZXMpCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBpbnRjIDQgLy8gNDA5NgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAyYQogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5OAogICAgLy8gc2VsZi5ib3hfYS52YWx1ZSArPSAzCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9hIGV4aXN0cwogICAgYnRvaQogICAgcHVzaGludCAzCiAgICArCiAgICBpdG9iCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMDAtMTAxCiAgICAvLyAjIHRlc3QgLmxlbmd0aAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2EubGVuZ3RoID09IDgKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2IubGVuZ3RoID09IGIuYnl0ZXMubGVuZ3RoCiAgICBieXRlYyA3IC8vICJiIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkaWcgMwogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTAzCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy5sZW5ndGggPT0gYy5ieXRlcy5sZW5ndGgKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYyBleGlzdHMKICAgIGRpZyAyCiAgICBsZW4KICAgIGR1cDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMDQKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLmxlbmd0aCA9PSBiLm5hdGl2ZS5sZW5ndGgKICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkaWcgMwogICAgbGVuCiAgICBkdXAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTA2LTEwNwogICAgLy8gIyB0ZXN0IC52YWx1ZS5ieXRlcwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbMF0gPT0gYy5ieXRlc1swXQogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGludGNfMiAvLyAwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyA2CiAgICBleHRyYWN0IDAgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwOAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbLTFdID09IGMuYnl0ZXNbLTFdCiAgICBkaWcgMwogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZGlnIDcKICAgIHN3YXAKICAgIGludGNfMCAvLyAxCiAgICBleHRyYWN0MwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbOi0xXSA9PSBjLmJ5dGVzWzotMV0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgNAogICAgPAogICAgZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDEKICAgIGRpZyA0CiAgICA+PQogICAgaW50Y18wIC8vIDEKICAgIGRpZyA1CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHN3YXAKICAgIC0KICAgIGRpZyA3CiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTEwCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy52YWx1ZS5ieXRlc1s6Ml0gPT0gYy5ieXRlc1s6Ml0KICAgIGludGNfMSAvLyAyCiAgICBkaWcgNAogICAgPAogICAgdW5jb3ZlciA0CiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18xIC8vIDIKICAgIGRpZyA0CiAgICA+PQogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgNQogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExMi0xMTMKICAgIC8vICMgdGVzdCAudmFsdWUgd2l0aCBCeXRlcyB0eXBlCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVswXSA9PSBiLm5hdGl2ZVswXQogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICB1bmNvdmVyIDQKICAgIGV4dHJhY3QgMiAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTE0CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVstMV0gPT0gYi5uYXRpdmVbLTFdCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgc3dhcAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGRpZyA0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgZXh0cmFjdDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMTUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWzotMV0gPT0gYi5uYXRpdmVbOi0xXQogICAgaW50Y18wIC8vIDEKICAgIGRpZyAyCiAgICA8CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMgogICAgc3dhcAogICAgLQogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDEKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18wIC8vIDEKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDIKICAgIHN3YXAKICAgIC0KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVs6NV0gPT0gYi5uYXRpdmVbOjVdCiAgICBwdXNoaW50IDUKICAgIGRpZyAyCiAgICA8CiAgICBkaWcgMgogICAgcHVzaGludCA1CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgcHVzaGludCA1CiAgICBkaWcgMgogICAgPj0KICAgIHB1c2hpbnQgNQogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgNAogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExNwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2QudmFsdWVbOiBVSW50NjQoMildID09IGIubmF0aXZlWzogVUludDY0KDIpXQogICAgaW50Y18xIC8vIDIKICAgIGRpZyAyCiAgICA8CiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18xIC8vIDIKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExOQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2xhcmdlLmxlbmd0aCA9PSBzaXplX29mKExhcmdlU3RydWN0KQogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgYm94X2xlbgogICAgcG9wCiAgICBwdXNoaW50IDYxNjAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmJveGVzX2V4aXN0W3JvdXRpbmddKCkgLT4gdm9pZDoKYm94ZXNfZXhpc3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTIzCiAgICAvLyByZXR1cm4gYm9vbChzZWxmLmJveF9hKSwgYm9vbChzZWxmLmJveF9iKSwgYm9vbChzZWxmLmJveF9jKSwgYm9vbChzZWxmLmJveF9sYXJnZSkKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieXRlYyA3IC8vICJiIgogICAgYm94X2xlbgogICAgY292ZXIgMgogICAgcG9wCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2xlbgogICAgY292ZXIgMwogICAgcG9wCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBib3hfbGVuCiAgICBjb3ZlciA0CiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMwogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QucmVhZF9ib3hlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlYWRfYm94ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM1CiAgICAvLyBnZXRfYm94X3ZhbHVlX3BsdXNfMShzZWxmLmJveF9hKSAtIDEsCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozNDUKICAgIC8vIHJldHVybiBib3gudmFsdWUgKyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMzUKICAgIC8vIGdldF9ib3hfdmFsdWVfcGx1c18xKHNlbGYuYm94X2EpIC0gMSwKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM2CiAgICAvLyBzZWxmLmJveF9iLnZhbHVlLm5hdGl2ZSwKICAgIGJ5dGVjIDcgLy8gImIiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYiBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM3CiAgICAvLyBzZWxmLmJveF9jLnZhbHVlLAogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9jIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEzOAogICAgLy8gc2VsZi5ib3hfbGFyZ2UudmFsdWUuZSwKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIGludGMgNCAvLyA0MDk2CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMTQKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCAyMAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmluZGlyZWN0X2V4dHJhY3RfYW5kX3JlcGxhY2Vbcm91dGluZ10oKSAtPiB2b2lkOgppbmRpcmVjdF9leHRyYWN0X2FuZF9yZXBsYWNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0MwogICAgLy8gbGFyZ2UgPSBzZWxmLmJveF9sYXJnZS52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyBsYXJnZSA9IHNlbGYuYm94X2xhcmdlLnZhbHVlLmNvcHkoKQogICAgLy8gbGFyZ2UuZSArPSAxCiAgICBpbnRjIDQgLy8gNDA5NgogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTQ0CiAgICAvLyBsYXJnZS5lICs9IDEKICAgIGJ0b2kKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTQ1CiAgICAvLyBzZWxmLmJveF9sYXJnZS52YWx1ZSA9IGxhcmdlLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0My0xNDUKICAgIC8vIGxhcmdlID0gc2VsZi5ib3hfbGFyZ2UudmFsdWUuY29weSgpCiAgICAvLyBsYXJnZS5lICs9IDEKICAgIC8vIHNlbGYuYm94X2xhcmdlLnZhbHVlID0gbGFyZ2UuY29weSgpCiAgICBpbnRjIDQgLy8gNDA5NgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuZGVsZXRlX2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZGVsZXRlX2JveGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0OQogICAgLy8gZGVsIHNlbGYuYm94X2EudmFsdWUKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTUwCiAgICAvLyBkZWwgc2VsZi5ib3hfYi52YWx1ZQogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE1MQogICAgLy8gZGVsIHNlbGYuYm94X2MudmFsdWUKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTIKICAgIC8vIGFzc2VydCBzZWxmLmJveF9hLmdldChkZWZhdWx0PVVJbnQ2NCg0MikpID09IDQyCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIHB1c2hpbnQgNDIKICAgIGRpZyAxCiAgICBkaWcgMwogICAgc2VsZWN0CiAgICBwdXNoaW50IDQyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTUzCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYi5nZXQoZGVmYXVsdD1hcmM0LkR5bmFtaWNCeXRlcyhiIjQyIikpLm5hdGl2ZSA9PSBiIjQyIgogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9nZXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMjM0MzIKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAweDM0MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTQKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLmdldChkZWZhdWx0PWFyYzQuU3RyaW5nKCI0MiIpKSA9PSAiNDIiCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2dldAogICAgYnl0ZWMgMTEgLy8gMHgwMDAyMzQzMgogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlYyAxMSAvLyAweDAwMDIzNDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTU2CiAgICAvLyBhc3NlcnQgbm90IGFfZXhpc3RzCiAgICBzd2FwCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTcKICAgIC8vIGFzc2VydCBhID09IDAKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE1OAogICAgLy8gZGVsIHNlbGYuYm94X2xhcmdlLnZhbHVlCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zbGljZV9ib3hbcm91dGluZ10oKSAtPiB2b2lkOgpzbGljZV9ib3g6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYyCiAgICAvLyBib3hfMCA9IEJveChCeXRlcywga2V5PVN0cmluZygiMCIpKQogICAgYnl0ZWMgMTAgLy8gIjAiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYzCiAgICAvLyBib3hfMC52YWx1ZSA9IEJ5dGVzKGIiVGVzdGluZyB0ZXN0aW5nIDEyMyIpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjIKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyAxMCAvLyAiMCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjMKICAgIC8vIGJveF8wLnZhbHVlID0gQnl0ZXMoYiJUZXN0aW5nIHRlc3RpbmcgMTIzIikKICAgIHB1c2hieXRlcyAweDU0NjU3Mzc0Njk2ZTY3MjA3NDY1NzM3NDY5NmU2NzIwMzEzMjMzCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYyCiAgICAvLyBib3hfMCA9IEJveChCeXRlcywga2V5PVN0cmluZygiMCIpKQogICAgYnl0ZWMgMTAgLy8gIjAiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTY0CiAgICAvLyBhc3NlcnQgYm94XzAudmFsdWVbMDo3XSA9PSBiIlRlc3RpbmciCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGR1cAogICAgaW50Y18yIC8vIDAKICAgIGRpZyAyCiAgICBzZWxlY3QKICAgIHB1c2hpbnQgNwogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDEKICAgIC0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjIKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyAxMCAvLyAiMCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjQKICAgIC8vIGFzc2VydCBib3hfMC52YWx1ZVswOjddID09IGIiVGVzdGluZyIKICAgIGNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBwdXNoYnl0ZXMgMHg1NDY1NzM3NDY5NmU2NwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2NgogICAgLy8gc2VsZi5ib3hfYy52YWx1ZSA9IGFyYzQuU3RyaW5nKCJIZWxsbyIpCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgcHVzaGJ5dGVzIDB4MDAwNTQ4NjU2YzZjNmYKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjcKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLnZhbHVlLmJ5dGVzWzI6MTBdID09IGIiSGVsbG8iCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzEgLy8gMgogICAgZGlnIDEKICAgIDwKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHB1c2hpbnQgMTAKICAgIGRpZyAyCiAgICA8CiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgMTAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMQogICAgLQogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBwdXNoYnl0ZXMgMHg0ODY1NmM2YzZmCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3Quc2V0X21hbnlfaW50c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9tYW55X2ludHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE4NQogICAgLy8gc2VsZi5tYW55X2ludHMudmFsdWVbaW5kZXhdID0gdmFsdWUKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBieXRlYyA5IC8vICJtYW55X2ludHMiCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdW1fbWFueV9pbnRzW3JvdXRpbmddKCkgLT4gdm9pZDoKc3VtX21hbnlfaW50czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCgpzdW1fbWFueV9pbnRzX3doaWxlX3RvcEA3OgogICAgcHVzaGludCAxMDUxMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogc3VtX21hbnlfaW50c19hZnRlcl93aGlsZUAxMgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDE1IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMTUgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGludGNfMiAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgc3VtX21hbnlfaW50c193aGlsZV90b3BANwoKc3VtX21hbnlfaW50c19hZnRlcl93aGlsZUAxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTAKICAgIC8vIHRvdGFsID0gVUludDY0KDApCiAgICBpbnRjXzIgLy8gMAogICAgYnVyeSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTkxCiAgICAvLyBmb3IgdmFsIGluIHNlbGYubWFueV9pbnRzLnZhbHVlOgogICAgYnl0ZWMgOSAvLyAibWFueV9pbnRzIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYW55X2ludHMgZXhpc3RzCiAgICBpbnRjXzIgLy8gMAogICAgYnVyeSAyCgpzdW1fbWFueV9pbnRzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTEKICAgIC8vIGZvciB2YWwgaW4gc2VsZi5tYW55X2ludHMudmFsdWU6CiAgICBkaWcgMQogICAgcHVzaGludCA1MTMKICAgIDwKICAgIGJ6IHN1bV9tYW55X2ludHNfYWZ0ZXJfZm9yQDUKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBieXRlYyA5IC8vICJtYW55X2ludHMiCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTIKICAgIC8vIHRvdGFsID0gdG90YWwgKyB2YWwKICAgIGRpZyAyCiAgICArCiAgICBidXJ5IDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDIKICAgIGIgc3VtX21hbnlfaW50c19mb3JfaGVhZGVyQDIKCnN1bV9tYW55X2ludHNfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnRlc3RfYm94X3JlZltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYm94X3JlZjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTctMTk4CiAgICAvLyAjIGluaXQgcmVmLCB3aXRoIHZhbGlkIGtleSB0eXBlcwogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PSJibG9iIikKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTk5CiAgICAvLyBhc3NlcnQgbm90IGJveF9yZWYsICJubyBkYXRhIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gbm8gZGF0YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDctMjA4CiAgICAvLyAjIGNyZWF0ZQogICAgLy8gYXNzZXJ0IGJveF9yZWYuY3JlYXRlKHNpemU9VUludDY0KDMyKSkKICAgIHB1c2hpbnQgMzIKICAgIGJveF9jcmVhdGUKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxMS0yMTIKICAgIC8vICMgbWFuaXB1bGF0ZSBkYXRhCiAgICAvLyBzZW5kZXJfYnl0ZXMgPSBUeG4uc2VuZGVyLmJ5dGVzCiAgICB0eG4gU2VuZGVyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjEzCiAgICAvLyBhcHBfYWRkcmVzcyA9IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MuYnl0ZXMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxNQogICAgLy8gYm94X3JlZi5yZXBsYWNlKDAsIHNlbmRlcl9ieXRlcykKICAgIGludGNfMiAvLyAwCiAgICBkaWcgMwogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE2CiAgICAvLyBib3hfcmVmLnJlc2l6ZSg4MDAwKQogICAgcHVzaGludCA4MDAwCiAgICBib3hfcmVzaXplCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxNwogICAgLy8gYm94X3JlZi5zcGxpY2UoMCwgMCwgYXBwX2FkZHJlc3MpCiAgICBpbnRjXzIgLy8gMAogICAgZHVwCiAgICBkaWcgMwogICAgYm94X3NwbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTgKICAgIC8vIGJveF9yZWYucmVwbGFjZSg2NCwgdmFsdWVfMykKICAgIHB1c2hpbnQgNjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTQKICAgIC8vIHZhbHVlXzMgPSBCeXRlcyhiImhlbGxvIikKICAgIGJ5dGVjIDEyIC8vIDB4Njg2NTZjNmM2ZgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxOAogICAgLy8gYm94X3JlZi5yZXBsYWNlKDY0LCB2YWx1ZV8zKQogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE5CiAgICAvLyBwcmVmaXggPSBib3hfcmVmLmV4dHJhY3QoMCwgMzIgKiAyICsgdmFsdWVfMy5sZW5ndGgpCiAgICBpbnRjXzIgLy8gMAogICAgcHVzaGludCA2OQogICAgYm94X2V4dHJhY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMjAKICAgIC8vIGFzc2VydCBwcmVmaXggPT0gYXBwX2FkZHJlc3MgKyBzZW5kZXJfYnl0ZXMgKyB2YWx1ZV8zCiAgICBkaWcgMQogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxNAogICAgLy8gdmFsdWVfMyA9IEJ5dGVzKGIiaGVsbG8iKQogICAgYnl0ZWMgMTIgLy8gMHg2ODY1NmM2YzZmCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjIwCiAgICAvLyBhc3NlcnQgcHJlZml4ID09IGFwcF9hZGRyZXNzICsgc2VuZGVyX2J5dGVzICsgdmFsdWVfMwogICAgY29uY2F0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyMi0yMjMKICAgIC8vICMgZGVsZXRlCiAgICAvLyBkZWwgYm94X3JlZi52YWx1ZQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyNi0yMjcKICAgIC8vICMgcXVlcnkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBib3hfcmVmLm1heWJlKCkKICAgIGJveF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMjgKICAgIC8vIGFzc2VydCBub3QgZXhpc3RzCiAgICBkdXAKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyOQogICAgLy8gYXNzZXJ0IHZhbHVlID09IGIiIgogICAgZGlnIDEKICAgIHB1c2hieXRlcyAweAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzMAogICAgLy8gYXNzZXJ0IGJveF9yZWYuZ2V0KGRlZmF1bHQ9c2VuZGVyX2J5dGVzKSA9PSBzZW5kZXJfYnl0ZXMKICAgIGRpZyAzCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjMyLTIzMwogICAgLy8gIyB1cGRhdGUKICAgIC8vIGJveF9yZWYudmFsdWUgPSBzZW5kZXJfYnl0ZXMgKyBhcHBfYWRkcmVzcwogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzMi0yMzMKICAgIC8vICMgdXBkYXRlCiAgICAvLyBib3hfcmVmLnZhbHVlID0gc2VuZGVyX2J5dGVzICsgYXBwX2FkZHJlc3MKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMzItMjMzCiAgICAvLyAjIHVwZGF0ZQogICAgLy8gYm94X3JlZi52YWx1ZSA9IHNlbmRlcl9ieXRlcyArIGFwcF9hZGRyZXNzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzNAogICAgLy8gYXNzZXJ0IGJveF9yZWYsICJCbG9iIGV4aXN0cyIKICAgIGJveF9sZW4KICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzNQogICAgLy8gYXNzZXJ0IGJveF9yZWYubGVuZ3RoID09IDY0CiAgICBwdXNoaW50IDY0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjM4LTIzOQogICAgLy8gIyBpbnN0YW5jZSBib3ggcmVmCiAgICAvLyBzZWxmLmJveF9yZWYuY3JlYXRlKHNpemU9VUludDY0KDMyKSkKICAgIGJ5dGVjIDE2IC8vICJib3hfcmVmIgogICAgcHVzaGludCAzMgogICAgYm94X2NyZWF0ZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQxCiAgICAvLyBkZWwgc2VsZi5ib3hfcmVmLnZhbHVlCiAgICBieXRlYyAxNiAvLyAiYm94X3JlZiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnNldF9uZXN0ZWRfc3RydWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X25lc3RlZF9zdHJ1Y3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0NgogICAgLy8gYXNzZXJ0IHN0cnVjdC5hLCAic3RydWN0LmEgaXMgdHJ1dGh5IgogICAgaW50Y18yIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBhc3NlcnQgLy8gc3RydWN0LmEgaXMgdHJ1dGh5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ3CiAgICAvLyBzdHJ1Y3RfYnl0ZXMgPSBUeG4uYXBwbGljYXRpb25fYXJncygxKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0OAogICAgLy8gc3RydWN0X3NpemUgPSBzdHJ1Y3RfYnl0ZXMubGVuZ3RoCiAgICBkdXAKICAgIGxlbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0OQogICAgLy8gdGFpbF9vZmZzZXQgPSBVSW50NjQoNDA5NiArIDIpCiAgICBpbnRjIDUgLy8gNDA5OAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1MC0yNTEKICAgIC8vICMgaW5pdGlhbGl6ZSBib3ggdG8gemVybwogICAgLy8gYm94LmNyZWF0ZShzaXplPXRhaWxfb2Zmc2V0ICsgc3RydWN0X3NpemUpCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ1CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTAtMjUxCiAgICAvLyAjIGluaXRpYWxpemUgYm94IHRvIHplcm8KICAgIC8vIGJveC5jcmVhdGUoc2l6ZT10YWlsX29mZnNldCArIHN0cnVjdF9zaXplKQogICAgc3dhcAogICAgYm94X2NyZWF0ZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ1CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTItMjUzCiAgICAvLyAjIHNldCBjb3JyZWN0IG9mZnNldCBmb3IgZHluYW1pYyBwb3J0aW9uCiAgICAvLyBib3gucmVwbGFjZSh0YWlsX29mZnNldCAtIDIsIGFyYzQuVUludDE2KHRhaWxfb2Zmc2V0KS5ieXRlcykKICAgIGludGMgNCAvLyA0MDk2CiAgICBwdXNoYnl0ZXMgMHgxMDAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0NQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ5CiAgICAvLyB0YWlsX29mZnNldCA9IFVJbnQ2NCg0MDk2ICsgMikKICAgIGludGMgNSAvLyA0MDk4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU0LTI1NQogICAgLy8gIyBzZXQgZHluYW1pYyBkYXRhCiAgICAvLyBib3gucmVwbGFjZSh0YWlsX29mZnNldCwgc3RydWN0X2J5dGVzKQogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QubmVzdGVkX3dyaXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKbmVzdGVkX3dyaXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYwCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmEgPSB2YWx1ZQogICAgaW50YyA1IC8vIDQwOTgKICAgIHVuY292ZXIgMwogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjEKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuYiA9IHZhbHVlICsgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYxCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmIgPSB2YWx1ZSArIDEKICAgIHB1c2hpbnQgNDExMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MgogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MgogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDIKICAgIHB1c2hpbnQgNDEzNgogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMwogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICBkaWcgMwogICAgKgogICAgaW50YyA2IC8vIDQxMzgKICAgIGRpZyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGMgNiAvLyA0MTM4CiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNQogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkaWcgNAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYzCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmlubmVyLmMgPSB2YWx1ZSArIDMKICAgIGRpZyAyCiAgICBwdXNoaW50IDMKICAgICsKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MwogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5jID0gdmFsdWUgKyAzCiAgICBwdXNoaW50IDQxMTgKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjQKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuZCA9IHZhbHVlICsgNAogICAgZGlnIDIKICAgIHB1c2hpbnQgNAogICAgKwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY0CiAgICAvLyBib3gudmFsdWUubmVzdGVkLmlubmVyLmQgPSB2YWx1ZSArIDQKICAgIHB1c2hpbnQgNDEyOAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA1CiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjUKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQud29haFtpbmRleF0uYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyA1CiAgICBwdXNoaW50IDQxMDgKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA1IC8vIDQwOTgKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyA1CiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGR1cAogICAgZGlnIDQKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgKwogICAgcHVzaGludCAxOAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDUKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZHVwCiAgICB1bmNvdmVyIDQKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgdW5jb3ZlciA0CiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgICsKICAgIHVuY292ZXIgMgogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QubmVzdGVkX3JlYWRbcm91dGluZ10oKSAtPiB2b2lkOgpuZXN0ZWRfcmVhZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzAKICAgIC8vIGEgPSBib3gudmFsdWUubmVzdGVkLmEKICAgIGludGMgNSAvLyA0MDk4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MQogICAgLy8gYiA9IGJveC52YWx1ZS5uZXN0ZWQuYgogICAgcHVzaGludCA0MTEwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBwdXNoaW50IDQxMzYKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDUKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgZGlnIDUKICAgICoKICAgIGludGMgNiAvLyA0MTM4CiAgICBkaWcgMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjcyCiAgICAvLyBhcnJfYXJyID0gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2kxXVtpMl0KICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA2IC8vIDQxMzgKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNgogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkaWcgNQogICAgaW50Y18zIC8vIDgKICAgICoKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MwogICAgLy8gYyA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYwogICAgcHVzaGludCA0MTE4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3NAogICAgLy8gZCA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuZAogICAgcHVzaGludCA0MTI4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3NQogICAgLy8gd29haF9hcnJfYXJyID0gYm94LnZhbHVlLm5lc3RlZC53b2FoW2kxXS5hcnJfYXJyW2kyXVtpM10KICAgIHB1c2hpbnQgNDEwOAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjIDUgLy8gNDA5OAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgdW5jb3ZlciAxMAogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkdXAKICAgIHVuY292ZXIgNQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICArCiAgICBwdXNoaW50IDE4CiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgOAogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciA4CiAgICAqCiAgICBkaWcgMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNwogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICB1bmNvdmVyIDYKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzcKICAgIC8vIHJldHVybiBhICsgYiArIGFycl9hcnIgKyBjICsgZCArIHdvYWhfYXJyX2FycgogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDUKICAgICsKICAgIHVuY292ZXIgNAogICAgKwogICAgdW5jb3ZlciAzCiAgICArCiAgICB1bmNvdmVyIDIKICAgICsKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnNldF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGludGNfMiAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyODUKICAgIC8vIHNlbGYudG9vX21hbnlfYm9vbHMudmFsdWVbaW5kZXhdID0gdmFsdWUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgJQogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICBkaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGJ5dGVjIDggLy8gInRvb19tYW55X2Jvb2xzIgogICAgY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdW1fYm9vbHNbcm91dGluZ10oKSAtPiB2b2lkOgpzdW1fYm9vbHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI4OQogICAgLy8gdG90YWwgPSBVSW50NjQoKQogICAgaW50Y18yIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyOTAKICAgIC8vIGZvciB2YWx1ZSBpbiBzZWxmLnRvb19tYW55X2Jvb2xzLnZhbHVlOgogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvb19tYW55X2Jvb2xzIGV4aXN0cwogICAgaW50Y18yIC8vIDAKCnN1bV9ib29sc19mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjkwCiAgICAvLyBmb3IgdmFsdWUgaW4gc2VsZi50b29fbWFueV9ib29scy52YWx1ZToKICAgIGR1cAogICAgcHVzaGludCAzMzAwMAogICAgPAogICAgYnogc3VtX2Jvb2xzX2FmdGVyX2ZvckA5CiAgICBkdXBuIDIKICAgIGludGNfMyAvLyA4CiAgICAvCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgJQogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgc3dhcAogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjkxCiAgICAvLyBpZiB2YWx1ZToKICAgIGJ6IHN1bV9ib29sc19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyOTIKICAgIC8vIHRvdGFsICs9IDEKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSAyCgpzdW1fYm9vbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI5MwogICAgLy8gaWYgdG90YWwgPT0gc3RvcF9hdF90b3RhbDoKICAgIGRpZyAxCiAgICBkaWcgMwogICAgPT0KICAgIGJueiBzdW1fYm9vbHNfYWZ0ZXJfZm9yQDkKICAgIGR1cAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBzdW1fYm9vbHNfZm9yX2hlYWRlckAyCgpzdW1fYm9vbHNfYWZ0ZXJfZm9yQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGl0b2IKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF90ZXN0W3JvdXRpbmddKCkgLT4gdm9pZDoKYm94X21hcF90ZXN0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI5OQogICAgLy8ga2V5XzAgPSBVSW50NjQoMCkKICAgIGludGNfMiAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAyCiAgICAvLyBzZWxmLmJveF9tYXBba2V5XzBdID0gdmFsdWUKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDEKICAgIC8vIHZhbHVlID0gU3RyaW5nKCJIbW1tbW0iKQogICAgcHVzaGJ5dGVzICJIbW1tbW0iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAyCiAgICAvLyBzZWxmLmJveF9tYXBba2V5XzBdID0gdmFsdWUKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9tYXBba2V5XzBdLmJ5dGVzLmxlbmd0aCA9PSB2YWx1ZS5ieXRlcy5sZW5ndGgKICAgIGJveF9sZW4KICAgIHBvcAogICAgcHVzaGludCA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAwCiAgICAvLyBrZXlfMSA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDkKICAgIC8vIGFzc2VydCBzZWxmLmJveF9tYXAuZ2V0KGtleV8xLCBkZWZhdWx0PVN0cmluZygiZGVmYXVsdCIpKSA9PSBTdHJpbmcoImRlZmF1bHQiKQogICAgaXRvYgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBieXRlYyAxNyAvLyAiZGVmYXVsdCIKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgMTcgLy8gImRlZmF1bHQiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzEwCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gc2VsZi5ib3hfbWFwLm1heWJlKGtleV8xKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMTEKICAgIC8vIGFzc2VydCBub3QgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMTcKICAgIC8vIHRtcF9ib3hfbWFwW2tleV8xXSA9IFN0cmluZygiaGVsbG8iKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGR1cAogICAgYnl0ZWMgMTIgLy8gImhlbGxvIgogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMxOQogICAgLy8gZGVsIHRtcF9ib3hfbWFwW2tleV8xXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9zZXRbcm91dGluZ10oKSAtPiB2b2lkOgpib3hfbWFwX3NldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjMKICAgIC8vIHNlbGYuYm94X21hcFtrZXldID0gdmFsdWUKICAgIHN3YXAKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9nZXRbcm91dGluZ10oKSAtPiB2b2lkOgpib3hfbWFwX2dldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyNwogICAgLy8gcmV0dXJuIHNlbGYuYm94X21hcFtrZXldCiAgICBpdG9iCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfbWFwIGVudHJ5IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX2RlbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJveF9tYXBfZGVsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzMxCiAgICAvLyBkZWwgc2VsZi5ib3hfbWFwW2tleV0KICAgIGl0b2IKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmJveF9tYXBfZXhpc3RzW3JvdXRpbmddKCkgLT4gdm9pZDoKYm94X21hcF9leGlzdHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMzUKICAgIC8vIHJldHVybiBrZXkgaW4gc2VsZi5ib3hfbWFwCiAgICBpdG9iCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAHAQIACIAggiCqICYSA2JveAVCT1hfQwRibG9iCWJveF9sYXJnZQQVH3x1BWJveF9hBWJveF9kAWIOdG9vX21hbnlfYm9vbHMJbWFueV9pbnRzATAEAAI0MgVoZWxsbwNvY2EDdHhuAwaBAQdib3hfcmVmB2RlZmF1bHQxG0EA3jEZFEQxGESCGQTybG1CBO8YbPcEfTcpbgTxPdk3BDMyXT0EphdIEgT6vLiFBNVmxjIEBO9JcQQj7LMsBAGZQI0EdyBZygQBJj32BO73WBYEmWSXrgRs7HL/BG+dEHUEWe83YASqZmuWBN+91jYEtTKROgTCnxZpBJyIjAkE5vaFBgSO4sNkNhoAjhkAKQA4AFgB2AAfAggCTgJfAqAAEwAKAx0DLwOIA+0EDwTRAAEFkwW6BgEGNAZHBl0GZgAnCIGdILlIIkMnCYGIILlIIkOCAgFkBAABAgO/IkMiQzEZFDEYFBBDIhYnDUy/gQYWJw5MvyJDJw2+REkXFkxLARJEJw6+REkXFkxLARJEUCcETFCwIkM2GgEXNhoCNhoDTwIWJwVMvycHvEgnB0sCvym8SClLAb9LAVcCACcGvEgnBksBvyuBkDC5SIEqFishBE8CuyshBIAIAAAAAAAAACq7JwW+RBeBAwgWJwVMvycFvUglEkQnB71ISwMVEkQpvURLAhVKEkQnBr1ISwMVShJEKSQiuksGVwABEkRLAyIJKUwiuksDIglLB0wiWBJEIksEDEsEIk8CTUsETAkpJE8CuiJLBA8iSwVPAk1LBEwJSwckTwJSEkQjSwQMTwQjTwJNKSRPArojSwQPI08FTwJNTwUkTwJSEkQnBiQiuk8EVwIBEkRLASIJJwZMIrpLASIJSwRMIlgSRCJLAgxLAiJPAk1LAkwJJwYkTwK6IksCDyJLA08CTUsCTAlLBCRPAlISRIEFSwIMSwKBBU8CTScGJE8CuoEFSwIPgQVLA08CTUsEJE8CUhJEI0sCDE8CI08CTScGJE8CuiNLAg8jTwNPAk1PAiRPAlISRCu9SIGQMBJEIkMnBb1FAScHvU4CSCm9TgNIK71OBEiAAQAkTwJUIk8CVCNPAlSBA08CVCcETFCwIkMnBb5EFyIIIgknB75EVwIAKb5EKyEEJboXTwMWSwMVFlcGAk8EUEyAAgAUUEsBFYEUCBZXBgJQTwIWUExQTFAnBExQsCJDKyEEJboXIggWKyEETwK7IkMnBbxIJwe8SCm8SCcFvkwXgSpLAUsDTYEqEkQnB74nC04CTVcCAIACNDISRCm+JwtOAk0nCxJETBREFEQrvEgiQycKvEgnCoATVGVzdGluZyB0ZXN0aW5nIDEyM78nCr1ISSRLAk2BB0sCDE8CgQdPAk1LAQknCk4CuoAHVGVzdGluZxJEKbxIKYAHAAVIZWxsb78pvUgjSwEMSwEjTwJNgQpLAgxPAoEKTwJNSwEJKU4CuoAFSGVsbG8SRCJDNhoBFzYaAkwlCycJTE8CuyJDgABJgY5SMgwNQQAYsYEGshCBBbIZJw+yHicPsh8ksgGzQv/fJEUBJwm9RQFEJEUCSwGBgQQMQQAXSwFJJQsnCUwluhdLAghFAiIIRQJC/+BJFicETFCwIkMqvUUBFEQqgSC5RDEAMgoqJEsDuyqBwD7TKiRJSwPSKoFAJwy7KiSBRbpLAUsDUCcMUBJEKrxIKr5JFERLAYAAEkRLA04CTUsCEkRQKrxIKky/Kr1IgUASRCcQgSC5SCcQvEgiQzYaASRbRDYaAUkVIQUIKEy5SCghBIACEAK7KCEFTwK7IkM2GgEXNhoCSRcoIQVPA7tJIggWKIGOIE8Cu0kjCBYogaggI7oXSwMNRCNLAwshBksBCChMI7oXIQYIKEsBI7oXSwUNRCMISwQlC0xLAQgoTE8Eu0sCgQMIFiiBliBPArtLAoEECBYogaAgTwK7TwKBBQgWKIGMICO6FyEFCChLASO6F0sFDUQjCElLBAgoTCO6FwiBEggoSwEjuhdLBQ1EIwhJTwQIKEwjuhcIKEsBI7oXTwQNRCMITwIIKExPArsiQzYaARc2GgIXNhoDFyghBSW6FyiBjiAluhcogaggI7oXSwUNRCNLBQshBksBCChMI7oXIQYIKEsBI7oXSwYNRCMISwUlCwgoTCW6FyiBliAluhcogaAgJboXKIGMICO6FyEFCChLASO6F08KDUQjCElPBQgoTCO6FwiBEggoSwEjuhdLCA1EIwgjTwgLSwEIKEwjuhcIKEsBI7oXSwcNRCMITwYlCwgoTCW6F08FTwUITwQITwMITwIICBYnBExQsCJDNhoBFzYaAiRTSwElCk8CJRgnCEsCIrpLASUMRExPA1QnCE4CuyJDNhoBFyQnCL1FAUQkSYHogQIMQQAoRwIlCkwlGCcITwIiukxTQQAGSwEiCEUCSwFLAxJAAAhJIghFAUL/z0sBFicETFCwIkMkFkm8SEmABkhtbW1tbb+9SIEGEkQiFkm+JxFOAk0nERJESb1FARRESbxISScMv7xIIkM2GgEXNhoCVwIATBZJvEhMvyJDNhoBFxa+REkVFlcGAkxQJwRMULAiQzYaARcWvEgiQzYaARcWvUUBgAEAJE8CVCcETFCwIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +// Type definitions for ARC-56 structs + +export type InnerStruct = { + c: bigint, + arrArr: bigint[][], + d: bigint +} + + +/** + * Converts the ABI tuple representation of a InnerStruct to the struct representation + */ +export function InnerStructFromTuple(abiTuple: [bigint, bigint[][], bigint]) { + const abiStructType = ABIStructType.fromStruct('InnerStruct', APP_SPEC.structs) + return getStructValueFromTupleValue(abiStructType, abiTuple) as InnerStruct +} + +export type LargeStruct = { + a: Uint8Array, + b: Uint8Array, + c: Uint8Array, + d: Uint8Array, + e: bigint, + f: Uint8Array, + g: Uint8Array, + h: bigint +} + + +/** + * Converts the ABI tuple representation of a LargeStruct to the struct representation + */ +export function LargeStructFromTuple(abiTuple: [Uint8Array, Uint8Array, Uint8Array, Uint8Array, bigint, Uint8Array, Uint8Array, bigint]) { + const abiStructType = ABIStructType.fromStruct('LargeStruct', APP_SPEC.structs) + return getStructValueFromTupleValue(abiStructType, abiTuple) as LargeStruct +} + +export type NestedStruct = { + a: bigint, + inner: InnerStruct, + woah: [bigint, bigint[][], bigint][], + b: bigint +} + + +/** + * Converts the ABI tuple representation of a NestedStruct to the struct representation + */ +export function NestedStructFromTuple(abiTuple: [bigint, InnerStruct, [bigint, bigint[][], bigint][], bigint]) { + const abiStructType = ABIStructType.fromStruct('NestedStruct', APP_SPEC.structs) + return getStructValueFromTupleValue(abiStructType, abiTuple) as NestedStruct +} + +/** + * The argument types for the BoxContract contract + */ +export type BoxContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'store_enums()void': Record + 'read_enums()(uint64,uint64)': Record + 'set_boxes(uint64,byte[],string)void': { + a: bigint | number + b: Uint8Array + c: string + } + 'boxes_exist()(bool,bool,bool,bool)': Record + 'check_keys()void': Record + 'read_boxes()(uint64,byte[],string,uint64)': Record + 'indirect_extract_and_replace()void': Record + 'delete_boxes()void': Record + 'slice_box()void': Record + 'arc4_box()void': Record + 'create_many_ints()void': Record + 'set_many_ints(uint64,uint64)void': { + index: bigint | number + value: bigint | number + } + 'sum_many_ints()uint64': Record + 'test_box_ref()void': Record + 'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void': { + struct: NestedStruct + } + 'nested_write(uint64,uint64)void': { + index: bigint | number + value: bigint | number + } + 'nested_read(uint64,uint64,uint64)uint64': { + i1: bigint | number + i2: bigint | number + i3: bigint | number + } + 'create_bools()void': Record + 'set_bool(uint64,bool)void': { + index: bigint | number + value: boolean + } + 'sum_bools(uint64)uint64': { + stopAtTotal: bigint | number + } + 'box_map_test()void': Record + 'box_map_set(uint64,string)void': { + key: bigint | number + value: string + } + 'box_map_get(uint64)string': { + key: bigint | number + } + 'box_map_del(uint64)void': { + key: bigint | number + } + 'box_map_exists(uint64)bool': { + key: bigint | number + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'store_enums()void': [] + 'read_enums()(uint64,uint64)': [] + 'set_boxes(uint64,byte[],string)void': [a: bigint | number, b: Uint8Array, c: string] + 'boxes_exist()(bool,bool,bool,bool)': [] + 'check_keys()void': [] + 'read_boxes()(uint64,byte[],string,uint64)': [] + 'indirect_extract_and_replace()void': [] + 'delete_boxes()void': [] + 'slice_box()void': [] + 'arc4_box()void': [] + 'create_many_ints()void': [] + 'set_many_ints(uint64,uint64)void': [index: bigint | number, value: bigint | number] + 'sum_many_ints()uint64': [] + 'test_box_ref()void': [] + 'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void': [struct: NestedStruct] + 'nested_write(uint64,uint64)void': [index: bigint | number, value: bigint | number] + 'nested_read(uint64,uint64,uint64)uint64': [i1: bigint | number, i2: bigint | number, i3: bigint | number] + 'create_bools()void': [] + 'set_bool(uint64,bool)void': [index: bigint | number, value: boolean] + 'sum_bools(uint64)uint64': [stopAtTotal: bigint | number] + 'box_map_test()void': [] + 'box_map_set(uint64,string)void': [key: bigint | number, value: string] + 'box_map_get(uint64)string': [key: bigint | number] + 'box_map_del(uint64)void': [key: bigint | number] + 'box_map_exists(uint64)bool': [key: bigint | number] + } +} + +/** + * The return type for each method + */ +export type BoxContractReturns = { + 'store_enums()void': void + 'read_enums()(uint64,uint64)': [bigint, bigint] + 'set_boxes(uint64,byte[],string)void': void + 'boxes_exist()(bool,bool,bool,bool)': [boolean, boolean, boolean, boolean] + 'check_keys()void': void + 'read_boxes()(uint64,byte[],string,uint64)': [bigint, Uint8Array, string, bigint] + 'indirect_extract_and_replace()void': void + 'delete_boxes()void': void + 'slice_box()void': void + 'arc4_box()void': void + 'create_many_ints()void': void + 'set_many_ints(uint64,uint64)void': void + 'sum_many_ints()uint64': bigint + 'test_box_ref()void': void + 'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void': void + 'nested_write(uint64,uint64)void': void + 'nested_read(uint64,uint64,uint64)uint64': bigint + 'create_bools()void': void + 'set_bool(uint64,bool)void': void + 'sum_bools(uint64)uint64': bigint + 'box_map_test()void': void + 'box_map_set(uint64,string)void': void + 'box_map_get(uint64)string': string + 'box_map_del(uint64)void': void + 'box_map_exists(uint64)bool': boolean +} + +/** + * Defines the types of available calls and state of the BoxContract smart contract. + */ +export type BoxContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'store_enums()void' | 'store_enums', { + argsObj: BoxContractArgs['obj']['store_enums()void'] + argsTuple: BoxContractArgs['tuple']['store_enums()void'] + returns: BoxContractReturns['store_enums()void'] + }> + & Record<'read_enums()(uint64,uint64)' | 'read_enums', { + argsObj: BoxContractArgs['obj']['read_enums()(uint64,uint64)'] + argsTuple: BoxContractArgs['tuple']['read_enums()(uint64,uint64)'] + returns: BoxContractReturns['read_enums()(uint64,uint64)'] + }> + & Record<'set_boxes(uint64,byte[],string)void' | 'set_boxes', { + argsObj: BoxContractArgs['obj']['set_boxes(uint64,byte[],string)void'] + argsTuple: BoxContractArgs['tuple']['set_boxes(uint64,byte[],string)void'] + returns: BoxContractReturns['set_boxes(uint64,byte[],string)void'] + }> + & Record<'boxes_exist()(bool,bool,bool,bool)' | 'boxes_exist', { + argsObj: BoxContractArgs['obj']['boxes_exist()(bool,bool,bool,bool)'] + argsTuple: BoxContractArgs['tuple']['boxes_exist()(bool,bool,bool,bool)'] + returns: BoxContractReturns['boxes_exist()(bool,bool,bool,bool)'] + }> + & Record<'check_keys()void' | 'check_keys', { + argsObj: BoxContractArgs['obj']['check_keys()void'] + argsTuple: BoxContractArgs['tuple']['check_keys()void'] + returns: BoxContractReturns['check_keys()void'] + }> + & Record<'read_boxes()(uint64,byte[],string,uint64)' | 'read_boxes', { + argsObj: BoxContractArgs['obj']['read_boxes()(uint64,byte[],string,uint64)'] + argsTuple: BoxContractArgs['tuple']['read_boxes()(uint64,byte[],string,uint64)'] + returns: BoxContractReturns['read_boxes()(uint64,byte[],string,uint64)'] + }> + & Record<'indirect_extract_and_replace()void' | 'indirect_extract_and_replace', { + argsObj: BoxContractArgs['obj']['indirect_extract_and_replace()void'] + argsTuple: BoxContractArgs['tuple']['indirect_extract_and_replace()void'] + returns: BoxContractReturns['indirect_extract_and_replace()void'] + }> + & Record<'delete_boxes()void' | 'delete_boxes', { + argsObj: BoxContractArgs['obj']['delete_boxes()void'] + argsTuple: BoxContractArgs['tuple']['delete_boxes()void'] + returns: BoxContractReturns['delete_boxes()void'] + }> + & Record<'slice_box()void' | 'slice_box', { + argsObj: BoxContractArgs['obj']['slice_box()void'] + argsTuple: BoxContractArgs['tuple']['slice_box()void'] + returns: BoxContractReturns['slice_box()void'] + }> + & Record<'arc4_box()void' | 'arc4_box', { + argsObj: BoxContractArgs['obj']['arc4_box()void'] + argsTuple: BoxContractArgs['tuple']['arc4_box()void'] + returns: BoxContractReturns['arc4_box()void'] + }> + & Record<'create_many_ints()void' | 'create_many_ints', { + argsObj: BoxContractArgs['obj']['create_many_ints()void'] + argsTuple: BoxContractArgs['tuple']['create_many_ints()void'] + returns: BoxContractReturns['create_many_ints()void'] + }> + & Record<'set_many_ints(uint64,uint64)void' | 'set_many_ints', { + argsObj: BoxContractArgs['obj']['set_many_ints(uint64,uint64)void'] + argsTuple: BoxContractArgs['tuple']['set_many_ints(uint64,uint64)void'] + returns: BoxContractReturns['set_many_ints(uint64,uint64)void'] + }> + & Record<'sum_many_ints()uint64' | 'sum_many_ints', { + argsObj: BoxContractArgs['obj']['sum_many_ints()uint64'] + argsTuple: BoxContractArgs['tuple']['sum_many_ints()uint64'] + returns: BoxContractReturns['sum_many_ints()uint64'] + }> + & Record<'test_box_ref()void' | 'test_box_ref', { + argsObj: BoxContractArgs['obj']['test_box_ref()void'] + argsTuple: BoxContractArgs['tuple']['test_box_ref()void'] + returns: BoxContractReturns['test_box_ref()void'] + }> + & Record<'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void' | 'set_nested_struct', { + argsObj: BoxContractArgs['obj']['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'] + argsTuple: BoxContractArgs['tuple']['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'] + returns: BoxContractReturns['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'] + }> + & Record<'nested_write(uint64,uint64)void' | 'nested_write', { + argsObj: BoxContractArgs['obj']['nested_write(uint64,uint64)void'] + argsTuple: BoxContractArgs['tuple']['nested_write(uint64,uint64)void'] + returns: BoxContractReturns['nested_write(uint64,uint64)void'] + }> + & Record<'nested_read(uint64,uint64,uint64)uint64' | 'nested_read', { + argsObj: BoxContractArgs['obj']['nested_read(uint64,uint64,uint64)uint64'] + argsTuple: BoxContractArgs['tuple']['nested_read(uint64,uint64,uint64)uint64'] + returns: BoxContractReturns['nested_read(uint64,uint64,uint64)uint64'] + }> + & Record<'create_bools()void' | 'create_bools', { + argsObj: BoxContractArgs['obj']['create_bools()void'] + argsTuple: BoxContractArgs['tuple']['create_bools()void'] + returns: BoxContractReturns['create_bools()void'] + }> + & Record<'set_bool(uint64,bool)void' | 'set_bool', { + argsObj: BoxContractArgs['obj']['set_bool(uint64,bool)void'] + argsTuple: BoxContractArgs['tuple']['set_bool(uint64,bool)void'] + returns: BoxContractReturns['set_bool(uint64,bool)void'] + }> + & Record<'sum_bools(uint64)uint64' | 'sum_bools', { + argsObj: BoxContractArgs['obj']['sum_bools(uint64)uint64'] + argsTuple: BoxContractArgs['tuple']['sum_bools(uint64)uint64'] + returns: BoxContractReturns['sum_bools(uint64)uint64'] + }> + & Record<'box_map_test()void' | 'box_map_test', { + argsObj: BoxContractArgs['obj']['box_map_test()void'] + argsTuple: BoxContractArgs['tuple']['box_map_test()void'] + returns: BoxContractReturns['box_map_test()void'] + }> + & Record<'box_map_set(uint64,string)void' | 'box_map_set', { + argsObj: BoxContractArgs['obj']['box_map_set(uint64,string)void'] + argsTuple: BoxContractArgs['tuple']['box_map_set(uint64,string)void'] + returns: BoxContractReturns['box_map_set(uint64,string)void'] + }> + & Record<'box_map_get(uint64)string' | 'box_map_get', { + argsObj: BoxContractArgs['obj']['box_map_get(uint64)string'] + argsTuple: BoxContractArgs['tuple']['box_map_get(uint64)string'] + returns: BoxContractReturns['box_map_get(uint64)string'] + }> + & Record<'box_map_del(uint64)void' | 'box_map_del', { + argsObj: BoxContractArgs['obj']['box_map_del(uint64)void'] + argsTuple: BoxContractArgs['tuple']['box_map_del(uint64)void'] + returns: BoxContractReturns['box_map_del(uint64)void'] + }> + & Record<'box_map_exists(uint64)bool' | 'box_map_exists', { + argsObj: BoxContractArgs['obj']['box_map_exists(uint64)bool'] + argsTuple: BoxContractArgs['tuple']['box_map_exists(uint64)bool'] + returns: BoxContractReturns['box_map_exists(uint64)bool'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + box: { + keys: { + oca: bigint + txn: bigint + boxA: bigint + boxB: Uint8Array + boxC: string + boxD: BinaryState + manyInts: [bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint] + boxRef: BinaryState + boxLarge: LargeStruct + tooManyBools: [boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean] + } + maps: { + boxMap: Map + } + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type BoxContractSignatures = keyof BoxContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type BoxContractNonVoidMethodSignatures = keyof BoxContractTypes['methods'] extends infer T ? T extends keyof BoxContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the BoxContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = BoxContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the BoxContract smart contract to the method's return type + */ +export type MethodReturn = BoxContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed box state of the application. + */ +export type BoxKeysState = BoxContractTypes['state']['box']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type BoxContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type BoxContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: BoxContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the BoxContract smart contract + */ +export abstract class BoxContractParamsFactory { + /** + * Constructs a no op call for the store_enums()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static storeEnums(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'store_enums()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the read_enums()(uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static readEnums(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'read_enums()(uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the set_boxes(uint64,byte[],string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_boxes(uint64,byte[],string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the boxes_exist()(bool,bool,bool,bool) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static boxesExist(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'boxes_exist()(bool,bool,bool,bool)' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the check_keys()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static checkKeys(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'check_keys()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the read_boxes()(uint64,byte[],string,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static readBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'read_boxes()(uint64,byte[],string,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the indirect_extract_and_replace()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static indirectExtractAndReplace(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'indirect_extract_and_replace()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the delete_boxes()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static deleteBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'delete_boxes()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the slice_box()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static sliceBox(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'slice_box()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the arc4_box()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static arc4Box(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'arc4_box()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the create_many_ints()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static createManyInts(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'create_many_ints()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the set_many_ints(uint64,uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setManyInts(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_many_ints(uint64,uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.index, params.args.value], + } + } + /** + * Constructs a no op call for the sum_many_ints()uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static sumManyInts(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'sum_many_ints()uint64' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_box_ref()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testBoxRef(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_box_ref()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setNestedStruct(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.struct], + } + } + /** + * Constructs a no op call for the nested_write(uint64,uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static nestedWrite(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'nested_write(uint64,uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.index, params.args.value], + } + } + /** + * Constructs a no op call for the nested_read(uint64,uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static nestedRead(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'nested_read(uint64,uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.i1, params.args.i2, params.args.i3], + } + } + /** + * Constructs a no op call for the create_bools()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static createBools(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'create_bools()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the set_bool(uint64,bool)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setBool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_bool(uint64,bool)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.index, params.args.value], + } + } + /** + * Constructs a no op call for the sum_bools(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static sumBools(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'sum_bools(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.stopAtTotal], + } + } + /** + * Constructs a no op call for the box_map_test()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static boxMapTest(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'box_map_test()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the box_map_set(uint64,string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static boxMapSet(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'box_map_set(uint64,string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.key, params.args.value], + } + } + /** + * Constructs a no op call for the box_map_get(uint64)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static boxMapGet(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'box_map_get(uint64)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.key], + } + } + /** + * Constructs a no op call for the box_map_del(uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static boxMapDel(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'box_map_del(uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.key], + } + } + /** + * Constructs a no op call for the box_map_exists(uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static boxMapExists(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'box_map_exists(uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.key], + } + } +} + +/** + * A factory to create and deploy one or more instance of the BoxContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class BoxContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `BoxContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new BoxContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new BoxContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the BoxContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: BoxContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new BoxContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the BoxContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the BoxContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the BoxContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new BoxContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the BoxContract smart contract + */ +export class BoxContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `BoxContractClient` + * + * @param appClient An `AppClient` instance which has been created with the BoxContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `BoxContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `BoxContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new BoxContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `BoxContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new BoxContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the BoxContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the BoxContract smart contract using the `store_enums()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + storeEnums: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.storeEnums(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `read_enums()(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + readEnums: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.readEnums(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_boxes(uint64,byte[],string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.setBoxes(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `boxes_exist()(bool,bool,bool,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + boxesExist: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.boxesExist(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `check_keys()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + checkKeys: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.checkKeys(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `read_boxes()(uint64,byte[],string,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + readBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.readBoxes(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `indirect_extract_and_replace()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + indirectExtractAndReplace: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.indirectExtractAndReplace(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `delete_boxes()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + deleteBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.deleteBoxes(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `slice_box()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + sliceBox: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.sliceBox(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `arc4_box()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + arc4Box: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.arc4Box(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `create_many_ints()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + createManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.createManyInts(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_many_ints(uint64,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.setManyInts(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `sum_many_ints()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + sumManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.sumManyInts(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `test_box_ref()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testBoxRef: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.testBoxRef(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setNestedStruct: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.setNestedStruct(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `nested_write(uint64,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + nestedWrite: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.nestedWrite(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `nested_read(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + nestedRead: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.nestedRead(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `create_bools()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + createBools: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.createBools(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_bool(uint64,bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setBool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.setBool(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `sum_bools(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + sumBools: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.sumBools(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_test()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + boxMapTest: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.boxMapTest(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_set(uint64,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + boxMapSet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.boxMapSet(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_get(uint64)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + boxMapGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.boxMapGet(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_del(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + boxMapDel: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.boxMapDel(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_exists(uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + boxMapExists: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.boxMapExists(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the BoxContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the BoxContract smart contract using the `store_enums()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + storeEnums: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.storeEnums(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `read_enums()(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + readEnums: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.readEnums(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_boxes(uint64,byte[],string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.setBoxes(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `boxes_exist()(bool,bool,bool,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + boxesExist: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.boxesExist(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `check_keys()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + checkKeys: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.checkKeys(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `read_boxes()(uint64,byte[],string,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + readBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.readBoxes(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `indirect_extract_and_replace()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + indirectExtractAndReplace: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.indirectExtractAndReplace(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `delete_boxes()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + deleteBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.deleteBoxes(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `slice_box()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + sliceBox: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.sliceBox(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `arc4_box()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + arc4Box: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.arc4Box(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `create_many_ints()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + createManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.createManyInts(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_many_ints(uint64,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.setManyInts(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `sum_many_ints()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + sumManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.sumManyInts(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `test_box_ref()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testBoxRef: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.testBoxRef(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setNestedStruct: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.setNestedStruct(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `nested_write(uint64,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + nestedWrite: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.nestedWrite(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `nested_read(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + nestedRead: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.nestedRead(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `create_bools()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + createBools: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.createBools(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_bool(uint64,bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setBool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.setBool(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `sum_bools(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + sumBools: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.sumBools(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_test()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + boxMapTest: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapTest(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_set(uint64,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + boxMapSet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapSet(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_get(uint64)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + boxMapGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapGet(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_del(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + boxMapDel: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapDel(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_exists(uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + boxMapExists: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapExists(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the BoxContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the BoxContract smart contract using the `store_enums()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + storeEnums: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.storeEnums(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['store_enums()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `read_enums()(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + readEnums: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.readEnums(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['read_enums()(uint64,uint64)'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_boxes(uint64,byte[],string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.setBoxes(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['set_boxes(uint64,byte[],string)void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `boxes_exist()(bool,bool,bool,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + boxesExist: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.boxesExist(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['boxes_exist()(bool,bool,bool,bool)'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `check_keys()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + checkKeys: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.checkKeys(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['check_keys()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `read_boxes()(uint64,byte[],string,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + readBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.readBoxes(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['read_boxes()(uint64,byte[],string,uint64)'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `indirect_extract_and_replace()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + indirectExtractAndReplace: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.indirectExtractAndReplace(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['indirect_extract_and_replace()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `delete_boxes()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + deleteBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.deleteBoxes(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['delete_boxes()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `slice_box()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + sliceBox: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.sliceBox(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['slice_box()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `arc4_box()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + arc4Box: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.arc4Box(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['arc4_box()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `create_many_ints()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + createManyInts: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.createManyInts(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['create_many_ints()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_many_ints(uint64,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setManyInts: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.setManyInts(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['set_many_ints(uint64,uint64)void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `sum_many_ints()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + sumManyInts: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.sumManyInts(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['sum_many_ints()uint64'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `test_box_ref()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testBoxRef: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.testBoxRef(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['test_box_ref()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setNestedStruct: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.setNestedStruct(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `nested_write(uint64,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + nestedWrite: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.nestedWrite(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['nested_write(uint64,uint64)void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `nested_read(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + nestedRead: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.nestedRead(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['nested_read(uint64,uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `create_bools()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + createBools: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.createBools(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['create_bools()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_bool(uint64,bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setBool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.setBool(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['set_bool(uint64,bool)void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `sum_bools(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + sumBools: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.sumBools(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['sum_bools(uint64)uint64'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_test()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + boxMapTest: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapTest(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_test()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_set(uint64,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + boxMapSet: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapSet(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_set(uint64,string)void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_get(uint64)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + boxMapGet: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapGet(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_get(uint64)string'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_del(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + boxMapDel: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapDel(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_del(uint64)void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_exists(uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + boxMapExists: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapExists(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_exists(uint64)bool'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new BoxContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current BoxContract app + */ + state = { + /** + * Methods to access box state for the current BoxContract app + */ + box: { + /** + * Get all current keyed values from box state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.box.getAll() + return { + oca: result.oca, + txn: result.txn, + boxA: result.box_a, + boxB: result.box_b, + boxC: result.box_c, + boxD: new BinaryStateValue(result.box_d), + manyInts: result.many_ints, + boxRef: new BinaryStateValue(result.box_ref), + boxLarge: result.box_large, + tooManyBools: result.too_many_bools, + } + }, + /** + * Get the current value of the oca key in box state + */ + oca: async (): Promise => { return (await this.appClient.state.box.getValue("oca")) as bigint | undefined }, + /** + * Get the current value of the txn key in box state + */ + txn: async (): Promise => { return (await this.appClient.state.box.getValue("txn")) as bigint | undefined }, + /** + * Get the current value of the box_a key in box state + */ + boxA: async (): Promise => { return (await this.appClient.state.box.getValue("box_a")) as bigint | undefined }, + /** + * Get the current value of the box_b key in box state + */ + boxB: async (): Promise => { return (await this.appClient.state.box.getValue("box_b")) as Uint8Array | undefined }, + /** + * Get the current value of the box_c key in box state + */ + boxC: async (): Promise => { return (await this.appClient.state.box.getValue("box_c")) as string | undefined }, + /** + * Get the current value of the box_d key in box state + */ + boxD: async (): Promise => { return new BinaryStateValue((await this.appClient.state.box.getValue("box_d")) as Uint8Array | undefined) }, + /** + * Get the current value of the many_ints key in box state + */ + manyInts: async (): Promise<[bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint] | undefined> => { return (await this.appClient.state.box.getValue("many_ints")) as [bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint] | undefined }, + /** + * Get the current value of the box_ref key in box state + */ + boxRef: async (): Promise => { return new BinaryStateValue((await this.appClient.state.box.getValue("box_ref")) as Uint8Array | undefined) }, + /** + * Get the current value of the box_large key in box state + */ + boxLarge: async (): Promise => { return (await this.appClient.state.box.getValue("box_large")) as LargeStruct | undefined }, + /** + * Get the current value of the too_many_bools key in box state + */ + tooManyBools: async (): Promise<[boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean] | undefined> => { return (await this.appClient.state.box.getValue("too_many_bools")) as [boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean] | undefined }, + /** + * Get values from the box_map map in box state + */ + boxMap: { + /** + * Get all current values of the box_map map in box state + */ + getMap: async (): Promise> => { return (await this.appClient.state.box.getMap("box_map")) as Map }, + /** + * Get a current value of the box_map map by key from box state + */ + value: async (key: bigint | number): Promise => { return await this.appClient.state.box.getMapValue("box_map", key) as string | undefined }, + }, + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): BoxContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a store_enums()void method call against the BoxContract contract + */ + storeEnums(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.storeEnums(params))) + return this + }, + /** + * Add a read_enums()(uint64,uint64) method call against the BoxContract contract + */ + readEnums(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.readEnums(params))) + return this + }, + /** + * Add a set_boxes(uint64,byte[],string)void method call against the BoxContract contract + */ + setBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setBoxes(params))) + return this + }, + /** + * Add a boxes_exist()(bool,bool,bool,bool) method call against the BoxContract contract + */ + boxesExist(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxesExist(params))) + return this + }, + /** + * Add a check_keys()void method call against the BoxContract contract + */ + checkKeys(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.checkKeys(params))) + return this + }, + /** + * Add a read_boxes()(uint64,byte[],string,uint64) method call against the BoxContract contract + */ + readBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.readBoxes(params))) + return this + }, + /** + * Add a indirect_extract_and_replace()void method call against the BoxContract contract + */ + indirectExtractAndReplace(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.indirectExtractAndReplace(params))) + return this + }, + /** + * Add a delete_boxes()void method call against the BoxContract contract + */ + deleteBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deleteBoxes(params))) + return this + }, + /** + * Add a slice_box()void method call against the BoxContract contract + */ + sliceBox(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sliceBox(params))) + return this + }, + /** + * Add a arc4_box()void method call against the BoxContract contract + */ + arc4Box(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.arc4Box(params))) + return this + }, + /** + * Add a create_many_ints()void method call against the BoxContract contract + */ + createManyInts(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createManyInts(params))) + return this + }, + /** + * Add a set_many_ints(uint64,uint64)void method call against the BoxContract contract + */ + setManyInts(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setManyInts(params))) + return this + }, + /** + * Add a sum_many_ints()uint64 method call against the BoxContract contract + */ + sumManyInts(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sumManyInts(params))) + return this + }, + /** + * Add a test_box_ref()void method call against the BoxContract contract + */ + testBoxRef(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBoxRef(params))) + return this + }, + /** + * Add a set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void method call against the BoxContract contract + */ + setNestedStruct(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setNestedStruct(params))) + return this + }, + /** + * Add a nested_write(uint64,uint64)void method call against the BoxContract contract + */ + nestedWrite(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.nestedWrite(params))) + return this + }, + /** + * Add a nested_read(uint64,uint64,uint64)uint64 method call against the BoxContract contract + */ + nestedRead(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.nestedRead(params))) + return this + }, + /** + * Add a create_bools()void method call against the BoxContract contract + */ + createBools(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createBools(params))) + return this + }, + /** + * Add a set_bool(uint64,bool)void method call against the BoxContract contract + */ + setBool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setBool(params))) + return this + }, + /** + * Add a sum_bools(uint64)uint64 method call against the BoxContract contract + */ + sumBools(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sumBools(params))) + return this + }, + /** + * Add a box_map_test()void method call against the BoxContract contract + */ + boxMapTest(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapTest(params))) + return this + }, + /** + * Add a box_map_set(uint64,string)void method call against the BoxContract contract + */ + boxMapSet(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapSet(params))) + return this + }, + /** + * Add a box_map_get(uint64)string method call against the BoxContract contract + */ + boxMapGet(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapGet(params))) + return this + }, + /** + * Add a box_map_del(uint64)void method call against the BoxContract contract + */ + boxMapDel(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapDel(params))) + return this + }, + /** + * Add a box_map_exists(uint64)bool method call against the BoxContract contract + */ + boxMapExists(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapExists(params))) + return this + }, + /** + * Add a clear state call to the BoxContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as BoxContractComposer + } +} +export type BoxContractComposer = { + /** + * Calls the store_enums()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + storeEnums(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['store_enums()void'] | undefined]> + + /** + * Calls the read_enums()(uint64,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + readEnums(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['read_enums()(uint64,uint64)'] | undefined]> + + /** + * Calls the set_boxes(uint64,byte[],string)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setBoxes(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['set_boxes(uint64,byte[],string)void'] | undefined]> + + /** + * Calls the boxes_exist()(bool,bool,bool,bool) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + boxesExist(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['boxes_exist()(bool,bool,bool,bool)'] | undefined]> + + /** + * Calls the check_keys()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + checkKeys(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['check_keys()void'] | undefined]> + + /** + * Calls the read_boxes()(uint64,byte[],string,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + readBoxes(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['read_boxes()(uint64,byte[],string,uint64)'] | undefined]> + + /** + * Calls the indirect_extract_and_replace()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + indirectExtractAndReplace(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['indirect_extract_and_replace()void'] | undefined]> + + /** + * Calls the delete_boxes()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + deleteBoxes(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['delete_boxes()void'] | undefined]> + + /** + * Calls the slice_box()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + sliceBox(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['slice_box()void'] | undefined]> + + /** + * Calls the arc4_box()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + arc4Box(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['arc4_box()void'] | undefined]> + + /** + * Calls the create_many_ints()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + createManyInts(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['create_many_ints()void'] | undefined]> + + /** + * Calls the set_many_ints(uint64,uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setManyInts(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['set_many_ints(uint64,uint64)void'] | undefined]> + + /** + * Calls the sum_many_ints()uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + sumManyInts(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['sum_many_ints()uint64'] | undefined]> + + /** + * Calls the test_box_ref()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testBoxRef(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['test_box_ref()void'] | undefined]> + + /** + * Calls the set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setNestedStruct(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'] | undefined]> + + /** + * Calls the nested_write(uint64,uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + nestedWrite(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['nested_write(uint64,uint64)void'] | undefined]> + + /** + * Calls the nested_read(uint64,uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + nestedRead(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['nested_read(uint64,uint64,uint64)uint64'] | undefined]> + + /** + * Calls the create_bools()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + createBools(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['create_bools()void'] | undefined]> + + /** + * Calls the set_bool(uint64,bool)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setBool(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['set_bool(uint64,bool)void'] | undefined]> + + /** + * Calls the sum_bools(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + sumBools(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['sum_bools(uint64)uint64'] | undefined]> + + /** + * Calls the box_map_test()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + boxMapTest(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_test()void'] | undefined]> + + /** + * Calls the box_map_set(uint64,string)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + boxMapSet(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_set(uint64,string)void'] | undefined]> + + /** + * Calls the box_map_get(uint64)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + boxMapGet(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_get(uint64)string'] | undefined]> + + /** + * Calls the box_map_del(uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + boxMapDel(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_del(uint64)void'] | undefined]> + + /** + * Calls the box_map_exists(uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + boxMapExists(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_exists(uint64)bool'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the BoxContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): BoxContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): BoxContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type BoxContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/Contract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/Contract.ts new file mode 100644 index 0000000..aa62d61 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/Contract.ts @@ -0,0 +1,621 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"Contract","structs":{},"methods":[{"name":"test_falcon_verify","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reject_version","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[138,226],"errorMessage":"application exists"},{"pc":[140],"errorMessage":"should be version 0"},{"pc":[229],"errorMessage":"should be version 1"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYgMAogICAgYnl0ZWNibG9jayBiYXNlNjQoRElFQlF3PT0pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQ29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMik6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhiZTU2NDk5YyAweGFjOGFhYjQyIC8vIG1ldGhvZCAidGVzdF9mYWxjb25fdmVyaWZ5KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X3JlamVjdF92ZXJzaW9uKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF9mYWxjb25fdmVyaWZ5IHRlc3RfcmVqZWN0X3ZlcnNpb24KICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQVZNMTIuY29udHJhY3QuQ29udHJhY3QudGVzdF9mYWxjb25fdmVyaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9mYWxjb25fdmVyaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjcKICAgIC8vIGFzc2VydCBub3Qgb3AuZmFsY29uX3ZlcmlmeShiIiIsIGIiIiwgb3AuYnplcm8oMTc5MykpCiAgICBwdXNoaW50IDE3OTMKICAgIGJ6ZXJvCiAgICBwdXNoYnl0ZXMgMHgKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBmYWxjb25fdmVyaWZ5CiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQVZNMTIuY29udHJhY3QuQ29udHJhY3QudGVzdF9yZWplY3RfdmVyc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfcmVqZWN0X3ZlcnNpb246CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTEKICAgIC8vIGFwcF92MF90eG4gPSBhcmM0LmFyYzRfY3JlYXRlKENvbnRyYWN0VjApCiAgICBpdHhuX2JlZ2luCiAgICBieXRlY18wIC8vIGJhc2U2NChESUVCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgcHVzaGJ5dGVzIGJhc2U2NChEREViUVFBYWdBU2c2Qmh5TmhvQWpnRUFBUUF4R1lFRUVqRVlFRVJDQUFneEdSUXhHQlFRUXpGRWdRRVNSSUVCUXc9PSkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTMKICAgIC8vIGFzc2VydCBhcHAudmVyc2lvbiA9PSAwLCAic2hvdWxkIGJlIHZlcnNpb24gMCIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwVmVyc2lvbgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIHNob3VsZCBiZSB2ZXJzaW9uIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToxNS0xNwogICAgLy8gYXJjNC5hcmM0X3VwZGF0ZSgKICAgIC8vICAgICBDb250cmFjdFYwLnVwZGF0ZSwgYXBwX2lkPWFwcCwgcmVqZWN0X3ZlcnNpb249MSwgY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdChDb250cmFjdFYxKQogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBDb250cmFjdFYwLnVwZGF0ZSwgYXBwX2lkPWFwcCwgcmVqZWN0X3ZlcnNpb249MSwgY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdChDb250cmFjdFYxKQogICAgYnl0ZWNfMCAvLyBiYXNlNjQoRElFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIHB1c2hieXRlcyBiYXNlNjQoRERFYlFRQWFnQVFrTjQwOE5ob0FqZ0VBQVFBeEdZRUZFakVZRUVSQ0FBZ3hHUlF4R0JRUVF6RkVnUUlTUklFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTUtMTcKICAgIC8vIGFyYzQuYXJjNF91cGRhdGUoCiAgICAvLyAgICAgQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIC8vICkKICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToxNgogICAgLy8gQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIGludGNfMCAvLyAxCiAgICBpdHhuX2ZpZWxkIFJlamVjdFZlcnNpb24KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTUtMTcKICAgIC8vIGFyYzQuYXJjNF91cGRhdGUoCiAgICAvLyAgICAgQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweGEwZTgxODcyIC8vIG1ldGhvZCAidXBkYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTgKICAgIC8vIGFzc2VydCBhcHAudmVyc2lvbiA9PSAxLCAic2hvdWxkIGJlIHZlcnNpb24gMSIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwVmVyc2lvbgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gc2hvdWxkIGJlIHZlcnNpb24gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjIwLTI5CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oCiAgICAvLyAgICAgICAgIGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgICAgICAgICBDb250cmFjdFYxLmRlbGV0ZSwKICAgIC8vICAgICAgICAgKSwKICAgIC8vICAgICApLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gICAgIHJlamVjdF92ZXJzaW9uPTIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjgKICAgIC8vIHJlamVjdF92ZXJzaW9uPTIsCiAgICBwdXNoaW50IDIKICAgIGl0eG5fZmllbGQgUmVqZWN0VmVyc2lvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjYKICAgIC8vIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToyMi0yNAogICAgLy8gYXJjNC5hcmM0X3NpZ25hdHVyZSgKICAgIC8vICAgICBDb250cmFjdFYxLmRlbGV0ZSwKICAgIC8vICksCiAgICBwdXNoYnl0ZXMgMHgyNDM3OGQzYyAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMiAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjIwLTI5CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oCiAgICAvLyAgICAgICAgIGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgICAgICAgICBDb250cmFjdFYxLmRlbGV0ZSwKICAgIC8vICAgICAgICAgKSwKICAgIC8vICAgICApLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gICAgIHJlamVjdF92ZXJzaW9uPTIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"DCADAQYAJgEEDIEBQzEbQQAdMRkURDEYRIICBL5WSZwErIqrQjYaAI4CAAkAFwAxGRQxGBQQQ4GBDq+AAElPAoUURCJDsSiyQoAxDDEbQQAagASg6BhyNhoAjgEAAQAxGYEEEjEYEERCAAgxGRQxGBQQQzFEgQESRIEBQ7JAI7IQJLIBs7Q9SXIJRBREsSiyQoAxDDEbQQAagAQkN408NhoAjgEAAQAxGYEFEjEYEERCAAgxGRQxGBQQQzFEgQISRIEBQ7JAgQSyGSKyREmyGIAEoOgYcrIaI7IQJLIBs0lyCUQiEkSxgQKyRLIYgQWyGYAEJDeNPLIaI7IQJLIBsyJD","clear":"DIEBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the Contract contract + */ +export type ContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'test_falcon_verify()void': Record + 'test_reject_version()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'test_falcon_verify()void': [] + 'test_reject_version()void': [] + } +} + +/** + * The return type for each method + */ +export type ContractReturns = { + 'test_falcon_verify()void': void + 'test_reject_version()void': void +} + +/** + * Defines the types of available calls and state of the Contract smart contract. + */ +export type ContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'test_falcon_verify()void' | 'test_falcon_verify', { + argsObj: ContractArgs['obj']['test_falcon_verify()void'] + argsTuple: ContractArgs['tuple']['test_falcon_verify()void'] + returns: ContractReturns['test_falcon_verify()void'] + }> + & Record<'test_reject_version()void' | 'test_reject_version', { + argsObj: ContractArgs['obj']['test_reject_version()void'] + argsTuple: ContractArgs['tuple']['test_reject_version()void'] + returns: ContractReturns['test_reject_version()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type ContractSignatures = keyof ContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the Contract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = ContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the Contract smart contract to the method's return type + */ +export type MethodReturn = ContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type ContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type ContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: ContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the Contract smart contract + */ +export abstract class ContractParamsFactory { + /** + * Constructs a no op call for the test_falcon_verify()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testFalconVerify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_falcon_verify()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_reject_version()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testRejectVersion(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_reject_version()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the Contract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class ContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `ContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new ContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new ContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the Contract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: ContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new ContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Contract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Contract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Contract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new ContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the Contract smart contract + */ +export class ContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `ContractClient` + * + * @param appClient An `AppClient` instance which has been created with the Contract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `ContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `ContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new ContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `ContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new ContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the Contract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the Contract smart contract using the `test_falcon_verify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testFalconVerify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ContractParamsFactory.testFalconVerify(params)) + }, + + /** + * Makes a call to the Contract smart contract using the `test_reject_version()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testRejectVersion: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ContractParamsFactory.testRejectVersion(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the Contract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the Contract smart contract using the `test_falcon_verify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testFalconVerify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ContractParamsFactory.testFalconVerify(params)) + }, + + /** + * Makes a call to the Contract smart contract using the `test_reject_version()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testRejectVersion: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ContractParamsFactory.testRejectVersion(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the Contract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the Contract smart contract using the `test_falcon_verify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testFalconVerify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ContractParamsFactory.testFalconVerify(params)) + return {...result, return: result.return as unknown as (undefined | ContractReturns['test_falcon_verify()void'])} + }, + + /** + * Makes a call to the Contract smart contract using the `test_reject_version()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testRejectVersion: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ContractParamsFactory.testRejectVersion(params)) + return {...result, return: result.return as unknown as (undefined | ContractReturns['test_reject_version()void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new ContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current Contract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): ContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a test_falcon_verify()void method call against the Contract contract + */ + testFalconVerify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testFalconVerify(params))) + return this + }, + /** + * Add a test_reject_version()void method call against the Contract contract + */ + testRejectVersion(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testRejectVersion(params))) + return this + }, + /** + * Add a clear state call to the Contract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as ContractComposer + } +} +export type ContractComposer = { + /** + * Calls the test_falcon_verify()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testFalconVerify(params?: CallParams): ContractComposer<[...TReturns, ContractReturns['test_falcon_verify()void'] | undefined]> + + /** + * Calls the test_reject_version()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testRejectVersion(params?: CallParams): ContractComposer<[...TReturns, ContractReturns['test_reject_version()void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the Contract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): ContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): ContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type ContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ContractV0.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ContractV0.ts new file mode 100644 index 0000000..4c42a4d --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/ContractV0.ts @@ -0,0 +1,621 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"ContractV0","structs":{},"methods":[{"name":"update","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["UpdateApplication"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[45],"errorMessage":"can only update if caller expects this to be currently be v0"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTozMgogICAgLy8gY2xhc3MgQ29udHJhY3RWMChBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTEyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweGEwZTgxODcyIC8vIG1ldGhvZCAidXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl91cGRhdGVfcm91dGVAMwogICAgZXJyCgptYWluX3VwZGF0ZV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz0oIlVwZGF0ZUFwcGxpY2F0aW9uIiwpKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgdXBkYXRlCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BVk0xMi5jb250cmFjdC5Db250cmFjdFYwLnVwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTozNgogICAgLy8gVHhuLnJlamVjdF92ZXJzaW9uID09IDEKICAgIHR4biBSZWplY3RWZXJzaW9uCiAgICBwdXNoaW50IDEKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MzUtMzcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnJlamVjdF92ZXJzaW9uID09IDEKICAgIC8vICksICJjYW4gb25seSB1cGRhdGUgaWYgY2FsbGVyIGV4cGVjdHMgdGhpcyB0byBiZSBjdXJyZW50bHkgYmUgdjAiCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgdXBkYXRlIGlmIGNhbGxlciBleHBlY3RzIHRoaXMgdG8gYmUgY3VycmVudGx5IGJlIHYwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPSgiVXBkYXRlQXBwbGljYXRpb24iLCkpCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"DDEbQQAagASg6BhyNhoAjgEAAQAxGYEEEjEYEERCAAgxGRQxGBQQQzFEgQESRIEBQw==","clear":"DIEBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the ContractV0 contract + */ +export type ContractV0Args = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'update()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'update()void': [] + } +} + +/** + * The return type for each method + */ +export type ContractV0Returns = { + 'update()void': void +} + +/** + * Defines the types of available calls and state of the ContractV0 smart contract. + */ +export type ContractV0Types = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'update()void' | 'update', { + argsObj: ContractV0Args['obj']['update()void'] + argsTuple: ContractV0Args['tuple']['update()void'] + returns: ContractV0Returns['update()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type ContractV0Signatures = keyof ContractV0Types['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the ContractV0 smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = ContractV0Types['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the ContractV0 smart contract to the method's return type + */ +export type MethodReturn = ContractV0Types['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type ContractV0CreateCallParams = + | Expand +/** + * Defines supported update method params for this smart contract + */ +export type ContractV0UpdateCallParams = + | Expand & {method: 'update'}> + | Expand & {method: 'update()void'}> +/** + * Defines arguments required for the deploy method. + */ +export type ContractV0DeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: ContractV0CreateCallParams + /** + * Update transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + updateParams?: ContractV0UpdateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the ContractV0 smart contract + */ +export abstract class ContractV0ParamsFactory { + /** + * Gets available update ABI call param factories + */ + static get update() { + return { + _resolveByMethod(params: TParams) { + switch(params.method) { + case 'update': + case 'update()void': + return ContractV0ParamsFactory.update.update(params) + } + throw new Error(`Unknown ' + verb + ' method`) + }, + + /** + * Constructs update ABI call params for the ContractV0 smart contract using the update()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + update(params: CallParams & AppClientCompilationParams): AppClientMethodCallParams & AppClientCompilationParams { + return { + ...params, + method: 'update()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + +} + +/** + * A factory to create and deploy one or more instance of the ContractV0 smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class ContractV0Factory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `ContractV0Factory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new ContractV0Client(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new ContractV0Client(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the ContractV0 smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: ContractV0DeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + updateParams: params.updateParams?.method ? ContractV0ParamsFactory.update._resolveByMethod(params.updateParams) : params.updateParams ? params.updateParams as (ContractV0UpdateCallParams & { args: Uint8Array[] }) : undefined, + }) + return { result: result.result, appClient: new ContractV0Client(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ContractV0 smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + /** + * Gets available deployUpdate methods + */ + deployUpdate: { + /** + * Updates an existing instance of the ContractV0 smart contract using the update()void ABI method. + * + * @param params The params for the smart contract call + * @returns The deployUpdate params + */ + update: (params: CallParams & AppClientCompilationParams = {args: []}) => { + return this.appFactory.params.deployUpdate(ContractV0ParamsFactory.update.update(params)) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ContractV0 smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ContractV0 smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new ContractV0Client(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the ContractV0 smart contract + */ +export class ContractV0Client { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `ContractV0Client` + * + * @param appClient An `AppClient` instance which has been created with the ContractV0 app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `ContractV0Client` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `ContractV0Client` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new ContractV0Client(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `ContractV0Client` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new ContractV0Client(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available update methods + */ + update: { + /** + * Updates an existing instance of the ContractV0 smart contract using the `update()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The update params + */ + update: (params: CallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.UpdateApplication } = {args: []}) => { + return this.appClient.params.update(ContractV0ParamsFactory.update.update(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the ContractV0 smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available update methods + */ + update: { + /** + * Updates an existing instance of the ContractV0 smart contract using the `update()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The update transaction + */ + update: (params: CallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.UpdateApplication } = {args: []}) => { + return this.appClient.createTransaction.update(ContractV0ParamsFactory.update.update(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the ContractV0 smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available update methods + */ + update: { + /** + * Updates an existing instance of the ContractV0 smart contract using the `update()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The update result + */ + update: async (params: CallParams & AppClientCompilationParams & SendParams & { onComplete?: OnApplicationComplete.UpdateApplication } = {args: []}) => { + const result = await this.appClient.send.update(ContractV0ParamsFactory.update.update(params)) + return {...result, return: result.return as unknown as (undefined | ContractV0Returns['update()void'])} + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the ContractV0 smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new ContractV0Client(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current ContractV0 app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): ContractV0Composer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + get update() { + return { + update: (params: CallParams & AppClientCompilationParams) => { + promiseChain = promiseChain.then(async () => composer.addAppUpdateMethodCall(await client.params.update.update(params))) + return this + }, + } + }, + /** + * Add a clear state call to the ContractV0 contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as ContractV0Composer + } +} +export type ContractV0Composer = { + /** + * Gets available update methods + */ + readonly update: { + /** + * Updates an existing instance of the ContractV0 smart contract using the update()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + update(params?: CallParams): ContractV0Composer<[...TReturns, ContractV0Returns['update()void'] | undefined]> + } + + /** + * Makes a clear_state call to an existing instance of the ContractV0 smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): ContractV0Composer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): ContractV0Composer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type ContractV0ComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ContractV1.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ContractV1.ts new file mode 100644 index 0000000..7f5e963 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/ContractV1.ts @@ -0,0 +1,621 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"ContractV1","structs":{},"methods":[{"name":"delete","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["DeleteApplication"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[45],"errorMessage":"can only update if caller expects this to be currently be v1"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo0MAogICAgLy8gY2xhc3MgQ29udHJhY3RWMShBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTEyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweDI0Mzc4ZDNjIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9kZWxldGVfcm91dGVAMwogICAgZXJyCgptYWluX2RlbGV0ZV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz0oIkRlbGV0ZUFwcGxpY2F0aW9uIiwpKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgZGVsZXRlCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BVk0xMi5jb250cmFjdC5Db250cmFjdFYxLmRlbGV0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlbGV0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo0NAogICAgLy8gVHhuLnJlamVjdF92ZXJzaW9uID09IDIKICAgIHR4biBSZWplY3RWZXJzaW9uCiAgICBwdXNoaW50IDIKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NDMtNDUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnJlamVjdF92ZXJzaW9uID09IDIKICAgIC8vICksICJjYW4gb25seSB1cGRhdGUgaWYgY2FsbGVyIGV4cGVjdHMgdGhpcyB0byBiZSBjdXJyZW50bHkgYmUgdjEiCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgdXBkYXRlIGlmIGNhbGxlciBleHBlY3RzIHRoaXMgdG8gYmUgY3VycmVudGx5IGJlIHYxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPSgiRGVsZXRlQXBwbGljYXRpb24iLCkpCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"DDEbQQAagAQkN408NhoAjgEAAQAxGYEFEjEYEERCAAgxGRQxGBQQQzFEgQISRIEBQw==","clear":"DIEBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the ContractV1 contract + */ +export type ContractV1Args = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'delete()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'delete()void': [] + } +} + +/** + * The return type for each method + */ +export type ContractV1Returns = { + 'delete()void': void +} + +/** + * Defines the types of available calls and state of the ContractV1 smart contract. + */ +export type ContractV1Types = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'delete()void' | 'delete', { + argsObj: ContractV1Args['obj']['delete()void'] + argsTuple: ContractV1Args['tuple']['delete()void'] + returns: ContractV1Returns['delete()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type ContractV1Signatures = keyof ContractV1Types['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the ContractV1 smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = ContractV1Types['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the ContractV1 smart contract to the method's return type + */ +export type MethodReturn = ContractV1Types['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type ContractV1CreateCallParams = + | Expand +/** + * Defines supported delete method params for this smart contract + */ +export type ContractV1DeleteCallParams = + | Expand & {method: 'delete'}> + | Expand & {method: 'delete()void'}> +/** + * Defines arguments required for the deploy method. + */ +export type ContractV1DeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: ContractV1CreateCallParams + /** + * Delete transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + deleteParams?: ContractV1DeleteCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the ContractV1 smart contract + */ +export abstract class ContractV1ParamsFactory { + /** + * Gets available delete ABI call param factories + */ + static get delete() { + return { + _resolveByMethod(params: TParams) { + switch(params.method) { + case 'delete': + case 'delete()void': + return ContractV1ParamsFactory.delete.delete(params) + } + throw new Error(`Unknown ' + verb + ' method`) + }, + + /** + * Constructs delete ABI call params for the ContractV1 smart contract using the delete()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + delete(params: CallParams): AppClientMethodCallParams { + return { + ...params, + method: 'delete()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + +} + +/** + * A factory to create and deploy one or more instance of the ContractV1 smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class ContractV1Factory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `ContractV1Factory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new ContractV1Client(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new ContractV1Client(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the ContractV1 smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: ContractV1DeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + deleteParams: params.deleteParams?.method ? ContractV1ParamsFactory.delete._resolveByMethod(params.deleteParams) : params.deleteParams ? params.deleteParams as (ContractV1DeleteCallParams & { args: Uint8Array[] }) : undefined, + }) + return { result: result.result, appClient: new ContractV1Client(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ContractV1 smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + /** + * Gets available deployDelete methods + */ + deployDelete: { + /** + * Deletes an existing instance of the ContractV1 smart contract using the delete()void ABI method. + * + * @param params The params for the smart contract call + * @returns The deployDelete params + */ + delete: (params: CallParams = {args: []}) => { + return this.appFactory.params.deployDelete(ContractV1ParamsFactory.delete.delete(params)) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ContractV1 smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ContractV1 smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new ContractV1Client(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the ContractV1 smart contract + */ +export class ContractV1Client { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `ContractV1Client` + * + * @param appClient An `AppClient` instance which has been created with the ContractV1 app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `ContractV1Client` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `ContractV1Client` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new ContractV1Client(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `ContractV1Client` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new ContractV1Client(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available delete methods + */ + delete: { + /** + * Deletes an existing instance of the ContractV1 smart contract using the `delete()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The delete params + */ + delete: (params: CallParams & { onComplete?: OnApplicationComplete.DeleteApplication } = {args: []}) => { + return this.appClient.params.delete(ContractV1ParamsFactory.delete.delete(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the ContractV1 smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available delete methods + */ + delete: { + /** + * Deletes an existing instance of the ContractV1 smart contract using the `delete()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The delete transaction + */ + delete: (params: CallParams & { onComplete?: OnApplicationComplete.DeleteApplication } = {args: []}) => { + return this.appClient.createTransaction.delete(ContractV1ParamsFactory.delete.delete(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the ContractV1 smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available delete methods + */ + delete: { + /** + * Deletes an existing instance of the ContractV1 smart contract using the `delete()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The delete result + */ + delete: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.DeleteApplication } = {args: []}) => { + const result = await this.appClient.send.delete(ContractV1ParamsFactory.delete.delete(params)) + return {...result, return: result.return as unknown as (undefined | ContractV1Returns['delete()void'])} + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the ContractV1 smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new ContractV1Client(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current ContractV1 app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): ContractV1Composer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + get delete() { + return { + delete: (params: CallParams) => { + promiseChain = promiseChain.then(async () => composer.addAppDeleteMethodCall(await client.params.delete.delete(params))) + return this + }, + } + }, + /** + * Add a clear state call to the ContractV1 contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as ContractV1Composer + } +} +export type ContractV1Composer = { + /** + * Gets available delete methods + */ + readonly delete: { + /** + * Deletes an existing instance of the ContractV1 smart contract using the delete()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + delete(params?: CallParams): ContractV1Composer<[...TReturns, ContractV1Returns['delete()void'] | undefined]> + } + + /** + * Makes a clear_state call to an existing instance of the ContractV1 smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): ContractV1Composer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): ContractV1Composer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type ContractV1ComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/CryptoOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/CryptoOpsContract.ts new file mode 100644 index 0000000..d63f44a --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/CryptoOpsContract.ts @@ -0,0 +1,1422 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"CryptoOpsContract","structs":{},"methods":[{"name":"verify_sha256","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_sha3_256","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_keccak_256","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_sha512_256","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ed25519verify","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ed25519verify_bare","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_verify_k1","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"},{"type":"byte[]","name":"e"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_verify_r1","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"},{"type":"byte[]","name":"e"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_recover_k1","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"}],"returns":{"type":"(byte[],byte[])"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_recover_r1","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"}],"returns":{"type":"(byte[],byte[])"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"desc":"Must fail, AVM does not support Secp256r1 for recover","events":[],"recommendations":{}},{"name":"verify_ecdsa_decompress_k1","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"(byte[],byte[])"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_decompress_r1","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"(byte[],byte[])"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_vrf_verify","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"(byte[],bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMzAwMCA0CiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHgwMCAweDE1MWY3Yzc1MDAyMCAweDAwMDQgMHgwNjgxMDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQ3J5cHRvT3BzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDIwCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHgzNDU2YzRjMyAweGU4NDQyYjg0IDB4NjVmNTY3YWEgMHgyNTg0NTViMSAweDM1YWYwZjM4IDB4NjU4MmM5OTcgMHg2Mjk4ZmZiYiAweDM4ODViNTRmIDB4MjE2NGUwYmYgMHg3NTViNzlhNSAweGYwNmJiMDc3IDB4MTMzZjhjY2MgMHgyZjdjNjhhOSAvLyBtZXRob2QgInZlcmlmeV9zaGEyNTYoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9zaGEzXzI1NihieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2tlY2Nha18yNTYoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9zaGE1MTJfMjU2KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZWQyNTUxOXZlcmlmeShieXRlW10sYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfZWQyNTUxOXZlcmlmeV9iYXJlKGJ5dGVbXSxieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9lY2RzYV92ZXJpZnlfazEoYnl0ZVtdLGJ5dGVbXSxieXRlW10sYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfZWNkc2FfdmVyaWZ5X3IxKGJ5dGVbXSxieXRlW10sYnl0ZVtdLGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX3JlY292ZXJfazEoYnl0ZVtdLHVpbnQ2NCxieXRlW10sYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX3JlY292ZXJfcjEoYnl0ZVtdLHVpbnQ2NCxieXRlW10sYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX2RlY29tcHJlc3NfazEoYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX2RlY29tcHJlc3NfcjEoYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X3ZyZl92ZXJpZnkoYnl0ZVtdLGJ5dGVbXSxieXRlW10pKGJ5dGVbXSxib29sKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9zaGEyNTYgdmVyaWZ5X3NoYTNfMjU2IHZlcmlmeV9rZWNjYWtfMjU2IHZlcmlmeV9zaGE1MTJfMjU2IHZlcmlmeV9lZDI1NTE5dmVyaWZ5IHZlcmlmeV9lZDI1NTE5dmVyaWZ5X2JhcmUgdmVyaWZ5X2VjZHNhX3ZlcmlmeV9rMSB2ZXJpZnlfZWNkc2FfdmVyaWZ5X3IxIHZlcmlmeV9lY2RzYV9yZWNvdmVyX2sxIHZlcmlmeV9lY2RzYV9yZWNvdmVyX3IxIHZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX2sxIHZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX3IxIHZlcmlmeV92cmZfdmVyaWZ5CiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMjA6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyA0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3aXRjaCBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMyBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANAoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICBpdHhuX3N1Ym1pdAogICAgYiBlbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxCgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANDoKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMzoKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2OgogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfc2hhMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NoYTI1NjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjcKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjgKICAgIC8vIHJlc3VsdCA9IG9wLnNoYTI1NihhKQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUwMDIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcnlwdG9PcHMuY29udHJhY3QuQ3J5cHRvT3BzQ29udHJhY3QudmVyaWZ5X3NoYTNfMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NoYTNfMjU2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBhID0gb3AuYnplcm8ocGFkX3NpemUpICsgYQogICAgYnplcm8KICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxNAogICAgLy8gcmVzdWx0ID0gb3Auc2hhM18yNTYoYSkKICAgIHNoYTNfMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3J5cHRvT3BzLmNvbnRyYWN0LkNyeXB0b09wc0NvbnRyYWN0LnZlcmlmeV9rZWNjYWtfMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2tlY2Nha18yNTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MTkKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyByZXN1bHQgPSBvcC5rZWNjYWsyNTYoYSkKICAgIGtlY2NhazI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfc2hhNTEyXzI1Nltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zaGE1MTJfMjU2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhID0gb3AuYnplcm8ocGFkX3NpemUpICsgYQogICAgYnplcm8KICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyNgogICAgLy8gcmVzdWx0ID0gb3Auc2hhNTEyXzI1NihhKQogICAgc2hhNTEyXzI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWQyNTUxOXZlcmlmeVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lZDI1NTE5dmVyaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzEKICAgIC8vIGVuc3VyZV9idWRnZXQoMTkwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgMTkwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozMgogICAgLy8gcmVzdWx0ID0gb3AuZWQyNTUxOXZlcmlmeShhLCBiLCBjKQogICAgZWQyNTUxOXZlcmlmeQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozMwogICAgLy8gcmV0dXJuIGFyYzQuQm9vbChyZXN1bHQpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3J5cHRvT3BzLmNvbnRyYWN0LkNyeXB0b09wc0NvbnRyYWN0LnZlcmlmeV9lZDI1NTE5dmVyaWZ5X2JhcmVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZWQyNTUxOXZlcmlmeV9iYXJlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzcKICAgIC8vIGVuc3VyZV9idWRnZXQoMTkwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgMTkwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozOAogICAgLy8gcmVzdWx0ID0gb3AuZWQyNTUxOXZlcmlmeV9iYXJlKGEsIGIsIGMpCiAgICBlZDI1NTE5dmVyaWZ5X2JhcmUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzkKICAgIC8vIHJldHVybiBhcmM0LkJvb2wocmVzdWx0KQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfdmVyaWZ5X2sxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2VjZHNhX3ZlcmlmeV9rMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDMKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyByZXN1bHRfazEgPSBvcC5lY2RzYV92ZXJpZnkob3AuRUNEU0EuU2VjcDI1NmsxLCBhLCBiLCBjLCBkLCBlKQogICAgZWNkc2FfdmVyaWZ5IFNlY3AyNTZrMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfdmVyaWZ5X3IxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2VjZHNhX3ZlcmlmeV9yMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDkKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjUwCiAgICAvLyByZXN1bHRfcjEgPSBvcC5lY2RzYV92ZXJpZnkob3AuRUNEU0EuU2VjcDI1NnIxLCBhLCBiLCBjLCBkLCBlKQogICAgZWNkc2FfdmVyaWZ5IFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfcmVjb3Zlcl9rMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9yZWNvdmVyX2sxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NTcKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjU4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfcmVjb3ZlcihvcC5FQ0RTQS5TZWNwMjU2azEsIGEsIGIsIGMsIGQpCiAgICBlY2RzYV9wa19yZWNvdmVyIFNlY3AyNTZrMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfcmVjb3Zlcl9yMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9yZWNvdmVyX3IxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NjcKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjY4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfcmVjb3ZlcihvcC5FQ0RTQS5TZWNwMjU2cjEsIGEsIGIsIGMsIGQpCiAgICBlY2RzYV9wa19yZWNvdmVyIFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19rMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX2sxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmVfYnVkZ2V0KDcwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNzAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjczCiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfZGVjb21wcmVzcyhvcC5FQ0RTQS5TZWNwMjU2azEsIGEpCiAgICBlY2RzYV9wa19kZWNvbXByZXNzIFNlY3AyNTZrMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19yMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX3IxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBlbnN1cmVfYnVkZ2V0KDcwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNzAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfZGVjb21wcmVzcyhvcC5FQ0RTQS5TZWNwMjU2cjEsIGEpCiAgICBlY2RzYV9wa19kZWNvbXByZXNzIFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfdnJmX3ZlcmlmeVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV92cmZfdmVyaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6ODIKICAgIC8vIGVuc3VyZV9idWRnZXQoNTcwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNTcwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo4MwogICAgLy8gcmVzdWx0ID0gb3AudnJmX3ZlcmlmeShvcC5WcmZWZXJpZnkuVnJmQWxnb3JhbmQsIGEsIGIsIGMpCiAgICB2cmZfdmVyaWZ5IFZyZkFsZ29yYW5kCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAAG4FwQmBQQVH3x1AQAGFR98dQAgAgAEAwaBATEbQQBqMRkURDEYRIINBDRWxMME6EQrhARl9WeqBCWEVbEENa8POARlgsmXBGKY/7sEOIW1TwQhZOC/BHVbeaUE8GuwdwQTP4zMBC98aKk2GgCODQBEAFgAbACAAJQAuQDeAQ4BPgGGAc4CCAJCADEZFDEYFBBDigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScEsh4nBLIfi/+NAgALAASzQv/bMgCyAUL/9SKyAUL/74k2GgFXAgA2GgIXr0xQASpMULAjQzYaAVcCADYaAhevTFCYKkxQsCNDNhoBVwIANhoCF69MUAIqTFCwI0M2GgFXAgA2GgIXr0xQAypMULAjQzYaAVcCADYaAlcCADYaA1cCAIHsDiKI/1wEKSJPAlQoTFCwI0M2GgFXAgA2GgJXAgA2GgNXAgCB7A4iiP83hCkiTwJUKExQsCNDNhoBVwIANhoCVwIANhoDVwIANhoEVwIANhoFVwIAJCKI/wgFACkiTwJUKExQsCNDNhoBVwIANhoCVwIANhoDVwIANhoEVwIANhoFVwIAJCKI/tgFASkiTwJUKExQsCNDNhoBVwIANhoCFzYaA1cCADYaBFcCACQiiP6wBwBLARUWVwYCTwJQSRUlCEsCFRZXBgJPA1BMFlcGAitMUE8CUExQKExQsCNDNhoBVwIANhoCFzYaA1cCADYaBFcCACQiiP5oBwFLARUWVwYCTwJQSRUlCEsCFRZXBgJPA1BMFlcGAitMUE8CUExQKExQsCNDNhoBVwIAgbwFIoj+LgYASwEVFlcGAk8CUEkVJQhLAhUWVwYCTwNQTBZXBgIrTFBPAlBMUChMULAjQzYaAVcCAIG8BSKI/fQGAUsBFRZXBgJPAlBJFSUISwIVFlcGAk8DUEwWVwYCK0xQTwJQTFAoTFCwI0M2GgFXAgA2GgJXAgA2GgNXAgCBxCwiiP2u0ABLARUWVwYCTwJQKSJPA1SAAgADTFBMUChMULAjQw==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the CryptoOpsContract contract + */ +export type CryptoOpsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_sha256(byte[],uint64)byte[]': { + a: Uint8Array + padSize: bigint | number + } + 'verify_sha3_256(byte[],uint64)byte[]': { + a: Uint8Array + padSize: bigint | number + } + 'verify_keccak_256(byte[],uint64)byte[]': { + a: Uint8Array + padSize: bigint | number + } + 'verify_sha512_256(byte[],uint64)byte[]': { + a: Uint8Array + padSize: bigint | number + } + 'verify_ed25519verify(byte[],byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + c: Uint8Array + } + 'verify_ed25519verify_bare(byte[],byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + c: Uint8Array + } + 'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + c: Uint8Array + d: Uint8Array + e: Uint8Array + } + 'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + c: Uint8Array + d: Uint8Array + e: Uint8Array + } + 'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])': { + a: Uint8Array + b: bigint | number + c: Uint8Array + d: Uint8Array + } + 'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])': { + a: Uint8Array + b: bigint | number + c: Uint8Array + d: Uint8Array + } + 'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])': { + a: Uint8Array + } + 'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])': { + a: Uint8Array + } + 'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)': { + a: Uint8Array + b: Uint8Array + c: Uint8Array + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_sha256(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] + 'verify_sha3_256(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] + 'verify_keccak_256(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] + 'verify_sha512_256(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] + 'verify_ed25519verify(byte[],byte[],byte[])bool': [a: Uint8Array, b: Uint8Array, c: Uint8Array] + 'verify_ed25519verify_bare(byte[],byte[],byte[])bool': [a: Uint8Array, b: Uint8Array, c: Uint8Array] + 'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool': [a: Uint8Array, b: Uint8Array, c: Uint8Array, d: Uint8Array, e: Uint8Array] + 'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool': [a: Uint8Array, b: Uint8Array, c: Uint8Array, d: Uint8Array, e: Uint8Array] + 'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])': [a: Uint8Array, b: bigint | number, c: Uint8Array, d: Uint8Array] + 'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])': [a: Uint8Array, b: bigint | number, c: Uint8Array, d: Uint8Array] + 'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])': [a: Uint8Array] + 'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])': [a: Uint8Array] + 'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)': [a: Uint8Array, b: Uint8Array, c: Uint8Array] + } +} + +/** + * The return type for each method + */ +export type CryptoOpsContractReturns = { + 'verify_sha256(byte[],uint64)byte[]': Uint8Array + 'verify_sha3_256(byte[],uint64)byte[]': Uint8Array + 'verify_keccak_256(byte[],uint64)byte[]': Uint8Array + 'verify_sha512_256(byte[],uint64)byte[]': Uint8Array + 'verify_ed25519verify(byte[],byte[],byte[])bool': boolean + 'verify_ed25519verify_bare(byte[],byte[],byte[])bool': boolean + 'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool': boolean + 'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool': boolean + 'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])': [Uint8Array, Uint8Array] + 'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])': [Uint8Array, Uint8Array] + 'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])': [Uint8Array, Uint8Array] + 'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])': [Uint8Array, Uint8Array] + 'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)': [Uint8Array, boolean] +} + +/** + * Defines the types of available calls and state of the CryptoOpsContract smart contract. + */ +export type CryptoOpsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_sha256(byte[],uint64)byte[]' | 'verify_sha256', { + argsObj: CryptoOpsContractArgs['obj']['verify_sha256(byte[],uint64)byte[]'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_sha256(byte[],uint64)byte[]'] + returns: CryptoOpsContractReturns['verify_sha256(byte[],uint64)byte[]'] + }> + & Record<'verify_sha3_256(byte[],uint64)byte[]' | 'verify_sha3_256', { + argsObj: CryptoOpsContractArgs['obj']['verify_sha3_256(byte[],uint64)byte[]'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_sha3_256(byte[],uint64)byte[]'] + returns: CryptoOpsContractReturns['verify_sha3_256(byte[],uint64)byte[]'] + }> + & Record<'verify_keccak_256(byte[],uint64)byte[]' | 'verify_keccak_256', { + argsObj: CryptoOpsContractArgs['obj']['verify_keccak_256(byte[],uint64)byte[]'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_keccak_256(byte[],uint64)byte[]'] + returns: CryptoOpsContractReturns['verify_keccak_256(byte[],uint64)byte[]'] + }> + & Record<'verify_sha512_256(byte[],uint64)byte[]' | 'verify_sha512_256', { + argsObj: CryptoOpsContractArgs['obj']['verify_sha512_256(byte[],uint64)byte[]'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_sha512_256(byte[],uint64)byte[]'] + returns: CryptoOpsContractReturns['verify_sha512_256(byte[],uint64)byte[]'] + }> + & Record<'verify_ed25519verify(byte[],byte[],byte[])bool' | 'verify_ed25519verify', { + argsObj: CryptoOpsContractArgs['obj']['verify_ed25519verify(byte[],byte[],byte[])bool'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ed25519verify(byte[],byte[],byte[])bool'] + returns: CryptoOpsContractReturns['verify_ed25519verify(byte[],byte[],byte[])bool'] + }> + & Record<'verify_ed25519verify_bare(byte[],byte[],byte[])bool' | 'verify_ed25519verify_bare', { + argsObj: CryptoOpsContractArgs['obj']['verify_ed25519verify_bare(byte[],byte[],byte[])bool'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ed25519verify_bare(byte[],byte[],byte[])bool'] + returns: CryptoOpsContractReturns['verify_ed25519verify_bare(byte[],byte[],byte[])bool'] + }> + & Record<'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool' | 'verify_ecdsa_verify_k1', { + argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'] + returns: CryptoOpsContractReturns['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'] + }> + & Record<'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool' | 'verify_ecdsa_verify_r1', { + argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'] + returns: CryptoOpsContractReturns['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'] + }> + & Record<'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])' | 'verify_ecdsa_recover_k1', { + argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'] + returns: CryptoOpsContractReturns['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'] + }> + & Record<'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])' | 'verify_ecdsa_recover_r1', { + argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'] + returns: CryptoOpsContractReturns['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'] + }> + & Record<'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])' | 'verify_ecdsa_decompress_k1', { + argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'] + returns: CryptoOpsContractReturns['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'] + }> + & Record<'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])' | 'verify_ecdsa_decompress_r1', { + argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'] + returns: CryptoOpsContractReturns['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'] + }> + & Record<'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)' | 'verify_vrf_verify', { + argsObj: CryptoOpsContractArgs['obj']['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'] + returns: CryptoOpsContractReturns['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type CryptoOpsContractSignatures = keyof CryptoOpsContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type CryptoOpsContractNonVoidMethodSignatures = keyof CryptoOpsContractTypes['methods'] extends infer T ? T extends keyof CryptoOpsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the CryptoOpsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = CryptoOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the CryptoOpsContract smart contract to the method's return type + */ +export type MethodReturn = CryptoOpsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type CryptoOpsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type CryptoOpsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: CryptoOpsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the CryptoOpsContract smart contract + */ +export abstract class CryptoOpsContractParamsFactory { + /** + * Constructs a no op call for the verify_sha256(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySha256(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_sha256(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], + } + } + /** + * Constructs a no op call for the verify_sha3_256(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySha3_256(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_sha3_256(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], + } + } + /** + * Constructs a no op call for the verify_keccak_256(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyKeccak_256(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_keccak_256(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], + } + } + /** + * Constructs a no op call for the verify_sha512_256(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySha512_256(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_sha512_256(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], + } + } + /** + * Constructs a no op call for the verify_ed25519verify(byte[],byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEd25519verify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ed25519verify(byte[],byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_ed25519verify_bare(byte[],byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEd25519verifyBare(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ed25519verify_bare(byte[],byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEcdsaVerifyK1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d, params.args.e], + } + } + /** + * Constructs a no op call for the verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEcdsaVerifyR1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d, params.args.e], + } + } + /** + * Constructs a no op call for the verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[]) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEcdsaRecoverK1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d], + } + } + /** + * Constructs a no op call for the verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[]) ABI method + * + * Must fail, AVM does not support Secp256r1 for recover + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEcdsaRecoverR1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d], + } + } + /** + * Constructs a no op call for the verify_ecdsa_decompress_k1(byte[])(byte[],byte[]) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEcdsaDecompressK1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_ecdsa_decompress_r1(byte[])(byte[],byte[]) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEcdsaDecompressR1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_vrf_verify(byte[],byte[],byte[])(byte[],bool) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyVrfVerify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } +} + +/** + * A factory to create and deploy one or more instance of the CryptoOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class CryptoOpsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `CryptoOpsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new CryptoOpsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new CryptoOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the CryptoOpsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: CryptoOpsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new CryptoOpsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the CryptoOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the CryptoOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the CryptoOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new CryptoOpsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the CryptoOpsContract smart contract + */ +export class CryptoOpsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `CryptoOpsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the CryptoOpsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `CryptoOpsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `CryptoOpsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new CryptoOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `CryptoOpsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new CryptoOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the CryptoOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySha256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifySha256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha3_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySha3_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifySha3_256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_keccak_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyKeccak_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyKeccak_256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha512_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySha512_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifySha512_256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify(byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEd25519verify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEd25519verify(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify_bare(byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEd25519verifyBare: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEd25519verifyBare(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEcdsaVerifyK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyK1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEcdsaVerifyR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyR1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEcdsaRecoverK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverK1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. + * + * Must fail, AVM does not support Secp256r1 for recover + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEcdsaRecoverR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverR1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_k1(byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEcdsaDecompressK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressK1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_r1(byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEcdsaDecompressR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressR1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyVrfVerify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyVrfVerify(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the CryptoOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySha256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifySha256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha3_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySha3_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifySha3_256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_keccak_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyKeccak_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyKeccak_256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha512_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySha512_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifySha512_256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify(byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEd25519verify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEd25519verify(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify_bare(byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEd25519verifyBare: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEd25519verifyBare(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEcdsaVerifyK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyK1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEcdsaVerifyR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyR1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEcdsaRecoverK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverK1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. + * + * Must fail, AVM does not support Secp256r1 for recover + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEcdsaRecoverR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverR1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_k1(byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEcdsaDecompressK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressK1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_r1(byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEcdsaDecompressR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressR1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyVrfVerify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyVrfVerify(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the CryptoOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySha256: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifySha256(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_sha256(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha3_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySha3_256: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifySha3_256(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_sha3_256(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_keccak_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyKeccak_256: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyKeccak_256(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_keccak_256(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha512_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySha512_256: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifySha512_256(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_sha512_256(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify(byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEd25519verify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEd25519verify(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ed25519verify(byte[],byte[],byte[])bool'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify_bare(byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEd25519verifyBare: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEd25519verifyBare(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ed25519verify_bare(byte[],byte[],byte[])bool'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEcdsaVerifyK1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyK1(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEcdsaVerifyR1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyR1(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEcdsaRecoverK1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverK1(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. + * + * Must fail, AVM does not support Secp256r1 for recover + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEcdsaRecoverR1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverR1(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_k1(byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEcdsaDecompressK1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressK1(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_r1(byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEcdsaDecompressR1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressR1(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyVrfVerify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyVrfVerify(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new CryptoOpsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current CryptoOpsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): CryptoOpsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_sha256(byte[],uint64)byte[] method call against the CryptoOpsContract contract + */ + verifySha256(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySha256(params))) + return this + }, + /** + * Add a verify_sha3_256(byte[],uint64)byte[] method call against the CryptoOpsContract contract + */ + verifySha3_256(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySha3_256(params))) + return this + }, + /** + * Add a verify_keccak_256(byte[],uint64)byte[] method call against the CryptoOpsContract contract + */ + verifyKeccak_256(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyKeccak_256(params))) + return this + }, + /** + * Add a verify_sha512_256(byte[],uint64)byte[] method call against the CryptoOpsContract contract + */ + verifySha512_256(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySha512_256(params))) + return this + }, + /** + * Add a verify_ed25519verify(byte[],byte[],byte[])bool method call against the CryptoOpsContract contract + */ + verifyEd25519verify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEd25519verify(params))) + return this + }, + /** + * Add a verify_ed25519verify_bare(byte[],byte[],byte[])bool method call against the CryptoOpsContract contract + */ + verifyEd25519verifyBare(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEd25519verifyBare(params))) + return this + }, + /** + * Add a verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool method call against the CryptoOpsContract contract + */ + verifyEcdsaVerifyK1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaVerifyK1(params))) + return this + }, + /** + * Add a verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool method call against the CryptoOpsContract contract + */ + verifyEcdsaVerifyR1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaVerifyR1(params))) + return this + }, + /** + * Add a verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[]) method call against the CryptoOpsContract contract + */ + verifyEcdsaRecoverK1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaRecoverK1(params))) + return this + }, + /** + * Add a verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[]) method call against the CryptoOpsContract contract + */ + verifyEcdsaRecoverR1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaRecoverR1(params))) + return this + }, + /** + * Add a verify_ecdsa_decompress_k1(byte[])(byte[],byte[]) method call against the CryptoOpsContract contract + */ + verifyEcdsaDecompressK1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaDecompressK1(params))) + return this + }, + /** + * Add a verify_ecdsa_decompress_r1(byte[])(byte[],byte[]) method call against the CryptoOpsContract contract + */ + verifyEcdsaDecompressR1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaDecompressR1(params))) + return this + }, + /** + * Add a verify_vrf_verify(byte[],byte[],byte[])(byte[],bool) method call against the CryptoOpsContract contract + */ + verifyVrfVerify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyVrfVerify(params))) + return this + }, + /** + * Add a clear state call to the CryptoOpsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as CryptoOpsContractComposer + } +} +export type CryptoOpsContractComposer = { + /** + * Calls the verify_sha256(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySha256(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_sha256(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_sha3_256(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySha3_256(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_sha3_256(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_keccak_256(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyKeccak_256(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_keccak_256(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_sha512_256(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySha512_256(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_sha512_256(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_ed25519verify(byte[],byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEd25519verify(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ed25519verify(byte[],byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_ed25519verify_bare(byte[],byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEd25519verifyBare(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ed25519verify_bare(byte[],byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEcdsaVerifyK1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEcdsaVerifyR1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[]) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEcdsaRecoverK1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'] | undefined]> + + /** + * Calls the verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[]) ABI method. + * + * Must fail, AVM does not support Secp256r1 for recover + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEcdsaRecoverR1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'] | undefined]> + + /** + * Calls the verify_ecdsa_decompress_k1(byte[])(byte[],byte[]) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEcdsaDecompressK1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'] | undefined]> + + /** + * Calls the verify_ecdsa_decompress_r1(byte[])(byte[],byte[]) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEcdsaDecompressR1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'] | undefined]> + + /** + * Calls the verify_vrf_verify(byte[],byte[],byte[])(byte[],bool) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyVrfVerify(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the CryptoOpsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): CryptoOpsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): CryptoOpsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type CryptoOpsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/DynamicArrayInitContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/DynamicArrayInitContract.ts new file mode 100644 index 0000000..3ed4087 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/DynamicArrayInitContract.ts @@ -0,0 +1,755 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"DynamicArrayInitContract","structs":{},"methods":[{"name":"test_immutable_array_init","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_immutable_array_init_without_type_generic","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reference_array_init","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reference_array_init_without_type_generic","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDggMyAwCiAgICBieXRlY2Jsb2NrIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0ODAKICAgIC8vIGNsYXNzIER5bmFtaWNBcnJheUluaXRDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4ODQzNGJhMmEgMHg2M2FhYmJhMCAweGRiYWYwMzRlIDB4YTlkMTQ1NTQgLy8gbWV0aG9kICJ0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdCB0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljIHRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXQgdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDExOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5EeW5hbWljQXJyYXlJbml0Q29udHJhY3QudGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0ODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuRHluYW1pY0FycmF5SW5pdENvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkR5bmFtaWNBcnJheUluaXRDb250cmFjdC50ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNwogICAgLy8gYTEgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzMAogICAgLy8gYXNzZXJ0IGExLmxlbmd0aCA9PSBhMi5sZW5ndGgKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgLwogICAgaW50Y18yIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzMQogICAgLy8gYXNzZXJ0IGExWzBdID09IGEyWzBdCiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzMgogICAgLy8gYXNzZXJ0IGExWzFdID09IGEyWzFdCiAgICBkdXAKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzMKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhMlsyXQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzNwogICAgLy8gYXNzZXJ0IGExWzBdID09IGEzWzBdCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzgKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhM1sxXQogICAgZHVwCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTM5CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTNbMl0KICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQyCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGE0Lmxlbmd0aAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQzCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTRbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ0CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTRbMV0KICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0NQogICAgLy8gYXNzZXJ0IGExWzJdID09IGE0WzJdCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5EeW5hbWljQXJyYXlJbml0Q29udHJhY3QudGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpY1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NDkKICAgIC8vIGExID0gUmVmZXJlbmNlQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUyCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGEyLmxlbmd0aAogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUzCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTJbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU0CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTJbMV0KICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1NQogICAgLy8gYXNzZXJ0IGExWzJdID09IGEyWzJdCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU5CiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTNbMF0KICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU2MAogICAgLy8gYXNzZXJ0IGExWzFdID09IGEzWzFdCiAgICBkdXAKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjEKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhM1syXQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjQKICAgIC8vIGFzc2VydCBhMS5sZW5ndGggPT0gYTQubGVuZ3RoCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIGludGNfMiAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjUKICAgIC8vIGFzc2VydCBhMVswXSA9PSBhNFswXQogICAgZHVwCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjYKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhNFsxXQogICAgZHVwCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY3CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTRbMl0KICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAQgDACYBGAAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAzEbQQArMRkURDEYRIIEBIQ0uioEY6q7oATbrwNOBKnRRVQ2GgCOBAAJAAsADQBZADEZFDEYFBBDIkMiQyhHAhUjCiQSREklWyISREkjW4ECEkSBEFskEkRHAiVbIhJESSNbgQISRIEQWyQSREkVIwokEkRJJVsiEkRJI1uBAhJEgRBbJBJEIkMoRwIVIwokEkRJJVsiEkRJI1uBAhJEgRBbJBJERwIlWyISREkjW4ECEkSBEFskEkRJFSMKJBJESSVbIhJESSNbgQISRIEQWyQSRCJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the DynamicArrayInitContract contract + */ +export type DynamicArrayInitContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'test_immutable_array_init()void': Record + 'test_immutable_array_init_without_type_generic()void': Record + 'test_reference_array_init()void': Record + 'test_reference_array_init_without_type_generic()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'test_immutable_array_init()void': [] + 'test_immutable_array_init_without_type_generic()void': [] + 'test_reference_array_init()void': [] + 'test_reference_array_init_without_type_generic()void': [] + } +} + +/** + * The return type for each method + */ +export type DynamicArrayInitContractReturns = { + 'test_immutable_array_init()void': void + 'test_immutable_array_init_without_type_generic()void': void + 'test_reference_array_init()void': void + 'test_reference_array_init_without_type_generic()void': void +} + +/** + * Defines the types of available calls and state of the DynamicArrayInitContract smart contract. + */ +export type DynamicArrayInitContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'test_immutable_array_init()void' | 'test_immutable_array_init', { + argsObj: DynamicArrayInitContractArgs['obj']['test_immutable_array_init()void'] + argsTuple: DynamicArrayInitContractArgs['tuple']['test_immutable_array_init()void'] + returns: DynamicArrayInitContractReturns['test_immutable_array_init()void'] + }> + & Record<'test_immutable_array_init_without_type_generic()void' | 'test_immutable_array_init_without_type_generic', { + argsObj: DynamicArrayInitContractArgs['obj']['test_immutable_array_init_without_type_generic()void'] + argsTuple: DynamicArrayInitContractArgs['tuple']['test_immutable_array_init_without_type_generic()void'] + returns: DynamicArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'] + }> + & Record<'test_reference_array_init()void' | 'test_reference_array_init', { + argsObj: DynamicArrayInitContractArgs['obj']['test_reference_array_init()void'] + argsTuple: DynamicArrayInitContractArgs['tuple']['test_reference_array_init()void'] + returns: DynamicArrayInitContractReturns['test_reference_array_init()void'] + }> + & Record<'test_reference_array_init_without_type_generic()void' | 'test_reference_array_init_without_type_generic', { + argsObj: DynamicArrayInitContractArgs['obj']['test_reference_array_init_without_type_generic()void'] + argsTuple: DynamicArrayInitContractArgs['tuple']['test_reference_array_init_without_type_generic()void'] + returns: DynamicArrayInitContractReturns['test_reference_array_init_without_type_generic()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type DynamicArrayInitContractSignatures = keyof DynamicArrayInitContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the DynamicArrayInitContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = DynamicArrayInitContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the DynamicArrayInitContract smart contract to the method's return type + */ +export type MethodReturn = DynamicArrayInitContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type DynamicArrayInitContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type DynamicArrayInitContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: DynamicArrayInitContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the DynamicArrayInitContract smart contract + */ +export abstract class DynamicArrayInitContractParamsFactory { + /** + * Constructs a no op call for the test_immutable_array_init()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImmutableArrayInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_immutable_array_init()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_immutable_array_init_without_type_generic()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImmutableArrayInitWithoutTypeGeneric(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_immutable_array_init_without_type_generic()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_reference_array_init()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testReferenceArrayInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_reference_array_init()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_reference_array_init_without_type_generic()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testReferenceArrayInitWithoutTypeGeneric(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_reference_array_init_without_type_generic()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the DynamicArrayInitContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class DynamicArrayInitContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `DynamicArrayInitContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new DynamicArrayInitContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new DynamicArrayInitContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the DynamicArrayInitContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: DynamicArrayInitContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new DynamicArrayInitContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the DynamicArrayInitContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the DynamicArrayInitContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the DynamicArrayInitContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new DynamicArrayInitContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the DynamicArrayInitContract smart contract + */ +export class DynamicArrayInitContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `DynamicArrayInitContractClient` + * + * @param appClient An `AppClient` instance which has been created with the DynamicArrayInitContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `DynamicArrayInitContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `DynamicArrayInitContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new DynamicArrayInitContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `DynamicArrayInitContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new DynamicArrayInitContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the DynamicArrayInitContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImmutableArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInit(params)) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImmutableArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testReferenceArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInit(params)) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testReferenceArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the DynamicArrayInitContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImmutableArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInit(params)) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImmutableArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testReferenceArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInit(params)) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testReferenceArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the DynamicArrayInitContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImmutableArrayInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInit(params)) + return {...result, return: result.return as unknown as (undefined | DynamicArrayInitContractReturns['test_immutable_array_init()void'])} + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImmutableArrayInitWithoutTypeGeneric: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) + return {...result, return: result.return as unknown as (undefined | DynamicArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'])} + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testReferenceArrayInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInit(params)) + return {...result, return: result.return as unknown as (undefined | DynamicArrayInitContractReturns['test_reference_array_init()void'])} + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testReferenceArrayInitWithoutTypeGeneric: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) + return {...result, return: result.return as unknown as (undefined | DynamicArrayInitContractReturns['test_reference_array_init_without_type_generic()void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new DynamicArrayInitContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current DynamicArrayInitContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): DynamicArrayInitContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a test_immutable_array_init()void method call against the DynamicArrayInitContract contract + */ + testImmutableArrayInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArrayInit(params))) + return this + }, + /** + * Add a test_immutable_array_init_without_type_generic()void method call against the DynamicArrayInitContract contract + */ + testImmutableArrayInitWithoutTypeGeneric(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArrayInitWithoutTypeGeneric(params))) + return this + }, + /** + * Add a test_reference_array_init()void method call against the DynamicArrayInitContract contract + */ + testReferenceArrayInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testReferenceArrayInit(params))) + return this + }, + /** + * Add a test_reference_array_init_without_type_generic()void method call against the DynamicArrayInitContract contract + */ + testReferenceArrayInitWithoutTypeGeneric(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testReferenceArrayInitWithoutTypeGeneric(params))) + return this + }, + /** + * Add a clear state call to the DynamicArrayInitContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as DynamicArrayInitContractComposer + } +} +export type DynamicArrayInitContractComposer = { + /** + * Calls the test_immutable_array_init()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImmutableArrayInit(params?: CallParams): DynamicArrayInitContractComposer<[...TReturns, DynamicArrayInitContractReturns['test_immutable_array_init()void'] | undefined]> + + /** + * Calls the test_immutable_array_init_without_type_generic()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImmutableArrayInitWithoutTypeGeneric(params?: CallParams): DynamicArrayInitContractComposer<[...TReturns, DynamicArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'] | undefined]> + + /** + * Calls the test_reference_array_init()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testReferenceArrayInit(params?: CallParams): DynamicArrayInitContractComposer<[...TReturns, DynamicArrayInitContractReturns['test_reference_array_init()void'] | undefined]> + + /** + * Calls the test_reference_array_init_without_type_generic()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testReferenceArrayInitWithoutTypeGeneric(params?: CallParams): DynamicArrayInitContractComposer<[...TReturns, DynamicArrayInitContractReturns['test_reference_array_init_without_type_generic()void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the DynamicArrayInitContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): DynamicArrayInitContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): DynamicArrayInitContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type DynamicArrayInitContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/DynamicItxnGroup.ts b/examples/p-py/projects/p-py-frontend/src/contracts/DynamicItxnGroup.ts new file mode 100644 index 0000000..8c63c52 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/DynamicItxnGroup.ts @@ -0,0 +1,629 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"DynamicItxnGroup","structs":{},"methods":[{"name":"test_firstly","args":[{"type":"address[]","name":"addresses"},{"type":"pay","name":"funds"},{"type":"uint64","name":"verifier"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_looply","args":[{"type":"address[]","name":"addresses"},{"type":"pay","name":"funds"},{"type":"uint64","name":"verifier"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[85,217],"errorMessage":"Funds must be sent to app"},{"pc":[141,250],"errorMessage":"index access is out of bounds"},{"pc":[89,220],"errorMessage":"invalid array length header"},{"pc":[94,225],"errorMessage":"must provide some accounts"},{"pc":[72,204],"errorMessage":"transaction type is pay"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgNgogICAgYnl0ZWNibG9jayAweDY1YTlhZWNjICJhYmMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBjbGFzcyBEeW5hbWljSXR4bkdyb3VwKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHgxNzM5MTc4NCAweDNmMTBhZWE3IC8vIG1ldGhvZCAidGVzdF9maXJzdGx5KGFkZHJlc3NbXSxwYXksdWludDY0KXZvaWQiLCBtZXRob2QgInRlc3RfbG9vcGx5KGFkZHJlc3NbXSxwYXksdWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB0ZXN0X2ZpcnN0bHkgdGVzdF9sb29wbHkKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuZHluYW1pY19pdHhuX2dyb3VwLmNvbnRyYWN0LkR5bmFtaWNJdHhuR3JvdXAudGVzdF9maXJzdGx5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9maXJzdGx5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MTgKICAgIC8vIGFzc2VydCBmdW5kcy5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLCAiRnVuZHMgbXVzdCBiZSBzZW50IHRvIGFwcCIKICAgIGR1cAogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEZ1bmRzIG11c3QgYmUgc2VudCB0byBhcHAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MjAKICAgIC8vIGFzc2VydCBhZGRyZXNzZXMubGVuZ3RoLCAibXVzdCBwcm92aWRlIHNvbWUgYWNjb3VudHMiCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBhc3NlcnQgLy8gbXVzdCBwcm92aWRlIHNvbWUgYWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MjIKICAgIC8vIHNoYXJlID0gZnVuZHMuYW1vdW50IC8vIGFkZHJlc3Nlcy5sZW5ndGgKICAgIHN3YXAKICAgIGd0eG5zIEFtb3VudAogICAgc3dhcAogICAgLwogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBpdHhuLlBheW1lbnQoYW1vdW50PXNoYXJlLCByZWNlaXZlcj1hZGRyZXNzZXNbMF0ubmF0aXZlKS5zdGFnZShiZWdpbl9ncm91cD1UcnVlKQogICAgaXR4bl9iZWdpbgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBleHRyYWN0IDIgMzIKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpbnRjXzAgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MjYKICAgIC8vIGZvciBpIGluIHVyYW5nZSgxLCBhZGRyZXNzZXMubGVuZ3RoKToKICAgIGludGNfMCAvLyAxCgp0ZXN0X2ZpcnN0bHlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weToyNgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGFkZHJlc3Nlcy5sZW5ndGgpOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogdGVzdF9maXJzdGx5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBhZGRyID0gYWRkcmVzc2VzW2ldCiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAzMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBpdHhuLlBheW1lbnQoYW1vdW50PXNoYXJlLCByZWNlaXZlcj1hZGRyLm5hdGl2ZSkuc3RhZ2UoKQogICAgaXR4bl9uZXh0CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBkaWcgMwogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGludGNfMCAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weToyNgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGFkZHJlc3Nlcy5sZW5ndGgpOgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2ZpcnN0bHlfZm9yX2hlYWRlckAyCgp0ZXN0X2ZpcnN0bHlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjMwLTMyCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9dmVyaWZpZXIuaWQsIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJ2ZXJpZnkoKXZvaWQiKSwpCiAgICAvLyApLnN0YWdlKCkKICAgIGl0eG5fbmV4dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTozMQogICAgLy8gYXBwX2lkPXZlcmlmaWVyLmlkLCBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgidmVyaWZ5KCl2b2lkIiksKQogICAgYnl0ZWNfMCAvLyBtZXRob2QgInZlcmlmeSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MzQKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoYXNzZXRfbmFtZT0iYWJjIikuc3RhZ2UoKQogICAgaXR4bl9uZXh0CiAgICBieXRlY18xIC8vICJhYmMiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TmFtZQogICAgcHVzaGludCAzIC8vIGFjZmcKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTozNgogICAgLy8gaXR4bi5zdWJtaXRfc3RhZ2VkKCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuZHluYW1pY19pdHhuX2dyb3VwLmNvbnRyYWN0LkR5bmFtaWNJdHhuR3JvdXAudGVzdF9sb29wbHlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2xvb3BseToKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBhc3NlcnQgZnVuZHMucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywgIkZ1bmRzIG11c3QgYmUgc2VudCB0byBhcHAiCiAgICBkdXAKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBGdW5kcyBtdXN0IGJlIHNlbnQgdG8gYXBwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBhc3NlcnQgYWRkcmVzc2VzLmxlbmd0aCwgIm11c3QgcHJvdmlkZSBzb21lIGFjY291bnRzIgogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBhc3NlcnQgLy8gbXVzdCBwcm92aWRlIHNvbWUgYWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NDkKICAgIC8vIHNoYXJlID0gZnVuZHMuYW1vdW50IC8vIGFkZHJlc3Nlcy5sZW5ndGgKICAgIHN3YXAKICAgIGd0eG5zIEFtb3VudAogICAgc3dhcAogICAgLwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTo1MQogICAgLy8gaXNfZmlyc3QgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgaW50Y18xIC8vIDAKCnRlc3RfbG9vcGx5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NTIKICAgIC8vIGZvciBhZGRyIGluIGFkZHJlc3NlczoKICAgIGR1cAogICAgZGlnIDQKICAgIDwKICAgIGJ6IHRlc3RfbG9vcGx5X2FmdGVyX2ZvckA4CiAgICBkaWcgNQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMzIKICAgICoKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidXJ5IDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NTQKICAgIC8vIG15X3R4bi5zdGFnZShiZWdpbl9ncm91cD1pc19maXJzdCkKICAgIGRpZyAxCiAgICBieiB0ZXN0X2xvb3BseV9pdHhuX25leHRANQogICAgaXR4bl9iZWdpbgoKdGVzdF9sb29wbHlfYWZ0ZXJfaXR4bl9iZWdpbl9uZXh0QDY6CiAgICBkaWcgNgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZGlnIDIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBteV90eG4gPSBpdHhuLlBheW1lbnQoYW1vdW50PXNoYXJlLCByZWNlaXZlcj1hZGRyLm5hdGl2ZSkKICAgIGludGNfMCAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTo1NQogICAgLy8gaXNfZmlyc3QgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGJ1cnkgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfbG9vcGx5X2Zvcl9oZWFkZXJAMgoKdGVzdF9sb29wbHlfaXR4bl9uZXh0QDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBteV90eG4uc3RhZ2UoYmVnaW5fZ3JvdXA9aXNfZmlyc3QpCiAgICBpdHhuX25leHQKICAgIGIgdGVzdF9sb29wbHlfYWZ0ZXJfaXR4bl9iZWdpbl9uZXh0QDYKCnRlc3RfbG9vcGx5X2FmdGVyX2ZvckA4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTo1Ny01OQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPXZlcmlmaWVyLmlkLCBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgidmVyaWZ5KCl2b2lkIiksKQogICAgLy8gKS5zdGFnZSgpCiAgICBpdHhuX25leHQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NTgKICAgIC8vIGFwcF9pZD12ZXJpZmllci5pZCwgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoInZlcmlmeSgpdm9pZCIpLCkKICAgIGJ5dGVjXzAgLy8gbWV0aG9kICJ2ZXJpZnkoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTo1NwogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKGFzc2V0X25hbWU9ImFiYyIpLnN0YWdlKCkKICAgIGl0eG5fbmV4dAogICAgYnl0ZWNfMSAvLyAiYWJjIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIHB1c2hpbnQgMyAvLyBhY2ZnCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NjMKICAgIC8vIGl0eG4uc3VibWl0X3N0YWdlZCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTozOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAQAgBiYCBGWprswDYWJjMRtBAB0xGRREMRhEggIEFzkXhAQ/EK6nNhoAjgIACQCLADEZFDEYFBBDNhoBMRYiCUk4ECISRDYaAhdOAkk4BzIKEkRLASNZSU4DSURMOAhMCklOArFLAVcCAE4CTFcCILIHsggishAjsgEiSUsEDEEAHUcCJAtLA0wkWLayB0sDsggishAjsgEiCEUBQv/ctiiyGksEshglshAjsgG2KbImgQOyECOyAbMiQyM2GgFJMRYiCUk4ECISRDYaAhdOAkk4BzIKEkRMI1lJTgJJREw4CEwKIiNJSwQMQQAwSwVXAgBLASQLJFhFB0sBQQAasUsGsgdLArIIIrIQI7IBI0UCSSIIRQFC/822Qv/jtiiyGksEshglshAjsgG2KbImgQOyECOyAbMiQw==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the DynamicItxnGroup contract + */ +export type DynamicItxnGroupArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'test_firstly(address[],pay,uint64)void': { + addresses: string[] + funds: AppMethodCallTransactionArgument + verifier: bigint | number + } + 'test_looply(address[],pay,uint64)void': { + addresses: string[] + funds: AppMethodCallTransactionArgument + verifier: bigint | number + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'test_firstly(address[],pay,uint64)void': [addresses: string[], funds: AppMethodCallTransactionArgument, verifier: bigint | number] + 'test_looply(address[],pay,uint64)void': [addresses: string[], funds: AppMethodCallTransactionArgument, verifier: bigint | number] + } +} + +/** + * The return type for each method + */ +export type DynamicItxnGroupReturns = { + 'test_firstly(address[],pay,uint64)void': void + 'test_looply(address[],pay,uint64)void': void +} + +/** + * Defines the types of available calls and state of the DynamicItxnGroup smart contract. + */ +export type DynamicItxnGroupTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'test_firstly(address[],pay,uint64)void' | 'test_firstly', { + argsObj: DynamicItxnGroupArgs['obj']['test_firstly(address[],pay,uint64)void'] + argsTuple: DynamicItxnGroupArgs['tuple']['test_firstly(address[],pay,uint64)void'] + returns: DynamicItxnGroupReturns['test_firstly(address[],pay,uint64)void'] + }> + & Record<'test_looply(address[],pay,uint64)void' | 'test_looply', { + argsObj: DynamicItxnGroupArgs['obj']['test_looply(address[],pay,uint64)void'] + argsTuple: DynamicItxnGroupArgs['tuple']['test_looply(address[],pay,uint64)void'] + returns: DynamicItxnGroupReturns['test_looply(address[],pay,uint64)void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type DynamicItxnGroupSignatures = keyof DynamicItxnGroupTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the DynamicItxnGroup smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = DynamicItxnGroupTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the DynamicItxnGroup smart contract to the method's return type + */ +export type MethodReturn = DynamicItxnGroupTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type DynamicItxnGroupCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type DynamicItxnGroupDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: DynamicItxnGroupCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the DynamicItxnGroup smart contract + */ +export abstract class DynamicItxnGroupParamsFactory { + /** + * Constructs a no op call for the test_firstly(address[],pay,uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testFirstly(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_firstly(address[],pay,uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.addresses, params.args.funds, params.args.verifier], + } + } + /** + * Constructs a no op call for the test_looply(address[],pay,uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testLooply(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_looply(address[],pay,uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.addresses, params.args.funds, params.args.verifier], + } + } +} + +/** + * A factory to create and deploy one or more instance of the DynamicItxnGroup smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class DynamicItxnGroupFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `DynamicItxnGroupFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new DynamicItxnGroupClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new DynamicItxnGroupClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the DynamicItxnGroup smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: DynamicItxnGroupDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new DynamicItxnGroupClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the DynamicItxnGroup smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the DynamicItxnGroup smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the DynamicItxnGroup smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new DynamicItxnGroupClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the DynamicItxnGroup smart contract + */ +export class DynamicItxnGroupClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `DynamicItxnGroupClient` + * + * @param appClient An `AppClient` instance which has been created with the DynamicItxnGroup app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `DynamicItxnGroupClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `DynamicItxnGroupClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new DynamicItxnGroupClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `DynamicItxnGroupClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new DynamicItxnGroupClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the DynamicItxnGroup smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the DynamicItxnGroup smart contract using the `test_firstly(address[],pay,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testFirstly: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(DynamicItxnGroupParamsFactory.testFirstly(params)) + }, + + /** + * Makes a call to the DynamicItxnGroup smart contract using the `test_looply(address[],pay,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testLooply: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(DynamicItxnGroupParamsFactory.testLooply(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the DynamicItxnGroup smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the DynamicItxnGroup smart contract using the `test_firstly(address[],pay,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testFirstly: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(DynamicItxnGroupParamsFactory.testFirstly(params)) + }, + + /** + * Makes a call to the DynamicItxnGroup smart contract using the `test_looply(address[],pay,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testLooply: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(DynamicItxnGroupParamsFactory.testLooply(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the DynamicItxnGroup smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the DynamicItxnGroup smart contract using the `test_firstly(address[],pay,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testFirstly: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(DynamicItxnGroupParamsFactory.testFirstly(params)) + return {...result, return: result.return as unknown as (undefined | DynamicItxnGroupReturns['test_firstly(address[],pay,uint64)void'])} + }, + + /** + * Makes a call to the DynamicItxnGroup smart contract using the `test_looply(address[],pay,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testLooply: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(DynamicItxnGroupParamsFactory.testLooply(params)) + return {...result, return: result.return as unknown as (undefined | DynamicItxnGroupReturns['test_looply(address[],pay,uint64)void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new DynamicItxnGroupClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current DynamicItxnGroup app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): DynamicItxnGroupComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a test_firstly(address[],pay,uint64)void method call against the DynamicItxnGroup contract + */ + testFirstly(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testFirstly(params))) + return this + }, + /** + * Add a test_looply(address[],pay,uint64)void method call against the DynamicItxnGroup contract + */ + testLooply(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testLooply(params))) + return this + }, + /** + * Add a clear state call to the DynamicItxnGroup contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as DynamicItxnGroupComposer + } +} +export type DynamicItxnGroupComposer = { + /** + * Calls the test_firstly(address[],pay,uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testFirstly(params?: CallParams): DynamicItxnGroupComposer<[...TReturns, DynamicItxnGroupReturns['test_firstly(address[],pay,uint64)void'] | undefined]> + + /** + * Calls the test_looply(address[],pay,uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testLooply(params?: CallParams): DynamicItxnGroupComposer<[...TReturns, DynamicItxnGroupReturns['test_looply(address[],pay,uint64)void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the DynamicItxnGroup smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): DynamicItxnGroupComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): DynamicItxnGroupComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type DynamicItxnGroupComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateContract.ts new file mode 100644 index 0000000..0d69d22 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateContract.ts @@ -0,0 +1,2649 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"GlobalStateContract","structs":{},"methods":[{"name":"get_implicit_key_arc4_uint","args":[],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_string","args":[],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_byte","args":[],"returns":{"type":"byte"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_bool","args":[],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_address","args":[],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_uint128","args":[],"returns":{"type":"uint128"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_dynamic_bytes","args":[],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_tuple","args":[],"returns":{"type":"(uint64,byte[],bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_uint","args":[],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_string","args":[],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_byte","args":[],"returns":{"type":"byte"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_bool","args":[],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_address","args":[],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_uint128","args":[],"returns":{"type":"uint128"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_dynamic_bytes","args":[],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_uint","args":[{"type":"uint64","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_string","args":[{"type":"string","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_byte","args":[{"type":"byte","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_bool","args":[{"type":"bool","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_address","args":[{"type":"address","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_uint128","args":[{"type":"uint128","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_dynamic_bytes","args":[{"type":"byte[]","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_tuple","args":[{"type":"(uint64,byte[],bool)","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_uint","args":[{"type":"uint64","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_string","args":[{"type":"string","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_byte","args":[{"type":"byte","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_bool","args":[{"type":"bool","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_address","args":[{"type":"address","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_uint128","args":[{"type":"uint128","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_dynamic_bytes","args":[{"type":"byte[]","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":15},"local":{"ints":0,"bytes":0}},"keys":{"global":{"implicit_key_arc4_uint":{"keyType":"AVMString","valueType":"uint64","key":"aW1wbGljaXRfa2V5X2FyYzRfdWludA=="},"implicit_key_arc4_string":{"keyType":"AVMString","valueType":"string","key":"aW1wbGljaXRfa2V5X2FyYzRfc3RyaW5n"},"implicit_key_arc4_byte":{"keyType":"AVMString","valueType":"byte","key":"aW1wbGljaXRfa2V5X2FyYzRfYnl0ZQ=="},"implicit_key_arc4_bool":{"keyType":"AVMString","valueType":"bool","key":"aW1wbGljaXRfa2V5X2FyYzRfYm9vbA=="},"implicit_key_arc4_address":{"keyType":"AVMString","valueType":"address","key":"aW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcw=="},"implicit_key_arc4_uint128":{"keyType":"AVMString","valueType":"uint128","key":"aW1wbGljaXRfa2V5X2FyYzRfdWludDEyOA=="},"implicit_key_arc4_dynamic_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"aW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcw=="},"implicit_key_tuple":{"keyType":"AVMString","valueType":"(uint64,byte[],bool)","key":"aW1wbGljaXRfa2V5X3R1cGxl"},"arc4_uint":{"keyType":"AVMString","valueType":"uint64","key":"ZXhwbGljaXRfa2V5X2FyYzRfdWludA=="},"arc4_string":{"keyType":"AVMString","valueType":"string","key":"ZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5n"},"arc4_byte":{"keyType":"AVMString","valueType":"byte","key":"ZXhwbGljaXRfa2V5X2FyYzRfYnl0ZQ=="},"arc4_bool":{"keyType":"AVMString","valueType":"bool","key":"ZXhwbGljaXRfa2V5X2FyYzRfYm9vbA=="},"arc4_address":{"keyType":"AVMString","valueType":"address","key":"ZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcw=="},"arc4_uint128":{"keyType":"AVMString","valueType":"uint128","key":"ZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOA=="},"arc4_dynamic_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"ZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcw=="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[906],"errorMessage":"check self.arc4_address exists"},{"pc":[895],"errorMessage":"check self.arc4_bool exists"},{"pc":[884],"errorMessage":"check self.arc4_byte exists"},{"pc":[928],"errorMessage":"check self.arc4_dynamic_bytes exists"},{"pc":[873],"errorMessage":"check self.arc4_string exists"},{"pc":[862],"errorMessage":"check self.arc4_uint exists"},{"pc":[917],"errorMessage":"check self.arc4_uint128 exists"},{"pc":[818],"errorMessage":"check self.implicit_key_arc4_address exists"},{"pc":[807],"errorMessage":"check self.implicit_key_arc4_bool exists"},{"pc":[796],"errorMessage":"check self.implicit_key_arc4_byte exists"},{"pc":[840],"errorMessage":"check self.implicit_key_arc4_dynamic_bytes exists"},{"pc":[786],"errorMessage":"check self.implicit_key_arc4_string exists"},{"pc":[776],"errorMessage":"check self.implicit_key_arc4_uint exists"},{"pc":[829],"errorMessage":"check self.implicit_key_arc4_uint128 exists"},{"pc":[851],"errorMessage":"check self.implicit_key_tuple exists"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIgImltcGxpY2l0X2tleV9hcmM0X3N0cmluZyIgImltcGxpY2l0X2tleV9hcmM0X2J5dGUiICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIiAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAiaW1wbGljaXRfa2V5X3R1cGxlIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIgImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIgImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIiAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAweDAwMDAwMDAwMDAwMDA1MzkgMHgwMDA1NDg2NTZjNmM2ZiAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE1LTUxNgogICAgLy8gIyBJbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQgPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQ2NCgxMzM3KSkKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlYyAxNiAvLyAweDAwMDAwMDAwMDAwMDA1MzkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE3CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyA9IEdsb2JhbFN0YXRlKGFyYzQuU3RyaW5nKCJIZWxsbyIpKQogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYnl0ZWMgMTcgLy8gMHgwMDA1NDg2NTZjNmM2ZgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSA9IEdsb2JhbFN0YXRlKGFyYzQuQnl0ZSgwKSkKICAgIGJ5dGVjXzMgLy8gImltcGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTkKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbCA9IEdsb2JhbFN0YXRlKGFyYzQuQm9vbChUcnVlKSkKICAgIGJ5dGVjIDQgLy8gImltcGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjAKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyA9IEdsb2JhbFN0YXRlKGFyYzQuQWRkcmVzcyhHbG9iYWwuY3JlYXRvcl9hZGRyZXNzKSkKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTIxCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQxMjgoMioqMTAwKSkKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBieXRlYyAxOCAvLyAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyMgogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzID0gR2xvYmFsU3RhdGUoYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikpCiAgICBieXRlYyA3IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYnl0ZWMgMTkgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV90dXBsZSA9IEdsb2JhbFN0YXRlKChVSW50NjQoMTApLCBCeXRlcyhiInRlc3QiKSwgRmFsc2UpKQogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwYTAwMGIwMDAwMDQ3NDY1NzM3NAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjUtNTI2CiAgICAvLyAjIEV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIHNlbGYuYXJjNF91aW50ID0gR2xvYmFsU3RhdGUoYXJjNC5VSW50NjQoMTMzNyksIGtleT0iZXhwbGljaXRfa2V5X2FyYzRfdWludCIpCiAgICBieXRlYyA5IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYnl0ZWMgMTYgLy8gMHgwMDAwMDAwMDAwMDAwNTM5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyNwogICAgLy8gc2VsZi5hcmM0X3N0cmluZyA9IEdsb2JhbFN0YXRlKGFyYzQuU3RyaW5nKCJIZWxsbyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIpCiAgICBieXRlYyAxMCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUxNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcgPSBHbG9iYWxTdGF0ZShhcmM0LlN0cmluZygiSGVsbG8iKSkKICAgIGJ5dGVjIDE3IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjcKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmcgPSBHbG9iYWxTdGF0ZShhcmM0LlN0cmluZygiSGVsbG8iKSwga2V5PSJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjgKICAgIC8vIHNlbGYuYXJjNF9ieXRlID0gR2xvYmFsU3RhdGUoYXJjNC5CeXRlKDApLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiKQogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjkKICAgIC8vIHNlbGYuYXJjNF9ib29sID0gR2xvYmFsU3RhdGUoYXJjNC5Cb29sKFRydWUpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiKQogICAgYnl0ZWMgMTIgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2wgPSBHbG9iYWxTdGF0ZShhcmM0LkJvb2woVHJ1ZSkpCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyOQogICAgLy8gc2VsZi5hcmM0X2Jvb2wgPSBHbG9iYWxTdGF0ZShhcmM0LkJvb2woVHJ1ZSksIGtleT0iZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIpCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMQogICAgLy8gYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMC01MzIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMwogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjggPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQxMjgoMioqMTAwKSwga2V5PSJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IikKICAgIGJ5dGVjIDE0IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYnl0ZWMgMTggLy8gMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzUKICAgIC8vIGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICBieXRlYyAxNSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjIKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyA9IEdsb2JhbFN0YXRlKGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpKQogICAgYnl0ZWMgMTkgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzQtNTM2CiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyA9IEdsb2JhbFN0YXRlKAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTEzCiAgICAvLyBjbGFzcyBHbG9iYWxTdGF0ZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzOQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4MWNjOTY2ZWUgMHgyMzY3Y2Q0YiAweDY5MTI4ZTkwIDB4NjhkNTkwZTIgMHg0NGVmMDY4MSAweDFjZDI5NGVjIDB4YWFjOGVjYjEgMHgxNjZjNmFmZCAweDNjYzNiYjdiIDB4OWE2OTQ2YWQgMHhkZWQ3NTAzMyAweDY2Mjc5ZTkzIDB4MDk2ZTkyN2IgMHg5NzUzMWZiYyAweDZlYTNmOTk2IDB4YTdmNGY0MDIgMHhhYWRkY2M0YyAweDVlYzMxMTZkIDB4MjBmNTZlZWUgMHgxYzE0OWE0MyAweGE1NzVhYzdkIDB4ODdmMDg2OWIgMHg0NjFhZmM2ZCAweDA0ODExNmVhIDB4MzBlMzRhOTMgMHhkMmU2NDZlZiAweGU2NzRhMjcwIDB4YTg3ZTU0MGQgMHg3MjBhM2NhMCAweDI1NzcwOGY3IC8vIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQoKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZygpc3RyaW5nIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSgpYnl0ZSIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woKWJvb2wiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKClhZGRyZXNzIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCgpdWludDEyOCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMoKWJ5dGVbXSIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV90dXBsZSgpKHVpbnQ2NCxieXRlW10sYm9vbCkiLCBtZXRob2QgImdldF9hcmM0X3VpbnQoKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2FyYzRfc3RyaW5nKClzdHJpbmciLCBtZXRob2QgImdldF9hcmM0X2J5dGUoKWJ5dGUiLCBtZXRob2QgImdldF9hcmM0X2Jvb2woKWJvb2wiLCBtZXRob2QgImdldF9hcmM0X2FkZHJlc3MoKWFkZHJlc3MiLCBtZXRob2QgImdldF9hcmM0X3VpbnQxMjgoKXVpbnQxMjgiLCBtZXRob2QgImdldF9hcmM0X2R5bmFtaWNfYnl0ZXMoKWJ5dGVbXSIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQodWludDY0KXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcoc3RyaW5nKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKGJ5dGUpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woYm9vbCl2b2lkIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyhhZGRyZXNzKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4KHVpbnQxMjgpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMoYnl0ZVtdKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfdHVwbGUoKHVpbnQ2NCxieXRlW10sYm9vbCkpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfdWludCh1aW50NjQpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfc3RyaW5nKHN0cmluZyl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9ieXRlKGJ5dGUpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfYm9vbChib29sKXZvaWQiLCBtZXRob2QgInNldF9hcmM0X2FkZHJlc3MoYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF91aW50MTI4KHVpbnQxMjgpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfZHluYW1pY19ieXRlcyhieXRlW10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50IGdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGUgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2wgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMgZ2V0X2ltcGxpY2l0X2tleV90dXBsZSBnZXRfYXJjNF91aW50IGdldF9hcmM0X3N0cmluZyBnZXRfYXJjNF9ieXRlIGdldF9hcmM0X2Jvb2wgZ2V0X2FyYzRfYWRkcmVzcyBnZXRfYXJjNF91aW50MTI4IGdldF9hcmM0X2R5bmFtaWNfYnl0ZXMgc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQgc2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBzZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSBzZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCBzZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCBzZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBzZXRfaW1wbGljaXRfa2V5X3R1cGxlIHNldF9hcmM0X3VpbnQgc2V0X2FyYzRfc3RyaW5nIHNldF9hcmM0X2J5dGUgc2V0X2FyYzRfYm9vbCBzZXRfYXJjNF9hZGRyZXNzIHNldF9hcmM0X3VpbnQxMjggc2V0X2FyYzRfZHluYW1pY19ieXRlcwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDM5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0MQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludCBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzgtNTM5CiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0NQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NDkKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTUzCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1NwogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NjEKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTY1CiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NjkKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV90dXBsZS52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDggLy8gImltcGxpY2l0X2tleV90dXBsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGUgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU3NAogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50LnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X3VpbnQgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTcxLTU3MgogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgZXhwbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTc4CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3N0cmluZy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9zdHJpbmcgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4MgogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9ieXRlLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ieXRlIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1ODYKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYm9vbC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfYm9vbCBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTkwCiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2FkZHJlc3MudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X2FkZHJlc3MgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5NAogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50MTI4LnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF91aW50MTI4IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OTgKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfZHluYW1pY19ieXRlcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDMKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludC52YWx1ZSA9IHZhbHVlCiAgICBieXRlY18xIC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwMC02MDEKICAgIC8vICMgU2V0dGVyIG1ldGhvZHMgZm9yIGltcGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjAzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDAtNjAxCiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDcKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjExCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWNfMyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjExCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTUKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyA0IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTUKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxOQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxOQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4W3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgNiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjcKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcy52YWx1ZSA9IHZhbHVlLmNvcHkoKQogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI3CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMudmFsdWUgPSB2YWx1ZS5jb3B5KCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfdHVwbGVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzMQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzEKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gc2VsZi5hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzMtNjM0CiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gc2VsZi5hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzMtNjM0CiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X3N0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDAKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmcudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTAgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQwCiAgICAvLyBzZWxmLmFyYzRfc3RyaW5nLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NAogICAgLy8gc2VsZi5hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NAogICAgLy8gc2VsZi5hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfYm9vbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ4CiAgICAvLyBzZWxmLmFyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyAxMiAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ4CiAgICAvLyBzZWxmLmFyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2FyYzRfYWRkcmVzczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjIDEzIC8vICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfZHluYW1pY19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjYwCiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlcy52YWx1ZSA9IHZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMTUgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY2MAogICAgLy8gc2VsZi5hcmM0X2R5bmFtaWNfYnl0ZXMudmFsdWUgPSB2YWx1ZS5jb3B5KCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmFAQVH3x1FmltcGxpY2l0X2tleV9hcmM0X3VpbnQYaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nFmltcGxpY2l0X2tleV9hcmM0X2J5dGUWaW1wbGljaXRfa2V5X2FyYzRfYm9vbBlpbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzGWltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcxJpbXBsaWNpdF9rZXlfdHVwbGUWZXhwbGljaXRfa2V5X2FyYzRfdWludBhleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmcWZXhwbGljaXRfa2V5X2FyYzRfYnl0ZRZleHBsaWNpdF9rZXlfYXJjNF9ib29sGWV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MZZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOB9leHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzCAAAAAAAAAU5BwAFSGVsbG8QAAAAEAAAAAAAAAAAAAAAAA8ADWR5bmFtaWMgYnl0ZXMxGEAAXSknEGcqJxFnK4ABAGcnBIABgGcnBTIJZycGJxJnJwcnE2cnCIARAAAAAAAAAAoACwAABHRlc3RnJwknEGcnCicRZycLgAEAZycMgAGAZycNMglnJw4nEmcnDycTZzEbQQDhMRkURDEYRIIeBBzJZu4EI2fNSwRpEo6QBGjVkOIERO8GgQQc0pTsBKrI7LEEFmxq/QQ8w7t7BJppRq0E3tdQMwRmJ56TBAluknsEl1MfvARuo/mWBKf09AIEqt3MTARewxFtBCD1bu4EHBSaQwSldax9BIfwhpsERhr8bQQEgRbqBDDjSpME0uZG7wTmdKJwBKh+VA0Ecgo8oAQldwj3NhoAjh4ACQATAB0AJwAyAD0ASABTAF4AaQB0AH8AigCVAKAAqwCyALkAwADIANAA2ADgAOgA8AD4AQABCAEQARgAMRkUMRgUEEMjKWVEKExQsCJDIyplRChMULAiQyMrZUQoTFCwIkMjJwRlRChMULAiQyMnBWVEKExQsCJDIycGZUQoTFCwIkMjJwdlRChMULAiQyMnCGVEKExQsCJDIycJZUQoTFCwIkMjJwplRChMULAiQyMnC2VEKExQsCJDIycMZUQoTFCwIkMjJw1lRChMULAiQyMnDmVEKExQsCJDIycPZUQoTFCwIkMpNhoBZyJDKjYaAWciQys2GgFnIkMnBDYaAWciQycFNhoBZyJDJwY2GgFnIkMnBzYaAWciQycINhoBZyJDJwk2GgFnIkMnCjYaAWciQycLNhoBZyJDJww2GgFnIkMnDTYaAWciQycONhoBZyJDJw82GgFnIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the GlobalStateContract contract + */ +export type GlobalStateContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'get_implicit_key_arc4_uint()uint64': Record + 'get_implicit_key_arc4_string()string': Record + 'get_implicit_key_arc4_byte()byte': Record + 'get_implicit_key_arc4_bool()bool': Record + 'get_implicit_key_arc4_address()address': Record + 'get_implicit_key_arc4_uint128()uint128': Record + 'get_implicit_key_arc4_dynamic_bytes()byte[]': Record + 'get_implicit_key_tuple()(uint64,byte[],bool)': Record + 'get_arc4_uint()uint64': Record + 'get_arc4_string()string': Record + 'get_arc4_byte()byte': Record + 'get_arc4_bool()bool': Record + 'get_arc4_address()address': Record + 'get_arc4_uint128()uint128': Record + 'get_arc4_dynamic_bytes()byte[]': Record + 'set_implicit_key_arc4_uint(uint64)void': { + value: bigint | number + } + 'set_implicit_key_arc4_string(string)void': { + value: string + } + 'set_implicit_key_arc4_byte(byte)void': { + value: number + } + 'set_implicit_key_arc4_bool(bool)void': { + value: boolean + } + 'set_implicit_key_arc4_address(address)void': { + value: string + } + 'set_implicit_key_arc4_uint128(uint128)void': { + value: bigint | number + } + 'set_implicit_key_arc4_dynamic_bytes(byte[])void': { + value: Uint8Array + } + 'set_implicit_key_tuple((uint64,byte[],bool))void': { + value: [bigint | number, Uint8Array, boolean] + } + 'set_arc4_uint(uint64)void': { + value: bigint | number + } + 'set_arc4_string(string)void': { + value: string + } + 'set_arc4_byte(byte)void': { + value: number + } + 'set_arc4_bool(bool)void': { + value: boolean + } + 'set_arc4_address(address)void': { + value: string + } + 'set_arc4_uint128(uint128)void': { + value: bigint | number + } + 'set_arc4_dynamic_bytes(byte[])void': { + value: Uint8Array + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'get_implicit_key_arc4_uint()uint64': [] + 'get_implicit_key_arc4_string()string': [] + 'get_implicit_key_arc4_byte()byte': [] + 'get_implicit_key_arc4_bool()bool': [] + 'get_implicit_key_arc4_address()address': [] + 'get_implicit_key_arc4_uint128()uint128': [] + 'get_implicit_key_arc4_dynamic_bytes()byte[]': [] + 'get_implicit_key_tuple()(uint64,byte[],bool)': [] + 'get_arc4_uint()uint64': [] + 'get_arc4_string()string': [] + 'get_arc4_byte()byte': [] + 'get_arc4_bool()bool': [] + 'get_arc4_address()address': [] + 'get_arc4_uint128()uint128': [] + 'get_arc4_dynamic_bytes()byte[]': [] + 'set_implicit_key_arc4_uint(uint64)void': [value: bigint | number] + 'set_implicit_key_arc4_string(string)void': [value: string] + 'set_implicit_key_arc4_byte(byte)void': [value: number] + 'set_implicit_key_arc4_bool(bool)void': [value: boolean] + 'set_implicit_key_arc4_address(address)void': [value: string] + 'set_implicit_key_arc4_uint128(uint128)void': [value: bigint | number] + 'set_implicit_key_arc4_dynamic_bytes(byte[])void': [value: Uint8Array] + 'set_implicit_key_tuple((uint64,byte[],bool))void': [value: [bigint | number, Uint8Array, boolean]] + 'set_arc4_uint(uint64)void': [value: bigint | number] + 'set_arc4_string(string)void': [value: string] + 'set_arc4_byte(byte)void': [value: number] + 'set_arc4_bool(bool)void': [value: boolean] + 'set_arc4_address(address)void': [value: string] + 'set_arc4_uint128(uint128)void': [value: bigint | number] + 'set_arc4_dynamic_bytes(byte[])void': [value: Uint8Array] + } +} + +/** + * The return type for each method + */ +export type GlobalStateContractReturns = { + 'get_implicit_key_arc4_uint()uint64': bigint + 'get_implicit_key_arc4_string()string': string + 'get_implicit_key_arc4_byte()byte': number + 'get_implicit_key_arc4_bool()bool': boolean + 'get_implicit_key_arc4_address()address': string + 'get_implicit_key_arc4_uint128()uint128': bigint + 'get_implicit_key_arc4_dynamic_bytes()byte[]': Uint8Array + 'get_implicit_key_tuple()(uint64,byte[],bool)': [bigint, Uint8Array, boolean] + 'get_arc4_uint()uint64': bigint + 'get_arc4_string()string': string + 'get_arc4_byte()byte': number + 'get_arc4_bool()bool': boolean + 'get_arc4_address()address': string + 'get_arc4_uint128()uint128': bigint + 'get_arc4_dynamic_bytes()byte[]': Uint8Array + 'set_implicit_key_arc4_uint(uint64)void': void + 'set_implicit_key_arc4_string(string)void': void + 'set_implicit_key_arc4_byte(byte)void': void + 'set_implicit_key_arc4_bool(bool)void': void + 'set_implicit_key_arc4_address(address)void': void + 'set_implicit_key_arc4_uint128(uint128)void': void + 'set_implicit_key_arc4_dynamic_bytes(byte[])void': void + 'set_implicit_key_tuple((uint64,byte[],bool))void': void + 'set_arc4_uint(uint64)void': void + 'set_arc4_string(string)void': void + 'set_arc4_byte(byte)void': void + 'set_arc4_bool(bool)void': void + 'set_arc4_address(address)void': void + 'set_arc4_uint128(uint128)void': void + 'set_arc4_dynamic_bytes(byte[])void': void +} + +/** + * Defines the types of available calls and state of the GlobalStateContract smart contract. + */ +export type GlobalStateContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'get_implicit_key_arc4_uint()uint64' | 'get_implicit_key_arc4_uint', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_uint()uint64'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_uint()uint64'] + returns: GlobalStateContractReturns['get_implicit_key_arc4_uint()uint64'] + }> + & Record<'get_implicit_key_arc4_string()string' | 'get_implicit_key_arc4_string', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_string()string'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_string()string'] + returns: GlobalStateContractReturns['get_implicit_key_arc4_string()string'] + }> + & Record<'get_implicit_key_arc4_byte()byte' | 'get_implicit_key_arc4_byte', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_byte()byte'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_byte()byte'] + returns: GlobalStateContractReturns['get_implicit_key_arc4_byte()byte'] + }> + & Record<'get_implicit_key_arc4_bool()bool' | 'get_implicit_key_arc4_bool', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_bool()bool'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_bool()bool'] + returns: GlobalStateContractReturns['get_implicit_key_arc4_bool()bool'] + }> + & Record<'get_implicit_key_arc4_address()address' | 'get_implicit_key_arc4_address', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_address()address'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_address()address'] + returns: GlobalStateContractReturns['get_implicit_key_arc4_address()address'] + }> + & Record<'get_implicit_key_arc4_uint128()uint128' | 'get_implicit_key_arc4_uint128', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_uint128()uint128'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_uint128()uint128'] + returns: GlobalStateContractReturns['get_implicit_key_arc4_uint128()uint128'] + }> + & Record<'get_implicit_key_arc4_dynamic_bytes()byte[]' | 'get_implicit_key_arc4_dynamic_bytes', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_dynamic_bytes()byte[]'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_dynamic_bytes()byte[]'] + returns: GlobalStateContractReturns['get_implicit_key_arc4_dynamic_bytes()byte[]'] + }> + & Record<'get_implicit_key_tuple()(uint64,byte[],bool)' | 'get_implicit_key_tuple', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_tuple()(uint64,byte[],bool)'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_tuple()(uint64,byte[],bool)'] + returns: GlobalStateContractReturns['get_implicit_key_tuple()(uint64,byte[],bool)'] + }> + & Record<'get_arc4_uint()uint64' | 'get_arc4_uint', { + argsObj: GlobalStateContractArgs['obj']['get_arc4_uint()uint64'] + argsTuple: GlobalStateContractArgs['tuple']['get_arc4_uint()uint64'] + returns: GlobalStateContractReturns['get_arc4_uint()uint64'] + }> + & Record<'get_arc4_string()string' | 'get_arc4_string', { + argsObj: GlobalStateContractArgs['obj']['get_arc4_string()string'] + argsTuple: GlobalStateContractArgs['tuple']['get_arc4_string()string'] + returns: GlobalStateContractReturns['get_arc4_string()string'] + }> + & Record<'get_arc4_byte()byte' | 'get_arc4_byte', { + argsObj: GlobalStateContractArgs['obj']['get_arc4_byte()byte'] + argsTuple: GlobalStateContractArgs['tuple']['get_arc4_byte()byte'] + returns: GlobalStateContractReturns['get_arc4_byte()byte'] + }> + & Record<'get_arc4_bool()bool' | 'get_arc4_bool', { + argsObj: GlobalStateContractArgs['obj']['get_arc4_bool()bool'] + argsTuple: GlobalStateContractArgs['tuple']['get_arc4_bool()bool'] + returns: GlobalStateContractReturns['get_arc4_bool()bool'] + }> + & Record<'get_arc4_address()address' | 'get_arc4_address', { + argsObj: GlobalStateContractArgs['obj']['get_arc4_address()address'] + argsTuple: GlobalStateContractArgs['tuple']['get_arc4_address()address'] + returns: GlobalStateContractReturns['get_arc4_address()address'] + }> + & Record<'get_arc4_uint128()uint128' | 'get_arc4_uint128', { + argsObj: GlobalStateContractArgs['obj']['get_arc4_uint128()uint128'] + argsTuple: GlobalStateContractArgs['tuple']['get_arc4_uint128()uint128'] + returns: GlobalStateContractReturns['get_arc4_uint128()uint128'] + }> + & Record<'get_arc4_dynamic_bytes()byte[]' | 'get_arc4_dynamic_bytes', { + argsObj: GlobalStateContractArgs['obj']['get_arc4_dynamic_bytes()byte[]'] + argsTuple: GlobalStateContractArgs['tuple']['get_arc4_dynamic_bytes()byte[]'] + returns: GlobalStateContractReturns['get_arc4_dynamic_bytes()byte[]'] + }> + & Record<'set_implicit_key_arc4_uint(uint64)void' | 'set_implicit_key_arc4_uint', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_uint(uint64)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_uint(uint64)void'] + returns: GlobalStateContractReturns['set_implicit_key_arc4_uint(uint64)void'] + }> + & Record<'set_implicit_key_arc4_string(string)void' | 'set_implicit_key_arc4_string', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_string(string)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_string(string)void'] + returns: GlobalStateContractReturns['set_implicit_key_arc4_string(string)void'] + }> + & Record<'set_implicit_key_arc4_byte(byte)void' | 'set_implicit_key_arc4_byte', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_byte(byte)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_byte(byte)void'] + returns: GlobalStateContractReturns['set_implicit_key_arc4_byte(byte)void'] + }> + & Record<'set_implicit_key_arc4_bool(bool)void' | 'set_implicit_key_arc4_bool', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_bool(bool)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_bool(bool)void'] + returns: GlobalStateContractReturns['set_implicit_key_arc4_bool(bool)void'] + }> + & Record<'set_implicit_key_arc4_address(address)void' | 'set_implicit_key_arc4_address', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_address(address)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_address(address)void'] + returns: GlobalStateContractReturns['set_implicit_key_arc4_address(address)void'] + }> + & Record<'set_implicit_key_arc4_uint128(uint128)void' | 'set_implicit_key_arc4_uint128', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_uint128(uint128)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_uint128(uint128)void'] + returns: GlobalStateContractReturns['set_implicit_key_arc4_uint128(uint128)void'] + }> + & Record<'set_implicit_key_arc4_dynamic_bytes(byte[])void' | 'set_implicit_key_arc4_dynamic_bytes', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_dynamic_bytes(byte[])void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_dynamic_bytes(byte[])void'] + returns: GlobalStateContractReturns['set_implicit_key_arc4_dynamic_bytes(byte[])void'] + }> + & Record<'set_implicit_key_tuple((uint64,byte[],bool))void' | 'set_implicit_key_tuple', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_tuple((uint64,byte[],bool))void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_tuple((uint64,byte[],bool))void'] + returns: GlobalStateContractReturns['set_implicit_key_tuple((uint64,byte[],bool))void'] + }> + & Record<'set_arc4_uint(uint64)void' | 'set_arc4_uint', { + argsObj: GlobalStateContractArgs['obj']['set_arc4_uint(uint64)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_arc4_uint(uint64)void'] + returns: GlobalStateContractReturns['set_arc4_uint(uint64)void'] + }> + & Record<'set_arc4_string(string)void' | 'set_arc4_string', { + argsObj: GlobalStateContractArgs['obj']['set_arc4_string(string)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_arc4_string(string)void'] + returns: GlobalStateContractReturns['set_arc4_string(string)void'] + }> + & Record<'set_arc4_byte(byte)void' | 'set_arc4_byte', { + argsObj: GlobalStateContractArgs['obj']['set_arc4_byte(byte)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_arc4_byte(byte)void'] + returns: GlobalStateContractReturns['set_arc4_byte(byte)void'] + }> + & Record<'set_arc4_bool(bool)void' | 'set_arc4_bool', { + argsObj: GlobalStateContractArgs['obj']['set_arc4_bool(bool)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_arc4_bool(bool)void'] + returns: GlobalStateContractReturns['set_arc4_bool(bool)void'] + }> + & Record<'set_arc4_address(address)void' | 'set_arc4_address', { + argsObj: GlobalStateContractArgs['obj']['set_arc4_address(address)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_arc4_address(address)void'] + returns: GlobalStateContractReturns['set_arc4_address(address)void'] + }> + & Record<'set_arc4_uint128(uint128)void' | 'set_arc4_uint128', { + argsObj: GlobalStateContractArgs['obj']['set_arc4_uint128(uint128)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_arc4_uint128(uint128)void'] + returns: GlobalStateContractReturns['set_arc4_uint128(uint128)void'] + }> + & Record<'set_arc4_dynamic_bytes(byte[])void' | 'set_arc4_dynamic_bytes', { + argsObj: GlobalStateContractArgs['obj']['set_arc4_dynamic_bytes(byte[])void'] + argsTuple: GlobalStateContractArgs['tuple']['set_arc4_dynamic_bytes(byte[])void'] + returns: GlobalStateContractReturns['set_arc4_dynamic_bytes(byte[])void'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + global: { + keys: { + implicitKeyArc4Uint: bigint + implicitKeyArc4String: string + implicitKeyArc4Byte: number + implicitKeyArc4Bool: boolean + implicitKeyArc4Address: string + implicitKeyArc4Uint128: bigint + implicitKeyArc4DynamicBytes: Uint8Array + implicitKeyTuple: [bigint, Uint8Array, boolean] + arc4Uint: bigint + arc4String: string + arc4Byte: number + arc4Bool: boolean + arc4Address: string + arc4Uint128: bigint + arc4DynamicBytes: Uint8Array + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type GlobalStateContractSignatures = keyof GlobalStateContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type GlobalStateContractNonVoidMethodSignatures = keyof GlobalStateContractTypes['methods'] extends infer T ? T extends keyof GlobalStateContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the GlobalStateContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = GlobalStateContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the GlobalStateContract smart contract to the method's return type + */ +export type MethodReturn = GlobalStateContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed global state of the application. + */ +export type GlobalKeysState = GlobalStateContractTypes['state']['global']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type GlobalStateContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type GlobalStateContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: GlobalStateContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the GlobalStateContract smart contract + */ +export abstract class GlobalStateContractParamsFactory { + /** + * Constructs a no op call for the get_implicit_key_arc4_uint()uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_uint()uint64' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_string()string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_string()string' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_byte()byte ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_byte()byte' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_bool()bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_bool()bool' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_address()address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_address()address' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_uint128()uint128 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_uint128()uint128' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_dynamic_bytes()byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_dynamic_bytes()byte[]' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_implicit_key_tuple()(uint64,byte[],bool) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_tuple()(uint64,byte[],bool)' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_arc4_uint()uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_uint()uint64' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_arc4_string()string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_string()string' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_arc4_byte()byte ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_byte()byte' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_arc4_bool()bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_bool()bool' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_arc4_address()address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_address()address' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_arc4_uint128()uint128 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_uint128()uint128' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_arc4_dynamic_bytes()byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_dynamic_bytes()byte[]' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the set_implicit_key_arc4_uint(uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_arc4_uint(uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_implicit_key_arc4_string(string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_arc4_string(string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_implicit_key_arc4_byte(byte)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_arc4_byte(byte)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_implicit_key_arc4_bool(bool)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_arc4_bool(bool)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_implicit_key_arc4_address(address)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_arc4_address(address)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_implicit_key_arc4_uint128(uint128)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_arc4_uint128(uint128)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_implicit_key_arc4_dynamic_bytes(byte[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_arc4_dynamic_bytes(byte[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_implicit_key_tuple((uint64,byte[],bool))void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_tuple((uint64,byte[],bool))void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_arc4_uint(uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_arc4_uint(uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_arc4_string(string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_arc4_string(string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_arc4_byte(byte)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_arc4_byte(byte)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_arc4_bool(bool)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_arc4_bool(bool)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_arc4_address(address)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_arc4_address(address)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_arc4_uint128(uint128)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_arc4_uint128(uint128)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_arc4_dynamic_bytes(byte[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_arc4_dynamic_bytes(byte[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } +} + +/** + * A factory to create and deploy one or more instance of the GlobalStateContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class GlobalStateContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `GlobalStateContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new GlobalStateContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new GlobalStateContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the GlobalStateContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: GlobalStateContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new GlobalStateContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the GlobalStateContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the GlobalStateContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the GlobalStateContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new GlobalStateContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the GlobalStateContract smart contract + */ +export class GlobalStateContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `GlobalStateContractClient` + * + * @param appClient An `AppClient` instance which has been created with the GlobalStateContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `GlobalStateContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `GlobalStateContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new GlobalStateContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `GlobalStateContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new GlobalStateContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the GlobalStateContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_string()string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_byte()byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_bool()bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_address()address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint128()uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes()byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_tuple()(uint64,byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyTuple(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_string()string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_byte()byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_bool()bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_address()address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint128()uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_dynamic_bytes()byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_string(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_byte(byte)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_bool(bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_address(address)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint128(uint128)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_dynamic_bytes(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_tuple((uint64,byte[],bool))void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyTuple(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_string(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_byte(byte)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_bool(bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_address(address)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint128(uint128)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_dynamic_bytes(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4DynamicBytes(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the GlobalStateContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_string()string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_byte()byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_bool()bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_address()address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint128()uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes()byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_tuple()(uint64,byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyTuple(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_string()string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_byte()byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_bool()bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_address()address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint128()uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_dynamic_bytes()byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_string(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_byte(byte)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_bool(bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_address(address)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint128(uint128)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_dynamic_bytes(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_tuple((uint64,byte[],bool))void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyTuple(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_string(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_byte(byte)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_bool(bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_address(address)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint128(uint128)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_dynamic_bytes(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4DynamicBytes(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the GlobalStateContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_uint()uint64'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_string()string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4String(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_string()string'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_byte()byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_byte()byte'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_bool()bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_bool()bool'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_address()address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Address(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_address()address'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint128()uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_uint128()uint128'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes()byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_dynamic_bytes()byte[]'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_tuple()(uint64,byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyTuple(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_tuple()(uint64,byte[],bool)'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Uint(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_uint()uint64'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_string()string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4String(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_string()string'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_byte()byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Byte(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_byte()byte'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_bool()bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Bool(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_bool()bool'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_address()address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Address(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_address()address'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint128()uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Uint128(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_uint128()uint128'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_dynamic_bytes()byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4DynamicBytes(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_dynamic_bytes()byte[]'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_uint(uint64)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_string(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4String(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_string(string)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_byte(byte)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Byte(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_byte(byte)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_bool(bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Bool(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_bool(bool)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_address(address)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Address(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_address(address)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint128(uint128)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint128(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_uint128(uint128)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_dynamic_bytes(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4DynamicBytes(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_dynamic_bytes(byte[])void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_tuple((uint64,byte[],bool))void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyTuple(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_tuple((uint64,byte[],bool))void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Uint(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_uint(uint64)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_string(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4String(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_string(string)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_byte(byte)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Byte(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_byte(byte)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_bool(bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Bool(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_bool(bool)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_address(address)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Address(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_address(address)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint128(uint128)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Uint128(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_uint128(uint128)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_dynamic_bytes(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4DynamicBytes(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_dynamic_bytes(byte[])void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new GlobalStateContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current GlobalStateContract app + */ + state = { + /** + * Methods to access global state for the current GlobalStateContract app + */ + global: { + /** + * Get all current keyed values from global state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.global.getAll() + return { + implicitKeyArc4Uint: result.implicit_key_arc4_uint, + implicitKeyArc4String: result.implicit_key_arc4_string, + implicitKeyArc4Byte: result.implicit_key_arc4_byte, + implicitKeyArc4Bool: result.implicit_key_arc4_bool, + implicitKeyArc4Address: result.implicit_key_arc4_address, + implicitKeyArc4Uint128: result.implicit_key_arc4_uint128, + implicitKeyArc4DynamicBytes: result.implicit_key_arc4_dynamic_bytes, + implicitKeyTuple: result.implicit_key_tuple, + arc4Uint: result.arc4_uint, + arc4String: result.arc4_string, + arc4Byte: result.arc4_byte, + arc4Bool: result.arc4_bool, + arc4Address: result.arc4_address, + arc4Uint128: result.arc4_uint128, + arc4DynamicBytes: result.arc4_dynamic_bytes, + } + }, + /** + * Get the current value of the implicit_key_arc4_uint key in global state + */ + implicitKeyArc4Uint: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_uint")) as bigint | undefined }, + /** + * Get the current value of the implicit_key_arc4_string key in global state + */ + implicitKeyArc4String: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_string")) as string | undefined }, + /** + * Get the current value of the implicit_key_arc4_byte key in global state + */ + implicitKeyArc4Byte: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_byte")) as number | undefined }, + /** + * Get the current value of the implicit_key_arc4_bool key in global state + */ + implicitKeyArc4Bool: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_bool")) as boolean | undefined }, + /** + * Get the current value of the implicit_key_arc4_address key in global state + */ + implicitKeyArc4Address: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_address")) as string | undefined }, + /** + * Get the current value of the implicit_key_arc4_uint128 key in global state + */ + implicitKeyArc4Uint128: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_uint128")) as bigint | undefined }, + /** + * Get the current value of the implicit_key_arc4_dynamic_bytes key in global state + */ + implicitKeyArc4DynamicBytes: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_dynamic_bytes")) as Uint8Array | undefined }, + /** + * Get the current value of the implicit_key_tuple key in global state + */ + implicitKeyTuple: async (): Promise<[bigint, Uint8Array, boolean] | undefined> => { return (await this.appClient.state.global.getValue("implicit_key_tuple")) as [bigint, Uint8Array, boolean] | undefined }, + /** + * Get the current value of the arc4_uint key in global state + */ + arc4Uint: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_uint")) as bigint | undefined }, + /** + * Get the current value of the arc4_string key in global state + */ + arc4String: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_string")) as string | undefined }, + /** + * Get the current value of the arc4_byte key in global state + */ + arc4Byte: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_byte")) as number | undefined }, + /** + * Get the current value of the arc4_bool key in global state + */ + arc4Bool: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_bool")) as boolean | undefined }, + /** + * Get the current value of the arc4_address key in global state + */ + arc4Address: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_address")) as string | undefined }, + /** + * Get the current value of the arc4_uint128 key in global state + */ + arc4Uint128: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_uint128")) as bigint | undefined }, + /** + * Get the current value of the arc4_dynamic_bytes key in global state + */ + arc4DynamicBytes: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_dynamic_bytes")) as Uint8Array | undefined }, + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): GlobalStateContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a get_implicit_key_arc4_uint()uint64 method call against the GlobalStateContract contract + */ + getImplicitKeyArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Uint(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_string()string method call against the GlobalStateContract contract + */ + getImplicitKeyArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4String(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_byte()byte method call against the GlobalStateContract contract + */ + getImplicitKeyArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Byte(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_bool()bool method call against the GlobalStateContract contract + */ + getImplicitKeyArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Bool(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_address()address method call against the GlobalStateContract contract + */ + getImplicitKeyArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Address(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_uint128()uint128 method call against the GlobalStateContract contract + */ + getImplicitKeyArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Uint128(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_dynamic_bytes()byte[] method call against the GlobalStateContract contract + */ + getImplicitKeyArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4DynamicBytes(params))) + return this + }, + /** + * Add a get_implicit_key_tuple()(uint64,byte[],bool) method call against the GlobalStateContract contract + */ + getImplicitKeyTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyTuple(params))) + return this + }, + /** + * Add a get_arc4_uint()uint64 method call against the GlobalStateContract contract + */ + getArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Uint(params))) + return this + }, + /** + * Add a get_arc4_string()string method call against the GlobalStateContract contract + */ + getArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4String(params))) + return this + }, + /** + * Add a get_arc4_byte()byte method call against the GlobalStateContract contract + */ + getArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Byte(params))) + return this + }, + /** + * Add a get_arc4_bool()bool method call against the GlobalStateContract contract + */ + getArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Bool(params))) + return this + }, + /** + * Add a get_arc4_address()address method call against the GlobalStateContract contract + */ + getArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Address(params))) + return this + }, + /** + * Add a get_arc4_uint128()uint128 method call against the GlobalStateContract contract + */ + getArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Uint128(params))) + return this + }, + /** + * Add a get_arc4_dynamic_bytes()byte[] method call against the GlobalStateContract contract + */ + getArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4DynamicBytes(params))) + return this + }, + /** + * Add a set_implicit_key_arc4_uint(uint64)void method call against the GlobalStateContract contract + */ + setImplicitKeyArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Uint(params))) + return this + }, + /** + * Add a set_implicit_key_arc4_string(string)void method call against the GlobalStateContract contract + */ + setImplicitKeyArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4String(params))) + return this + }, + /** + * Add a set_implicit_key_arc4_byte(byte)void method call against the GlobalStateContract contract + */ + setImplicitKeyArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Byte(params))) + return this + }, + /** + * Add a set_implicit_key_arc4_bool(bool)void method call against the GlobalStateContract contract + */ + setImplicitKeyArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Bool(params))) + return this + }, + /** + * Add a set_implicit_key_arc4_address(address)void method call against the GlobalStateContract contract + */ + setImplicitKeyArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Address(params))) + return this + }, + /** + * Add a set_implicit_key_arc4_uint128(uint128)void method call against the GlobalStateContract contract + */ + setImplicitKeyArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Uint128(params))) + return this + }, + /** + * Add a set_implicit_key_arc4_dynamic_bytes(byte[])void method call against the GlobalStateContract contract + */ + setImplicitKeyArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4DynamicBytes(params))) + return this + }, + /** + * Add a set_implicit_key_tuple((uint64,byte[],bool))void method call against the GlobalStateContract contract + */ + setImplicitKeyTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyTuple(params))) + return this + }, + /** + * Add a set_arc4_uint(uint64)void method call against the GlobalStateContract contract + */ + setArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Uint(params))) + return this + }, + /** + * Add a set_arc4_string(string)void method call against the GlobalStateContract contract + */ + setArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4String(params))) + return this + }, + /** + * Add a set_arc4_byte(byte)void method call against the GlobalStateContract contract + */ + setArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Byte(params))) + return this + }, + /** + * Add a set_arc4_bool(bool)void method call against the GlobalStateContract contract + */ + setArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Bool(params))) + return this + }, + /** + * Add a set_arc4_address(address)void method call against the GlobalStateContract contract + */ + setArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Address(params))) + return this + }, + /** + * Add a set_arc4_uint128(uint128)void method call against the GlobalStateContract contract + */ + setArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Uint128(params))) + return this + }, + /** + * Add a set_arc4_dynamic_bytes(byte[])void method call against the GlobalStateContract contract + */ + setArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4DynamicBytes(params))) + return this + }, + /** + * Add a clear state call to the GlobalStateContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as GlobalStateContractComposer + } +} +export type GlobalStateContractComposer = { + /** + * Calls the get_implicit_key_arc4_uint()uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Uint(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_uint()uint64'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_string()string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4String(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_string()string'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_byte()byte ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Byte(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_byte()byte'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_bool()bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Bool(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_bool()bool'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_address()address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Address(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_address()address'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_uint128()uint128 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Uint128(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_uint128()uint128'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_dynamic_bytes()byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4DynamicBytes(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_dynamic_bytes()byte[]'] | undefined]> + + /** + * Calls the get_implicit_key_tuple()(uint64,byte[],bool) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyTuple(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_tuple()(uint64,byte[],bool)'] | undefined]> + + /** + * Calls the get_arc4_uint()uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Uint(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_uint()uint64'] | undefined]> + + /** + * Calls the get_arc4_string()string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4String(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_string()string'] | undefined]> + + /** + * Calls the get_arc4_byte()byte ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Byte(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_byte()byte'] | undefined]> + + /** + * Calls the get_arc4_bool()bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Bool(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_bool()bool'] | undefined]> + + /** + * Calls the get_arc4_address()address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Address(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_address()address'] | undefined]> + + /** + * Calls the get_arc4_uint128()uint128 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Uint128(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_uint128()uint128'] | undefined]> + + /** + * Calls the get_arc4_dynamic_bytes()byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4DynamicBytes(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_dynamic_bytes()byte[]'] | undefined]> + + /** + * Calls the set_implicit_key_arc4_uint(uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyArc4Uint(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_uint(uint64)void'] | undefined]> + + /** + * Calls the set_implicit_key_arc4_string(string)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyArc4String(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_string(string)void'] | undefined]> + + /** + * Calls the set_implicit_key_arc4_byte(byte)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyArc4Byte(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_byte(byte)void'] | undefined]> + + /** + * Calls the set_implicit_key_arc4_bool(bool)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyArc4Bool(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_bool(bool)void'] | undefined]> + + /** + * Calls the set_implicit_key_arc4_address(address)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyArc4Address(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_address(address)void'] | undefined]> + + /** + * Calls the set_implicit_key_arc4_uint128(uint128)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyArc4Uint128(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_uint128(uint128)void'] | undefined]> + + /** + * Calls the set_implicit_key_arc4_dynamic_bytes(byte[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyArc4DynamicBytes(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_dynamic_bytes(byte[])void'] | undefined]> + + /** + * Calls the set_implicit_key_tuple((uint64,byte[],bool))void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyTuple(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_tuple((uint64,byte[],bool))void'] | undefined]> + + /** + * Calls the set_arc4_uint(uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setArc4Uint(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_uint(uint64)void'] | undefined]> + + /** + * Calls the set_arc4_string(string)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setArc4String(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_string(string)void'] | undefined]> + + /** + * Calls the set_arc4_byte(byte)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setArc4Byte(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_byte(byte)void'] | undefined]> + + /** + * Calls the set_arc4_bool(bool)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setArc4Bool(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_bool(bool)void'] | undefined]> + + /** + * Calls the set_arc4_address(address)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setArc4Address(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_address(address)void'] | undefined]> + + /** + * Calls the set_arc4_uint128(uint128)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setArc4Uint128(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_uint128(uint128)void'] | undefined]> + + /** + * Calls the set_arc4_dynamic_bytes(byte[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setArc4DynamicBytes(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_dynamic_bytes(byte[])void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the GlobalStateContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): GlobalStateContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): GlobalStateContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type GlobalStateContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateValidator.ts b/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateValidator.ts new file mode 100644 index 0000000..483c414 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateValidator.ts @@ -0,0 +1,557 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"GlobalStateValidator","structs":{},"methods":[{"name":"validate_g_args","args":[{"type":"uint64","name":"arg1"},{"type":"string","name":"arg2"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[72],"errorMessage":"transaction type is appl"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHhjMGViNWM2NwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIEdsb2JhbFN0YXRlVmFsaWRhdG9yKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBieXRlY18wIC8vIG1ldGhvZCAidmFsaWRhdGVfZ19hcmdzKHVpbnQ2NCxzdHJpbmcpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdmFsaWRhdGVfZ19hcmdzX3JvdXRlQDMKICAgIGVycgoKbWFpbl92YWxpZGF0ZV9nX2FyZ3Nfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIHZhbGlkYXRlX2dfYXJncwoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuR2xvYmFsU3RhdGVWYWxpZGF0b3IuY29udHJhY3QuR2xvYmFsU3RhdGVWYWxpZGF0b3IudmFsaWRhdGVfZ19hcmdzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmFsaWRhdGVfZ19hcmdzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjcKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygwKSA9PSBhcmM0LmFyYzRfc2lnbmF0dXJlKCJ2YWxpZGF0ZV9nX2FyZ3ModWludDY0LHN0cmluZyl2b2lkIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIGJ5dGVjXzAgLy8gbWV0aG9kICJ2YWxpZGF0ZV9nX2FyZ3ModWludDY0LHN0cmluZyl2b2lkIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjgKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygxKSA9PSBhcmcxLmJ5dGVzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjkKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygyKSA9PSBhcmcyLmJ5dGVzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6MTAKICAgIC8vIGFzc2VydCBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKFR4bi5ncm91cF9pbmRleCkuYXBwX2FyZ3MoMSkgPT0gYXJnMS5ieXRlcwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgcHVzaGludCAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weToxMQogICAgLy8gYXNzZXJ0IGd0eG4uVHJhbnNhY3Rpb24oVHhuLmdyb3VwX2luZGV4KS5hcHBfYXJncygxKSA9PSBhcmcxLmJ5dGVzCiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weToxMgogICAgLy8gYXNzZXJ0IG9wLkdUeG4uYXBwbGljYXRpb25fYXJncyhUeG4uZ3JvdXBfaW5kZXgsIDEpID09IGFyZzEuYnl0ZXMKICAgIHR4biBHcm91cEluZGV4CiAgICBndHhuc2EgQXBwbGljYXRpb25BcmdzIDEKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6MTMKICAgIC8vIGFzc2VydCBvcC5UeG4uYXBwbGljYXRpb25fYXJncygxKSA9PSBhcmcxLmJ5dGVzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyYBBMDrXGcxG0EAEyg2GgCOAQABADEZFDEYEERCAAgxGRQxGBQQQzYaATYaAjYaACgSRDYaAUsCEkQ2GgISRDEWSTgQgQYSRIEBwhpLARJEMRaBAcIaSwESRDEWORoBSwESRDYaARJEgQFD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the GlobalStateValidator contract + */ +export type GlobalStateValidatorArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'validate_g_args(uint64,string)void': { + arg1: bigint | number + arg2: string + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'validate_g_args(uint64,string)void': [arg1: bigint | number, arg2: string] + } +} + +/** + * The return type for each method + */ +export type GlobalStateValidatorReturns = { + 'validate_g_args(uint64,string)void': void +} + +/** + * Defines the types of available calls and state of the GlobalStateValidator smart contract. + */ +export type GlobalStateValidatorTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'validate_g_args(uint64,string)void' | 'validate_g_args', { + argsObj: GlobalStateValidatorArgs['obj']['validate_g_args(uint64,string)void'] + argsTuple: GlobalStateValidatorArgs['tuple']['validate_g_args(uint64,string)void'] + returns: GlobalStateValidatorReturns['validate_g_args(uint64,string)void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type GlobalStateValidatorSignatures = keyof GlobalStateValidatorTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the GlobalStateValidator smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = GlobalStateValidatorTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the GlobalStateValidator smart contract to the method's return type + */ +export type MethodReturn = GlobalStateValidatorTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type GlobalStateValidatorCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type GlobalStateValidatorDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: GlobalStateValidatorCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the GlobalStateValidator smart contract + */ +export abstract class GlobalStateValidatorParamsFactory { + /** + * Constructs a no op call for the validate_g_args(uint64,string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static validateGArgs(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'validate_g_args(uint64,string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arg1, params.args.arg2], + } + } +} + +/** + * A factory to create and deploy one or more instance of the GlobalStateValidator smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class GlobalStateValidatorFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `GlobalStateValidatorFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new GlobalStateValidatorClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new GlobalStateValidatorClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the GlobalStateValidator smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: GlobalStateValidatorDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new GlobalStateValidatorClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the GlobalStateValidator smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the GlobalStateValidator smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the GlobalStateValidator smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new GlobalStateValidatorClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the GlobalStateValidator smart contract + */ +export class GlobalStateValidatorClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `GlobalStateValidatorClient` + * + * @param appClient An `AppClient` instance which has been created with the GlobalStateValidator app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `GlobalStateValidatorClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `GlobalStateValidatorClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new GlobalStateValidatorClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `GlobalStateValidatorClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new GlobalStateValidatorClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the GlobalStateValidator smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the GlobalStateValidator smart contract using the `validate_g_args(uint64,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + validateGArgs: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateValidatorParamsFactory.validateGArgs(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the GlobalStateValidator smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the GlobalStateValidator smart contract using the `validate_g_args(uint64,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + validateGArgs: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateValidatorParamsFactory.validateGArgs(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the GlobalStateValidator smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the GlobalStateValidator smart contract using the `validate_g_args(uint64,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + validateGArgs: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateValidatorParamsFactory.validateGArgs(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateValidatorReturns['validate_g_args(uint64,string)void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new GlobalStateValidatorClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current GlobalStateValidator app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): GlobalStateValidatorComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a validate_g_args(uint64,string)void method call against the GlobalStateValidator contract + */ + validateGArgs(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.validateGArgs(params))) + return this + }, + /** + * Add a clear state call to the GlobalStateValidator contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as GlobalStateValidatorComposer + } +} +export type GlobalStateValidatorComposer = { + /** + * Calls the validate_g_args(uint64,string)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + validateGArgs(params?: CallParams): GlobalStateValidatorComposer<[...TReturns, GlobalStateValidatorReturns['validate_g_args(uint64,string)void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the GlobalStateValidator smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): GlobalStateValidatorComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): GlobalStateValidatorComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type GlobalStateValidatorComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/HelloWorld.ts b/examples/p-py/projects/p-py-frontend/src/contracts/HelloWorld.ts new file mode 100644 index 0000000..e60b7c5 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/HelloWorld.ts @@ -0,0 +1,560 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"HelloWorld","structs":{},"methods":[{"name":"hello","args":[{"type":"string","name":"name"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[44],"errorMessage":"invalid array length header"},{"pc":[52],"errorMessage":"invalid number of bytes for arc4.dynamic_array"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5weTo1CiAgICAvLyBjbGFzcyBIZWxsb1dvcmxkKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2hlbGxvX3JvdXRlQDMKICAgIGVycgoKbWFpbl9oZWxsb19yb3V0ZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LnB5OjYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgaGVsbG8KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLmhlbGxvX3dvcmxkLmNvbnRyYWN0LkhlbGxvV29ybGQuaGVsbG9bcm91dGluZ10oKSAtPiB2b2lkOgpoZWxsbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5weTo2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgcHVzaGludCAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5weTo4CiAgICAvLyByZXR1cm4gIkhlbGxvLCAiICsgbmFtZQogICAgcHVzaGJ5dGVzICJIZWxsbywgIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QucHk6NgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgAQCvs4RNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEM2GgFJgQBZgQIISwEVEkRXAgCAB0hlbGxvLCBMUEkVFlcGAkxQgAQVH3x1TFCwgQFD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the HelloWorld contract + */ +export type HelloWorldArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'hello(string)string': { + name: string + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'hello(string)string': [name: string] + } +} + +/** + * The return type for each method + */ +export type HelloWorldReturns = { + 'hello(string)string': string +} + +/** + * Defines the types of available calls and state of the HelloWorld smart contract. + */ +export type HelloWorldTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'hello(string)string' | 'hello', { + argsObj: HelloWorldArgs['obj']['hello(string)string'] + argsTuple: HelloWorldArgs['tuple']['hello(string)string'] + returns: HelloWorldReturns['hello(string)string'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type HelloWorldSignatures = keyof HelloWorldTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type HelloWorldNonVoidMethodSignatures = keyof HelloWorldTypes['methods'] extends infer T ? T extends keyof HelloWorldTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the HelloWorld smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = HelloWorldTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the HelloWorld smart contract to the method's return type + */ +export type MethodReturn = HelloWorldTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type HelloWorldCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type HelloWorldDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: HelloWorldCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the HelloWorld smart contract + */ +export abstract class HelloWorldParamsFactory { + /** + * Constructs a no op call for the hello(string)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static hello(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'hello(string)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.name], + } + } +} + +/** + * A factory to create and deploy one or more instance of the HelloWorld smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class HelloWorldFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `HelloWorldFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new HelloWorldClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new HelloWorldClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the HelloWorld smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: HelloWorldDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new HelloWorldClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the HelloWorld smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the HelloWorld smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the HelloWorld smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new HelloWorldClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the HelloWorld smart contract + */ +export class HelloWorldClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `HelloWorldClient` + * + * @param appClient An `AppClient` instance which has been created with the HelloWorld app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `HelloWorldClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `HelloWorldClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new HelloWorldClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `HelloWorldClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new HelloWorldClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the HelloWorld smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + hello: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(HelloWorldParamsFactory.hello(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the HelloWorld smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + hello: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(HelloWorldParamsFactory.hello(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the HelloWorld smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + hello: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(HelloWorldParamsFactory.hello(params)) + return {...result, return: result.return as unknown as (undefined | HelloWorldReturns['hello(string)string'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new HelloWorldClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current HelloWorld app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): HelloWorldComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a hello(string)string method call against the HelloWorld contract + */ + hello(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hello(params))) + return this + }, + /** + * Add a clear state call to the HelloWorld contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as HelloWorldComposer + } +} +export type HelloWorldComposer = { + /** + * Calls the hello(string)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + hello(params?: CallParams): HelloWorldComposer<[...TReturns, HelloWorldReturns['hello(string)string'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the HelloWorld smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): HelloWorldComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): HelloWorldComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type HelloWorldComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ITxnOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ITxnOpsContract.ts new file mode 100644 index 0000000..a3d8854 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/ITxnOpsContract.ts @@ -0,0 +1,554 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"ITxnOpsContract","structs":{},"methods":[{"name":"verify_itxn_ops","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYgMTAwMAogICAgYnl0ZWNibG9jayAweDA2ODEwMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ4OAogICAgLy8gY2xhc3MgSVR4bk9wc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHg0ZTdjZDljYiAvLyBtZXRob2QgInZlcmlmeV9pdHhuX29wcygpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdmVyaWZ5X2l0eG5fb3BzX3JvdXRlQDMKICAgIGVycgoKbWFpbl92ZXJpZnlfaXR4bl9vcHNfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiB2ZXJpZnlfaXR4bl9vcHMKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LklUeG5PcHNDb250cmFjdC52ZXJpZnlfaXR4bl9vcHNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfaXR4bl9vcHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDkxCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5iZWdpbigpCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDkyCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfdHlwZV9lbnVtKGFsZ29weS5UcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTMKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9vbl9jb21wbGV0aW9uKGFsZ29weS5PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uKQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ5NAogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc2V0X2FwcHJvdmFsX3Byb2dyYW0oQnl0ZXMuZnJvbV9oZXgoIjA2ODEwMSIpKQogICAgYnl0ZWNfMCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTUtNDk2CiAgICAvLyAjIHBhZ2VzIGVzc2VudGlhbGx5IGFwcGVuZHMKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9hcHByb3ZhbF9wcm9ncmFtX3BhZ2VzKEJ5dGVzLmZyb21faGV4KCIwNjgxMDEiKSkKICAgIGJ5dGVjXzAgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTcKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9jbGVhcl9zdGF0ZV9wcm9ncmFtKEJ5dGVzLmZyb21faGV4KCIwNjgxMDEiKSkKICAgIGJ5dGVjXzAgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTgKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9mZWUoYWxnb3B5Lm9wLkdsb2JhbC5taW5fdHhuX2ZlZSkKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDk5CiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5uZXh0KCkKICAgIGl0eG5fbmV4dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwMAogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc2V0X3R5cGVfZW51bShhbGdvcHkuVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpCiAgICBpbnRjXzAgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTAxCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfcmVjZWl2ZXIoYWxnb3B5Lm9wLkdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MDIKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9hbW91bnQoYWxnb3B5LlVJbnQ2NCgxMDAwKSkKICAgIGludGNfMiAvLyAxMDAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwMwogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA1CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLklUeG4ucmVjZWl2ZXIoKSA9PSBhbGdvcHkub3AuR2xvYmFsLmNyZWF0b3JfYWRkcmVzcwogICAgaXR4biBSZWNlaXZlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA2CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLklUeG4uYW1vdW50KCkgPT0gYWxnb3B5LlVJbnQ2NCgxMDAwKQogICAgaXR4biBBbW91bnQKICAgIGludGNfMiAvLyAxMDAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA3CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLklUeG4udHlwZV9lbnVtKCkgPT0gYWxnb3B5LlRyYW5zYWN0aW9uVHlwZS5QYXltZW50CiAgICBpdHhuIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA5CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLkdJVHhuLnR5cGVfZW51bSgwKSA9PSBhbGdvcHkuVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgZ2l0eG4gMCBUeXBlRW51bQogICAgaW50Y18xIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTAKICAgIC8vIGFzc2VydCBhbGdvcHkub3AuR0lUeG4udHlwZV9lbnVtKDEpID09IGFsZ29weS5UcmFuc2FjdGlvblR5cGUuUGF5bWVudAogICAgZ2l0eG4gMSBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyADAQboByYBAwaBATEbQQAYgAROfNnLNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEOxI7IQgQWyGSiyHiiyQCiyHzIAsgG2IrIQMgmyBySyCLO0BzIJEkS0CCQSRLQQIhJEtwAQIxJEtwEQIhJEIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the ITxnOpsContract contract + */ +export type ITxnOpsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_itxn_ops()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_itxn_ops()void': [] + } +} + +/** + * The return type for each method + */ +export type ITxnOpsContractReturns = { + 'verify_itxn_ops()void': void +} + +/** + * Defines the types of available calls and state of the ITxnOpsContract smart contract. + */ +export type ITxnOpsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_itxn_ops()void' | 'verify_itxn_ops', { + argsObj: ITxnOpsContractArgs['obj']['verify_itxn_ops()void'] + argsTuple: ITxnOpsContractArgs['tuple']['verify_itxn_ops()void'] + returns: ITxnOpsContractReturns['verify_itxn_ops()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type ITxnOpsContractSignatures = keyof ITxnOpsContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the ITxnOpsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = ITxnOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the ITxnOpsContract smart contract to the method's return type + */ +export type MethodReturn = ITxnOpsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type ITxnOpsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type ITxnOpsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: ITxnOpsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the ITxnOpsContract smart contract + */ +export abstract class ITxnOpsContractParamsFactory { + /** + * Constructs a no op call for the verify_itxn_ops()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyItxnOps(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_itxn_ops()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the ITxnOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class ITxnOpsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `ITxnOpsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new ITxnOpsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new ITxnOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the ITxnOpsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: ITxnOpsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new ITxnOpsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ITxnOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ITxnOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ITxnOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new ITxnOpsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the ITxnOpsContract smart contract + */ +export class ITxnOpsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `ITxnOpsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the ITxnOpsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `ITxnOpsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `ITxnOpsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new ITxnOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `ITxnOpsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new ITxnOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the ITxnOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the ITxnOpsContract smart contract using the `verify_itxn_ops()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyItxnOps: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ITxnOpsContractParamsFactory.verifyItxnOps(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the ITxnOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the ITxnOpsContract smart contract using the `verify_itxn_ops()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyItxnOps: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ITxnOpsContractParamsFactory.verifyItxnOps(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the ITxnOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the ITxnOpsContract smart contract using the `verify_itxn_ops()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyItxnOps: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ITxnOpsContractParamsFactory.verifyItxnOps(params)) + return {...result, return: result.return as unknown as (undefined | ITxnOpsContractReturns['verify_itxn_ops()void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new ITxnOpsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current ITxnOpsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): ITxnOpsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_itxn_ops()void method call against the ITxnOpsContract contract + */ + verifyItxnOps(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyItxnOps(params))) + return this + }, + /** + * Add a clear state call to the ITxnOpsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as ITxnOpsContractComposer + } +} +export type ITxnOpsContractComposer = { + /** + * Calls the verify_itxn_ops()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyItxnOps(params?: CallParams): ITxnOpsContractComposer<[...TReturns, ITxnOpsContractReturns['verify_itxn_ops()void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the ITxnOpsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): ITxnOpsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): ITxnOpsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type ITxnOpsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayContract.ts new file mode 100644 index 0000000..ff91ca4 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayContract.ts @@ -0,0 +1,2231 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"ImmutableArrayContract","structs":{},"methods":[{"name":"test_uint64_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_biguint_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_bool_array","args":[{"type":"uint64","name":"length"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_fixed_size_tuple_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_fixed_size_named_tuple_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_sized_tuple_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_sized_named_tuple_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_implicit_conversion_log","args":[{"type":"uint64[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_implicit_conversion_emit","args":[{"type":"uint64[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[{"name":"emit_test","args":[{"type":"uint64[]","name":"field1"}]}],"recommendations":{}},{"name":"test_nested_array","args":[{"type":"uint64","name":"arr_to_add"},{"type":"uint64[][]","name":"arr"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_bit_packed_tuples","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"sum_uints_and_lengths_and_trues","args":[{"type":"uint64[]","name":"arr1"},{"type":"bool[]","name":"arr2"},{"type":"(uint64,bool,bool)[]","name":"arr3"},{"type":"(uint64,string)[]","name":"arr4"}],"returns":{"type":"(uint64,uint64,uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_uint64_return","args":[{"type":"uint64","name":"append"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_bool_return","args":[{"type":"uint64","name":"append"}],"returns":{"type":"bool[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_tuple_return","args":[{"type":"uint64","name":"append"}],"returns":{"type":"(uint64,bool,bool)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_tuple_return","args":[{"type":"uint64","name":"append"}],"returns":{"type":"(uint64,string)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_convert_to_array_and_back","args":[{"type":"(uint64,bool,bool)[]","name":"arr"},{"type":"uint64","name":"append"}],"returns":{"type":"(uint64,bool,bool)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_concat_with_arc4_tuple","args":[{"type":"(uint64,uint64)","name":"arg"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_concat_with_native_tuple","args":[{"type":"(uint64,uint64)","name":"arg"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_concat_with_arc4_tuple","args":[{"type":"(string,string)","name":"arg"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_concat_with_native_tuple","args":[{"type":"(string,string)","name":"arg"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_concat_immutable_dynamic","args":[{"type":"(uint64,string)[]","name":"imm1"},{"type":"(uint64,string)[]","name":"imm2"}],"returns":{"type":"(uint64,string)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_immutable_arc4","args":[{"type":"(uint64,uint64)[]","name":"imm"}],"returns":{"type":"(uint64,uint64)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_imm_fixed_arr","args":[],"returns":{"type":"(uint64,uint64)[3]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":11},"local":{"ints":0,"bytes":0}},"keys":{"global":{"a":{"keyType":"AVMString","valueType":"uint64[]","key":"YQ=="},"g":{"keyType":"AVMString","valueType":"bool[]","key":"Zw=="},"c":{"keyType":"AVMString","valueType":"(uint64,uint64)[]","key":"Yw=="},"d":{"keyType":"AVMString","valueType":"(uint64,bool,bool)[]","key":"ZA=="},"e":{"keyType":"AVMString","valueType":"(uint64,byte[])[]","key":"ZQ=="},"f":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"Zg=="},"bool2":{"keyType":"AVMString","valueType":"(bool,bool)[]","key":"Ym9vbDI="},"bool7":{"keyType":"AVMString","valueType":"(uint64,bool,bool,bool,bool,bool,bool,bool,uint64)[]","key":"Ym9vbDc="},"bool8":{"keyType":"AVMString","valueType":"(uint64,bool,bool,bool,bool,bool,bool,bool,bool,uint64)[]","key":"Ym9vbDg="},"bool9":{"keyType":"AVMString","valueType":"(uint64,bool,bool,bool,bool,bool,bool,bool,bool,bool,uint64)[]","key":"Ym9vbDk="},"imm_fixed_arr":{"keyType":"AVMString","valueType":"(uint64,uint64)[3]","key":"aW1tX2ZpeGVkX2Fycg=="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[4104],"errorMessage":"check self.imm_fixed_arr exists"},{"pc":[2179,2487],"errorMessage":"expected 1, 0"},{"pc":[2094,2402],"errorMessage":"expected 1st element to be correct"},{"pc":[2099,2409],"errorMessage":"expected 2nd element to be correct"},{"pc":[2240,2549],"errorMessage":"expected 4, 3"},{"pc":[3988],"errorMessage":"expected arrays to be different"},{"pc":[4022],"errorMessage":"expected arrays to be the same"},{"pc":[1548],"errorMessage":"expected element 0 to be False"},{"pc":[1567],"errorMessage":"expected element 1 to be False"},{"pc":[1585],"errorMessage":"expected element 2 to be True"},{"pc":[4049],"errorMessage":"expected items on iteration to be the same"},{"pc":[1611],"errorMessage":"expected last element to be False"},{"pc":[3935],"errorMessage":"expected non empty array"},{"pc":[3363],"errorMessage":"expected string length to match index"},{"pc":[4099],"errorMessage":"expected sum to be 10"},{"pc":[4072],"errorMessage":"expected sum to be 15"},{"pc":[852,1156,1221,1289,1346,1456,1541,1560,1579,1602,1753,1817,2050,2131,2196,2358,2441,2504,3214,3307,3950,4007,4045,4091],"errorMessage":"index access is out of bounds"},{"pc":[968,1009,1065,1092,1132,1160,1204,1269,1326,1438,1525,1656,1715,1779,1906,2008,2114,2316,2424,2681,2722,3012,3021,3030,3039,3107,3144,3188,3269,3910,3933],"errorMessage":"invalid array length header"},{"pc":[923,996,1120,1194,1244,1314,1426,1692,1881,2622,2769,2833,2919,2958,2989,3438,3571,3745,3779,3814],"errorMessage":"max array length exceeded"},{"pc":[1307],"errorMessage":"overflow"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA4CiAgICBieXRlY2Jsb2NrIDB4IDB4MTUxZjdjNzUgMHgwMDAwIDB4MDAgMHgwMDAyIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYgMHgwMDBhIDB4NjI2OTY3NzU2OTZlNzQgMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIgMHgwMDAyMDAwNDAwMDcwMDAxNjEwMDAxNjIgImltbV9maXhlZF9hcnIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo5MwogICAgLy8gY2xhc3MgSW1tdXRhYmxlQXJyYXlDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NDRkNDJmOTkgMHhiN2VhYTYwYiAweDc0M2Q3MGVkIDB4MWM3ZTA0OTQgMHhhMmQ1ODYwYiAweGUwNWZjNTY0IDB4MWUwOTJiODMgMHgwMTMxMDI2MiAweGM4NjU0YTk4IDB4ODlkMTk2ZjggMHg2Y2I3Yzk5MSAweDk4OThiZjAyIDB4ZjZiNjFlZTggMHg2MGI4NmE3YiAweDczYWQyODNmIDB4NTI5ZGZhZTkgMHgyMDZkNTE0ZiAweGUwNjQ2NWUyIDB4ZWMwMzAwYTIgMHhlY2RmMTRhZiAweDUxMWFjYTY0IDB4Mjk4NTJlNGYgMHg2ZDRhYTM1OCAweGI3Y2I5NmJkIC8vIG1ldGhvZCAidGVzdF91aW50NjRfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfYmlndWludF9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9ib29sX2FycmF5KHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2ZpeGVkX3NpemVfdHVwbGVfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfZml4ZWRfc2l6ZV9uYW1lZF90dXBsZV9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9sb2codWludDY0W10pdm9pZCIsIG1ldGhvZCAidGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2VtaXQodWludDY0W10pdm9pZCIsIG1ldGhvZCAidGVzdF9uZXN0ZWRfYXJyYXkodWludDY0LHVpbnQ2NFtdW10pdWludDY0W10iLCBtZXRob2QgInRlc3RfYml0X3BhY2tlZF90dXBsZXMoKXZvaWQiLCBtZXRob2QgInN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXModWludDY0W10sYm9vbFtdLCh1aW50NjQsYm9vbCxib29sKVtdLCh1aW50NjQsc3RyaW5nKVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ0ZXN0X3VpbnQ2NF9yZXR1cm4odWludDY0KXVpbnQ2NFtdIiwgbWV0aG9kICJ0ZXN0X2Jvb2xfcmV0dXJuKHVpbnQ2NClib29sW10iLCBtZXRob2QgInRlc3RfdHVwbGVfcmV0dXJuKHVpbnQ2NCkodWludDY0LGJvb2wsYm9vbClbXSIsIG1ldGhvZCAidGVzdF9keW5hbWljX3R1cGxlX3JldHVybih1aW50NjQpKHVpbnQ2NCxzdHJpbmcpW10iLCBtZXRob2QgInRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFjaygodWludDY0LGJvb2wsYm9vbClbXSx1aW50NjQpKHVpbnQ2NCxib29sLGJvb2wpW10iLCBtZXRob2QgInRlc3RfY29uY2F0X3dpdGhfYXJjNF90dXBsZSgodWludDY0LHVpbnQ2NCkpdWludDY0W10iLCBtZXRob2QgInRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlKCh1aW50NjQsdWludDY0KSl1aW50NjRbXSIsIG1ldGhvZCAidGVzdF9keW5hbWljX2NvbmNhdF93aXRoX2FyYzRfdHVwbGUoKHN0cmluZyxzdHJpbmcpKXN0cmluZ1tdIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlKChzdHJpbmcsc3RyaW5nKSlzdHJpbmdbXSIsIG1ldGhvZCAidGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWMoKHVpbnQ2NCxzdHJpbmcpW10sKHVpbnQ2NCxzdHJpbmcpW10pKHVpbnQ2NCxzdHJpbmcpW10iLCBtZXRob2QgInRlc3RfaW1tdXRhYmxlX2FyYzQoKHVpbnQ2NCx1aW50NjQpW10pKHVpbnQ2NCx1aW50NjQpW10iLCBtZXRob2QgInRlc3RfaW1tX2ZpeGVkX2FycigpKHVpbnQ2NCx1aW50NjQpWzNdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF91aW50NjRfYXJyYXkgdGVzdF9iaWd1aW50X2FycmF5IHRlc3RfYm9vbF9hcnJheSB0ZXN0X2ZpeGVkX3NpemVfdHVwbGVfYXJyYXkgdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5IHRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheSB0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXkgdGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2xvZyB0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fZW1pdCB0ZXN0X25lc3RlZF9hcnJheSB0ZXN0X2JpdF9wYWNrZWRfdHVwbGVzIHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXMgdGVzdF91aW50NjRfcmV0dXJuIHRlc3RfYm9vbF9yZXR1cm4gdGVzdF90dXBsZV9yZXR1cm4gdGVzdF9keW5hbWljX3R1cGxlX3JldHVybiB0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2sgdGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlIHRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlIHRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9hcmM0X3R1cGxlIHRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9uYXRpdmVfdHVwbGUgdGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWMgdGVzdF9pbW11dGFibGVfYXJjNCB0ZXN0X2ltbV9maXhlZF9hcnIKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzMToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZShhcnJheTogYnl0ZXMsIGZpeGVkX2J5dGVfc2l6ZTogdWludDY0KSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemU6CiAgICBwcm90byAyIDIKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZHVwCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgZHVwMgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0MwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQoYXJyYXk6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDEgMgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgMwogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9idXJ5IDEKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMoYXJyYXk6IGJ5dGVzLCBuZXdfaXRlbXNfYnl0ZXM6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgcmVhZF9zdGVwOiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzOgogICAgcHJvdG8gNCAxCiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDIKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXBuIDIKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICByZXBsYWNlMiAwCiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBwdXNoaW50IDcKICAgICsKICAgIGludGNfMyAvLyA4CiAgICAvCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3CiAgICArCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX2lmX2Vsc2VAMgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyA1CiAgICAtCiAgICBiemVybwogICAgZnJhbWVfZGlnIDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIGZyYW1lX2RpZyAzCiAgICBwdXNoaW50IDE2CiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBmcmFtZV9idXJ5IDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfd2hpbGVfdG9wQDM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfYWZ0ZXJfd2hpbGVANQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBnZXRiaXQKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX3doaWxlX3RvcEAzCgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX3doaWxlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18wIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuc3VtX2ltbV9maXhlZChhcnI6IGJ5dGVzKSAtPiB1aW50NjQ6CnN1bV9pbW1fZml4ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzAtNTcxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHN1bV9pbW1fZml4ZWQoYXJyOiBOYXRpdmVTdHJ1Y3QzKSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3MgogICAgLy8gdG90YWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBkdXAKCnN1bV9pbW1fZml4ZWRfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTczCiAgICAvLyBmb3IgaXRlbSBpbiBhcnI6CiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGludCAzCiAgICA8CiAgICBieiBzdW1faW1tX2ZpeGVkX2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzMtNTc0CiAgICAvLyBmb3IgaXRlbSBpbiBhcnI6CiAgICAvLyAgICAgdG90YWwgKz0gaXRlbS5mb28KICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgcHVzaGludCAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzQKICAgIC8vIHRvdGFsICs9IGl0ZW0uZm9vCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3My01NzQKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIC8vICAgICB0b3RhbCArPSBpdGVtLmZvbwogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3NAogICAgLy8gdG90YWwgKz0gaXRlbS5mb28KICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTc1CiAgICAvLyB0b3RhbCArPSBpdGVtLmJhcgogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgc3VtX2ltbV9maXhlZF9mb3JfaGVhZGVyQDEKCnN1bV9pbW1fZml4ZWRfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzYKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUudGltZXMobjogdWludDY0KSAtPiBieXRlczoKdGltZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzktNTgwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHRpbWVzKG46IFVJbnQ2NCkgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODEKICAgIC8vIHJlc3VsdCA9IFN0cmluZygpCiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODIKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2Uobik6CiAgICBpbnRjXzAgLy8gMAoKdGltZXNfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTgyCiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKG4pOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMQogICAgPAogICAgYnogdGltZXNfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU4MwogICAgLy8gcmVzdWx0ICs9IFN0cmluZygiICIpCiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGJ5dGVzICIgIgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU4MgogICAgLy8gZm9yIF9pIGluIHVyYW5nZShuKToKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHRpbWVzX2Zvcl9oZWFkZXJAMQoKdGltZXNfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODQKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLmFkZF94KGFycjogYnl0ZXMsIHg6IHVpbnQ2NCkgLT4gYnl0ZXM6CmFkZF94OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg3LTU4OAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZGRfeChhcnI6IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0sIHg6IFVJbnQ2NCkgLT4gSW1tdXRhYmxlQXJyYXlbVUludDY0XToKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzAgLy8gMAoKYWRkX3hfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBieiBhZGRfeF9hZnRlcl9mb3JANAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTkwCiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKGkpCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIGFkZF94X2Zvcl9oZWFkZXJAMQoKYWRkX3hfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1OTEKICAgIC8vIHJldHVybiBhcnIKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X3VpbnQ2NF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfdWludDY0X2FycmF5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6OTkKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoVUludDY0KDQyKSkKICAgIHB1c2hieXRlcyAweDAwMDEwMDAwMDAwMDAwMDAwMDJhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDMKICAgIC8vIGFyciA9IGFkZF94KGFyciwgVUludDY0KDUpKQogICAgcHVzaGludCA1CiAgICBjYWxsc3ViIGFkZF94CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDQKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDUKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEwNwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChVSW50NjQoNDMpKQogICAgcHVzaGludCA0MwogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDgKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDcKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgNwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTA5CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSA0MwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQzCiAgICA9PQogICAgYXNzZXJ0CiAgICBpbnRjXzIgLy8gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEwCiAgICAvLyBhc3NlcnQgYXJyWzBdID09IDQyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0MgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTk2CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKHgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfdWludDY0X2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NgogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEyCiAgICAvLyBhcnIgPSBwb3BfeChhcnIsIFVJbnQ2NCgzKSkKICAgIHB1c2hpbnQgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTk2CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKHgpOgogICAgPAogICAgYnogdGVzdF91aW50NjRfYXJyYXlfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NwogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZQogICAgYnVyeSAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NgogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X3VpbnQ2NF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfdWludDY0X2FycmF5X2FmdGVyX2ZvckA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEzCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExNAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTE2CiAgICAvLyBhcnIgPSBhZGRfeChhcnIsIFVJbnQ2NCgxMCkpCiAgICBwdXNoaW50IDEwCiAgICBjYWxsc3ViIGFkZF94CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMTcKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExOAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gOQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgOQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTIwCiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKFVJbnQ2NCg0NCkpCiAgICBwdXNoaW50IDQ0CiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjEKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEyMgogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gNDQKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0NAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTI0CiAgICAvLyBhcnIgPSBhcnIucmVwbGFjZSgyLCBVSW50NjQoMjMpKQogICAgcHVzaGludCAyMwogICAgaXRvYgogICAgcmVwbGFjZTIgMTggLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjUKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDE1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjYKICAgIC8vIGFzc2VydCBhcnJbMl0gPT0gMjMKICAgIGR1cAogICAgcHVzaGludCAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMjMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEyOAogICAgLy8gc2VsZi5hID0gYXJyCiAgICBwdXNoYnl0ZXMgImEiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6OTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2JpZ3VpbnRfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2JpZ3VpbnRfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzUKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludChUeG4ubnVtX2FwcF9hcmdzIC0gMSkpCiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGl0b2IKICAgIHB1c2hpbnQgNjQKICAgIGJ6ZXJvCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzIKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W0JpZ1VJbnRdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzUKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludChUeG4ubnVtX2FwcF9hcmdzIC0gMSkpCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHB1c2hieXRlcyAweDAwMDEKICAgIHJlcGxhY2UyIDAKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM2CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM3CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSAwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNjQKICAgICoKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWNfMCAvLyAweAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKHgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYmlndWludF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MDMKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM5CiAgICAvLyBhcnIgPSBhZGRfeGIoYXJyLCBVSW50NjQoNSkpCiAgICBwdXNoaW50IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKHgpOgogICAgPAogICAgYnogdGVzdF9iaWd1aW50X2FycmF5X2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MDQKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludChpKSkKICAgIGR1cG4gMgogICAgaXRvYgogICAgZGlnIDQKICAgIGJ8CiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfYmlndWludF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfYmlndWludF9hcnJheV9hZnRlcl9mb3JANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0MAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNgogICAgZGlnIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDEKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA2NAogICAgKgogICAgcHVzaGludCA2NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwNAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0MwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChCaWdVSW50KDIqKjUxMiAtIDEpIC0gVHhuLm51bV9hcHBfYXJncykKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpdG9iCiAgICBieXRlYyA1IC8vIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIHN3YXAKICAgIGItCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZGlnIDUKICAgIGJ8CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDQKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA3CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDUKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDIqKjUxMiAtIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA2NAogICAgKgogICAgcHVzaGludCA2NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0NgogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAwCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDY0CiAgICBieXRlY18wIC8vIDB4CiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTQ4CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKEJpZ1VJbnQoMioqNTEyIC0gMSkpCiAgICBzd2FwCiAgICBieXRlYyA1IC8vIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDkKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE1MAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMioqNTEyIC0gMQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA2NAogICAgKgogICAgcHVzaGludCA2NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA1IC8vIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTEKICAgIC8vIGFzc2VydCBhcnJbMF0gPT0gMAogICAgZHVwCiAgICBleHRyYWN0IDIgNjQKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTMKICAgIC8vIEJveChJbW11dGFibGVBcnJheVtCaWdVSW50XSwga2V5PWIiYmlndWludCIpLnZhbHVlID0gYXJyCiAgICBieXRlYyA3IC8vIDB4NjI2OTY3NzU2OTZlNzQKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgNyAvLyAweDYyNjk2Nzc1Njk2ZTc0CiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2Jvb2xfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2Jvb2xfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTcKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W2Jvb2xdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjEKICAgIC8vIGZvciBpIGluIHVyYW5nZShsZW5ndGgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYm9vbF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjEKICAgIC8vIGZvciBpIGluIHVyYW5nZShsZW5ndGgpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjIKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoaSA9PSBUeG4ubnVtX2FwcF9hcmdzKQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGRpZyAxCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGludGNfMyAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTYxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UobGVuZ3RoKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9ib29sX2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTY0CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGgKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBidXJ5IDUKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE2NgogICAgLy8gaWYgbGVuZ3RoID4gMDoKICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE2NwogICAgLy8gYXNzZXJ0IG5vdCBhcnJbMF0sICJleHBlY3RlZCBlbGVtZW50IDAgdG8gYmUgRmFsc2UiCiAgICBkaWcgMwogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZWxlbWVudCAwIHRvIGJlIEZhbHNlCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTY4CiAgICAvLyBpZiBsZW5ndGggPiAxOgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjkKICAgIC8vIGFzc2VydCBub3QgYXJyWzFdLCAiZXhwZWN0ZWQgZWxlbWVudCAxIHRvIGJlIEZhbHNlIgogICAgaW50Y18xIC8vIDEKICAgIGRpZyA0CiAgICA8CiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBwdXNoaW50IDE3CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBleHBlY3RlZCBlbGVtZW50IDEgdG8gYmUgRmFsc2UKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzAKICAgIC8vIGlmIGxlbmd0aCA+IDI6CiAgICBkaWcgMgogICAgaW50Y18yIC8vIDIKICAgID4KICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzEKICAgIC8vIGFzc2VydCBhcnJbMl0sICJleHBlY3RlZCBlbGVtZW50IDIgdG8gYmUgVHJ1ZSIKICAgIGludGNfMiAvLyAyCiAgICBkaWcgNAogICAgPAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcHVzaGludCAxOAogICAgZ2V0Yml0CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZWxlbWVudCAyIHRvIGJlIFRydWUKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTcyCiAgICAvLyBpZiBsZW5ndGggPiAzOgogICAgZGlnIDIKICAgIHB1c2hpbnQgMwogICAgPgogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE3MwogICAgLy8gYXNzZXJ0IG5vdCBhcnJbbGVuZ3RoIC0gMV0sICJleHBlY3RlZCBsYXN0IGVsZW1lbnQgdG8gYmUgRmFsc2UiCiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGludCAxNgogICAgKwogICAgZGlnIDIKICAgIHN3YXAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxhc3QgZWxlbWVudCB0byBiZSBGYWxzZQoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzUKICAgIC8vIHNlbGYuZyA9IGFycgogICAgcHVzaGJ5dGVzICJnIgogICAgZGlnIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzYKICAgIC8vIGlmIGxlbmd0aDoKICAgIGRpZyAyCiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICBkaWcgMwogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBzZXRiaXQKICAgIHN3YXAKICAgIHB1c2hpbnQgNwogICAgKwogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGludGNfMiAvLyAyCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTc4CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGggLSAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICA9PQogICAgYXNzZXJ0Cgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4MgogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXlbdHVwbGVbVUludDY0LCBVSW50NjRdXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg1CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4NQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgIDwKICAgIGJ6IHRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg2CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKChpICsgMSwgaSArIDIpKQogICAgZHVwbiAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAzCiAgICBidXJ5IDEKICAgIGIgdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg4CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA1CiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4OQogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAoVUludDY0KDEpLCBVSW50NjQoMikpCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMTYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxOTAKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IChVSW50NjQoNSksIFVJbnQ2NCg2KSkKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIHN3YXAKICAgIHB1c2hpbnQgNgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5MgogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBwdXNoaW50IDE2CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemUKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTkzCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTk0CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IChVSW50NjQoMSksIFVJbnQ2NCgyKSkKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAxNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5NQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg0KSwgVUludDY0KDUpKQogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgcHVzaGludCA0CiAgICA9PQogICAgc3dhcAogICAgcHVzaGludCA1CiAgICA9PQogICAgJiYKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTk2CiAgICAvLyBzZWxmLmMgPSBhcnIKICAgIHB1c2hieXRlcyAiYyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDAKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W015VHVwbGVdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDMKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNQogICAgPAogICAgYnogdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDQKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlUdXBsZShmb289aSwgYmFyPWkgJSAyID09IDAsIGJhej1pICogMyAlIDIgPT0gMCkpCiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAyCiAgICAlCiAgICAhCiAgICBkaWcgMQogICAgcHVzaGludCAzCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDIKICAgIGl0b2IKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDYKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwNwogICAgLy8gZm9vLCBiYXIsIGJheiA9IGFyclswXQogICAgZHVwCiAgICBleHRyYWN0IDIgOQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBwdXNoaW50IDY0CiAgICBnZXRiaXQKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA2NQogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDgKICAgIC8vIGFzc2VydCBmb28gPT0gMAogICAgdW5jb3ZlciAyCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwOQogICAgLy8gYXNzZXJ0IGJhcgogICAgc3dhcAogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTAKICAgIC8vIGFzc2VydCBiYXoKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjExCiAgICAvLyBzZWxmLmQgPSBhcnIKICAgIHB1c2hieXRlcyAiZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxOTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTUKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W3R1cGxlW1VJbnQ2NCwgQnl0ZXNdXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjE4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIxOAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgIDwKICAgIGJ6IHRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjE5CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKChpICsgMSwgb3AuYnplcm8oaSkpKQogICAgZHVwbiAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgc3dhcAogICAgYnplcm8KICAgIGRpZyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGJ5dGVjIDYgLy8gMHgwMDBhCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMwogICAgYnVyeSAxCiAgICBiIHRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyMQogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGJ1cnkgNAogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjIKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEKCnRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjIKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA8CiAgICBieiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyMwogICAgLy8gYXNzZXJ0IGFycltpXVswXSA9PSBpICsgMSwgImV4cGVjdGVkIDFzdCBlbGVtZW50IHRvIGJlIGNvcnJlY3QiCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZGlnIDYKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMXN0IGVsZW1lbnQgdG8gYmUgY29ycmVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjI0CiAgICAvLyBhc3NlcnQgYXJyW2ldWzFdLmxlbmd0aCA9PSBpLCAiZXhwZWN0ZWQgMm5kIGVsZW1lbnQgdG8gYmUgY29ycmVjdCIKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDJuZCBlbGVtZW50IHRvIGJlIGNvcnJlY3QKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2Cgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjYKICAgIC8vIGFyciA9IGFyci5wb3AoKQogICAgZGlnIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyNwogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyOAogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAoVUludDY0KDEpLCBvcC5iemVybygwKSksICJleHBlY3RlZCAxLCAwIgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgaW50Y18wIC8vIDAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDEsIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyOQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg0KSwgb3AuYnplcm8oMykpLCAiZXhwZWN0ZWQgNCwgMyIKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDQKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIHB1c2hpbnQgMwogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgNCwgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjMwCiAgICAvLyBzZWxmLmUgPSBhcnIKICAgIHB1c2hieXRlcyAiZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzQKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W015RHluYW1pY1NpemVkVHVwbGVdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzcKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjM3CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNQogICAgPAogICAgYnogdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzgKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlEeW5hbWljU2l6ZWRUdXBsZShmb289aSArIDEsIGJhcj10aW1lcyhpKSkpCiAgICBkdXBuIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBjYWxsc3ViIHRpbWVzCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyA2IC8vIDB4MDAwYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDMKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDAKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBidXJ5IDQKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNQogICAgPAogICAgYnogdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDIKICAgIC8vIGFzc2VydCBhcnJbaV1bMF0gPT0gaSArIDEsICJleHBlY3RlZCAxc3QgZWxlbWVudCB0byBiZSBjb3JyZWN0IgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGRpZyA2CiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDUKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDFzdCBlbGVtZW50IHRvIGJlIGNvcnJlY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI0MwogICAgLy8gYXNzZXJ0IGFycltpXVsxXSA9PSB0aW1lcyhpKSwgImV4cGVjdGVkIDJuZCBlbGVtZW50IHRvIGJlIGNvcnJlY3QiCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgdGltZXMKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMm5kIGVsZW1lbnQgdG8gYmUgY29ycmVjdAogICAgYnVyeSAxCiAgICBiIHRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDYKCnRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheV9hZnRlcl9mb3JAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI0NQogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBkaWcgMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ2CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ3CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IE15RHluYW1pY1NpemVkVHVwbGUoVUludDY0KDEpLCBTdHJpbmcoKSksICJleHBlY3RlZCAxLCAwIgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAiIgogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMSwgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ4CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSBNeUR5bmFtaWNTaXplZFR1cGxlKFVJbnQ2NCg0KSwgU3RyaW5nKCIgICAiKSksICJleHBlY3RlZCA0LCAzIgogICAgZGlnIDEKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgNAogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA0CiAgICA9PQogICAgc3dhcAogICAgcHVzaGJ5dGVzICIgICAiCiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBleHBlY3RlZCA0LCAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDkKICAgIC8vIHNlbGYuZiA9IGFycgogICAgcHVzaGJ5dGVzICJmIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9sb2dbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fbG9nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjUzCiAgICAvLyBsb2coYXJyKQogICAgbG9nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fZW1pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9lbWl0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU3CiAgICAvLyBhcmM0LmVtaXQoImVtaXRfdGVzdCIsIGFycikKICAgIHB1c2hieXRlcyAweGZhNDBjMDUzMDAwMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU3CiAgICAvLyBhcmM0LmVtaXQoImVtaXRfdGVzdCIsIGFycikKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X25lc3RlZF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfbmVzdGVkX2FycmF5OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMgogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjMtMjY0CiAgICAvLyAjIGFkZCBuIG5ldyBhcnJheXMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcnJfdG9fYWRkKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjMtMjY0CiAgICAvLyAjIGFkZCBuIG5ldyBhcnJheXMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcnJfdG9fYWRkKToKICAgIGR1cAogICAgZGlnIDMKICAgIDwKICAgIGJ6IHRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjUKICAgIC8vIGV4dHJhX2FyciA9IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGJ1cnkgMTIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2NgogICAgLy8gZm9yIGogaW4gdXJhbmdlKGkpOgogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjY2CiAgICAvLyBmb3IgaiBpbiB1cmFuZ2UoaSk6CiAgICBkaWcgNAogICAgZGlnIDEKICAgIDwKICAgIGJ6IHRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckA3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjcKICAgIC8vIGV4dHJhX2FyciA9IGV4dHJhX2Fyci5hcHBlbmQoaikKICAgIGRpZyA0CiAgICBkdXAKICAgIGl0b2IKICAgIGRpZyAxMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2NgogICAgLy8gZm9yIGogaW4gdXJhbmdlKGkpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiB0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDQKCnRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjY4CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKGV4dHJhX2FycikKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBkaWcgMTQKICAgIGNvbmNhdAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjYzLTI2NAogICAgLy8gIyBhZGQgbiBuZXcgYXJyYXlzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXJyX3RvX2FkZCk6CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3MC0yNzEKICAgIC8vICMgc3VtIGlubmVyIGFycmF5cyBhbmQgcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgc3VtcwogICAgLy8gdG90YWxzID0gSW1tdXRhYmxlQXJyYXlbVUludDY0XSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYnVyeSAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjcyCiAgICAvLyBmb3IgaW5uZXJfYXJyIGluIGFycjoKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgYnVyeSA5CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA3Cgp0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDEwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjcyCiAgICAvLyBmb3IgaW5uZXJfYXJyIGluIGFycjoKICAgIGRpZyA2CiAgICBkaWcgOQogICAgPAogICAgYnogdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDEzCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA3CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBidXJ5IDEyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MTAKICAgIC8vIHRvdGFsID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYxMQogICAgLy8gZm9yIGkgaW4gYXJyOgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGJ1cnkgOAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgoKdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAxNToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYxMQogICAgLy8gZm9yIGkgaW4gYXJyOgogICAgZGlnIDUKICAgIGRpZyA4CiAgICA8CiAgICBieiB0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAMTcKICAgIGRpZyAxMAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjEyCiAgICAvLyB0b3RhbCArPSBpCiAgICBkaWcgNQogICAgKwogICAgYnVyeSA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA2CiAgICBiIHRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJAMTUKCnRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckAxNzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3MwogICAgLy8gdG90YWxzID0gdG90YWxzLmFwcGVuZChzdW1fYXJyKGlubmVyX2FycikpCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDEwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAxMAogICAgZGlnIDYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDcKICAgIGIgdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAxMAoKdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2JpdF9wYWNrZWRfdHVwbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9iaXRfcGFja2VkX3R1cGxlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3OQogICAgLy8gYXJyMiA9IEltbXV0YWJsZUFycmF5W1R3b0Jvb2xUdXBsZV0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4MC0yODIKICAgIC8vIGFycjcgPSBJbW11dGFibGVBcnJheVtTZXZlbkJvb2xUdXBsZV0oKQogICAgLy8gYXJyOCA9IEltbXV0YWJsZUFycmF5W0VpZ2h0Qm9vbFR1cGxlXSgpCiAgICAvLyBhcnI5ID0gSW1tdXRhYmxlQXJyYXlbTmluZUJvb2xUdXBsZV0oKQogICAgZHVwbiAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyODgKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2JpdF9wYWNrZWRfdHVwbGVzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4OAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgIDwKICAgIGJ6IHRlc3RfYml0X3BhY2tlZF90dXBsZXNfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4OQogICAgLy8gYXJyMiA9IGFycjIuYXBwZW5kKFR3b0Jvb2xUdXBsZShhPWkgPT0gMCwgYj1pID09IDEpKQogICAgZHVwbiAyCiAgICAhCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI5MwogICAgLy8gYmFyPWkgKyAxLAogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTYKICAgIC8vIGM9aSA9PSAyLAogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjk3CiAgICAvLyBkPWkgPT0gMywKICAgIGRpZyAzCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTgKICAgIC8vIGU9aSA9PSA0LAogICAgZGlnIDQKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI5OQogICAgLy8gZj1pID09IDUsCiAgICBkaWcgNQogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzAwCiAgICAvLyBnPWkgPT0gNiwKICAgIGRpZyA2CiAgICBwdXNoaW50IDYKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTAtMzAyCiAgICAvLyBhcnI3ID0gYXJyNy5hcHBlbmQoCiAgICAvLyAgICAgU2V2ZW5Cb29sVHVwbGUoCiAgICAvLyAgICAgICAgIGZvbz1pLAogICAgLy8gICAgICAgICBiYXI9aSArIDEsCiAgICAvLyAgICAgICAgIGE9aSA9PSAwLAogICAgLy8gICAgICAgICBiPWkgPT0gMSwKICAgIC8vICAgICAgICAgYz1pID09IDIsCiAgICAvLyAgICAgICAgIGQ9aSA9PSAzLAogICAgLy8gICAgICAgICBlPWkgPT0gNCwKICAgIC8vICAgICAgICAgZj1pID09IDUsCiAgICAvLyAgICAgICAgIGc9aSA9PSA2LAogICAgLy8gICAgICkKICAgIC8vICkKICAgIGRpZyA3CiAgICBpdG9iCiAgICB1bmNvdmVyIDcKICAgIGludGNfMiAvLyAyCiAgICB1bmNvdmVyIDcKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCA1CiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCA2CiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgZHVwMgogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDkKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMxNAogICAgLy8gaD1pID09IDcsCiAgICBkaWcgNAogICAgcHVzaGludCA3CiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzAzLTMxNgogICAgLy8gYXJyOCA9IGFycjguYXBwZW5kKAogICAgLy8gICAgIEVpZ2h0Qm9vbFR1cGxlKAogICAgLy8gICAgICAgICBmb289aSwKICAgIC8vICAgICAgICAgYmFyPWkgKyAxLAogICAgLy8gICAgICAgICBhPWkgPT0gMCwKICAgIC8vICAgICAgICAgYj1pID09IDEsCiAgICAvLyAgICAgICAgIGM9aSA9PSAyLAogICAgLy8gICAgICAgICBkPWkgPT0gMywKICAgIC8vICAgICAgICAgZT1pID09IDQsCiAgICAvLyAgICAgICAgIGY9aSA9PSA1LAogICAgLy8gICAgICAgICBnPWkgPT0gNiwKICAgIC8vICAgICAgICAgaD1pID09IDcsCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDcKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkaWcgNwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgNwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzI5CiAgICAvLyBpPWkgPT0gOCwKICAgIHVuY292ZXIgMwogICAgaW50Y18zIC8vIDgKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMTctMzMxCiAgICAvLyBhcnI5ID0gYXJyOS5hcHBlbmQoCiAgICAvLyAgICAgTmluZUJvb2xUdXBsZSgKICAgIC8vICAgICAgICAgZm9vPWksCiAgICAvLyAgICAgICAgIGJhcj1pICsgMSwKICAgIC8vICAgICAgICAgYT1pID09IDAsCiAgICAvLyAgICAgICAgIGI9aSA9PSAxLAogICAgLy8gICAgICAgICBjPWkgPT0gMiwKICAgIC8vICAgICAgICAgZD1pID09IDMsCiAgICAvLyAgICAgICAgIGU9aSA9PSA0LAogICAgLy8gICAgICAgICBmPWkgPT0gNSwKICAgIC8vICAgICAgICAgZz1pID09IDYsCiAgICAvLyAgICAgICAgIGg9aSA9PSA3LAogICAgLy8gICAgICAgICBpPWkgPT0gOCwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAzCiAgICBidXJ5IDEKICAgIGIgdGVzdF9iaXRfcGFja2VkX3R1cGxlc19mb3JfaGVhZGVyQDIKCnRlc3RfYml0X3BhY2tlZF90dXBsZXNfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzMKICAgIC8vIGFzc2VydCBhcnIyLmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzQKICAgIC8vIGFzc2VydCBhcnI3Lmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzUKICAgIC8vIGFzc2VydCBhcnI4Lmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzYKICAgIC8vIGFzc2VydCBhcnI5Lmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzcKICAgIC8vIHNlbGYuYm9vbDIgPSBhcnIyCiAgICBwdXNoYnl0ZXMgImJvb2wyIgogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzM4CiAgICAvLyBzZWxmLmJvb2w3ID0gYXJyNwogICAgcHVzaGJ5dGVzICJib29sNyIKICAgIHVuY292ZXIgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMzOQogICAgLy8gc2VsZi5ib29sOCA9IGFycjgKICAgIHB1c2hieXRlcyAiYm9vbDgiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNDAKICAgIC8vIHNlbGYuYm9vbDkgPSBhcnI5CiAgICBwdXNoYnl0ZXMgImJvb2w5IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzOgogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTAKICAgIC8vIHN1bTEgPSBzdW0yID0gc3VtMyA9IHN1bTQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUxCiAgICAvLyBmb3IgaSBpbiBhcnIxOgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMCAvLyAwCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MQogICAgLy8gZm9yIGkgaW4gYXJyMToKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDUKICAgIGRpZyA5CiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTIKICAgIC8vIHN1bTEgKz0gaQogICAgZGlnIDQKICAgICsKICAgIGJ1cnkgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMgoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MwogICAgLy8gZm9yIGIgaW4gYXJyMjoKICAgIGRpZyA4CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgYnVyeSAxNwogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUzCiAgICAvLyBmb3IgYiBpbiBhcnIyOgogICAgZGlnIDEyCiAgICBkaWcgMTcKICAgIDwKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDExCiAgICBkaWcgMTIKICAgIHB1c2hpbnQgMTYKICAgICsKICAgIGRpZyA5CiAgICBzd2FwCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1NAogICAgLy8gaWYgYjoKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTUKICAgIC8vIHN1bTIgKz0gMQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDQKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUA5OgogICAgZGlnIDEyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxMwogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJANgoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTYKICAgIC8vIGZvciB0dXAgaW4gYXJyMzoKICAgIGRpZyA3CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgYnVyeSAxNgogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTIKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckAxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1NgogICAgLy8gZm9yIHR1cCBpbiBhcnIzOgogICAgZGlnIDExCiAgICBkaWcgMTYKICAgIDwKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDE5CiAgICBkaWcgNwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxMgogICAgcHVzaGludCA5CiAgICAqCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBwdXNoaW50IDY0CiAgICBnZXRiaXQKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA2NQogICAgZ2V0Yml0CiAgICBidXJ5IDEzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTcKICAgIC8vIHN1bTMgKz0gdHVwLmZvbwogICAgZGlnIDYKICAgIHVuY292ZXIgMgogICAgKwogICAgYnVyeSA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTgKICAgIC8vIGlmIHR1cC5iYXI6CiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1OQogICAgLy8gc3VtMyArPSAxCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYwCiAgICAvLyBpZiB0dXAuYmF6OgogICAgZGlnIDEwCiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM2MQogICAgLy8gc3VtMyArPSAxCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9pZl9lbHNlQDE3OgogICAgZGlnIDExCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxMgogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMTIKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDE5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYyCiAgICAvLyBmb3IgaWR4LCBkeW5fdHVwIGluIHVlbnVtZXJhdGUoYXJyNCk6CiAgICBkaWcgNgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGJ1cnkgMTUKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMjA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjIKICAgIC8vIGZvciBpZHgsIGR5bl90dXAgaW4gdWVudW1lcmF0ZShhcnI0KToKICAgIGRpZyAxMwogICAgZGlnIDE1CiAgICA8CiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAyMwogICAgZGlnIDYKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMTQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkaWcgMTgKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYzCiAgICAvLyBzdW00ICs9IGR5bl90dXAuZm9vCiAgICBkaWcgOQogICAgdW5jb3ZlciAyCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjQKICAgIC8vIHN1bTQgKz0gZHluX3R1cC5iYXIuYnl0ZXMubGVuZ3RoCiAgICBzd2FwCiAgICBsZW4KICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICBidXJ5IDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM2NQogICAgLy8gYXNzZXJ0IGR5bl90dXAuYmFyLmJ5dGVzLmxlbmd0aCA9PSBpZHgsICJleHBlY3RlZCBzdHJpbmcgbGVuZ3RoIHRvIG1hdGNoIGluZGV4IgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHN0cmluZyBsZW5ndGggdG8gbWF0Y2ggaW5kZXgKICAgIGJ1cnkgMTQKICAgIGIgc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19mb3JfaGVhZGVyQDIwCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAyMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAyCiAgICBpdG9iCiAgICBkaWcgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNgogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X3VpbnQ2NF9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3VpbnQ2NF9yZXR1cm46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzEKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIHB1c2hieXRlcyAweDAwMDMwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF91aW50NjRfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X3VpbnQ2NF9yZXR1cm5fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChpKQogICAgZHVwbiAyCiAgICBpdG9iCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzcyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF91aW50NjRfcmV0dXJuX2Zvcl9oZWFkZXJAMgoKdGVzdF91aW50NjRfcmV0dXJuX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfYm9vbF9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2Jvb2xfcmV0dXJuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc4CiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheSgoVHJ1ZSwgRmFsc2UsIFRydWUsIEZhbHNlLCBUcnVlKSkKICAgIHB1c2hieXRlcyAweDAwMDVhOAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2Jvb2xfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3OQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2Jvb2xfcmV0dXJuX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODAKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoaSAlIDIgPT0gMCkKICAgIGR1cG4gMgogICAgaW50Y18yIC8vIDIKICAgICUKICAgICEKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGludGNfMyAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9ib29sX3JldHVybl9mb3JfaGVhZGVyQDIKCnRlc3RfYm9vbF9yZXR1cm5fYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF90dXBsZV9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3R1cGxlX3JldHVybjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NQogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXkoKE15VHVwbGUoVUludDY0KCksIFRydWUsIEZhbHNlKSwpKQogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDAwMDAwMDAwMDAwMDA4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzg2CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X3R1cGxlX3JldHVybl9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODYKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF90dXBsZV9yZXR1cm5fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChNeVR1cGxlKGZvbz1pLCBiYXI9aSAlIDIgPT0gMCwgYmF6PWkgJSAzID09IDApKQogICAgZHVwbiAyCiAgICBpbnRjXzIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDEKICAgIHB1c2hpbnQgMwogICAgJQogICAgIQogICAgZGlnIDIKICAgIGl0b2IKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfdHVwbGVfcmV0dXJuX2Zvcl9oZWFkZXJAMgoKdGVzdF90dXBsZV9yZXR1cm5fYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9keW5hbWljX3R1cGxlX3JldHVybltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZHluYW1pY190dXBsZV9yZXR1cm46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTIKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5KChNeUR5bmFtaWNTaXplZFR1cGxlKFVJbnQ2NCgpLCBTdHJpbmcoIkhlbGxvIikpLCkpCiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDBhMDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9keW5hbWljX3R1cGxlX3JldHVybl9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF9keW5hbWljX3R1cGxlX3JldHVybl9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzk0CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKE15RHluYW1pY1NpemVkVHVwbGUoaSwgdGltZXMoaSkpKQogICAgZHVwbiAyCiAgICBjYWxsc3ViIHRpbWVzCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyA2IC8vIDB4MDAwYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfZHluYW1pY190dXBsZV9yZXR1cm5fZm9yX2hlYWRlckAyCgp0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFja1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFjazoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwMgogICAgLy8gbXV0YWJsZS5leHRlbmQoYXJyKQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwNAogICAgLy8gbXV0YWJsZS5hcHBlbmQoTXlUdXBsZShmb289aSwgYmFyPWkgJSAyID09IDAsIGJhej1pICUgMyA9PSAwKSkKICAgIGR1cG4gMgogICAgaW50Y18yIC8vIDIKICAgICUKICAgICEKICAgIGRpZyAxCiAgICBwdXNoaW50IDMKICAgICUKICAgICEKICAgIGRpZyA0CiAgICBjb3ZlciAzCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgYnVyeSAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MDMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfZm9yX2hlYWRlckAyCgp0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDA1CiAgICAvLyByZXR1cm4gbXV0YWJsZS5mcmVlemUoKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOQogICAgLwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDExCiAgICAvLyBwcmVmaXggPSBJbW11dGFibGVBcnJheSgoYXJjNC5VSW50NjQoMSksIGFyYzQuVUludDY0KDIpKSkKICAgIGJ5dGVjIDggLy8gMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxMgogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZXh0cmFjdCA4IDgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQyMAogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxOQogICAgLy8gcHJlZml4ID0gSW1tdXRhYmxlQXJyYXkoKGFyYzQuVUludDY0KDEpLCBhcmM0LlVJbnQ2NCgyKSkpCiAgICBieXRlYyA4IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjAKICAgIC8vIHJlc3VsdCA9IHByZWZpeCArIGFyZwogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBwdXNoYnl0ZXMgMHgwMDA0CiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfYXJjNF90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9hcmM0X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDI4CiAgICAvLyByZXN1bHQgPSBwcmVmaXggKyBhcmcKICAgIGV4dHJhY3QgNCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjcKICAgIC8vIHByZWZpeCA9IEltbXV0YWJsZUFycmF5KChhcmM0LlN0cmluZygiYSIpLCBhcmM0LlN0cmluZygiYiIpKSkKICAgIGJ5dGVjIDkgLy8gMHgwMDAyMDAwNDAwMDcwMDAxNjEwMDAxNjIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQyOAogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDM2CiAgICAvLyByZXN1bHQgPSBwcmVmaXggKyBhcmcKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDM1CiAgICAvLyBwcmVmaXggPSBJbW11dGFibGVBcnJheSgoYXJjNC5TdHJpbmcoImEiKSwgYXJjNC5TdHJpbmcoImIiKSkpCiAgICBieXRlYyA5IC8vIDB4MDAwMjAwMDQwMDA3MDAwMTYxMDAwMTYyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MzYKICAgIC8vIHJlc3VsdCA9IHByZWZpeCArIGFyZwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2NvbmNhdF9pbW11dGFibGVfZHluYW1pYzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ0MwogICAgLy8gcmV0dXJuIGltbTEgKyBpbW0yCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgZXh0cmFjdCAyIDAKICAgIHVuY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FyYzRbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcmM0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ3CiAgICAvLyBhc3NlcnQgaW1tLCAiZXhwZWN0ZWQgbm9uIGVtcHR5IGFycmF5IgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgbm9uIGVtcHR5IGFycmF5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NDgKICAgIC8vIGltbSA9IGltbS5yZXBsYWNlKGltbS5sZW5ndGggLSAxLCBpbW1bMF0pCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAxNgogICAgc3dhcAogICAgcHVzaGludCAxNgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIHN3YXAKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9pbW1fZml4ZWRfYXJyW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9pbW1fZml4ZWRfYXJyOgogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDUzCiAgICAvLyBhcnIxID0gemVyb19ieXRlcyhOYXRpdmVTdHJ1Y3QzKQogICAgcHVzaGludCA0OAogICAgYnplcm8KICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU0CiAgICAvLyBzdHJ1Y3QxMiA9IE5hdGl2ZVN0cnVjdChUeG4ubnVtX2FwcF9hcmdzICsgMSwgVHhuLm51bV9hcHBfYXJncyArIDIpCiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ1NQogICAgLy8gYXJyMiA9IE5hdGl2ZVN0cnVjdDMoKHN0cnVjdDEyLCBzdHJ1Y3QxMiwgc3RydWN0MTIpKQogICAgZHVwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU3CiAgICAvLyBhc3NlcnQgYXJyMSAhPSBhcnIyLCAiZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIGRpZmZlcmVudCIKICAgICE9CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIGRpZmZlcmVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDYwCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2MAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDMpOgogICAgZHVwCiAgICBwdXNoaW50IDMKICAgIDwKICAgIGJ6IHRlc3RfaW1tX2ZpeGVkX2Fycl9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDYxCiAgICAvLyBhcnIxID0gYXJyMS5yZXBsYWNlKGksIHN0cnVjdDEyKQogICAgZHVwbiAyCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZGlnIDUKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnVyeSA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NjAKICAgIC8vIGZvciBpIGluIHVyYW5nZSgzKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJAMgoKdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDYzCiAgICAvLyBhc3NlcnQgYXJyMSA9PSBhcnIyLCAiZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIHRoZSBzYW1lIgogICAgZGlnIDMKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFycmF5cyB0byBiZSB0aGUgc2FtZQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2NQogICAgLy8gZm9yIHN0cnVjdF9pdCBpbiBhcnIxOgogICAgZGlnIDQKICAgIHB1c2hpbnQgMwogICAgPAogICAgYnogdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA5CiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgcHVzaGludCAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NjYKICAgIC8vIGFzc2VydCBzdHJ1Y3RfaXQgPT0gc3RydWN0MTIsICJleHBlY3RlZCBpdGVtcyBvbiBpdGVyYXRpb24gdG8gYmUgdGhlIHNhbWUiCiAgICBkaWcgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBpdGVtcyBvbiBpdGVyYXRpb24gdG8gYmUgdGhlIHNhbWUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDUKICAgIGIgdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJANgoKdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDY4CiAgICAvLyBzZWxmLmltbV9maXhlZF9hcnIgPSBhcnIxCiAgICBieXRlYyAxMCAvLyAiaW1tX2ZpeGVkX2FyciIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzIKICAgIC8vIGFzc2VydCBzdW1faW1tX2ZpeGVkKG11dF9hcnIuZnJlZXplKCkpID09IDE1LCAiZXhwZWN0ZWQgc3VtIHRvIGJlIDE1IgogICAgZHVwCiAgICBjYWxsc3ViIHN1bV9pbW1fZml4ZWQKICAgIHB1c2hpbnQgMTUKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgc3VtIHRvIGJlIDE1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzQKICAgIC8vIG11dF9hcnJbMF0gPSBOYXRpdmVTdHJ1Y3QoVUludDY0KCksIFVJbnQ2NCgpKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDAgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzUKICAgIC8vIGFzc2VydCBzdW1faW1tX2ZpeGVkKG11dF9hcnIuZnJlZXplKCkpID09IDEwLCAiZXhwZWN0ZWQgc3VtIHRvIGJlIDEwIgogICAgY2FsbHN1YiBzdW1faW1tX2ZpeGVkCiAgICBwdXNoaW50IDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHN1bSB0byBiZSAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDc3CiAgICAvLyByZXR1cm4gc2VsZi5pbW1fZml4ZWRfYXJyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImltbV9maXhlZF9hcnIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1tX2ZpeGVkX2FyciBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAAECCCYLAAQVH3x1AgAAAQACAAJA/////////////////////////////////////////////////////////////////////////////////////wIACgdiaWd1aW50EgACAAAAAAAAAAEAAAAAAAAAAgwAAgAEAAcAAWEAAWINaW1tX2ZpeGVkX2FycjEbQQC3MRkURDEYRIIYBETUL5kEt+qmCwR0PXDtBBx+BJQEotWGCwTgX8VkBB4JK4MEATECYgTIZUqYBInRlvgEbLfJkQSYmL8CBPa2HugEYLhqewRzrSg/BFKd+ukEIG1RTwTgZGXiBOwDAKIE7N8UrwRRGspkBCmFLk8EbUqjWAS3y5a9NhoAjhgCaQNQBHoFNQXlBkoHfAixCLcIxgmjCsEL8gw+DHEMww0jDXINiw2nDboN4w4MDikAMRkUMRgUEEOKAgKL/iJZIwkWVwYAi/5MXABJFYv/CUqL/1hPAiJPA1KJigECi/8iWSMJSSQLSYv/VwIASU4CSU8CWUlPAkkVTE4CUigiiwaLAQxBABuLAosGSU4CWSQJFlcGAosFTFCMBSQIjAZC/92LABZXBgKLBVCLASQIiwJMiwNSUIsEjACMAYmKBAEoRwKL/CJZRwKL/ghJFlcGAIv8TFwATgJMgQcIJQpJTwKBBwglCklOAgxBAAyLBosFCa+LBExQjAQijACLA4EQCEmMAov+CIwBiwKLAQxBACCL/YsASU4CU4sEiwJJTgNPAlSMBCMIjAKL/wiMAEL/2IsEjACJigMBi/0iWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJIosEiwIMQQAjiwNJFlcGAosBiwRJTgRPAl1JjAFLAVkkCAiMAyQIjARC/9WLAIsBUIwAiYoEAShJi/4kC4v8JAsiiwSLAwxBAByL/YsESU4CWYsCCBZXBgKLAUxQjAEkCIwEQv/ci/0VjAAijASLBIsCDEEAHIv/iwRJTgJZiwAIFlcGAosBTFCMASQIjARC/9yL/Iv+CBZXBgKLAVCL/YsDiwBSUIv/FYv/iwJPAlJQjACJigEBIkmLAYEDDEEAH4sBSYEQC4v/TIEQWEkiW4sACEwlWwiMACMIjAFC/9mJigEBKCKLAYv/DEEAEYsAgAEgUIwAiwEjCIwBQv/niYoCASKLAIv/DEEAHYsASRaL/kxQi/4iWSMIFlcGAlwAjP4jCIwAQv/bi/5MiYAKAAEAAAAAAAAAKoEFiP/CSSJZSYEGEkRJIwlLAlcCAEwlC1uBBBJEgSsWTwJMUEwjCBZXBgJcAEcCIllJgQcSRCMJSwFXAgBMJQtbgSsSRCRbgSoSRCJJgQMMQQARSwEliP07RQNISSMIRQFC/+hLAUkiWUmBBBJEIwlLAVcCAEwlC1skEkSBCoj/RkkiWUmBDhJESSMJSwJXAgBMJQtbgQkSRIEsFk8CTFBMIwgWVwYCXABJIllJgQ8SRCMJSwFXAgBMJQtbgSwSRIEXFlwSSSJZgQ8SREmBEluBFxJEgAFhTGcjQzEbIwkWgUCvSU4CqypMUIACAAFcAEcCIllJIxJEIwlMVwIATIFAC4FAWCioRCJJgQUMQQAgRwIWSwSrSwNJTwJQTCJZIwgWVwYCXABFAyMIRQFC/9lLAUkiWUmBBhJESSMJSwJXAgBMgUALgUBYgAEEqEQxGxYnBUyhSRWBQA5ESwWrTwJMUEwjCBZXBgJcAEkiWUmBBxJESSMJSwJXAgBMgUALgUBYgED////////////////////////////////////////////////////////////////////////////////////+qERLAVcCQCioREwnBVBMIwgWVwYCXABJIllJJRJEIwlLAVcCAEyBQAuBQFgnBahESVcCQCioRCcHvEgnB0y/I0MoNhoBFyoiSUsDDEEAHjEbSwFJTwISKyJPAlRLA0wjJYj78EUDIwhFAUL/20sBIllJRQVLA0lOAhJEQQAKSwNESwGBEFMUREsCIw1BAAwjSwQMREsBgRFTFERLAiQNQQALJEsEDERLAYESU0RLAoEDDUEAEksCIwlJSwUMRIEQCEsCTFMURIABZ0sCZ0sCQQAoSwMjCUkWVwYASwNMXABLAYEQCCJUTIEHCCUKJAgiTFIiWUsDIwkSRCNDKiJJgQUMQQAlRwIjCEwkCEsBFkwWUEsDSU8CUEwiWSMIFlcGAlwARQNFAUL/1EsBSSJZSYEFEkRLAVcCAEsCVwIQSSJbTCVbTCMSTCQSEERMIwmBEAuBEFhJIltMJVtMgQUSTIEGEhBEgRCI+mZFAUkiWUmBBBJESwFXAgBLAlcCEEkiW0wlW0wjEkwkEhBETCMJgRALgRBYSSJbTCVbTIEEEkyBBRIQRIABY0xnI0MqIkmBBQxBADRHAiQYFEsBgQMLJBgUSwIWKyJPBFQjTwNUUEsDSU8CUEwiWSMIFlcGAlwARQMjCEUBQv/FSwFJIlmBBRJESVcCCUkiW0sBgUBTTwKBQVNPAhRETEREgAFkTGcjQygqIkmBBQxBADVHAiMITK9LA0kiWUxXAgBLAxZLAxUWVwYCTwRQTCcGUExQJwRMUE4CI08DiPruRQNFAUL/xEsBIllJRQSBBRJEIkUBSYEFDEEAT0sBVwIASwFJTgIkC0sBTFlLAiMISwZLAQlLAxVLAiQLSwVMWU8CTU8DTwNPAlJJIltLASVZSwIVTwNOAlJXAgBMSwISRBVPAhJERQFC/6pLAYj5OUUBSSJZSYEEEkRLAVcCAEkiWUsCIwlLAhVLAyRZSwFMSwNNSwRPBE8CUkkiW0sBJVlLAhVPA04CUlcCAEwjEiKvTwISEERLASQLSwNMWU8CIwhPBEsBCUwkC0sETFlPA0xPAk1SSSJbSwElWUsCFU8DTgJSVwIATIEEEoEDr08CEhBEgAFlTGcjQygqIkmBBQxBADdHAiMITIj6j0sDSSJZTFcCAEsDFksDFRZXBgJPBFBMJwZQTFAnBExQTgIjTwOI+bpFA0UBQv/CSwEiWUlFBIEFEkQiRQFJgQUMQQBRSwFXAgBLAUlOAiQLSwFMWUsCIwhLBksBCUsDFUsCJAtLBUxZTwJNTwNPA08CUkkiW0sBJVlLAhVPA04CUlcCAExLAhJETwKI+gESREUBQv+oSwGI+ANFAUkiWUmBBBJESwFXAgBJIllLAiMJSwIVSwMkWUsBTEsDTUsETwRPAlJJIltLASVZSwIVTwNOAlJXAgBMIxJMKBIQREsBJAtLA0xZTwIjCE8ESwEJTCQLSwRMWU8DTE8CTVJJIltLASVZSwIVTwNOAlJXAgBMgQQSTIADICAgEhBEgAFmTGcjQzYaAbAjQ4AG+kDAUwACNhoBULAjQyJHAihHBTYaARc2GgIiSUsDDEEATCpFDCJFBUsESwEMQQAeSwRJFksNSU8CUEwiWSMIFlcGAlwARQ0jCEUFQv/aSwFJIllMVwIAJwRLDlBOAiNPA4j4U0UCSSMIRQFC/60qRQpLASJZRQkiRQdLBksJDEEAYUsBVwIASwckC0sBTFlKWSULJAhYSUUMIkUFIllFCCJFBksFSwgMQQAZSwpXAgBLBklOAiULW0sFCEUFIwhFBkL/30sDFksKSU8CUEwiWSMIFlcGAlwARQpLBiMIRQdC/5cpSwpQsCNDKkcDIkmBBQxBAMZHAhRLASMSKyJPA1QjTwJUSwZJTgJLAVBPAiJZIwgWVwYCXABFB0sBIwhLAiQSSwOBAxJLBIEEEksFgQUSSwaBBhJLBxZPByRPB1SBA08GVIEETwVUgQVPBFSBBk8DVEpQSwMWTEsBUEsJSU8CUEwiWSMIFlcGAlwARQlLBIEHEk8CgQdPAlRPAkxQSUsCUEsHSU8CUEwiWSMIFlcGAlwARQdPAyUSKyJPAlRQTFBLA0lPAlBMIlkjCBZXBgJcAEUDRQFC/zNLBEkiWYEFEkRLBEkiWYEFEkRLBEkiWYEFEkRLBEkiWYEFEkSABWJvb2wyTwRngAVib29sN08DZ4AFYm9vbDhPAmeABWJvb2w5TGcjQyhHBjYaATYaAjYaAzYaBCJHAzYaASJZIklLAgxBABlLCVcCAEsBSU4CJQtbSwQIRQQjCEUBQv/gSwgiWUURIkUNSwxLEQxBABtLDIEQCEsJTFNBAAZLAyMIRQRLDCMIRQ1C/91LByJZRRAiRQxLC0sQDEEAQEsHVwIASwyBCQuBCVhJIltLAYFAU08CgUFTRQ1LBk8CCEUGQQAGSwQjCEUFSwpBAAZLBCMIRQVLCyMIRQxC/7hLBiJZRQ8iRQ5LDUsPDEEAVksGVwIASw5JTgIkC0sBTFlLAiMISxJLAQlLAxVLAiQLSwVMWU8CTU8DTwNPAlJJIltLASVZSwIVTwNOAlJXAgBLCU8CCEwVTEsBCEUJTwISREUOQv+iSwIWSwQWUEsFFlBLBhZQKUxQsCNDNhoBF4AaAAMAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAMiSUsDDEEAHUcCFksDSU8CUEwiWSMIFlcGAlwARQMjCEUBQv/cKUsCULAjQzYaAReAAwAFqCJJSwMMQQAbRwIkGBQrIk8CVEsDTCMliPQsRQMjCEUBQv/eKUsCULAjQzYaAReACwABAAAAAAAAAACAIklLAwxBADJHAiQYFEsBgQMYFEsCFisiTwRUI08DVFBLA0lPAlBMIlkjCBZXBgJcAEUDIwhFAUL/xylLAlCwI0M2GgEXgBUAAQACAAAAAAAAAAAACgAFSGVsbG8iSUsDDEEANkcCiPUySwNJIllMVwIASwMWSwMVFlcGAk8EUEwnBlBMUCcETFBOAiNPA4j0XUUDIwhFAUL/wylLAlCwI0M2GgE2GgIXTFcCACJJSwMMQQApRwIkGBRLAYEDGBRLBE4DSwIWKyJPBFQjTwNUUE8CTFBFAyMIRQFC/9BLAUkVgQkKFlcGAkxQKUxQsCNDJwg2GgFQSVcCABUlChZXBgJcAClMULAjQzYaAUlXAAhMVwgIUCcITFCAAgAEXAApTFCwI0M2GgFXBAAnCUwkiPNSKUxQsCNDNhoBSSJZSwEkWUsCTwJLAlJLAhVPA08DTwJSUCcJTCSI8ykpTFCwI0M2GgE2GgJLASJZTwJXAgBLAlcCAE8DIllPA08DTwJPA4jzailMULAjQzYaAUkiWUlEIwlLAVcCEEyBEAskCExdKUxQsCNDKIEwr0kxGyMIMRskCEwWTBZQSU4CSUsBUExQSU4CE0QiSYEDDEEAFEcCgRALSwVMSwVdRQUjCEUBQv/lSwNLAhJEIkUFSwSBAwxBABdLBEmBEAtLBUyBEFhLBBJEIwhFBUL/4ScKSwRJTgJnSYjzV4EPEkSAEAAAAAAAAAAAAAAAAAAAAABcAIjzPIEKEkQiJwplRClMULAjQw==","clear":"C4EBQw=="},"events":[{"name":"emit_test","args":[{"type":"uint64[]","name":"field1"}]}],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the ImmutableArrayContract contract + */ +export type ImmutableArrayContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'test_uint64_array()void': Record + 'test_biguint_array()void': Record + 'test_bool_array(uint64)void': { + length: bigint | number + } + 'test_fixed_size_tuple_array()void': Record + 'test_fixed_size_named_tuple_array()void': Record + 'test_dynamic_sized_tuple_array()void': Record + 'test_dynamic_sized_named_tuple_array()void': Record + 'test_implicit_conversion_log(uint64[])void': { + arr: bigint[] | number[] + } + 'test_implicit_conversion_emit(uint64[])void': { + arr: bigint[] | number[] + } + 'test_nested_array(uint64,uint64[][])uint64[]': { + arrToAdd: bigint | number + arr: bigint[] | number[][] + } + 'test_bit_packed_tuples()void': Record + 'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)': { + arr1: bigint[] | number[] + arr2: boolean[] + arr3: [bigint | number, boolean, boolean][] + arr4: [bigint | number, string][] + } + 'test_uint64_return(uint64)uint64[]': { + append: bigint | number + } + 'test_bool_return(uint64)bool[]': { + append: bigint | number + } + 'test_tuple_return(uint64)(uint64,bool,bool)[]': { + append: bigint | number + } + 'test_dynamic_tuple_return(uint64)(uint64,string)[]': { + append: bigint | number + } + 'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]': { + arr: [bigint | number, boolean, boolean][] + append: bigint | number + } + 'test_concat_with_arc4_tuple((uint64,uint64))uint64[]': { + arg: [bigint | number, bigint | number] + } + 'test_concat_with_native_tuple((uint64,uint64))uint64[]': { + arg: [bigint | number, bigint | number] + } + 'test_dynamic_concat_with_arc4_tuple((string,string))string[]': { + arg: [string, string] + } + 'test_dynamic_concat_with_native_tuple((string,string))string[]': { + arg: [string, string] + } + 'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]': { + imm1: [bigint | number, string][] + imm2: [bigint | number, string][] + } + 'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]': { + imm: [bigint | number, bigint | number][] + } + 'test_imm_fixed_arr()(uint64,uint64)[3]': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'test_uint64_array()void': [] + 'test_biguint_array()void': [] + 'test_bool_array(uint64)void': [length: bigint | number] + 'test_fixed_size_tuple_array()void': [] + 'test_fixed_size_named_tuple_array()void': [] + 'test_dynamic_sized_tuple_array()void': [] + 'test_dynamic_sized_named_tuple_array()void': [] + 'test_implicit_conversion_log(uint64[])void': [arr: bigint[] | number[]] + 'test_implicit_conversion_emit(uint64[])void': [arr: bigint[] | number[]] + 'test_nested_array(uint64,uint64[][])uint64[]': [arrToAdd: bigint | number, arr: bigint[] | number[][]] + 'test_bit_packed_tuples()void': [] + 'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)': [arr1: bigint[] | number[], arr2: boolean[], arr3: [bigint | number, boolean, boolean][], arr4: [bigint | number, string][]] + 'test_uint64_return(uint64)uint64[]': [append: bigint | number] + 'test_bool_return(uint64)bool[]': [append: bigint | number] + 'test_tuple_return(uint64)(uint64,bool,bool)[]': [append: bigint | number] + 'test_dynamic_tuple_return(uint64)(uint64,string)[]': [append: bigint | number] + 'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]': [arr: [bigint | number, boolean, boolean][], append: bigint | number] + 'test_concat_with_arc4_tuple((uint64,uint64))uint64[]': [arg: [bigint | number, bigint | number]] + 'test_concat_with_native_tuple((uint64,uint64))uint64[]': [arg: [bigint | number, bigint | number]] + 'test_dynamic_concat_with_arc4_tuple((string,string))string[]': [arg: [string, string]] + 'test_dynamic_concat_with_native_tuple((string,string))string[]': [arg: [string, string]] + 'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]': [imm1: [bigint | number, string][], imm2: [bigint | number, string][]] + 'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]': [imm: [bigint | number, bigint | number][]] + 'test_imm_fixed_arr()(uint64,uint64)[3]': [] + } +} + +/** + * The return type for each method + */ +export type ImmutableArrayContractReturns = { + 'test_uint64_array()void': void + 'test_biguint_array()void': void + 'test_bool_array(uint64)void': void + 'test_fixed_size_tuple_array()void': void + 'test_fixed_size_named_tuple_array()void': void + 'test_dynamic_sized_tuple_array()void': void + 'test_dynamic_sized_named_tuple_array()void': void + 'test_implicit_conversion_log(uint64[])void': void + 'test_implicit_conversion_emit(uint64[])void': void + 'test_nested_array(uint64,uint64[][])uint64[]': bigint[] + 'test_bit_packed_tuples()void': void + 'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)': [bigint, bigint, bigint, bigint] + 'test_uint64_return(uint64)uint64[]': bigint[] + 'test_bool_return(uint64)bool[]': boolean[] + 'test_tuple_return(uint64)(uint64,bool,bool)[]': [bigint, boolean, boolean][] + 'test_dynamic_tuple_return(uint64)(uint64,string)[]': [bigint, string][] + 'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]': [bigint, boolean, boolean][] + 'test_concat_with_arc4_tuple((uint64,uint64))uint64[]': bigint[] + 'test_concat_with_native_tuple((uint64,uint64))uint64[]': bigint[] + 'test_dynamic_concat_with_arc4_tuple((string,string))string[]': string[] + 'test_dynamic_concat_with_native_tuple((string,string))string[]': string[] + 'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]': [bigint, string][] + 'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]': [bigint, bigint][] + 'test_imm_fixed_arr()(uint64,uint64)[3]': [[bigint, bigint], [bigint, bigint], [bigint, bigint]] +} + +/** + * Defines the types of available calls and state of the ImmutableArrayContract smart contract. + */ +export type ImmutableArrayContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'test_uint64_array()void' | 'test_uint64_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_uint64_array()void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_uint64_array()void'] + returns: ImmutableArrayContractReturns['test_uint64_array()void'] + }> + & Record<'test_biguint_array()void' | 'test_biguint_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_biguint_array()void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_biguint_array()void'] + returns: ImmutableArrayContractReturns['test_biguint_array()void'] + }> + & Record<'test_bool_array(uint64)void' | 'test_bool_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_bool_array(uint64)void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_bool_array(uint64)void'] + returns: ImmutableArrayContractReturns['test_bool_array(uint64)void'] + }> + & Record<'test_fixed_size_tuple_array()void' | 'test_fixed_size_tuple_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_fixed_size_tuple_array()void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_fixed_size_tuple_array()void'] + returns: ImmutableArrayContractReturns['test_fixed_size_tuple_array()void'] + }> + & Record<'test_fixed_size_named_tuple_array()void' | 'test_fixed_size_named_tuple_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_fixed_size_named_tuple_array()void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_fixed_size_named_tuple_array()void'] + returns: ImmutableArrayContractReturns['test_fixed_size_named_tuple_array()void'] + }> + & Record<'test_dynamic_sized_tuple_array()void' | 'test_dynamic_sized_tuple_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_sized_tuple_array()void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_sized_tuple_array()void'] + returns: ImmutableArrayContractReturns['test_dynamic_sized_tuple_array()void'] + }> + & Record<'test_dynamic_sized_named_tuple_array()void' | 'test_dynamic_sized_named_tuple_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_sized_named_tuple_array()void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_sized_named_tuple_array()void'] + returns: ImmutableArrayContractReturns['test_dynamic_sized_named_tuple_array()void'] + }> + & Record<'test_implicit_conversion_log(uint64[])void' | 'test_implicit_conversion_log', { + argsObj: ImmutableArrayContractArgs['obj']['test_implicit_conversion_log(uint64[])void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_implicit_conversion_log(uint64[])void'] + returns: ImmutableArrayContractReturns['test_implicit_conversion_log(uint64[])void'] + }> + & Record<'test_implicit_conversion_emit(uint64[])void' | 'test_implicit_conversion_emit', { + argsObj: ImmutableArrayContractArgs['obj']['test_implicit_conversion_emit(uint64[])void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_implicit_conversion_emit(uint64[])void'] + returns: ImmutableArrayContractReturns['test_implicit_conversion_emit(uint64[])void'] + }> + & Record<'test_nested_array(uint64,uint64[][])uint64[]' | 'test_nested_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_nested_array(uint64,uint64[][])uint64[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_nested_array(uint64,uint64[][])uint64[]'] + returns: ImmutableArrayContractReturns['test_nested_array(uint64,uint64[][])uint64[]'] + }> + & Record<'test_bit_packed_tuples()void' | 'test_bit_packed_tuples', { + argsObj: ImmutableArrayContractArgs['obj']['test_bit_packed_tuples()void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_bit_packed_tuples()void'] + returns: ImmutableArrayContractReturns['test_bit_packed_tuples()void'] + }> + & Record<'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)' | 'sum_uints_and_lengths_and_trues', { + argsObj: ImmutableArrayContractArgs['obj']['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'] + argsTuple: ImmutableArrayContractArgs['tuple']['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'] + returns: ImmutableArrayContractReturns['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'] + }> + & Record<'test_uint64_return(uint64)uint64[]' | 'test_uint64_return', { + argsObj: ImmutableArrayContractArgs['obj']['test_uint64_return(uint64)uint64[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_uint64_return(uint64)uint64[]'] + returns: ImmutableArrayContractReturns['test_uint64_return(uint64)uint64[]'] + }> + & Record<'test_bool_return(uint64)bool[]' | 'test_bool_return', { + argsObj: ImmutableArrayContractArgs['obj']['test_bool_return(uint64)bool[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_bool_return(uint64)bool[]'] + returns: ImmutableArrayContractReturns['test_bool_return(uint64)bool[]'] + }> + & Record<'test_tuple_return(uint64)(uint64,bool,bool)[]' | 'test_tuple_return', { + argsObj: ImmutableArrayContractArgs['obj']['test_tuple_return(uint64)(uint64,bool,bool)[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_tuple_return(uint64)(uint64,bool,bool)[]'] + returns: ImmutableArrayContractReturns['test_tuple_return(uint64)(uint64,bool,bool)[]'] + }> + & Record<'test_dynamic_tuple_return(uint64)(uint64,string)[]' | 'test_dynamic_tuple_return', { + argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_tuple_return(uint64)(uint64,string)[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_tuple_return(uint64)(uint64,string)[]'] + returns: ImmutableArrayContractReturns['test_dynamic_tuple_return(uint64)(uint64,string)[]'] + }> + & Record<'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]' | 'test_convert_to_array_and_back', { + argsObj: ImmutableArrayContractArgs['obj']['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'] + returns: ImmutableArrayContractReturns['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'] + }> + & Record<'test_concat_with_arc4_tuple((uint64,uint64))uint64[]' | 'test_concat_with_arc4_tuple', { + argsObj: ImmutableArrayContractArgs['obj']['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'] + returns: ImmutableArrayContractReturns['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'] + }> + & Record<'test_concat_with_native_tuple((uint64,uint64))uint64[]' | 'test_concat_with_native_tuple', { + argsObj: ImmutableArrayContractArgs['obj']['test_concat_with_native_tuple((uint64,uint64))uint64[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_concat_with_native_tuple((uint64,uint64))uint64[]'] + returns: ImmutableArrayContractReturns['test_concat_with_native_tuple((uint64,uint64))uint64[]'] + }> + & Record<'test_dynamic_concat_with_arc4_tuple((string,string))string[]' | 'test_dynamic_concat_with_arc4_tuple', { + argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_concat_with_arc4_tuple((string,string))string[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_concat_with_arc4_tuple((string,string))string[]'] + returns: ImmutableArrayContractReturns['test_dynamic_concat_with_arc4_tuple((string,string))string[]'] + }> + & Record<'test_dynamic_concat_with_native_tuple((string,string))string[]' | 'test_dynamic_concat_with_native_tuple', { + argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_concat_with_native_tuple((string,string))string[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_concat_with_native_tuple((string,string))string[]'] + returns: ImmutableArrayContractReturns['test_dynamic_concat_with_native_tuple((string,string))string[]'] + }> + & Record<'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]' | 'test_concat_immutable_dynamic', { + argsObj: ImmutableArrayContractArgs['obj']['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'] + returns: ImmutableArrayContractReturns['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'] + }> + & Record<'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]' | 'test_immutable_arc4', { + argsObj: ImmutableArrayContractArgs['obj']['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'] + returns: ImmutableArrayContractReturns['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'] + }> + & Record<'test_imm_fixed_arr()(uint64,uint64)[3]' | 'test_imm_fixed_arr', { + argsObj: ImmutableArrayContractArgs['obj']['test_imm_fixed_arr()(uint64,uint64)[3]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_imm_fixed_arr()(uint64,uint64)[3]'] + returns: ImmutableArrayContractReturns['test_imm_fixed_arr()(uint64,uint64)[3]'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + global: { + keys: { + a: bigint[] + g: boolean[] + c: [bigint, bigint][] + d: [bigint, boolean, boolean][] + e: [bigint, Uint8Array][] + f: [bigint, string][] + bool2: [boolean, boolean][] + bool7: [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] + bool8: [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] + bool9: [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] + immFixedArr: [[bigint, bigint], [bigint, bigint], [bigint, bigint]] + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type ImmutableArrayContractSignatures = keyof ImmutableArrayContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type ImmutableArrayContractNonVoidMethodSignatures = keyof ImmutableArrayContractTypes['methods'] extends infer T ? T extends keyof ImmutableArrayContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the ImmutableArrayContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = ImmutableArrayContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the ImmutableArrayContract smart contract to the method's return type + */ +export type MethodReturn = ImmutableArrayContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed global state of the application. + */ +export type GlobalKeysState = ImmutableArrayContractTypes['state']['global']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type ImmutableArrayContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type ImmutableArrayContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: ImmutableArrayContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the ImmutableArrayContract smart contract + */ +export abstract class ImmutableArrayContractParamsFactory { + /** + * Constructs a no op call for the test_uint64_array()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testUint64Array(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_uint64_array()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_biguint_array()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testBiguintArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_biguint_array()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_bool_array(uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testBoolArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_bool_array(uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.length], + } + } + /** + * Constructs a no op call for the test_fixed_size_tuple_array()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testFixedSizeTupleArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_fixed_size_tuple_array()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_fixed_size_named_tuple_array()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testFixedSizeNamedTupleArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_fixed_size_named_tuple_array()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_dynamic_sized_tuple_array()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testDynamicSizedTupleArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_dynamic_sized_tuple_array()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_dynamic_sized_named_tuple_array()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testDynamicSizedNamedTupleArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_dynamic_sized_named_tuple_array()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_implicit_conversion_log(uint64[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImplicitConversionLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_implicit_conversion_log(uint64[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arr], + } + } + /** + * Constructs a no op call for the test_implicit_conversion_emit(uint64[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImplicitConversionEmit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_implicit_conversion_emit(uint64[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arr], + } + } + /** + * Constructs a no op call for the test_nested_array(uint64,uint64[][])uint64[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testNestedArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_nested_array(uint64,uint64[][])uint64[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arrToAdd, params.args.arr], + } + } + /** + * Constructs a no op call for the test_bit_packed_tuples()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testBitPackedTuples(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_bit_packed_tuples()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static sumUintsAndLengthsAndTrues(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arr1, params.args.arr2, params.args.arr3, params.args.arr4], + } + } + /** + * Constructs a no op call for the test_uint64_return(uint64)uint64[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testUint64Return(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_uint64_return(uint64)uint64[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.append], + } + } + /** + * Constructs a no op call for the test_bool_return(uint64)bool[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testBoolReturn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_bool_return(uint64)bool[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.append], + } + } + /** + * Constructs a no op call for the test_tuple_return(uint64)(uint64,bool,bool)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testTupleReturn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_tuple_return(uint64)(uint64,bool,bool)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.append], + } + } + /** + * Constructs a no op call for the test_dynamic_tuple_return(uint64)(uint64,string)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testDynamicTupleReturn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_dynamic_tuple_return(uint64)(uint64,string)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.append], + } + } + /** + * Constructs a no op call for the test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testConvertToArrayAndBack(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arr, params.args.append], + } + } + /** + * Constructs a no op call for the test_concat_with_arc4_tuple((uint64,uint64))uint64[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testConcatWithArc4Tuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_concat_with_arc4_tuple((uint64,uint64))uint64[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arg], + } + } + /** + * Constructs a no op call for the test_concat_with_native_tuple((uint64,uint64))uint64[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testConcatWithNativeTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_concat_with_native_tuple((uint64,uint64))uint64[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arg], + } + } + /** + * Constructs a no op call for the test_dynamic_concat_with_arc4_tuple((string,string))string[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testDynamicConcatWithArc4Tuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_dynamic_concat_with_arc4_tuple((string,string))string[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arg], + } + } + /** + * Constructs a no op call for the test_dynamic_concat_with_native_tuple((string,string))string[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testDynamicConcatWithNativeTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_dynamic_concat_with_native_tuple((string,string))string[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arg], + } + } + /** + * Constructs a no op call for the test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testConcatImmutableDynamic(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.imm1, params.args.imm2], + } + } + /** + * Constructs a no op call for the test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImmutableArc4(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.imm], + } + } + /** + * Constructs a no op call for the test_imm_fixed_arr()(uint64,uint64)[3] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImmFixedArr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_imm_fixed_arr()(uint64,uint64)[3]' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the ImmutableArrayContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class ImmutableArrayContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `ImmutableArrayContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new ImmutableArrayContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new ImmutableArrayContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the ImmutableArrayContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: ImmutableArrayContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new ImmutableArrayContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ImmutableArrayContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ImmutableArrayContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ImmutableArrayContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new ImmutableArrayContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the ImmutableArrayContract smart contract + */ +export class ImmutableArrayContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `ImmutableArrayContractClient` + * + * @param appClient An `AppClient` instance which has been created with the ImmutableArrayContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `ImmutableArrayContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `ImmutableArrayContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new ImmutableArrayContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `ImmutableArrayContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new ImmutableArrayContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testUint64Array: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testUint64Array(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_biguint_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testBiguintArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testBiguintArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_array(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testBoolArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testBoolArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testFixedSizeTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testFixedSizeTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_named_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testFixedSizeNamedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testFixedSizeNamedTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testDynamicSizedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicSizedTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_named_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testDynamicSizedNamedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicSizedNamedTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_log(uint64[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImplicitConversionLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testImplicitConversionLog(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_emit(uint64[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImplicitConversionEmit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testImplicitConversionEmit(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_nested_array(uint64,uint64[][])uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testNestedArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testNestedArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bit_packed_tuples()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testBitPackedTuples: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testBitPackedTuples(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + sumUintsAndLengthsAndTrues: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.sumUintsAndLengthsAndTrues(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_return(uint64)uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testUint64Return: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testUint64Return(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_return(uint64)bool[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testBoolReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testBoolReturn(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_tuple_return(uint64)(uint64,bool,bool)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testTupleReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testTupleReturn(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_tuple_return(uint64)(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testDynamicTupleReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicTupleReturn(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testConvertToArrayAndBack: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testConvertToArrayAndBack(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_arc4_tuple((uint64,uint64))uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testConcatWithArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testConcatWithArc4Tuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_native_tuple((uint64,uint64))uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testConcatWithNativeTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testConcatWithNativeTuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_arc4_tuple((string,string))string[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testDynamicConcatWithArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithArc4Tuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_native_tuple((string,string))string[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testDynamicConcatWithNativeTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithNativeTuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testConcatImmutableDynamic: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testConcatImmutableDynamic(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImmutableArc4: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testImmutableArc4(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_imm_fixed_arr()(uint64,uint64)[3]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImmFixedArr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testImmFixedArr(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testUint64Array: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testUint64Array(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_biguint_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testBiguintArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testBiguintArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_array(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testBoolArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testBoolArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testFixedSizeTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testFixedSizeTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_named_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testFixedSizeNamedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testFixedSizeNamedTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testDynamicSizedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicSizedTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_named_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testDynamicSizedNamedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicSizedNamedTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_log(uint64[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImplicitConversionLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testImplicitConversionLog(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_emit(uint64[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImplicitConversionEmit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testImplicitConversionEmit(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_nested_array(uint64,uint64[][])uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testNestedArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testNestedArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bit_packed_tuples()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testBitPackedTuples: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testBitPackedTuples(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + sumUintsAndLengthsAndTrues: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.sumUintsAndLengthsAndTrues(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_return(uint64)uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testUint64Return: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testUint64Return(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_return(uint64)bool[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testBoolReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testBoolReturn(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_tuple_return(uint64)(uint64,bool,bool)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testTupleReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testTupleReturn(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_tuple_return(uint64)(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testDynamicTupleReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicTupleReturn(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testConvertToArrayAndBack: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testConvertToArrayAndBack(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_arc4_tuple((uint64,uint64))uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testConcatWithArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testConcatWithArc4Tuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_native_tuple((uint64,uint64))uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testConcatWithNativeTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testConcatWithNativeTuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_arc4_tuple((string,string))string[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testDynamicConcatWithArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithArc4Tuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_native_tuple((string,string))string[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testDynamicConcatWithNativeTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithNativeTuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testConcatImmutableDynamic: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testConcatImmutableDynamic(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImmutableArc4: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testImmutableArc4(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_imm_fixed_arr()(uint64,uint64)[3]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImmFixedArr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testImmFixedArr(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testUint64Array: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testUint64Array(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_uint64_array()void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_biguint_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testBiguintArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testBiguintArray(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_biguint_array()void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_array(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testBoolArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testBoolArray(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_bool_array(uint64)void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testFixedSizeTupleArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testFixedSizeTupleArray(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_fixed_size_tuple_array()void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_named_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testFixedSizeNamedTupleArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testFixedSizeNamedTupleArray(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_fixed_size_named_tuple_array()void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testDynamicSizedTupleArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicSizedTupleArray(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_sized_tuple_array()void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_named_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testDynamicSizedNamedTupleArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicSizedNamedTupleArray(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_sized_named_tuple_array()void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_log(uint64[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImplicitConversionLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testImplicitConversionLog(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_implicit_conversion_log(uint64[])void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_emit(uint64[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImplicitConversionEmit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testImplicitConversionEmit(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_implicit_conversion_emit(uint64[])void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_nested_array(uint64,uint64[][])uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testNestedArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testNestedArray(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_nested_array(uint64,uint64[][])uint64[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bit_packed_tuples()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testBitPackedTuples: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testBitPackedTuples(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_bit_packed_tuples()void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + sumUintsAndLengthsAndTrues: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.sumUintsAndLengthsAndTrues(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_return(uint64)uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testUint64Return: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testUint64Return(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_uint64_return(uint64)uint64[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_return(uint64)bool[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testBoolReturn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testBoolReturn(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_bool_return(uint64)bool[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_tuple_return(uint64)(uint64,bool,bool)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testTupleReturn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testTupleReturn(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_tuple_return(uint64)(uint64,bool,bool)[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_tuple_return(uint64)(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testDynamicTupleReturn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicTupleReturn(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_tuple_return(uint64)(uint64,string)[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testConvertToArrayAndBack: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testConvertToArrayAndBack(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_arc4_tuple((uint64,uint64))uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testConcatWithArc4Tuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testConcatWithArc4Tuple(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_native_tuple((uint64,uint64))uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testConcatWithNativeTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testConcatWithNativeTuple(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_concat_with_native_tuple((uint64,uint64))uint64[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_arc4_tuple((string,string))string[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testDynamicConcatWithArc4Tuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithArc4Tuple(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_concat_with_arc4_tuple((string,string))string[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_native_tuple((string,string))string[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testDynamicConcatWithNativeTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithNativeTuple(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_concat_with_native_tuple((string,string))string[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testConcatImmutableDynamic: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testConcatImmutableDynamic(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImmutableArc4: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testImmutableArc4(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_imm_fixed_arr()(uint64,uint64)[3]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImmFixedArr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testImmFixedArr(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_imm_fixed_arr()(uint64,uint64)[3]'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new ImmutableArrayContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current ImmutableArrayContract app + */ + state = { + /** + * Methods to access global state for the current ImmutableArrayContract app + */ + global: { + /** + * Get all current keyed values from global state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.global.getAll() + return { + a: result.a, + g: result.g, + c: result.c, + d: result.d, + e: result.e, + f: result.f, + bool2: result.bool2, + bool7: result.bool7, + bool8: result.bool8, + bool9: result.bool9, + immFixedArr: result.imm_fixed_arr, + } + }, + /** + * Get the current value of the a key in global state + */ + a: async (): Promise => { return (await this.appClient.state.global.getValue("a")) as bigint[] | undefined }, + /** + * Get the current value of the g key in global state + */ + g: async (): Promise => { return (await this.appClient.state.global.getValue("g")) as boolean[] | undefined }, + /** + * Get the current value of the c key in global state + */ + c: async (): Promise<[bigint, bigint][] | undefined> => { return (await this.appClient.state.global.getValue("c")) as [bigint, bigint][] | undefined }, + /** + * Get the current value of the d key in global state + */ + d: async (): Promise<[bigint, boolean, boolean][] | undefined> => { return (await this.appClient.state.global.getValue("d")) as [bigint, boolean, boolean][] | undefined }, + /** + * Get the current value of the e key in global state + */ + e: async (): Promise<[bigint, Uint8Array][] | undefined> => { return (await this.appClient.state.global.getValue("e")) as [bigint, Uint8Array][] | undefined }, + /** + * Get the current value of the f key in global state + */ + f: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.global.getValue("f")) as [bigint, string][] | undefined }, + /** + * Get the current value of the bool2 key in global state + */ + bool2: async (): Promise<[boolean, boolean][] | undefined> => { return (await this.appClient.state.global.getValue("bool2")) as [boolean, boolean][] | undefined }, + /** + * Get the current value of the bool7 key in global state + */ + bool7: async (): Promise<[bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined> => { return (await this.appClient.state.global.getValue("bool7")) as [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined }, + /** + * Get the current value of the bool8 key in global state + */ + bool8: async (): Promise<[bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined> => { return (await this.appClient.state.global.getValue("bool8")) as [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined }, + /** + * Get the current value of the bool9 key in global state + */ + bool9: async (): Promise<[bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined> => { return (await this.appClient.state.global.getValue("bool9")) as [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined }, + /** + * Get the current value of the imm_fixed_arr key in global state + */ + immFixedArr: async (): Promise<[[bigint, bigint], [bigint, bigint], [bigint, bigint]] | undefined> => { return (await this.appClient.state.global.getValue("imm_fixed_arr")) as [[bigint, bigint], [bigint, bigint], [bigint, bigint]] | undefined }, + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): ImmutableArrayContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a test_uint64_array()void method call against the ImmutableArrayContract contract + */ + testUint64Array(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testUint64Array(params))) + return this + }, + /** + * Add a test_biguint_array()void method call against the ImmutableArrayContract contract + */ + testBiguintArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBiguintArray(params))) + return this + }, + /** + * Add a test_bool_array(uint64)void method call against the ImmutableArrayContract contract + */ + testBoolArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBoolArray(params))) + return this + }, + /** + * Add a test_fixed_size_tuple_array()void method call against the ImmutableArrayContract contract + */ + testFixedSizeTupleArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testFixedSizeTupleArray(params))) + return this + }, + /** + * Add a test_fixed_size_named_tuple_array()void method call against the ImmutableArrayContract contract + */ + testFixedSizeNamedTupleArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testFixedSizeNamedTupleArray(params))) + return this + }, + /** + * Add a test_dynamic_sized_tuple_array()void method call against the ImmutableArrayContract contract + */ + testDynamicSizedTupleArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicSizedTupleArray(params))) + return this + }, + /** + * Add a test_dynamic_sized_named_tuple_array()void method call against the ImmutableArrayContract contract + */ + testDynamicSizedNamedTupleArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicSizedNamedTupleArray(params))) + return this + }, + /** + * Add a test_implicit_conversion_log(uint64[])void method call against the ImmutableArrayContract contract + */ + testImplicitConversionLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImplicitConversionLog(params))) + return this + }, + /** + * Add a test_implicit_conversion_emit(uint64[])void method call against the ImmutableArrayContract contract + */ + testImplicitConversionEmit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImplicitConversionEmit(params))) + return this + }, + /** + * Add a test_nested_array(uint64,uint64[][])uint64[] method call against the ImmutableArrayContract contract + */ + testNestedArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testNestedArray(params))) + return this + }, + /** + * Add a test_bit_packed_tuples()void method call against the ImmutableArrayContract contract + */ + testBitPackedTuples(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBitPackedTuples(params))) + return this + }, + /** + * Add a sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64) method call against the ImmutableArrayContract contract + */ + sumUintsAndLengthsAndTrues(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sumUintsAndLengthsAndTrues(params))) + return this + }, + /** + * Add a test_uint64_return(uint64)uint64[] method call against the ImmutableArrayContract contract + */ + testUint64Return(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testUint64Return(params))) + return this + }, + /** + * Add a test_bool_return(uint64)bool[] method call against the ImmutableArrayContract contract + */ + testBoolReturn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBoolReturn(params))) + return this + }, + /** + * Add a test_tuple_return(uint64)(uint64,bool,bool)[] method call against the ImmutableArrayContract contract + */ + testTupleReturn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testTupleReturn(params))) + return this + }, + /** + * Add a test_dynamic_tuple_return(uint64)(uint64,string)[] method call against the ImmutableArrayContract contract + */ + testDynamicTupleReturn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicTupleReturn(params))) + return this + }, + /** + * Add a test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[] method call against the ImmutableArrayContract contract + */ + testConvertToArrayAndBack(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testConvertToArrayAndBack(params))) + return this + }, + /** + * Add a test_concat_with_arc4_tuple((uint64,uint64))uint64[] method call against the ImmutableArrayContract contract + */ + testConcatWithArc4Tuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testConcatWithArc4Tuple(params))) + return this + }, + /** + * Add a test_concat_with_native_tuple((uint64,uint64))uint64[] method call against the ImmutableArrayContract contract + */ + testConcatWithNativeTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testConcatWithNativeTuple(params))) + return this + }, + /** + * Add a test_dynamic_concat_with_arc4_tuple((string,string))string[] method call against the ImmutableArrayContract contract + */ + testDynamicConcatWithArc4Tuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicConcatWithArc4Tuple(params))) + return this + }, + /** + * Add a test_dynamic_concat_with_native_tuple((string,string))string[] method call against the ImmutableArrayContract contract + */ + testDynamicConcatWithNativeTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicConcatWithNativeTuple(params))) + return this + }, + /** + * Add a test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[] method call against the ImmutableArrayContract contract + */ + testConcatImmutableDynamic(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testConcatImmutableDynamic(params))) + return this + }, + /** + * Add a test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[] method call against the ImmutableArrayContract contract + */ + testImmutableArc4(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArc4(params))) + return this + }, + /** + * Add a test_imm_fixed_arr()(uint64,uint64)[3] method call against the ImmutableArrayContract contract + */ + testImmFixedArr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmFixedArr(params))) + return this + }, + /** + * Add a clear state call to the ImmutableArrayContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as ImmutableArrayContractComposer + } +} +export type ImmutableArrayContractComposer = { + /** + * Calls the test_uint64_array()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testUint64Array(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_uint64_array()void'] | undefined]> + + /** + * Calls the test_biguint_array()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testBiguintArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_biguint_array()void'] | undefined]> + + /** + * Calls the test_bool_array(uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testBoolArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_bool_array(uint64)void'] | undefined]> + + /** + * Calls the test_fixed_size_tuple_array()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testFixedSizeTupleArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_fixed_size_tuple_array()void'] | undefined]> + + /** + * Calls the test_fixed_size_named_tuple_array()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testFixedSizeNamedTupleArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_fixed_size_named_tuple_array()void'] | undefined]> + + /** + * Calls the test_dynamic_sized_tuple_array()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testDynamicSizedTupleArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_sized_tuple_array()void'] | undefined]> + + /** + * Calls the test_dynamic_sized_named_tuple_array()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testDynamicSizedNamedTupleArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_sized_named_tuple_array()void'] | undefined]> + + /** + * Calls the test_implicit_conversion_log(uint64[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImplicitConversionLog(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_implicit_conversion_log(uint64[])void'] | undefined]> + + /** + * Calls the test_implicit_conversion_emit(uint64[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImplicitConversionEmit(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_implicit_conversion_emit(uint64[])void'] | undefined]> + + /** + * Calls the test_nested_array(uint64,uint64[][])uint64[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testNestedArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_nested_array(uint64,uint64[][])uint64[]'] | undefined]> + + /** + * Calls the test_bit_packed_tuples()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testBitPackedTuples(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_bit_packed_tuples()void'] | undefined]> + + /** + * Calls the sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + sumUintsAndLengthsAndTrues(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'] | undefined]> + + /** + * Calls the test_uint64_return(uint64)uint64[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testUint64Return(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_uint64_return(uint64)uint64[]'] | undefined]> + + /** + * Calls the test_bool_return(uint64)bool[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testBoolReturn(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_bool_return(uint64)bool[]'] | undefined]> + + /** + * Calls the test_tuple_return(uint64)(uint64,bool,bool)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testTupleReturn(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_tuple_return(uint64)(uint64,bool,bool)[]'] | undefined]> + + /** + * Calls the test_dynamic_tuple_return(uint64)(uint64,string)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testDynamicTupleReturn(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_tuple_return(uint64)(uint64,string)[]'] | undefined]> + + /** + * Calls the test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testConvertToArrayAndBack(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'] | undefined]> + + /** + * Calls the test_concat_with_arc4_tuple((uint64,uint64))uint64[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testConcatWithArc4Tuple(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'] | undefined]> + + /** + * Calls the test_concat_with_native_tuple((uint64,uint64))uint64[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testConcatWithNativeTuple(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_concat_with_native_tuple((uint64,uint64))uint64[]'] | undefined]> + + /** + * Calls the test_dynamic_concat_with_arc4_tuple((string,string))string[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testDynamicConcatWithArc4Tuple(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_concat_with_arc4_tuple((string,string))string[]'] | undefined]> + + /** + * Calls the test_dynamic_concat_with_native_tuple((string,string))string[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testDynamicConcatWithNativeTuple(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_concat_with_native_tuple((string,string))string[]'] | undefined]> + + /** + * Calls the test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testConcatImmutableDynamic(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'] | undefined]> + + /** + * Calls the test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImmutableArc4(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'] | undefined]> + + /** + * Calls the test_imm_fixed_arr()(uint64,uint64)[3] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImmFixedArr(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_imm_fixed_arr()(uint64,uint64)[3]'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): ImmutableArrayContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): ImmutableArrayContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type ImmutableArrayContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayInitContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayInitContract.ts new file mode 100644 index 0000000..358fea4 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayInitContract.ts @@ -0,0 +1,755 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"ImmutableArrayInitContract","structs":{},"methods":[{"name":"test_immutable_array_init","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_immutable_array_init_without_type_generic","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reference_array_init","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reference_array_init_without_type_generic","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[42],"errorMessage":"OnCompletion must be NoOp"},{"pc":[89],"errorMessage":"OnCompletion must be NoOp && can only call when creating"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayA4IDMgMSAwCiAgICBieXRlY2Jsb2NrIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzkKICAgIC8vIGNsYXNzIEltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDExCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDg0MzRiYTJhIDB4NjNhYWJiYTAgMHhkYmFmMDM0ZSAweGE5ZDE0NTU0IC8vIG1ldGhvZCAidGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdCgpdm9pZCIsIG1ldGhvZCAidGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYygpdm9pZCIsIG1ldGhvZCAidGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdCgpdm9pZCIsIG1ldGhvZCAidGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYygpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXQgdGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYyB0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0IHRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWMKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDkwCiAgICAvLyBhMyA9IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0oUmVmZXJlbmNlQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTEyCiAgICAvLyBhMyA9IEltbXV0YWJsZUFycmF5KFJlZmVyZW5jZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUluaXRDb250cmFjdC50ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNgogICAgLy8gYTEgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyOAogICAgLy8gYTIgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKEZpeGVkQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKSkKICAgIGR1cAogICAgcG9wCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyOQogICAgLy8gYXNzZXJ0IGExLmxlbmd0aCA9PSBhMi5sZW5ndGgKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzAKICAgIC8vIGFzc2VydCBhMVswXSA9PSBhMlswXQogICAgZHVwCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzEKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhMlsxXQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzIKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhMlsyXQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzQKICAgIC8vIGEzID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XShJbW11dGFibGVBcnJheSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgcG9wCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzNgogICAgLy8gYXNzZXJ0IGExWzBdID09IGEzWzBdCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzcKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhM1sxXQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzgKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhM1syXQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MjYKICAgIC8vIGExID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQxCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGE0Lmxlbmd0aAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQyCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTRbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQzCiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTRbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ0CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTRbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0LnRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ4CiAgICAvLyBhMSA9IFJlZmVyZW5jZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1MAogICAgLy8gYTIgPSBSZWZlcmVuY2VBcnJheShGaXhlZEFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBkdXAKICAgIHBvcAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NTEKICAgIC8vIGFzc2VydCBhMS5sZW5ndGggPT0gYTIubGVuZ3RoCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUyCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTJbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUzCiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTJbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU0CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTJbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU2CiAgICAvLyBhMyA9IFJlZmVyZW5jZUFycmF5KEltbXV0YWJsZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU4CiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTNbMF0KICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1OQogICAgLy8gYXNzZXJ0IGExWzFdID09IGEzWzFdCiAgICBkdXAKICAgIGludGNfMCAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU2MAogICAgLy8gYXNzZXJ0IGExWzJdID09IGEzWzJdCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0OAogICAgLy8gYTEgPSBSZWZlcmVuY2VBcnJheSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTYzCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGE0Lmxlbmd0aAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY0CiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTRbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY1CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTRbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY2CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTRbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"byteCode":{"approval":"CiAECAMBACYBGAAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAzEbQQArMRkURDEYRIIEBIQ0uioEY6q7oATbrwNOBKnRRVQ2GgCOBAAJAA0AEQBjADEZFDEYFBBDKEgkQyhIJEMoSUhHAhUiCiMSREklWyQSREkiW4ECEkSBEFsjEkQoSEcCJVskEkRJIluBAhJEgRBbIxJEKEgoSEkVIgojEkRJJVskEkRJIluBAhJEgRBbIxJDKElIRwIVIgojEkRJJVskEkRJIluBAhJEgRBbIxJEKEhHAiVbJBJESSJbgQISRIEQWyMSRChIKEhJFSIKIxJESSVbJBJESSJbgQISRIEQWyMSQw==","clear":"CoEBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the ImmutableArrayInitContract contract + */ +export type ImmutableArrayInitContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'test_immutable_array_init()void': Record + 'test_immutable_array_init_without_type_generic()void': Record + 'test_reference_array_init()void': Record + 'test_reference_array_init_without_type_generic()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'test_immutable_array_init()void': [] + 'test_immutable_array_init_without_type_generic()void': [] + 'test_reference_array_init()void': [] + 'test_reference_array_init_without_type_generic()void': [] + } +} + +/** + * The return type for each method + */ +export type ImmutableArrayInitContractReturns = { + 'test_immutable_array_init()void': void + 'test_immutable_array_init_without_type_generic()void': void + 'test_reference_array_init()void': void + 'test_reference_array_init_without_type_generic()void': void +} + +/** + * Defines the types of available calls and state of the ImmutableArrayInitContract smart contract. + */ +export type ImmutableArrayInitContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'test_immutable_array_init()void' | 'test_immutable_array_init', { + argsObj: ImmutableArrayInitContractArgs['obj']['test_immutable_array_init()void'] + argsTuple: ImmutableArrayInitContractArgs['tuple']['test_immutable_array_init()void'] + returns: ImmutableArrayInitContractReturns['test_immutable_array_init()void'] + }> + & Record<'test_immutable_array_init_without_type_generic()void' | 'test_immutable_array_init_without_type_generic', { + argsObj: ImmutableArrayInitContractArgs['obj']['test_immutable_array_init_without_type_generic()void'] + argsTuple: ImmutableArrayInitContractArgs['tuple']['test_immutable_array_init_without_type_generic()void'] + returns: ImmutableArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'] + }> + & Record<'test_reference_array_init()void' | 'test_reference_array_init', { + argsObj: ImmutableArrayInitContractArgs['obj']['test_reference_array_init()void'] + argsTuple: ImmutableArrayInitContractArgs['tuple']['test_reference_array_init()void'] + returns: ImmutableArrayInitContractReturns['test_reference_array_init()void'] + }> + & Record<'test_reference_array_init_without_type_generic()void' | 'test_reference_array_init_without_type_generic', { + argsObj: ImmutableArrayInitContractArgs['obj']['test_reference_array_init_without_type_generic()void'] + argsTuple: ImmutableArrayInitContractArgs['tuple']['test_reference_array_init_without_type_generic()void'] + returns: ImmutableArrayInitContractReturns['test_reference_array_init_without_type_generic()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type ImmutableArrayInitContractSignatures = keyof ImmutableArrayInitContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the ImmutableArrayInitContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = ImmutableArrayInitContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the ImmutableArrayInitContract smart contract to the method's return type + */ +export type MethodReturn = ImmutableArrayInitContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type ImmutableArrayInitContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type ImmutableArrayInitContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: ImmutableArrayInitContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the ImmutableArrayInitContract smart contract + */ +export abstract class ImmutableArrayInitContractParamsFactory { + /** + * Constructs a no op call for the test_immutable_array_init()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImmutableArrayInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_immutable_array_init()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_immutable_array_init_without_type_generic()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImmutableArrayInitWithoutTypeGeneric(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_immutable_array_init_without_type_generic()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_reference_array_init()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testReferenceArrayInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_reference_array_init()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_reference_array_init_without_type_generic()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testReferenceArrayInitWithoutTypeGeneric(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_reference_array_init_without_type_generic()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the ImmutableArrayInitContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class ImmutableArrayInitContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `ImmutableArrayInitContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new ImmutableArrayInitContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new ImmutableArrayInitContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the ImmutableArrayInitContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: ImmutableArrayInitContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new ImmutableArrayInitContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ImmutableArrayInitContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ImmutableArrayInitContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ImmutableArrayInitContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new ImmutableArrayInitContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the ImmutableArrayInitContract smart contract + */ +export class ImmutableArrayInitContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `ImmutableArrayInitContractClient` + * + * @param appClient An `AppClient` instance which has been created with the ImmutableArrayInitContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `ImmutableArrayInitContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `ImmutableArrayInitContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new ImmutableArrayInitContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `ImmutableArrayInitContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new ImmutableArrayInitContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayInitContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImmutableArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInit(params)) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImmutableArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testReferenceArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInit(params)) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testReferenceArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayInitContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImmutableArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInit(params)) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImmutableArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testReferenceArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInit(params)) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testReferenceArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayInitContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImmutableArrayInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInit(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayInitContractReturns['test_immutable_array_init()void'])} + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImmutableArrayInitWithoutTypeGeneric: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'])} + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testReferenceArrayInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInit(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayInitContractReturns['test_reference_array_init()void'])} + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testReferenceArrayInitWithoutTypeGeneric: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayInitContractReturns['test_reference_array_init_without_type_generic()void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new ImmutableArrayInitContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current ImmutableArrayInitContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): ImmutableArrayInitContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a test_immutable_array_init()void method call against the ImmutableArrayInitContract contract + */ + testImmutableArrayInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArrayInit(params))) + return this + }, + /** + * Add a test_immutable_array_init_without_type_generic()void method call against the ImmutableArrayInitContract contract + */ + testImmutableArrayInitWithoutTypeGeneric(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArrayInitWithoutTypeGeneric(params))) + return this + }, + /** + * Add a test_reference_array_init()void method call against the ImmutableArrayInitContract contract + */ + testReferenceArrayInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testReferenceArrayInit(params))) + return this + }, + /** + * Add a test_reference_array_init_without_type_generic()void method call against the ImmutableArrayInitContract contract + */ + testReferenceArrayInitWithoutTypeGeneric(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testReferenceArrayInitWithoutTypeGeneric(params))) + return this + }, + /** + * Add a clear state call to the ImmutableArrayInitContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as ImmutableArrayInitContractComposer + } +} +export type ImmutableArrayInitContractComposer = { + /** + * Calls the test_immutable_array_init()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImmutableArrayInit(params?: CallParams): ImmutableArrayInitContractComposer<[...TReturns, ImmutableArrayInitContractReturns['test_immutable_array_init()void'] | undefined]> + + /** + * Calls the test_immutable_array_init_without_type_generic()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImmutableArrayInitWithoutTypeGeneric(params?: CallParams): ImmutableArrayInitContractComposer<[...TReturns, ImmutableArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'] | undefined]> + + /** + * Calls the test_reference_array_init()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testReferenceArrayInit(params?: CallParams): ImmutableArrayInitContractComposer<[...TReturns, ImmutableArrayInitContractReturns['test_reference_array_init()void'] | undefined]> + + /** + * Calls the test_reference_array_init_without_type_generic()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testReferenceArrayInitWithoutTypeGeneric(params?: CallParams): ImmutableArrayInitContractComposer<[...TReturns, ImmutableArrayInitContractReturns['test_reference_array_init_without_type_generic()void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayInitContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): ImmutableArrayInitContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): ImmutableArrayInitContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type ImmutableArrayInitContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/LocalStateContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/LocalStateContract.ts new file mode 100644 index 0000000..767e777 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/LocalStateContract.ts @@ -0,0 +1,1746 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"LocalStateContract","structs":{},"methods":[{"name":"opt_in","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["OptIn"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_uint","args":[{"type":"address","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_string","args":[{"type":"address","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_byte","args":[{"type":"address","name":"a"}],"returns":{"type":"byte"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_bool","args":[{"type":"address","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_address","args":[{"type":"address","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_uint128","args":[{"type":"address","name":"a"}],"returns":{"type":"uint128"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_dynamic_bytes","args":[{"type":"address","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_tuple","args":[{"type":"address","name":"a"}],"returns":{"type":"(uint64,byte[],bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_uint","args":[{"type":"address","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_string","args":[{"type":"address","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_byte","args":[{"type":"address","name":"a"}],"returns":{"type":"byte"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_bool","args":[{"type":"address","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_address","args":[{"type":"address","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_uint128","args":[{"type":"address","name":"a"}],"returns":{"type":"uint128"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_dynamic_bytes","args":[{"type":"address","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":15}},"keys":{"global":{},"local":{"implicit_key_arc4_uint":{"keyType":"AVMString","valueType":"uint64","key":"aW1wbGljaXRfa2V5X2FyYzRfdWludA=="},"implicit_key_arc4_string":{"keyType":"AVMString","valueType":"string","key":"aW1wbGljaXRfa2V5X2FyYzRfc3RyaW5n"},"implicit_key_arc4_byte":{"keyType":"AVMString","valueType":"byte","key":"aW1wbGljaXRfa2V5X2FyYzRfYnl0ZQ=="},"implicit_key_arc4_bool":{"keyType":"AVMString","valueType":"bool","key":"aW1wbGljaXRfa2V5X2FyYzRfYm9vbA=="},"implicit_key_arc4_address":{"keyType":"AVMString","valueType":"address","key":"aW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcw=="},"implicit_key_arc4_uint128":{"keyType":"AVMString","valueType":"uint128","key":"aW1wbGljaXRfa2V5X2FyYzRfdWludDEyOA=="},"implicit_key_arc4_dynamic_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"aW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcw=="},"implicit_key_tuple":{"keyType":"AVMString","valueType":"(uint64,byte[],bool)","key":"aW1wbGljaXRfa2V5X3R1cGxl"},"arc4_uint":{"keyType":"AVMString","valueType":"uint64","key":"ZXhwbGljaXRfa2V5X2FyYzRfdWludA=="},"arc4_string":{"keyType":"AVMString","valueType":"string","key":"ZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5n"},"arc4_byte":{"keyType":"AVMString","valueType":"byte","key":"ZXhwbGljaXRfa2V5X2FyYzRfYnl0ZQ=="},"arc4_bool":{"keyType":"AVMString","valueType":"bool","key":"ZXhwbGljaXRfa2V5X2FyYzRfYm9vbA=="},"arc4_address":{"keyType":"AVMString","valueType":"address","key":"ZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcw=="},"arc4_uint128":{"keyType":"AVMString","valueType":"uint128","key":"ZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOA=="},"arc4_dynamic_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"ZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcw=="}},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[891],"errorMessage":"check self.arc4_address exists for account"},{"pc":[877],"errorMessage":"check self.arc4_bool exists for account"},{"pc":[863],"errorMessage":"check self.arc4_byte exists for account"},{"pc":[919],"errorMessage":"check self.arc4_dynamic_bytes exists for account"},{"pc":[849],"errorMessage":"check self.arc4_string exists for account"},{"pc":[835],"errorMessage":"check self.arc4_uint exists for account"},{"pc":[905],"errorMessage":"check self.arc4_uint128 exists for account"},{"pc":[779],"errorMessage":"check self.implicit_key_arc4_address exists for account"},{"pc":[765],"errorMessage":"check self.implicit_key_arc4_bool exists for account"},{"pc":[751],"errorMessage":"check self.implicit_key_arc4_byte exists for account"},{"pc":[807],"errorMessage":"check self.implicit_key_arc4_dynamic_bytes exists for account"},{"pc":[737],"errorMessage":"check self.implicit_key_arc4_string exists for account"},{"pc":[724],"errorMessage":"check self.implicit_key_arc4_uint exists for account"},{"pc":[793],"errorMessage":"check self.implicit_key_arc4_uint128 exists for account"},{"pc":[821],"errorMessage":"check self.implicit_key_tuple exists for account"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIgMHgwMDAwMDAwMDAwMDAwNTM5ICJpbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmciIDB4MDAwNTQ4NjU2YzZjNmYgImltcGxpY2l0X2tleV9hcmM0X2J5dGUiICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIiAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiIDB4MDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgImltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczICJpbXBsaWNpdF9rZXlfdHVwbGUiICJleHBsaWNpdF9rZXlfYXJjNF91aW50IiAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIiAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIgImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOCIgImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjYzCiAgICAvLyBjbGFzcyBMb2NhbFN0YXRlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDI2CiAgICBwdXNoYnl0ZXMgMHgzMGM2ZDU4YSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2luX3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY2MwogICAgLy8gY2xhc3MgTG9jYWxTdGF0ZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhiM2NmYTM4OSAweGRiODU4MTc2IDB4NzgyNjc3NjIgMHg0MjYzNTFjOCAweDA3NWNhZTkxIDB4NTljMGI4MGIgMHgwZDZmYTY5MCAweDk3ZTEwZDljIDB4MmU0YThjNDkgMHhiMjJjZDIxZSAweGIzZjQ0NzAxIDB4ZWRkOTcyOTcgMHg2NzFkMzUzYyAweGEzZmQ2ZmRjIDB4Y2QyZTVkNjYgLy8gbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludChhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyhhZGRyZXNzKXN0cmluZyIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGUoYWRkcmVzcylieXRlIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbChhZGRyZXNzKWJvb2wiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKGFkZHJlc3MpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgoYWRkcmVzcyl1aW50MTI4IiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyhhZGRyZXNzKWJ5dGVbXSIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV90dXBsZShhZGRyZXNzKSh1aW50NjQsYnl0ZVtdLGJvb2wpIiwgbWV0aG9kICJnZXRfYXJjNF91aW50KGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJnZXRfYXJjNF9zdHJpbmcoYWRkcmVzcylzdHJpbmciLCBtZXRob2QgImdldF9hcmM0X2J5dGUoYWRkcmVzcylieXRlIiwgbWV0aG9kICJnZXRfYXJjNF9ib29sKGFkZHJlc3MpYm9vbCIsIG1ldGhvZCAiZ2V0X2FyYzRfYWRkcmVzcyhhZGRyZXNzKWFkZHJlc3MiLCBtZXRob2QgImdldF9hcmM0X3VpbnQxMjgoYWRkcmVzcyl1aW50MTI4IiwgbWV0aG9kICJnZXRfYXJjNF9keW5hbWljX2J5dGVzKGFkZHJlc3MpYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBnZXRfaW1wbGljaXRfa2V5X3R1cGxlIGdldF9hcmM0X3VpbnQgZ2V0X2FyYzRfc3RyaW5nIGdldF9hcmM0X2J5dGUgZ2V0X2FyYzRfYm9vbCBnZXRfYXJjNF9hZGRyZXNzIGdldF9hcmM0X3VpbnQxMjggZ2V0X2FyYzRfZHluYW1pY19ieXRlcwogICAgZXJyCgptYWluX29wdF9pbl9yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE9wdEluCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgb3B0X2luCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDI2OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0Lm9wdF9pbltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdF9pbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2ODgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuVUludDY0KDEzMzcpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDUzOQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY4OQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlY18zIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICBieXRlYyA0IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTAKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZVtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQnl0ZSgwKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyA1IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTEKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQm9vbChUcnVlKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgcHVzaGJ5dGVzIDB4ODAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTIKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQWRkcmVzcygKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTMKICAgIC8vIEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5Mi02OTQKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQWRkcmVzcygKICAgIC8vICAgICBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzCiAgICAvLyApCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk1CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjhbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlVJbnQxMjgoMioqMTAwKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyA4IC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk2CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkR5bmFtaWNCeXRlcygKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTAgLy8gImltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk2LTY5OAogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoCiAgICAvLyAgICAgYiJkeW5hbWljIGJ5dGVzIgogICAgLy8gKQogICAgYnl0ZWMgMTEgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTkKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gKFVJbnQ2NCgxMCksIEJ5dGVzKGIidGVzdCIpLCBGYWxzZSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTIgLy8gImltcGxpY2l0X2tleV90dXBsZSIKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMGEwMDBiMDAwMDA0NzQ2NTczNzQKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDEKICAgIC8vIHNlbGYuYXJjNF91aW50W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5VSW50NjQoMTMzNykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTMgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDUzOQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwMgogICAgLy8gc2VsZi5hcmM0X3N0cmluZ1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuU3RyaW5nKCJIZWxsbyIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDE0IC8vICJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njg5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZ1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuU3RyaW5nKCJIZWxsbyIpCiAgICBieXRlYyA0IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDIKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmdbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwMwogICAgLy8gc2VsZi5hcmM0X2J5dGVbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJ5dGUoMCkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTUgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwNAogICAgLy8gc2VsZi5hcmM0X2Jvb2xbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJvb2woVHJ1ZSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTYgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjkxCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2xbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJvb2woVHJ1ZSkKICAgIHB1c2hieXRlcyAweDgwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA0CiAgICAvLyBzZWxmLmFyYzRfYm9vbFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQm9vbChUcnVlKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwNQogICAgLy8gc2VsZi5hcmM0X2FkZHJlc3NbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkFkZHJlc3MoR2xvYmFsLmNyZWF0b3JfYWRkcmVzcykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTcgLy8gImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDYKICAgIC8vIHNlbGYuYXJjNF91aW50MTI4W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5VSW50MTI4KDIqKjEwMCkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTggLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDcKICAgIC8vIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTkgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk2LTY5OAogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoCiAgICAvLyAgICAgYiJkeW5hbWljIGJ5dGVzIgogICAgLy8gKQogICAgYnl0ZWMgMTEgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDcKICAgIC8vIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA5LTcxMAogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgaW1wbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MTIKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnRbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDktNzEwCiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxNgogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyMAogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZVthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ieXRlIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyNAogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyOAogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDcgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczMgogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDggLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczNgogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQwCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGVbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMiAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0Mi03NDMKICAgIC8vICMgR2V0dGVyIG1ldGhvZHMgZm9yIGV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQ1CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3VpbnRbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfdWludCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDItNzQzCiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfc3RyaW5nW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDkKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfc3RyaW5nW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfc3RyaW5nIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTMKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYnl0ZVthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJleHBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ieXRlIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ib29sOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTcKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYm9vbFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ib29sIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2FkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjEKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYWRkcmVzc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9hZGRyZXNzIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjUKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfdWludDEyOFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF91aW50MTI4IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2R5bmFtaWNfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9keW5hbWljX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjkKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfZHluYW1pY19ieXRlc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmFAQVH3x1FmltcGxpY2l0X2tleV9hcmM0X3VpbnQIAAAAAAAABTkYaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nBwAFSGVsbG8WaW1wbGljaXRfa2V5X2FyYzRfYnl0ZRZpbXBsaWNpdF9rZXlfYXJjNF9ib29sGWltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MZaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOBAAAAAQAAAAAAAAAAAAAAAAH2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMPAA1keW5hbWljIGJ5dGVzEmltcGxpY2l0X2tleV90dXBsZRZleHBsaWNpdF9rZXlfYXJjNF91aW50GGV4cGxpY2l0X2tleV9hcmM0X3N0cmluZxZleHBsaWNpdF9rZXlfYXJjNF9ieXRlFmV4cGxpY2l0X2tleV9hcmM0X2Jvb2wZZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcxlleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4H2V4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMxG0EAkIAEMMbVijYaAI4BAHgxGRREMRhEgg8Es8+jiQTbhYF2BHgmd2IEQmNRyAQHXK6RBFnAuAsEDW+mkASX4Q2cBC5KjEkEsizSHgSz9EcBBO3ZcpcEZx01PASj/W/cBM0uXWY2GgCODwCQAJ0AqgC4AMYA1ADiAPAA/gEMARoBKAE2AUQBUgAxGSISMRgQREIACDEZFDEYFBBDMgkpKmYyCSsnBGYyCScFgAEAZjIJJwaAAYBmMgknBzIJZjIJJwgnCWYyCScKJwtmMgknDIARAAAAAAAAAAoACwAABHRlc3RmMgknDSpmMgknDicEZjIJJw+AAQBmMgknEIABgGYyCScRMglmMgknEicJZjIJJxMnC2YiQzYaASMpY0QoTFCwIkM2GgEjK2NEKExQsCJDNhoBIycFY0QoTFCwIkM2GgEjJwZjRChMULAiQzYaASMnB2NEKExQsCJDNhoBIycIY0QoTFCwIkM2GgEjJwpjRChMULAiQzYaASMnDGNEKExQsCJDNhoBIycNY0QoTFCwIkM2GgEjJw5jRChMULAiQzYaASMnD2NEKExQsCJDNhoBIycQY0QoTFCwIkM2GgEjJxFjRChMULAiQzYaASMnEmNEKExQsCJDNhoBIycTY0QoTFCwIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the LocalStateContract contract + */ +export type LocalStateContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'opt_in()void': Record + 'get_implicit_key_arc4_uint(address)uint64': { + a: string + } + 'get_implicit_key_arc4_string(address)string': { + a: string + } + 'get_implicit_key_arc4_byte(address)byte': { + a: string + } + 'get_implicit_key_arc4_bool(address)bool': { + a: string + } + 'get_implicit_key_arc4_address(address)address': { + a: string + } + 'get_implicit_key_arc4_uint128(address)uint128': { + a: string + } + 'get_implicit_key_arc4_dynamic_bytes(address)byte[]': { + a: string + } + 'get_implicit_key_tuple(address)(uint64,byte[],bool)': { + a: string + } + 'get_arc4_uint(address)uint64': { + a: string + } + 'get_arc4_string(address)string': { + a: string + } + 'get_arc4_byte(address)byte': { + a: string + } + 'get_arc4_bool(address)bool': { + a: string + } + 'get_arc4_address(address)address': { + a: string + } + 'get_arc4_uint128(address)uint128': { + a: string + } + 'get_arc4_dynamic_bytes(address)byte[]': { + a: string + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'opt_in()void': [] + 'get_implicit_key_arc4_uint(address)uint64': [a: string] + 'get_implicit_key_arc4_string(address)string': [a: string] + 'get_implicit_key_arc4_byte(address)byte': [a: string] + 'get_implicit_key_arc4_bool(address)bool': [a: string] + 'get_implicit_key_arc4_address(address)address': [a: string] + 'get_implicit_key_arc4_uint128(address)uint128': [a: string] + 'get_implicit_key_arc4_dynamic_bytes(address)byte[]': [a: string] + 'get_implicit_key_tuple(address)(uint64,byte[],bool)': [a: string] + 'get_arc4_uint(address)uint64': [a: string] + 'get_arc4_string(address)string': [a: string] + 'get_arc4_byte(address)byte': [a: string] + 'get_arc4_bool(address)bool': [a: string] + 'get_arc4_address(address)address': [a: string] + 'get_arc4_uint128(address)uint128': [a: string] + 'get_arc4_dynamic_bytes(address)byte[]': [a: string] + } +} + +/** + * The return type for each method + */ +export type LocalStateContractReturns = { + 'opt_in()void': void + 'get_implicit_key_arc4_uint(address)uint64': bigint + 'get_implicit_key_arc4_string(address)string': string + 'get_implicit_key_arc4_byte(address)byte': number + 'get_implicit_key_arc4_bool(address)bool': boolean + 'get_implicit_key_arc4_address(address)address': string + 'get_implicit_key_arc4_uint128(address)uint128': bigint + 'get_implicit_key_arc4_dynamic_bytes(address)byte[]': Uint8Array + 'get_implicit_key_tuple(address)(uint64,byte[],bool)': [bigint, Uint8Array, boolean] + 'get_arc4_uint(address)uint64': bigint + 'get_arc4_string(address)string': string + 'get_arc4_byte(address)byte': number + 'get_arc4_bool(address)bool': boolean + 'get_arc4_address(address)address': string + 'get_arc4_uint128(address)uint128': bigint + 'get_arc4_dynamic_bytes(address)byte[]': Uint8Array +} + +/** + * Defines the types of available calls and state of the LocalStateContract smart contract. + */ +export type LocalStateContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'opt_in()void' | 'opt_in', { + argsObj: LocalStateContractArgs['obj']['opt_in()void'] + argsTuple: LocalStateContractArgs['tuple']['opt_in()void'] + returns: LocalStateContractReturns['opt_in()void'] + }> + & Record<'get_implicit_key_arc4_uint(address)uint64' | 'get_implicit_key_arc4_uint', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_uint(address)uint64'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_uint(address)uint64'] + returns: LocalStateContractReturns['get_implicit_key_arc4_uint(address)uint64'] + }> + & Record<'get_implicit_key_arc4_string(address)string' | 'get_implicit_key_arc4_string', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_string(address)string'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_string(address)string'] + returns: LocalStateContractReturns['get_implicit_key_arc4_string(address)string'] + }> + & Record<'get_implicit_key_arc4_byte(address)byte' | 'get_implicit_key_arc4_byte', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_byte(address)byte'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_byte(address)byte'] + returns: LocalStateContractReturns['get_implicit_key_arc4_byte(address)byte'] + }> + & Record<'get_implicit_key_arc4_bool(address)bool' | 'get_implicit_key_arc4_bool', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_bool(address)bool'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_bool(address)bool'] + returns: LocalStateContractReturns['get_implicit_key_arc4_bool(address)bool'] + }> + & Record<'get_implicit_key_arc4_address(address)address' | 'get_implicit_key_arc4_address', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_address(address)address'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_address(address)address'] + returns: LocalStateContractReturns['get_implicit_key_arc4_address(address)address'] + }> + & Record<'get_implicit_key_arc4_uint128(address)uint128' | 'get_implicit_key_arc4_uint128', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_uint128(address)uint128'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_uint128(address)uint128'] + returns: LocalStateContractReturns['get_implicit_key_arc4_uint128(address)uint128'] + }> + & Record<'get_implicit_key_arc4_dynamic_bytes(address)byte[]' | 'get_implicit_key_arc4_dynamic_bytes', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_dynamic_bytes(address)byte[]'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_dynamic_bytes(address)byte[]'] + returns: LocalStateContractReturns['get_implicit_key_arc4_dynamic_bytes(address)byte[]'] + }> + & Record<'get_implicit_key_tuple(address)(uint64,byte[],bool)' | 'get_implicit_key_tuple', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_tuple(address)(uint64,byte[],bool)'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_tuple(address)(uint64,byte[],bool)'] + returns: LocalStateContractReturns['get_implicit_key_tuple(address)(uint64,byte[],bool)'] + }> + & Record<'get_arc4_uint(address)uint64' | 'get_arc4_uint', { + argsObj: LocalStateContractArgs['obj']['get_arc4_uint(address)uint64'] + argsTuple: LocalStateContractArgs['tuple']['get_arc4_uint(address)uint64'] + returns: LocalStateContractReturns['get_arc4_uint(address)uint64'] + }> + & Record<'get_arc4_string(address)string' | 'get_arc4_string', { + argsObj: LocalStateContractArgs['obj']['get_arc4_string(address)string'] + argsTuple: LocalStateContractArgs['tuple']['get_arc4_string(address)string'] + returns: LocalStateContractReturns['get_arc4_string(address)string'] + }> + & Record<'get_arc4_byte(address)byte' | 'get_arc4_byte', { + argsObj: LocalStateContractArgs['obj']['get_arc4_byte(address)byte'] + argsTuple: LocalStateContractArgs['tuple']['get_arc4_byte(address)byte'] + returns: LocalStateContractReturns['get_arc4_byte(address)byte'] + }> + & Record<'get_arc4_bool(address)bool' | 'get_arc4_bool', { + argsObj: LocalStateContractArgs['obj']['get_arc4_bool(address)bool'] + argsTuple: LocalStateContractArgs['tuple']['get_arc4_bool(address)bool'] + returns: LocalStateContractReturns['get_arc4_bool(address)bool'] + }> + & Record<'get_arc4_address(address)address' | 'get_arc4_address', { + argsObj: LocalStateContractArgs['obj']['get_arc4_address(address)address'] + argsTuple: LocalStateContractArgs['tuple']['get_arc4_address(address)address'] + returns: LocalStateContractReturns['get_arc4_address(address)address'] + }> + & Record<'get_arc4_uint128(address)uint128' | 'get_arc4_uint128', { + argsObj: LocalStateContractArgs['obj']['get_arc4_uint128(address)uint128'] + argsTuple: LocalStateContractArgs['tuple']['get_arc4_uint128(address)uint128'] + returns: LocalStateContractReturns['get_arc4_uint128(address)uint128'] + }> + & Record<'get_arc4_dynamic_bytes(address)byte[]' | 'get_arc4_dynamic_bytes', { + argsObj: LocalStateContractArgs['obj']['get_arc4_dynamic_bytes(address)byte[]'] + argsTuple: LocalStateContractArgs['tuple']['get_arc4_dynamic_bytes(address)byte[]'] + returns: LocalStateContractReturns['get_arc4_dynamic_bytes(address)byte[]'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + local: { + keys: { + implicitKeyArc4Uint: bigint + implicitKeyArc4String: string + implicitKeyArc4Byte: number + implicitKeyArc4Bool: boolean + implicitKeyArc4Address: string + implicitKeyArc4Uint128: bigint + implicitKeyArc4DynamicBytes: Uint8Array + implicitKeyTuple: [bigint, Uint8Array, boolean] + arc4Uint: bigint + arc4String: string + arc4Byte: number + arc4Bool: boolean + arc4Address: string + arc4Uint128: bigint + arc4DynamicBytes: Uint8Array + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type LocalStateContractSignatures = keyof LocalStateContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type LocalStateContractNonVoidMethodSignatures = keyof LocalStateContractTypes['methods'] extends infer T ? T extends keyof LocalStateContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the LocalStateContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = LocalStateContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the LocalStateContract smart contract to the method's return type + */ +export type MethodReturn = LocalStateContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed local state of the application. + */ +export type LocalKeysState = LocalStateContractTypes['state']['local']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type LocalStateContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type LocalStateContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: LocalStateContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the LocalStateContract smart contract + */ +export abstract class LocalStateContractParamsFactory { + /** + * Gets available optIn ABI call param factories + */ + static get optIn() { + return { + /** + * Constructs opt-in ABI call params for the LocalStateContract smart contract using the opt_in()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + optIn(params: CallParams): AppClientMethodCallParams { + return { + ...params, + method: 'opt_in()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + + /** + * Constructs a no op call for the get_implicit_key_arc4_uint(address)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_uint(address)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_string(address)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_string(address)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_byte(address)byte ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_byte(address)byte' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_bool(address)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_bool(address)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_address(address)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_address(address)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_uint128(address)uint128 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_uint128(address)uint128' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_dynamic_bytes(address)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_dynamic_bytes(address)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_implicit_key_tuple(address)(uint64,byte[],bool) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_tuple(address)(uint64,byte[],bool)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_arc4_uint(address)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_uint(address)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_arc4_string(address)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_string(address)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_arc4_byte(address)byte ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_byte(address)byte' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_arc4_bool(address)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_bool(address)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_arc4_address(address)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_address(address)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_arc4_uint128(address)uint128 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_uint128(address)uint128' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_arc4_dynamic_bytes(address)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_dynamic_bytes(address)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } +} + +/** + * A factory to create and deploy one or more instance of the LocalStateContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class LocalStateContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `LocalStateContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new LocalStateContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new LocalStateContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the LocalStateContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: LocalStateContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new LocalStateContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the LocalStateContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the LocalStateContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the LocalStateContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new LocalStateContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the LocalStateContract smart contract + */ +export class LocalStateContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `LocalStateContractClient` + * + * @param appClient An `AppClient` instance which has been created with the LocalStateContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `LocalStateContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `LocalStateContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new LocalStateContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `LocalStateContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new LocalStateContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the LocalStateContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn params + */ + optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + return this.appClient.params.optIn(LocalStateContractParamsFactory.optIn.optIn(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the LocalStateContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint(address)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_string(address)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4String(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_byte(address)byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_bool(address)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_address(address)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Address(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint128(address)uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes(address)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_tuple(address)(uint64,byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyTuple(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint(address)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Uint(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_string(address)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getArc4String(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_byte(address)byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Byte(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_bool(address)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Bool(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_address(address)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Address(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint128(address)uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Uint128(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_dynamic_bytes(address)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getArc4DynamicBytes(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the LocalStateContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn transaction + */ + optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + return this.appClient.createTransaction.optIn(LocalStateContractParamsFactory.optIn.optIn(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the LocalStateContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint(address)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_string(address)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4String(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_byte(address)byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_bool(address)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_address(address)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Address(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint128(address)uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes(address)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_tuple(address)(uint64,byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyTuple(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint(address)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Uint(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_string(address)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4String(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_byte(address)byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Byte(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_bool(address)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Bool(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_address(address)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Address(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint128(address)uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Uint128(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_dynamic_bytes(address)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4DynamicBytes(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the LocalStateContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn result + */ + optIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + const result = await this.appClient.send.optIn(LocalStateContractParamsFactory.optIn.optIn(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['opt_in()void'])} + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the LocalStateContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint(address)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_uint(address)uint64'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_string(address)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4String(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_string(address)string'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_byte(address)byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_byte(address)byte'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_bool(address)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_bool(address)bool'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_address(address)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Address(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_address(address)address'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint128(address)uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_uint128(address)uint128'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes(address)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_dynamic_bytes(address)byte[]'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_tuple(address)(uint64,byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyTuple(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_tuple(address)(uint64,byte[],bool)'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint(address)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Uint(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_uint(address)uint64'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_string(address)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4String(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_string(address)string'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_byte(address)byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Byte(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_byte(address)byte'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_bool(address)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Bool(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_bool(address)bool'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_address(address)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Address(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_address(address)address'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint128(address)uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Uint128(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_uint128(address)uint128'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_dynamic_bytes(address)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4DynamicBytes(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_dynamic_bytes(address)byte[]'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new LocalStateContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current LocalStateContract app + */ + state = { + /** + * Methods to access local state for the current LocalStateContract app + */ + local: (address: string | Address) => { + const encodedAddress = typeof address === 'string' ? address : encodeAddress(address.publicKey) + return { + /** + * Get all current keyed values from local state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.local(encodedAddress).getAll() + return { + implicitKeyArc4Uint: result.implicit_key_arc4_uint, + implicitKeyArc4String: result.implicit_key_arc4_string, + implicitKeyArc4Byte: result.implicit_key_arc4_byte, + implicitKeyArc4Bool: result.implicit_key_arc4_bool, + implicitKeyArc4Address: result.implicit_key_arc4_address, + implicitKeyArc4Uint128: result.implicit_key_arc4_uint128, + implicitKeyArc4DynamicBytes: result.implicit_key_arc4_dynamic_bytes, + implicitKeyTuple: result.implicit_key_tuple, + arc4Uint: result.arc4_uint, + arc4String: result.arc4_string, + arc4Byte: result.arc4_byte, + arc4Bool: result.arc4_bool, + arc4Address: result.arc4_address, + arc4Uint128: result.arc4_uint128, + arc4DynamicBytes: result.arc4_dynamic_bytes, + } + }, + /** + * Get the current value of the implicit_key_arc4_uint key in local state + */ + implicitKeyArc4Uint: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_uint")) as bigint | undefined }, + /** + * Get the current value of the implicit_key_arc4_string key in local state + */ + implicitKeyArc4String: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_string")) as string | undefined }, + /** + * Get the current value of the implicit_key_arc4_byte key in local state + */ + implicitKeyArc4Byte: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_byte")) as number | undefined }, + /** + * Get the current value of the implicit_key_arc4_bool key in local state + */ + implicitKeyArc4Bool: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_bool")) as boolean | undefined }, + /** + * Get the current value of the implicit_key_arc4_address key in local state + */ + implicitKeyArc4Address: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_address")) as string | undefined }, + /** + * Get the current value of the implicit_key_arc4_uint128 key in local state + */ + implicitKeyArc4Uint128: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_uint128")) as bigint | undefined }, + /** + * Get the current value of the implicit_key_arc4_dynamic_bytes key in local state + */ + implicitKeyArc4DynamicBytes: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_dynamic_bytes")) as Uint8Array | undefined }, + /** + * Get the current value of the implicit_key_tuple key in local state + */ + implicitKeyTuple: async (): Promise<[bigint, Uint8Array, boolean] | undefined> => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_tuple")) as [bigint, Uint8Array, boolean] | undefined }, + /** + * Get the current value of the arc4_uint key in local state + */ + arc4Uint: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_uint")) as bigint | undefined }, + /** + * Get the current value of the arc4_string key in local state + */ + arc4String: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_string")) as string | undefined }, + /** + * Get the current value of the arc4_byte key in local state + */ + arc4Byte: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_byte")) as number | undefined }, + /** + * Get the current value of the arc4_bool key in local state + */ + arc4Bool: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_bool")) as boolean | undefined }, + /** + * Get the current value of the arc4_address key in local state + */ + arc4Address: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_address")) as string | undefined }, + /** + * Get the current value of the arc4_uint128 key in local state + */ + arc4Uint128: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_uint128")) as bigint | undefined }, + /** + * Get the current value of the arc4_dynamic_bytes key in local state + */ + arc4DynamicBytes: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_dynamic_bytes")) as Uint8Array | undefined }, + } + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): LocalStateContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a get_implicit_key_arc4_uint(address)uint64 method call against the LocalStateContract contract + */ + getImplicitKeyArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Uint(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_string(address)string method call against the LocalStateContract contract + */ + getImplicitKeyArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4String(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_byte(address)byte method call against the LocalStateContract contract + */ + getImplicitKeyArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Byte(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_bool(address)bool method call against the LocalStateContract contract + */ + getImplicitKeyArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Bool(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_address(address)address method call against the LocalStateContract contract + */ + getImplicitKeyArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Address(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_uint128(address)uint128 method call against the LocalStateContract contract + */ + getImplicitKeyArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Uint128(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_dynamic_bytes(address)byte[] method call against the LocalStateContract contract + */ + getImplicitKeyArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4DynamicBytes(params))) + return this + }, + /** + * Add a get_implicit_key_tuple(address)(uint64,byte[],bool) method call against the LocalStateContract contract + */ + getImplicitKeyTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyTuple(params))) + return this + }, + /** + * Add a get_arc4_uint(address)uint64 method call against the LocalStateContract contract + */ + getArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Uint(params))) + return this + }, + /** + * Add a get_arc4_string(address)string method call against the LocalStateContract contract + */ + getArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4String(params))) + return this + }, + /** + * Add a get_arc4_byte(address)byte method call against the LocalStateContract contract + */ + getArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Byte(params))) + return this + }, + /** + * Add a get_arc4_bool(address)bool method call against the LocalStateContract contract + */ + getArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Bool(params))) + return this + }, + /** + * Add a get_arc4_address(address)address method call against the LocalStateContract contract + */ + getArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Address(params))) + return this + }, + /** + * Add a get_arc4_uint128(address)uint128 method call against the LocalStateContract contract + */ + getArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Uint128(params))) + return this + }, + /** + * Add a get_arc4_dynamic_bytes(address)byte[] method call against the LocalStateContract contract + */ + getArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4DynamicBytes(params))) + return this + }, + get optIn() { + return { + optIn: (params: CallParams) => { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn.optIn(params))) + return this + }, + } + }, + /** + * Add a clear state call to the LocalStateContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as LocalStateContractComposer + } +} +export type LocalStateContractComposer = { + /** + * Calls the get_implicit_key_arc4_uint(address)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Uint(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_uint(address)uint64'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_string(address)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4String(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_string(address)string'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_byte(address)byte ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Byte(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_byte(address)byte'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_bool(address)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Bool(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_bool(address)bool'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_address(address)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Address(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_address(address)address'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_uint128(address)uint128 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Uint128(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_uint128(address)uint128'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_dynamic_bytes(address)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4DynamicBytes(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_dynamic_bytes(address)byte[]'] | undefined]> + + /** + * Calls the get_implicit_key_tuple(address)(uint64,byte[],bool) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyTuple(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_tuple(address)(uint64,byte[],bool)'] | undefined]> + + /** + * Calls the get_arc4_uint(address)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Uint(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_uint(address)uint64'] | undefined]> + + /** + * Calls the get_arc4_string(address)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4String(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_string(address)string'] | undefined]> + + /** + * Calls the get_arc4_byte(address)byte ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Byte(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_byte(address)byte'] | undefined]> + + /** + * Calls the get_arc4_bool(address)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Bool(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_bool(address)bool'] | undefined]> + + /** + * Calls the get_arc4_address(address)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Address(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_address(address)address'] | undefined]> + + /** + * Calls the get_arc4_uint128(address)uint128 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Uint128(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_uint128(address)uint128'] | undefined]> + + /** + * Calls the get_arc4_dynamic_bytes(address)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4DynamicBytes(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_dynamic_bytes(address)byte[]'] | undefined]> + + /** + * Gets available optIn methods + */ + readonly optIn: { + /** + * Opts the user into an existing instance of the LocalStateContract smart contract using the opt_in()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + optIn(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['opt_in()void'] | undefined]> + } + + /** + * Makes a clear_state call to an existing instance of the LocalStateContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): LocalStateContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): LocalStateContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type LocalStateContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/MiscellaneousOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/MiscellaneousOpsContract.ts new file mode 100644 index 0000000..afd9e82 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/MiscellaneousOpsContract.ts @@ -0,0 +1,3082 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"MiscellaneousOpsContract","structs":{},"methods":[{"name":"verify_addw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_base64_decode_standard","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_base64_decode_url","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_bitlen","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_a_size"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_bitlen","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bsqrt","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_btoi","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bzero","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_concat","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"uint64","name":"pad_a_size"},{"type":"uint64","name":"pad_b_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_divmodw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"},{"type":"uint64","name":"d"}],"returns":{"type":"(uint64,uint64,uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_divw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_err","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_exp","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_expw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract_from_2","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract_uint16","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract_uint32","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_getbit_bytes","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_getbit_uint64","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_getbyte","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_itob","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_mulw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_replace","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_select_bytes","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_select_uint64","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_setbit_bytes","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"bool","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_setbit_uint64","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"},{"type":"bool","name":"c"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_setbyte","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_shl","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_shr","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_sqrt","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_substring","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_json_ref_string","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_json_ref_uint64","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_json_ref_object","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDE1MWY3Yzc1MDAyMCAweDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDQ0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg0NTg0N2VlYSAweGY1N2FjZWI1IDB4N2Q2MzE3MzAgMHhhMWIyNDQ0MSAweGNkN2JlMWFjIDB4N2NmZGE2NGIgMHg1NGE5MTBkOSAweGM0NjU2OGRlIDB4N2E0NmE2YWUgMHgwNDM3MjIwOSAweDdlNWY2ZDcyIDB4MjRlYmNmODQgMHg5YzBiMzM5NyAweDBhZDQwZGE0IDB4OTUxNzg4NzAgMHhkZWVkYzk5YiAweGFiMjE1MGJiIDB4MDJhNTQwMTcgMHgzZGI2NmI0MSAweDZlM2ZmMzhjIDB4OGYzYjlmMTggMHgxNjE2NmY5YSAweDJmNDcyMDY1IDB4ZDVhNzM5YzMgMHg2MWYzYjNlMSAweDU2Y2YzNjhiIDB4OTE5ZmZiZDIgMHhhYWU4YjY5NyAweDg0NzQyMmIxIDB4ZDUyNjAzMjcgMHgxMTRjOGM2ZCAweDM5ZTllNjJhIDB4ZDZhNGMwNWUgMHgxZWY4MTUxYSAweDY2ZGQ3Zjk2IDB4NGQ5ZWNlYjIgMHgxOWJhNzBlZSAvLyBtZXRob2QgInZlcmlmeV9hZGR3KHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfYmFzZTY0X2RlY29kZV9zdGFuZGFyZChieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmFzZTY0X2RlY29kZV91cmwoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2JpdGxlbihieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9iaXRsZW4odWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2JzcXJ0KGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9idG9pKGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9iemVybyh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfY29uY2F0KGJ5dGVbXSxieXRlW10sdWludDY0LHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9kaXZtb2R3KHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidmVyaWZ5X2RpdncodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZXJyKCl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfZXhwKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZXhwdyh1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidmVyaWZ5X2V4dHJhY3QoYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdF9mcm9tXzIoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2V4dHJhY3RfdWludDE2KGJ5dGVbXSx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdF91aW50MzIoYnl0ZVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9leHRyYWN0X3VpbnQ2NChieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2dldGJpdF9ieXRlcyhieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9nZXRiaXRfdWludDY0KHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2dldGJ5dGUoYnl0ZVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9pdG9iKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9tdWx3KHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfcmVwbGFjZShieXRlW10sdWludDY0LGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9zZWxlY3RfYnl0ZXMoYnl0ZVtdLGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc2VsZWN0X3VpbnQ2NCh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9zZXRiaXRfYnl0ZXMoYnl0ZVtdLHVpbnQ2NCxib29sKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X3NldGJpdF91aW50NjQodWludDY0LHVpbnQ2NCxib29sKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3NldGJ5dGUoYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc2hsKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc2hyKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc3FydCh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc3Vic3RyaW5nKGJ5dGVbXSx1aW50NjQsdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2pzb25fcmVmX3N0cmluZyhieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2pzb25fcmVmX3VpbnQ2NChieXRlW10sYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2pzb25fcmVmX29iamVjdChieXRlW10sYnl0ZVtdKWJ5dGVbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9hZGR3IHZlcmlmeV9iYXNlNjRfZGVjb2RlX3N0YW5kYXJkIHZlcmlmeV9iYXNlNjRfZGVjb2RlX3VybCB2ZXJpZnlfYnl0ZXNfYml0bGVuIHZlcmlmeV91aW50NjRfYml0bGVuIHZlcmlmeV9ic3FydCB2ZXJpZnlfYnRvaSB2ZXJpZnlfYnplcm8gdmVyaWZ5X2NvbmNhdCB2ZXJpZnlfZGl2bW9kdyB2ZXJpZnlfZGl2dyBtYWluX3ZlcmlmeV9lcnJfcm91dGVAMTUgdmVyaWZ5X2V4cCB2ZXJpZnlfZXhwdyB2ZXJpZnlfZXh0cmFjdCB2ZXJpZnlfZXh0cmFjdF9mcm9tXzIgdmVyaWZ5X2V4dHJhY3RfdWludDE2IHZlcmlmeV9leHRyYWN0X3VpbnQzMiB2ZXJpZnlfZXh0cmFjdF91aW50NjQgdmVyaWZ5X2dldGJpdF9ieXRlcyB2ZXJpZnlfZ2V0Yml0X3VpbnQ2NCB2ZXJpZnlfZ2V0Ynl0ZSB2ZXJpZnlfaXRvYiB2ZXJpZnlfbXVsdyB2ZXJpZnlfcmVwbGFjZSB2ZXJpZnlfc2VsZWN0X2J5dGVzIHZlcmlmeV9zZWxlY3RfdWludDY0IHZlcmlmeV9zZXRiaXRfYnl0ZXMgdmVyaWZ5X3NldGJpdF91aW50NjQgdmVyaWZ5X3NldGJ5dGUgdmVyaWZ5X3NobCB2ZXJpZnlfc2hyIHZlcmlmeV9zcXJ0IHZlcmlmeV9zdWJzdHJpbmcgdmVyaWZ5X2pzb25fcmVmX3N0cmluZyB2ZXJpZnlfanNvbl9yZWZfdWludDY0IHZlcmlmeV9qc29uX3JlZl9vYmplY3QKICAgIGVycgoKbWFpbl92ZXJpZnlfZXJyX3JvdXRlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANDQ6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYWRkd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hZGR3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjcKICAgIC8vIHJlc3VsdCA9IG9wLmFkZHcoYSwgYikKICAgIGFkZHcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Jhc2U2NF9kZWNvZGVfc3RhbmRhcmRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmFzZTY0X2RlY29kZV9zdGFuZGFyZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyCiAgICAvLyByZXN1bHQgPSBvcC5iYXNlNjRfZGVjb2RlKG9wLkJhc2U2NC5TdGRFbmNvZGluZywgYSkKICAgIGJhc2U2NF9kZWNvZGUgU3RkRW5jb2RpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIHJlc3VsdCA9IG9wLmJhc2U2NF9kZWNvZGUob3AuQmFzZTY0LlVSTEVuY29kaW5nLCBhKQogICAgYmFzZTY0X2RlY29kZSBVUkxFbmNvZGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfYml0bGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX2JpdGxlbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBhID0gb3AuYnplcm8ocGFkX2Ffc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToyMwogICAgLy8gcmVzdWx0ID0gb3AuYml0bGVuKGEpCiAgICBiaXRsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2JpdGxlbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfYml0bGVuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToyOAogICAgLy8gcmVzdWx0ID0gb3AuYml0bGVuKGEpCiAgICBiaXRsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYnNxcnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnNxcnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTozMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTozNAogICAgLy8gcmVzdWx0ID0gb3AuYnNxcnQoYV9iaWd1aW50KQogICAgYnNxcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2J0b2lbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnRvaToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjM5CiAgICAvLyByZXN1bHQgPSBvcC5idG9pKGEpCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTozNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2J6ZXJvW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J6ZXJvOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NAogICAgLy8gcmVzdWx0ID0gb3AuYnplcm8oYSkKICAgIGJ6ZXJvCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NQogICAgLy8gcmV0dXJuIG9wLnNoYTI1NihyZXN1bHQpCiAgICBzaGEyNTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2NvbmNhdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9jb25jYXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NDkKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfYV9zaXplKSArIGEKICAgIHN3YXAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NTAKICAgIC8vIGIgPSBvcC5iemVybyhwYWRfYl9zaXplKSArIGIKICAgIHN3YXAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NTEKICAgIC8vIHJlc3VsdCA9IGEgKyBiCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjUyCiAgICAvLyByZXN1bHQgPSBvcC5zaGEyNTYocmVzdWx0KQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9kaXZtb2R3W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Rpdm1vZHc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjU5CiAgICAvLyByZXN1bHQgPSBvcC5kaXZtb2R3KGEsIGIsIGMsIGQpCiAgICBkaXZtb2R3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Rpdndbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGl2dzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NjQKICAgIC8vIHJlc3VsdCA9IG9wLmRpdncoYSwgYiwgYykKICAgIGRpdncKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXhwW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4cDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIHJlc3VsdCA9IG9wLmV4cChhLCBiKQogICAgZXhwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4cHdbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZXhwdzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NzgKICAgIC8vIHJlc3VsdCA9IG9wLmV4cHcoYSwgYikKICAgIGV4cHcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4MwogICAgLy8gcmVzdWx0ID0gb3AuZXh0cmFjdChhLCBiLCBjKQogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3RfZnJvbV8yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3RfZnJvbV8yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4OAogICAgLy8gcmVzdWx0ID0gb3AuZXh0cmFjdChhLCAyLCAwKQogICAgZXh0cmFjdCA0IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3RfdWludDE2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3RfdWludDE2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTMKICAgIC8vIHJlc3VsdCA9IG9wLmV4dHJhY3RfdWludDE2KGEsIGIpCiAgICBleHRyYWN0X3VpbnQxNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0X3VpbnQzMltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9leHRyYWN0X3VpbnQzMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyByZXN1bHQgPSBvcC5leHRyYWN0X3VpbnQzMihhLCBiKQogICAgZXh0cmFjdF91aW50MzIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXh0cmFjdF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZXh0cmFjdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgcHVzaGludCA4CiAgICBleHRyYWN0MwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZ2V0Yml0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldGJpdF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMDgKICAgIC8vIHJlc3VsdCA9IG9wLmdldGJpdChhLCBiKQogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18yIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZ2V0Yml0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRiaXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTEzCiAgICAvLyByZXN1bHQgPSBvcC5nZXRiaXQoYSwgYikKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMiAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2dldGJ5dGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0Ynl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjExNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMTgKICAgIC8vIHJlc3VsdCA9IG9wLmdldGJ5dGUoYSwgYikKICAgIGdldGJ5dGUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjExNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2l0b2Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfaXRvYjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gcmVzdWx0ID0gb3AuaXRvYihhKQogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUwMDA4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfbXVsd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9tdWx3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTI4CiAgICAvLyByZXN1bHQgPSBvcC5tdWx3KGEsIGIpCiAgICBtdWx3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3JlcGxhY2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfcmVwbGFjZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTMzCiAgICAvLyByZXN1bHQgPSBvcC5yZXBsYWNlKGEsIGIsIGMpCiAgICByZXBsYWNlMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NlbGVjdF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zZWxlY3RfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gcmVzdWx0ID0gb3Auc2VsZWN0X2J5dGVzKGEsIGIsIGMpCiAgICBzZWxlY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zZWxlY3RfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NlbGVjdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDMKICAgIC8vIHJlc3VsdCA9IG9wLnNlbGVjdF91aW50NjQoYSwgYiwgYykKICAgIHNlbGVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2V0Yml0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NldGJpdF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDgKICAgIC8vIHJlc3VsdCA9IG9wLnNldGJpdF9ieXRlcyhhLCBiLCBjKQogICAgc2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2V0Yml0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zZXRiaXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUzCiAgICAvLyByZXN1bHQgPSBvcC5zZXRiaXRfdWludDY0KGEsIGIsIGMpCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NldGJ5dGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2V0Ynl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNTgKICAgIC8vIHJlc3VsdCA9IG9wLnNldGJ5dGUoYSwgYiwgYykKICAgIHNldGJ5dGUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zaGxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2hsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTYzCiAgICAvLyByZXN1bHQgPSBvcC5zaGwoYSwgYikKICAgIHNobAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2hyW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NocjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2OAogICAgLy8gcmVzdWx0ID0gb3Auc2hyKGEsIGIpCiAgICBzaHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NxcnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3FydDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3MwogICAgLy8gcmVzdWx0ID0gb3Auc3FydChhKQogICAgc3FydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc3Vic3RyaW5nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N1YnN0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNzgKICAgIC8vIHJlc3VsdCA9IG9wLnN1YnN0cmluZyhhLCBiLCBjKQogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2pzb25fcmVmX3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9qc29uX3JlZl9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gcmVzdWx0ID0gb3AuSnNvblJlZi5qc29uX3N0cmluZyhhLCBiKQogICAganNvbl9yZWYgSlNPTlN0cmluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2pzb25fcmVmX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9qc29uX3JlZl91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gcmVzdWx0ID0gb3AuSnNvblJlZi5qc29uX3VpbnQ2NChhLCBiKQogICAganNvbl9yZWYgSlNPTlVpbnQ2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfanNvbl9yZWZfb2JqZWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2pzb25fcmVmX29iamVjdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTkzCiAgICAvLyByZXN1bHQgPSBvcC5Kc29uUmVmLmpzb25fb2JqZWN0KGEsIGIpCiAgICBqc29uX3JlZiBKU09OT2JqZWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmAwQVH3x1BhUffHUAIAEAMRtBARMxGRREMRhEgiUERYR+6gT1es61BH1jFzAEobJEQQTNe+GsBHz9pksEVKkQ2QTEZWjeBHpGpq4EBDciCQR+X21yBCTrz4QEnAszlwQK1A2kBJUXiHAE3u3JmwSrIVC7BAKlQBcEPbZrQQRuP/OMBI87nxgEFhZvmgQvRyBlBNWnOcMEYfOz4QRWzzaLBJGf+9IEqui2lwSEdCKxBNUmAycEEUyMbQQ56eYqBNakwF4EHvgVGgRm3X+WBE2ezrIEGbpw7jYaAI4lAAoAHgA0AEoAXwBrAIAAjgCaAMAA5QABAPkBCQEdAToBTgFgAXIBhQGbAa8BwQHTAecCBgIlAjkCVwJsAokCmQKpArUC0gLuAwMAADEZFDEYFBBDNhoBFzYaAhceTBZMFlAoTFCwIkM2GgFXAgBeAUkVFlcGAkxQKExQsCJDNhoBVwIAXgBJFRZXBgJMUChMULAiQzYaAVcCADYaAhevTFCTFihMULAiQzYaAReTFihMULAiQzYaAVcCAJZJFRZXBgJMUChMULAiQzYaAVcCABcWKExQsCJDNhoBF68BKUxQsCJDNhoBVwIANhoCVwIANhoDFzYaBBdMr08DUEyvTwJQUAEpTFCwIkM2GgEXNhoCFzYaAxc2GgQXH08DFk8DFlBPAhZQTBZQKExQsCJDNhoBFzYaAhc2GgMXlxYoTFCwIkM2GgEXNhoCF5QWKExQsCJDNhoBFzYaAheVTBZMFlAoTFCwIkM2GgFXAgA2GgIXNhoDF1hJFRZXBgJMUChMULAiQzYaAVcEAEkVFlcGAkxQKExQsCJDNhoBVwIANhoCF1kWKExQsCJDNhoBVwIANhoCF1oWKExQsCJDNhoBVwIANhoCF4EIWChMULAiQzYaAVcCADYaAhdTKiNPAlQoTFCwIkM2GgEXNhoCF1MqI08CVChMULAiQzYaAVcCADYaAhdVFihMULAiQzYaARcWgAYVH3x1AAhMULAiQzYaARc2GgIXHUwWTBZQKExQsCJDNhoBVwIANhoCFzYaA1cCAF1JFRZXBgJMUChMULAiQzYaAVcCADYaAlcCADYaAxdNSRUWVwYCTFAoTFCwIkM2GgEXNhoCFzYaAxdNFihMULAiQzYaAVcCADYaAhc2GgMjU1RJFRZXBgJMUChMULAiQzYaARc2GgIXNhoDI1NUFihMULAiQzYaAVcCADYaAhc2GgMXVkkVFlcGAkxQKExQsCJDNhoBFzYaAheQFihMULAiQzYaARc2GgIXkRYoTFCwIkM2GgEXkhYoTFCwIkM2GgFXAgA2GgIXNhoDF1JJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAF8ASRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgBfARYoTFCwIkM2GgFXAgA2GgJXAgBfAkkVFlcGAkxQKExQsCJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the MiscellaneousOpsContract contract + */ +export type MiscellaneousOpsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_addw(uint64,uint64)(uint64,uint64)': { + a: bigint | number + b: bigint | number + } + 'verify_base64_decode_standard(byte[])byte[]': { + a: Uint8Array + } + 'verify_base64_decode_url(byte[])byte[]': { + a: Uint8Array + } + 'verify_bytes_bitlen(byte[],uint64)uint64': { + a: Uint8Array + padASize: bigint | number + } + 'verify_uint64_bitlen(uint64)uint64': { + a: bigint | number + } + 'verify_bsqrt(byte[])byte[]': { + a: Uint8Array + } + 'verify_btoi(byte[])uint64': { + a: Uint8Array + } + 'verify_bzero(uint64)byte[]': { + a: bigint | number + } + 'verify_concat(byte[],byte[],uint64,uint64)byte[]': { + a: Uint8Array + b: Uint8Array + padASize: bigint | number + padBSize: bigint | number + } + 'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)': { + a: bigint | number + b: bigint | number + c: bigint | number + d: bigint | number + } + 'verify_divw(uint64,uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + c: bigint | number + } + 'verify_err()void': Record + 'verify_exp(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_expw(uint64,uint64)(uint64,uint64)': { + a: bigint | number + b: bigint | number + } + 'verify_extract(byte[],uint64,uint64)byte[]': { + a: Uint8Array + b: bigint | number + c: bigint | number + } + 'verify_extract_from_2(byte[])byte[]': { + a: Uint8Array + } + 'verify_extract_uint16(byte[],uint64)uint64': { + a: Uint8Array + b: bigint | number + } + 'verify_extract_uint32(byte[],uint64)uint64': { + a: Uint8Array + b: bigint | number + } + 'verify_extract_uint64(byte[],uint64)uint64': { + a: Uint8Array + b: bigint | number + } + 'verify_getbit_bytes(byte[],uint64)bool': { + a: Uint8Array + b: bigint | number + } + 'verify_getbit_uint64(uint64,uint64)bool': { + a: bigint | number + b: bigint | number + } + 'verify_getbyte(byte[],uint64)uint64': { + a: Uint8Array + b: bigint | number + } + 'verify_itob(uint64)byte[]': { + a: bigint | number + } + 'verify_mulw(uint64,uint64)(uint64,uint64)': { + a: bigint | number + b: bigint | number + } + 'verify_replace(byte[],uint64,byte[])byte[]': { + a: Uint8Array + b: bigint | number + c: Uint8Array + } + 'verify_select_bytes(byte[],byte[],uint64)byte[]': { + a: Uint8Array + b: Uint8Array + c: bigint | number + } + 'verify_select_uint64(uint64,uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + c: bigint | number + } + 'verify_setbit_bytes(byte[],uint64,bool)byte[]': { + a: Uint8Array + b: bigint | number + c: boolean + } + 'verify_setbit_uint64(uint64,uint64,bool)uint64': { + a: bigint | number + b: bigint | number + c: boolean + } + 'verify_setbyte(byte[],uint64,uint64)byte[]': { + a: Uint8Array + b: bigint | number + c: bigint | number + } + 'verify_shl(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_shr(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_sqrt(uint64)uint64': { + a: bigint | number + } + 'verify_substring(byte[],uint64,uint64)byte[]': { + a: Uint8Array + b: bigint | number + c: bigint | number + } + 'verify_json_ref_string(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_json_ref_uint64(byte[],byte[])uint64': { + a: Uint8Array + b: Uint8Array + } + 'verify_json_ref_object(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_addw(uint64,uint64)(uint64,uint64)': [a: bigint | number, b: bigint | number] + 'verify_base64_decode_standard(byte[])byte[]': [a: Uint8Array] + 'verify_base64_decode_url(byte[])byte[]': [a: Uint8Array] + 'verify_bytes_bitlen(byte[],uint64)uint64': [a: Uint8Array, padASize: bigint | number] + 'verify_uint64_bitlen(uint64)uint64': [a: bigint | number] + 'verify_bsqrt(byte[])byte[]': [a: Uint8Array] + 'verify_btoi(byte[])uint64': [a: Uint8Array] + 'verify_bzero(uint64)byte[]': [a: bigint | number] + 'verify_concat(byte[],byte[],uint64,uint64)byte[]': [a: Uint8Array, b: Uint8Array, padASize: bigint | number, padBSize: bigint | number] + 'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)': [a: bigint | number, b: bigint | number, c: bigint | number, d: bigint | number] + 'verify_divw(uint64,uint64,uint64)uint64': [a: bigint | number, b: bigint | number, c: bigint | number] + 'verify_err()void': [] + 'verify_exp(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_expw(uint64,uint64)(uint64,uint64)': [a: bigint | number, b: bigint | number] + 'verify_extract(byte[],uint64,uint64)byte[]': [a: Uint8Array, b: bigint | number, c: bigint | number] + 'verify_extract_from_2(byte[])byte[]': [a: Uint8Array] + 'verify_extract_uint16(byte[],uint64)uint64': [a: Uint8Array, b: bigint | number] + 'verify_extract_uint32(byte[],uint64)uint64': [a: Uint8Array, b: bigint | number] + 'verify_extract_uint64(byte[],uint64)uint64': [a: Uint8Array, b: bigint | number] + 'verify_getbit_bytes(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] + 'verify_getbit_uint64(uint64,uint64)bool': [a: bigint | number, b: bigint | number] + 'verify_getbyte(byte[],uint64)uint64': [a: Uint8Array, b: bigint | number] + 'verify_itob(uint64)byte[]': [a: bigint | number] + 'verify_mulw(uint64,uint64)(uint64,uint64)': [a: bigint | number, b: bigint | number] + 'verify_replace(byte[],uint64,byte[])byte[]': [a: Uint8Array, b: bigint | number, c: Uint8Array] + 'verify_select_bytes(byte[],byte[],uint64)byte[]': [a: Uint8Array, b: Uint8Array, c: bigint | number] + 'verify_select_uint64(uint64,uint64,uint64)uint64': [a: bigint | number, b: bigint | number, c: bigint | number] + 'verify_setbit_bytes(byte[],uint64,bool)byte[]': [a: Uint8Array, b: bigint | number, c: boolean] + 'verify_setbit_uint64(uint64,uint64,bool)uint64': [a: bigint | number, b: bigint | number, c: boolean] + 'verify_setbyte(byte[],uint64,uint64)byte[]': [a: Uint8Array, b: bigint | number, c: bigint | number] + 'verify_shl(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_shr(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_sqrt(uint64)uint64': [a: bigint | number] + 'verify_substring(byte[],uint64,uint64)byte[]': [a: Uint8Array, b: bigint | number, c: bigint | number] + 'verify_json_ref_string(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_json_ref_uint64(byte[],byte[])uint64': [a: Uint8Array, b: Uint8Array] + 'verify_json_ref_object(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + } +} + +/** + * The return type for each method + */ +export type MiscellaneousOpsContractReturns = { + 'verify_addw(uint64,uint64)(uint64,uint64)': [bigint, bigint] + 'verify_base64_decode_standard(byte[])byte[]': Uint8Array + 'verify_base64_decode_url(byte[])byte[]': Uint8Array + 'verify_bytes_bitlen(byte[],uint64)uint64': bigint + 'verify_uint64_bitlen(uint64)uint64': bigint + 'verify_bsqrt(byte[])byte[]': Uint8Array + 'verify_btoi(byte[])uint64': bigint + 'verify_bzero(uint64)byte[]': Uint8Array + 'verify_concat(byte[],byte[],uint64,uint64)byte[]': Uint8Array + 'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)': [bigint, bigint, bigint, bigint] + 'verify_divw(uint64,uint64,uint64)uint64': bigint + 'verify_err()void': void + 'verify_exp(uint64,uint64)uint64': bigint + 'verify_expw(uint64,uint64)(uint64,uint64)': [bigint, bigint] + 'verify_extract(byte[],uint64,uint64)byte[]': Uint8Array + 'verify_extract_from_2(byte[])byte[]': Uint8Array + 'verify_extract_uint16(byte[],uint64)uint64': bigint + 'verify_extract_uint32(byte[],uint64)uint64': bigint + 'verify_extract_uint64(byte[],uint64)uint64': bigint + 'verify_getbit_bytes(byte[],uint64)bool': boolean + 'verify_getbit_uint64(uint64,uint64)bool': boolean + 'verify_getbyte(byte[],uint64)uint64': bigint + 'verify_itob(uint64)byte[]': Uint8Array + 'verify_mulw(uint64,uint64)(uint64,uint64)': [bigint, bigint] + 'verify_replace(byte[],uint64,byte[])byte[]': Uint8Array + 'verify_select_bytes(byte[],byte[],uint64)byte[]': Uint8Array + 'verify_select_uint64(uint64,uint64,uint64)uint64': bigint + 'verify_setbit_bytes(byte[],uint64,bool)byte[]': Uint8Array + 'verify_setbit_uint64(uint64,uint64,bool)uint64': bigint + 'verify_setbyte(byte[],uint64,uint64)byte[]': Uint8Array + 'verify_shl(uint64,uint64)uint64': bigint + 'verify_shr(uint64,uint64)uint64': bigint + 'verify_sqrt(uint64)uint64': bigint + 'verify_substring(byte[],uint64,uint64)byte[]': Uint8Array + 'verify_json_ref_string(byte[],byte[])byte[]': Uint8Array + 'verify_json_ref_uint64(byte[],byte[])uint64': bigint + 'verify_json_ref_object(byte[],byte[])byte[]': Uint8Array +} + +/** + * Defines the types of available calls and state of the MiscellaneousOpsContract smart contract. + */ +export type MiscellaneousOpsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_addw(uint64,uint64)(uint64,uint64)' | 'verify_addw', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_addw(uint64,uint64)(uint64,uint64)'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_addw(uint64,uint64)(uint64,uint64)'] + returns: MiscellaneousOpsContractReturns['verify_addw(uint64,uint64)(uint64,uint64)'] + }> + & Record<'verify_base64_decode_standard(byte[])byte[]' | 'verify_base64_decode_standard', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_base64_decode_standard(byte[])byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_base64_decode_standard(byte[])byte[]'] + returns: MiscellaneousOpsContractReturns['verify_base64_decode_standard(byte[])byte[]'] + }> + & Record<'verify_base64_decode_url(byte[])byte[]' | 'verify_base64_decode_url', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_base64_decode_url(byte[])byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_base64_decode_url(byte[])byte[]'] + returns: MiscellaneousOpsContractReturns['verify_base64_decode_url(byte[])byte[]'] + }> + & Record<'verify_bytes_bitlen(byte[],uint64)uint64' | 'verify_bytes_bitlen', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_bytes_bitlen(byte[],uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_bytes_bitlen(byte[],uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_bytes_bitlen(byte[],uint64)uint64'] + }> + & Record<'verify_uint64_bitlen(uint64)uint64' | 'verify_uint64_bitlen', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_uint64_bitlen(uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_uint64_bitlen(uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_uint64_bitlen(uint64)uint64'] + }> + & Record<'verify_bsqrt(byte[])byte[]' | 'verify_bsqrt', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_bsqrt(byte[])byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_bsqrt(byte[])byte[]'] + returns: MiscellaneousOpsContractReturns['verify_bsqrt(byte[])byte[]'] + }> + & Record<'verify_btoi(byte[])uint64' | 'verify_btoi', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_btoi(byte[])uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_btoi(byte[])uint64'] + returns: MiscellaneousOpsContractReturns['verify_btoi(byte[])uint64'] + }> + & Record<'verify_bzero(uint64)byte[]' | 'verify_bzero', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_bzero(uint64)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_bzero(uint64)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_bzero(uint64)byte[]'] + }> + & Record<'verify_concat(byte[],byte[],uint64,uint64)byte[]' | 'verify_concat', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_concat(byte[],byte[],uint64,uint64)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_concat(byte[],byte[],uint64,uint64)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_concat(byte[],byte[],uint64,uint64)byte[]'] + }> + & Record<'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)' | 'verify_divmodw', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'] + returns: MiscellaneousOpsContractReturns['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'] + }> + & Record<'verify_divw(uint64,uint64,uint64)uint64' | 'verify_divw', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_divw(uint64,uint64,uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_divw(uint64,uint64,uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_divw(uint64,uint64,uint64)uint64'] + }> + & Record<'verify_err()void' | 'verify_err', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_err()void'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_err()void'] + returns: MiscellaneousOpsContractReturns['verify_err()void'] + }> + & Record<'verify_exp(uint64,uint64)uint64' | 'verify_exp', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_exp(uint64,uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_exp(uint64,uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_exp(uint64,uint64)uint64'] + }> + & Record<'verify_expw(uint64,uint64)(uint64,uint64)' | 'verify_expw', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_expw(uint64,uint64)(uint64,uint64)'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_expw(uint64,uint64)(uint64,uint64)'] + returns: MiscellaneousOpsContractReturns['verify_expw(uint64,uint64)(uint64,uint64)'] + }> + & Record<'verify_extract(byte[],uint64,uint64)byte[]' | 'verify_extract', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract(byte[],uint64,uint64)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract(byte[],uint64,uint64)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_extract(byte[],uint64,uint64)byte[]'] + }> + & Record<'verify_extract_from_2(byte[])byte[]' | 'verify_extract_from_2', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract_from_2(byte[])byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract_from_2(byte[])byte[]'] + returns: MiscellaneousOpsContractReturns['verify_extract_from_2(byte[])byte[]'] + }> + & Record<'verify_extract_uint16(byte[],uint64)uint64' | 'verify_extract_uint16', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract_uint16(byte[],uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract_uint16(byte[],uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_extract_uint16(byte[],uint64)uint64'] + }> + & Record<'verify_extract_uint32(byte[],uint64)uint64' | 'verify_extract_uint32', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract_uint32(byte[],uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract_uint32(byte[],uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_extract_uint32(byte[],uint64)uint64'] + }> + & Record<'verify_extract_uint64(byte[],uint64)uint64' | 'verify_extract_uint64', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract_uint64(byte[],uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract_uint64(byte[],uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_extract_uint64(byte[],uint64)uint64'] + }> + & Record<'verify_getbit_bytes(byte[],uint64)bool' | 'verify_getbit_bytes', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_getbit_bytes(byte[],uint64)bool'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_getbit_bytes(byte[],uint64)bool'] + returns: MiscellaneousOpsContractReturns['verify_getbit_bytes(byte[],uint64)bool'] + }> + & Record<'verify_getbit_uint64(uint64,uint64)bool' | 'verify_getbit_uint64', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_getbit_uint64(uint64,uint64)bool'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_getbit_uint64(uint64,uint64)bool'] + returns: MiscellaneousOpsContractReturns['verify_getbit_uint64(uint64,uint64)bool'] + }> + & Record<'verify_getbyte(byte[],uint64)uint64' | 'verify_getbyte', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_getbyte(byte[],uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_getbyte(byte[],uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_getbyte(byte[],uint64)uint64'] + }> + & Record<'verify_itob(uint64)byte[]' | 'verify_itob', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_itob(uint64)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_itob(uint64)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_itob(uint64)byte[]'] + }> + & Record<'verify_mulw(uint64,uint64)(uint64,uint64)' | 'verify_mulw', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_mulw(uint64,uint64)(uint64,uint64)'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_mulw(uint64,uint64)(uint64,uint64)'] + returns: MiscellaneousOpsContractReturns['verify_mulw(uint64,uint64)(uint64,uint64)'] + }> + & Record<'verify_replace(byte[],uint64,byte[])byte[]' | 'verify_replace', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_replace(byte[],uint64,byte[])byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_replace(byte[],uint64,byte[])byte[]'] + returns: MiscellaneousOpsContractReturns['verify_replace(byte[],uint64,byte[])byte[]'] + }> + & Record<'verify_select_bytes(byte[],byte[],uint64)byte[]' | 'verify_select_bytes', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_select_bytes(byte[],byte[],uint64)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_select_bytes(byte[],byte[],uint64)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_select_bytes(byte[],byte[],uint64)byte[]'] + }> + & Record<'verify_select_uint64(uint64,uint64,uint64)uint64' | 'verify_select_uint64', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_select_uint64(uint64,uint64,uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_select_uint64(uint64,uint64,uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_select_uint64(uint64,uint64,uint64)uint64'] + }> + & Record<'verify_setbit_bytes(byte[],uint64,bool)byte[]' | 'verify_setbit_bytes', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_setbit_bytes(byte[],uint64,bool)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_setbit_bytes(byte[],uint64,bool)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_setbit_bytes(byte[],uint64,bool)byte[]'] + }> + & Record<'verify_setbit_uint64(uint64,uint64,bool)uint64' | 'verify_setbit_uint64', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_setbit_uint64(uint64,uint64,bool)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_setbit_uint64(uint64,uint64,bool)uint64'] + returns: MiscellaneousOpsContractReturns['verify_setbit_uint64(uint64,uint64,bool)uint64'] + }> + & Record<'verify_setbyte(byte[],uint64,uint64)byte[]' | 'verify_setbyte', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_setbyte(byte[],uint64,uint64)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_setbyte(byte[],uint64,uint64)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_setbyte(byte[],uint64,uint64)byte[]'] + }> + & Record<'verify_shl(uint64,uint64)uint64' | 'verify_shl', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_shl(uint64,uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_shl(uint64,uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_shl(uint64,uint64)uint64'] + }> + & Record<'verify_shr(uint64,uint64)uint64' | 'verify_shr', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_shr(uint64,uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_shr(uint64,uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_shr(uint64,uint64)uint64'] + }> + & Record<'verify_sqrt(uint64)uint64' | 'verify_sqrt', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_sqrt(uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_sqrt(uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_sqrt(uint64)uint64'] + }> + & Record<'verify_substring(byte[],uint64,uint64)byte[]' | 'verify_substring', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_substring(byte[],uint64,uint64)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_substring(byte[],uint64,uint64)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_substring(byte[],uint64,uint64)byte[]'] + }> + & Record<'verify_json_ref_string(byte[],byte[])byte[]' | 'verify_json_ref_string', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_json_ref_string(byte[],byte[])byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_json_ref_string(byte[],byte[])byte[]'] + returns: MiscellaneousOpsContractReturns['verify_json_ref_string(byte[],byte[])byte[]'] + }> + & Record<'verify_json_ref_uint64(byte[],byte[])uint64' | 'verify_json_ref_uint64', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_json_ref_uint64(byte[],byte[])uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_json_ref_uint64(byte[],byte[])uint64'] + returns: MiscellaneousOpsContractReturns['verify_json_ref_uint64(byte[],byte[])uint64'] + }> + & Record<'verify_json_ref_object(byte[],byte[])byte[]' | 'verify_json_ref_object', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_json_ref_object(byte[],byte[])byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_json_ref_object(byte[],byte[])byte[]'] + returns: MiscellaneousOpsContractReturns['verify_json_ref_object(byte[],byte[])byte[]'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type MiscellaneousOpsContractSignatures = keyof MiscellaneousOpsContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type MiscellaneousOpsContractNonVoidMethodSignatures = keyof MiscellaneousOpsContractTypes['methods'] extends infer T ? T extends keyof MiscellaneousOpsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the MiscellaneousOpsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = MiscellaneousOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the MiscellaneousOpsContract smart contract to the method's return type + */ +export type MethodReturn = MiscellaneousOpsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type MiscellaneousOpsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type MiscellaneousOpsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: MiscellaneousOpsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the MiscellaneousOpsContract smart contract + */ +export abstract class MiscellaneousOpsContractParamsFactory { + /** + * Constructs a no op call for the verify_addw(uint64,uint64)(uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAddw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_addw(uint64,uint64)(uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_base64_decode_standard(byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBase64DecodeStandard(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_base64_decode_standard(byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_base64_decode_url(byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBase64DecodeUrl(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_base64_decode_url(byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bytes_bitlen(byte[],uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesBitlen(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_bitlen(byte[],uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padASize], + } + } + /** + * Constructs a no op call for the verify_uint64_bitlen(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Bitlen(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_bitlen(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bsqrt(byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBsqrt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bsqrt(byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_btoi(byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBtoi(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_btoi(byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bzero(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBzero(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bzero(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_concat(byte[],byte[],uint64,uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyConcat(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_concat(byte[],byte[],uint64,uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.padASize, params.args.padBSize], + } + } + /** + * Constructs a no op call for the verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyDivmodw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d], + } + } + /** + * Constructs a no op call for the verify_divw(uint64,uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyDivw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_divw(uint64,uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_err()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyErr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_err()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the verify_exp(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExp(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_exp(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_expw(uint64,uint64)(uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExpw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_expw(uint64,uint64)(uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_extract(byte[],uint64,uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExtract(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_extract(byte[],uint64,uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_extract_from_2(byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExtractFrom_2(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_extract_from_2(byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_extract_uint16(byte[],uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExtractUint16(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_extract_uint16(byte[],uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_extract_uint32(byte[],uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExtractUint32(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_extract_uint32(byte[],uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_extract_uint64(byte[],uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExtractUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_extract_uint64(byte[],uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_getbit_bytes(byte[],uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetbitBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_getbit_bytes(byte[],uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_getbit_uint64(uint64,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetbitUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_getbit_uint64(uint64,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_getbyte(byte[],uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetbyte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_getbyte(byte[],uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_itob(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyItob(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_itob(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_mulw(uint64,uint64)(uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyMulw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_mulw(uint64,uint64)(uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_replace(byte[],uint64,byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyReplace(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_replace(byte[],uint64,byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_select_bytes(byte[],byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySelectBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_select_bytes(byte[],byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_select_uint64(uint64,uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySelectUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_select_uint64(uint64,uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_setbit_bytes(byte[],uint64,bool)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySetbitBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_setbit_bytes(byte[],uint64,bool)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_setbit_uint64(uint64,uint64,bool)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySetbitUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_setbit_uint64(uint64,uint64,bool)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_setbyte(byte[],uint64,uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySetbyte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_setbyte(byte[],uint64,uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_shl(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyShl(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_shl(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_shr(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyShr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_shr(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_sqrt(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySqrt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_sqrt(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_substring(byte[],uint64,uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySubstring(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_substring(byte[],uint64,uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_json_ref_string(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyJsonRefString(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_json_ref_string(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_json_ref_uint64(byte[],byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyJsonRefUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_json_ref_uint64(byte[],byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_json_ref_object(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyJsonRefObject(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_json_ref_object(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } +} + +/** + * A factory to create and deploy one or more instance of the MiscellaneousOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class MiscellaneousOpsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `MiscellaneousOpsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new MiscellaneousOpsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new MiscellaneousOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the MiscellaneousOpsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: MiscellaneousOpsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new MiscellaneousOpsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the MiscellaneousOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the MiscellaneousOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the MiscellaneousOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new MiscellaneousOpsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the MiscellaneousOpsContract smart contract + */ +export class MiscellaneousOpsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `MiscellaneousOpsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the MiscellaneousOpsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `MiscellaneousOpsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `MiscellaneousOpsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new MiscellaneousOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `MiscellaneousOpsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new MiscellaneousOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the MiscellaneousOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_addw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAddw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyAddw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_standard(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBase64DecodeStandard: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeStandard(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_url(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBase64DecodeUrl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeUrl(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bytes_bitlen(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesBitlen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBytesBitlen(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_uint64_bitlen(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Bitlen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyUint64Bitlen(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bsqrt(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBsqrt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBsqrt(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_btoi(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBtoi: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBtoi(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bzero(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBzero: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBzero(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_concat(byte[],byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyConcat: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyConcat(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyDivmodw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyDivmodw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divw(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyDivw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyDivw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_err()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyErr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyErr(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_exp(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExp: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExp(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_expw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExpw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExpw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExtract: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtract(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_from_2(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExtractFrom_2: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtractFrom_2(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint16(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExtractUint16: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint16(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint32(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExtractUint32: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint32(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint64(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExtractUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_bytes(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetbitBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyGetbitBytes(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_uint64(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetbitUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyGetbitUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbyte(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetbyte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyGetbyte(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_itob(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyItob: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyItob(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_mulw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyMulw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyMulw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_replace(byte[],uint64,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyReplace: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyReplace(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_bytes(byte[],byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySelectBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySelectBytes(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_uint64(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySelectUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySelectUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_bytes(byte[],uint64,bool)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySetbitBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySetbitBytes(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_uint64(uint64,uint64,bool)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySetbitUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySetbitUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbyte(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySetbyte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySetbyte(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shl(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyShl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyShl(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shr(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyShr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyShr(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_sqrt(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySqrt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySqrt(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_substring(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySubstring: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySubstring(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_string(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyJsonRefString: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefString(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_uint64(byte[],byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyJsonRefUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_object(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyJsonRefObject: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefObject(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the MiscellaneousOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_addw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAddw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyAddw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_standard(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBase64DecodeStandard: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeStandard(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_url(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBase64DecodeUrl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeUrl(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bytes_bitlen(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesBitlen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBytesBitlen(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_uint64_bitlen(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Bitlen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyUint64Bitlen(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bsqrt(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBsqrt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBsqrt(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_btoi(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBtoi: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBtoi(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bzero(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBzero: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBzero(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_concat(byte[],byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyConcat: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyConcat(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyDivmodw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyDivmodw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divw(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyDivw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyDivw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_err()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyErr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyErr(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_exp(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExp: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExp(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_expw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExpw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExpw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExtract: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtract(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_from_2(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExtractFrom_2: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtractFrom_2(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint16(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExtractUint16: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint16(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint32(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExtractUint32: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint32(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint64(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExtractUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_bytes(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetbitBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyGetbitBytes(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_uint64(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetbitUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyGetbitUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbyte(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetbyte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyGetbyte(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_itob(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyItob: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyItob(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_mulw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyMulw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyMulw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_replace(byte[],uint64,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyReplace: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyReplace(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_bytes(byte[],byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySelectBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySelectBytes(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_uint64(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySelectUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySelectUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_bytes(byte[],uint64,bool)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySetbitBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySetbitBytes(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_uint64(uint64,uint64,bool)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySetbitUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySetbitUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbyte(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySetbyte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySetbyte(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shl(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyShl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyShl(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shr(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyShr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyShr(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_sqrt(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySqrt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySqrt(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_substring(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySubstring: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySubstring(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_string(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyJsonRefString: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefString(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_uint64(byte[],byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyJsonRefUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_object(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyJsonRefObject: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefObject(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the MiscellaneousOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_addw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAddw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyAddw(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_addw(uint64,uint64)(uint64,uint64)'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_standard(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBase64DecodeStandard: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeStandard(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_base64_decode_standard(byte[])byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_url(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBase64DecodeUrl: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeUrl(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_base64_decode_url(byte[])byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bytes_bitlen(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesBitlen: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBytesBitlen(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_bytes_bitlen(byte[],uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_uint64_bitlen(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Bitlen: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyUint64Bitlen(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_uint64_bitlen(uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bsqrt(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBsqrt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBsqrt(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_bsqrt(byte[])byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_btoi(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBtoi: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBtoi(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_btoi(byte[])uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bzero(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBzero: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBzero(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_bzero(uint64)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_concat(byte[],byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyConcat: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyConcat(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_concat(byte[],byte[],uint64,uint64)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyDivmodw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyDivmodw(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divw(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyDivw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyDivw(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_divw(uint64,uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_err()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyErr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyErr(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_err()void'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_exp(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExp: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExp(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_exp(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_expw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExpw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExpw(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_expw(uint64,uint64)(uint64,uint64)'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExtract: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtract(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract(byte[],uint64,uint64)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_from_2(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExtractFrom_2: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtractFrom_2(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract_from_2(byte[])byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint16(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExtractUint16: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint16(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract_uint16(byte[],uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint32(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExtractUint32: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint32(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract_uint32(byte[],uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint64(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExtractUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint64(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract_uint64(byte[],uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_bytes(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetbitBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyGetbitBytes(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_getbit_bytes(byte[],uint64)bool'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_uint64(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetbitUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyGetbitUint64(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_getbit_uint64(uint64,uint64)bool'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbyte(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetbyte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyGetbyte(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_getbyte(byte[],uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_itob(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyItob: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyItob(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_itob(uint64)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_mulw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyMulw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyMulw(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_mulw(uint64,uint64)(uint64,uint64)'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_replace(byte[],uint64,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyReplace: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyReplace(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_replace(byte[],uint64,byte[])byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_bytes(byte[],byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySelectBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySelectBytes(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_select_bytes(byte[],byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_uint64(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySelectUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySelectUint64(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_select_uint64(uint64,uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_bytes(byte[],uint64,bool)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySetbitBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySetbitBytes(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_setbit_bytes(byte[],uint64,bool)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_uint64(uint64,uint64,bool)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySetbitUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySetbitUint64(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_setbit_uint64(uint64,uint64,bool)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbyte(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySetbyte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySetbyte(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_setbyte(byte[],uint64,uint64)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shl(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyShl: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyShl(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_shl(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shr(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyShr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyShr(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_shr(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_sqrt(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySqrt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySqrt(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_sqrt(uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_substring(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySubstring: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySubstring(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_substring(byte[],uint64,uint64)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_string(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyJsonRefString: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefString(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_json_ref_string(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_uint64(byte[],byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyJsonRefUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefUint64(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_json_ref_uint64(byte[],byte[])uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_object(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyJsonRefObject: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefObject(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_json_ref_object(byte[],byte[])byte[]'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new MiscellaneousOpsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current MiscellaneousOpsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): MiscellaneousOpsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_addw(uint64,uint64)(uint64,uint64) method call against the MiscellaneousOpsContract contract + */ + verifyAddw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAddw(params))) + return this + }, + /** + * Add a verify_base64_decode_standard(byte[])byte[] method call against the MiscellaneousOpsContract contract + */ + verifyBase64DecodeStandard(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBase64DecodeStandard(params))) + return this + }, + /** + * Add a verify_base64_decode_url(byte[])byte[] method call against the MiscellaneousOpsContract contract + */ + verifyBase64DecodeUrl(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBase64DecodeUrl(params))) + return this + }, + /** + * Add a verify_bytes_bitlen(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyBytesBitlen(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesBitlen(params))) + return this + }, + /** + * Add a verify_uint64_bitlen(uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyUint64Bitlen(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Bitlen(params))) + return this + }, + /** + * Add a verify_bsqrt(byte[])byte[] method call against the MiscellaneousOpsContract contract + */ + verifyBsqrt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBsqrt(params))) + return this + }, + /** + * Add a verify_btoi(byte[])uint64 method call against the MiscellaneousOpsContract contract + */ + verifyBtoi(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBtoi(params))) + return this + }, + /** + * Add a verify_bzero(uint64)byte[] method call against the MiscellaneousOpsContract contract + */ + verifyBzero(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBzero(params))) + return this + }, + /** + * Add a verify_concat(byte[],byte[],uint64,uint64)byte[] method call against the MiscellaneousOpsContract contract + */ + verifyConcat(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyConcat(params))) + return this + }, + /** + * Add a verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64) method call against the MiscellaneousOpsContract contract + */ + verifyDivmodw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyDivmodw(params))) + return this + }, + /** + * Add a verify_divw(uint64,uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyDivw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyDivw(params))) + return this + }, + /** + * Add a verify_err()void method call against the MiscellaneousOpsContract contract + */ + verifyErr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyErr(params))) + return this + }, + /** + * Add a verify_exp(uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyExp(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExp(params))) + return this + }, + /** + * Add a verify_expw(uint64,uint64)(uint64,uint64) method call against the MiscellaneousOpsContract contract + */ + verifyExpw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExpw(params))) + return this + }, + /** + * Add a verify_extract(byte[],uint64,uint64)byte[] method call against the MiscellaneousOpsContract contract + */ + verifyExtract(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtract(params))) + return this + }, + /** + * Add a verify_extract_from_2(byte[])byte[] method call against the MiscellaneousOpsContract contract + */ + verifyExtractFrom_2(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtractFrom_2(params))) + return this + }, + /** + * Add a verify_extract_uint16(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyExtractUint16(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtractUint16(params))) + return this + }, + /** + * Add a verify_extract_uint32(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyExtractUint32(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtractUint32(params))) + return this + }, + /** + * Add a verify_extract_uint64(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyExtractUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtractUint64(params))) + return this + }, + /** + * Add a verify_getbit_bytes(byte[],uint64)bool method call against the MiscellaneousOpsContract contract + */ + verifyGetbitBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetbitBytes(params))) + return this + }, + /** + * Add a verify_getbit_uint64(uint64,uint64)bool method call against the MiscellaneousOpsContract contract + */ + verifyGetbitUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetbitUint64(params))) + return this + }, + /** + * Add a verify_getbyte(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyGetbyte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetbyte(params))) + return this + }, + /** + * Add a verify_itob(uint64)byte[] method call against the MiscellaneousOpsContract contract + */ + verifyItob(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyItob(params))) + return this + }, + /** + * Add a verify_mulw(uint64,uint64)(uint64,uint64) method call against the MiscellaneousOpsContract contract + */ + verifyMulw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyMulw(params))) + return this + }, + /** + * Add a verify_replace(byte[],uint64,byte[])byte[] method call against the MiscellaneousOpsContract contract + */ + verifyReplace(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyReplace(params))) + return this + }, + /** + * Add a verify_select_bytes(byte[],byte[],uint64)byte[] method call against the MiscellaneousOpsContract contract + */ + verifySelectBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySelectBytes(params))) + return this + }, + /** + * Add a verify_select_uint64(uint64,uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifySelectUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySelectUint64(params))) + return this + }, + /** + * Add a verify_setbit_bytes(byte[],uint64,bool)byte[] method call against the MiscellaneousOpsContract contract + */ + verifySetbitBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySetbitBytes(params))) + return this + }, + /** + * Add a verify_setbit_uint64(uint64,uint64,bool)uint64 method call against the MiscellaneousOpsContract contract + */ + verifySetbitUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySetbitUint64(params))) + return this + }, + /** + * Add a verify_setbyte(byte[],uint64,uint64)byte[] method call against the MiscellaneousOpsContract contract + */ + verifySetbyte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySetbyte(params))) + return this + }, + /** + * Add a verify_shl(uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyShl(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyShl(params))) + return this + }, + /** + * Add a verify_shr(uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyShr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyShr(params))) + return this + }, + /** + * Add a verify_sqrt(uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifySqrt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySqrt(params))) + return this + }, + /** + * Add a verify_substring(byte[],uint64,uint64)byte[] method call against the MiscellaneousOpsContract contract + */ + verifySubstring(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySubstring(params))) + return this + }, + /** + * Add a verify_json_ref_string(byte[],byte[])byte[] method call against the MiscellaneousOpsContract contract + */ + verifyJsonRefString(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyJsonRefString(params))) + return this + }, + /** + * Add a verify_json_ref_uint64(byte[],byte[])uint64 method call against the MiscellaneousOpsContract contract + */ + verifyJsonRefUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyJsonRefUint64(params))) + return this + }, + /** + * Add a verify_json_ref_object(byte[],byte[])byte[] method call against the MiscellaneousOpsContract contract + */ + verifyJsonRefObject(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyJsonRefObject(params))) + return this + }, + /** + * Add a clear state call to the MiscellaneousOpsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as MiscellaneousOpsContractComposer + } +} +export type MiscellaneousOpsContractComposer = { + /** + * Calls the verify_addw(uint64,uint64)(uint64,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAddw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_addw(uint64,uint64)(uint64,uint64)'] | undefined]> + + /** + * Calls the verify_base64_decode_standard(byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBase64DecodeStandard(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_base64_decode_standard(byte[])byte[]'] | undefined]> + + /** + * Calls the verify_base64_decode_url(byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBase64DecodeUrl(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_base64_decode_url(byte[])byte[]'] | undefined]> + + /** + * Calls the verify_bytes_bitlen(byte[],uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesBitlen(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_bytes_bitlen(byte[],uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_bitlen(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Bitlen(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_uint64_bitlen(uint64)uint64'] | undefined]> + + /** + * Calls the verify_bsqrt(byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBsqrt(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_bsqrt(byte[])byte[]'] | undefined]> + + /** + * Calls the verify_btoi(byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBtoi(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_btoi(byte[])uint64'] | undefined]> + + /** + * Calls the verify_bzero(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBzero(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_bzero(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_concat(byte[],byte[],uint64,uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyConcat(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_concat(byte[],byte[],uint64,uint64)byte[]'] | undefined]> + + /** + * Calls the verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyDivmodw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'] | undefined]> + + /** + * Calls the verify_divw(uint64,uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyDivw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_divw(uint64,uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_err()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyErr(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_err()void'] | undefined]> + + /** + * Calls the verify_exp(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExp(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_exp(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_expw(uint64,uint64)(uint64,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExpw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_expw(uint64,uint64)(uint64,uint64)'] | undefined]> + + /** + * Calls the verify_extract(byte[],uint64,uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExtract(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract(byte[],uint64,uint64)byte[]'] | undefined]> + + /** + * Calls the verify_extract_from_2(byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExtractFrom_2(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract_from_2(byte[])byte[]'] | undefined]> + + /** + * Calls the verify_extract_uint16(byte[],uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExtractUint16(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract_uint16(byte[],uint64)uint64'] | undefined]> + + /** + * Calls the verify_extract_uint32(byte[],uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExtractUint32(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract_uint32(byte[],uint64)uint64'] | undefined]> + + /** + * Calls the verify_extract_uint64(byte[],uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExtractUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract_uint64(byte[],uint64)uint64'] | undefined]> + + /** + * Calls the verify_getbit_bytes(byte[],uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetbitBytes(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_getbit_bytes(byte[],uint64)bool'] | undefined]> + + /** + * Calls the verify_getbit_uint64(uint64,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetbitUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_getbit_uint64(uint64,uint64)bool'] | undefined]> + + /** + * Calls the verify_getbyte(byte[],uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetbyte(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_getbyte(byte[],uint64)uint64'] | undefined]> + + /** + * Calls the verify_itob(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyItob(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_itob(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_mulw(uint64,uint64)(uint64,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyMulw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_mulw(uint64,uint64)(uint64,uint64)'] | undefined]> + + /** + * Calls the verify_replace(byte[],uint64,byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyReplace(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_replace(byte[],uint64,byte[])byte[]'] | undefined]> + + /** + * Calls the verify_select_bytes(byte[],byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySelectBytes(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_select_bytes(byte[],byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_select_uint64(uint64,uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySelectUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_select_uint64(uint64,uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_setbit_bytes(byte[],uint64,bool)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySetbitBytes(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_setbit_bytes(byte[],uint64,bool)byte[]'] | undefined]> + + /** + * Calls the verify_setbit_uint64(uint64,uint64,bool)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySetbitUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_setbit_uint64(uint64,uint64,bool)uint64'] | undefined]> + + /** + * Calls the verify_setbyte(byte[],uint64,uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySetbyte(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_setbyte(byte[],uint64,uint64)byte[]'] | undefined]> + + /** + * Calls the verify_shl(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyShl(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_shl(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_shr(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyShr(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_shr(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_sqrt(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySqrt(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_sqrt(uint64)uint64'] | undefined]> + + /** + * Calls the verify_substring(byte[],uint64,uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySubstring(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_substring(byte[],uint64,uint64)byte[]'] | undefined]> + + /** + * Calls the verify_json_ref_string(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyJsonRefString(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_json_ref_string(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_json_ref_uint64(byte[],byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyJsonRefUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_json_ref_uint64(byte[],byte[])uint64'] | undefined]> + + /** + * Calls the verify_json_ref_object(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyJsonRefObject(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_json_ref_object(byte[],byte[])byte[]'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the MiscellaneousOpsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): MiscellaneousOpsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): MiscellaneousOpsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type MiscellaneousOpsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/PrimitiveOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/PrimitiveOpsContract.ts new file mode 100644 index 0000000..5ff671b --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/PrimitiveOpsContract.ts @@ -0,0 +1,4701 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"PrimitiveOpsContract","structs":{},"methods":[{"name":"verify_uint64_init","args":[{"type":"byte[]","name":"raw_value"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_add","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_sub","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_mul","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_div","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_mod","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_and","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_or","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_xor","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_not","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_lshift","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_rshift","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_pow","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_eq","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_ne","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_lt","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_le","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_gt","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_ge","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_init","args":[{"type":"uint64","name":"raw_value"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_add","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"uint64","name":"pad_a_size"},{"type":"uint64","name":"pad_b_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_and","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_or","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_xor","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_not","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_add","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_add_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_sub","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_sub_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_mul","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_mul_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_div","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_div_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_mod","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_mod_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_and","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_and_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_or","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_or_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_xor","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_xor_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_eq_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_ne_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_lt_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_le_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_gt_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_ge_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_init","args":[{"type":"string","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_startswith","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_endswith","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_join","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_log","args":[{"type":"string","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"},{"type":"bool","name":"e"},{"type":"string","name":"f"},{"type":"uint64","name":"g"},{"type":"uint256","name":"h"},{"type":"ufixed32x8","name":"i"},{"type":"ufixed256x16","name":"j"},{"type":"byte[]","name":"k"},{"type":"byte[]","name":"m"},{"type":"byte[]","name":"n"},{"type":"byte[5]","name":"o"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDAwICItIiAweDE1MWY3Yzc1MDAyMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANjcKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDcyNWM2OTJiIDB4MTczMTQ1NTkgMHg1M2YzNDg5MyAweDg4YzhiMjY5IDB4YTQ2NGI3YWIgMHg5YzhiMTFiOCAweDZmNDA2NTRlIDB4ZWM5YTI5NzQgMHhjNzkzNzA4ZiAweDdkZGI3NDk5IDB4YTIxYzQ0M2QgMHg2ZTdmYjIxMiAweGIwMDdmY2IwIDB4MmViYzIwZDQgMHhiMDk1NGI2NiAweGRkMTQwYWVmIDB4YWNlNDc0ZGEgMHhiYTY5NDk5MCAweDZkYjU4MWMwIDB4OTFjOGRiODkgMHhkYmU3NzE1OCAweDlhMGYyMmUxIDB4NjQwMzNkMzcgMHgyYTcyMzdjNSAweGUzYTk0NDU4IDB4NDJmODdmN2QgMHgyYjU1NDJhNCAweDliZTJmYmU5IDB4MWNkOTI1MTUgMHg2NGUxNzA1YyAweGYxMjcxYzUwIDB4MmFiNjNiNzAgMHg4MzRiYjdkMiAweDUzMTYyMGQ3IDB4M2ZiOWU3NjkgMHhmYThkYjBiYyAweGE3MmVhNDg1IDB4YjdiMGJhMTkgMHg3NDQ2MGM0MiAweGFiMzIwNzM4IDB4NTJhZDQ2NTQgMHgxMDE1NjM5OSAweDBmMDc1OTU3IDB4YmQ4NDNkZmYgMHhiMzc3ZDM4MSAweDg5NzY3MjY1IDB4NDU2YjRiMjMgMHgzM2QxYjg4YyAweDZiZjk3M2VhIDB4NjdjZDZiYjIgMHgzZjU4ODA1YSAweDFlMTMwMDM5IDB4NTA5ZGM5MWQgMHhhNTY0YTIwMiAweDIzNjUwNzYzIDB4ZjhjOGY4ZDUgMHgyM2ZhZjdhNCAweDdkMGFmZTE1IDB4NDg1ODFhZGYgMHgzZGFlZjljZCAvLyBtZXRob2QgInZlcmlmeV91aW50NjRfaW5pdChieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2FkZCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9zdWIodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbXVsKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2Rpdih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9tb2QodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfYW5kKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X29yKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X3hvcih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9ub3QodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9sc2hpZnQodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfcnNoaWZ0KHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X3Bvdyh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9lcSh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbmUodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2x0KHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9sZSh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfZ3QodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2dlKHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2luaXQodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2FkZChieXRlW10sYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfYW5kKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfb3IoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc194b3IoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc19ub3QoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2FkZChieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfYWRkX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfc3ViKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9zdWJfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9tdWwoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X211bF91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2RpdihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZGl2X3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbW9kKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9tb2RfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9hbmQoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X29yKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9vcl91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X3hvcihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfeG9yX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9lcV91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9uZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2x0KGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9sZV91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9ndChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2dlKGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19pbml0KHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aChzdHJpbmcsc3RyaW5nKWJvb2wiLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfZW5kc3dpdGgoc3RyaW5nLHN0cmluZylib29sIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2pvaW4oc3RyaW5nLHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9sb2coc3RyaW5nLHVpbnQ2NCxieXRlW10sYnl0ZVtdLGJvb2wsc3RyaW5nLHVpbnQ2NCx1aW50MjU2LHVmaXhlZDMyeDgsdWZpeGVkMjU2eDE2LGJ5dGVbXSxieXRlW10sYnl0ZVtdLGJ5dGVbNV0pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV91aW50NjRfaW5pdCB2ZXJpZnlfdWludDY0X2FkZCB2ZXJpZnlfdWludDY0X3N1YiB2ZXJpZnlfdWludDY0X211bCB2ZXJpZnlfdWludDY0X2RpdiB2ZXJpZnlfdWludDY0X21vZCB2ZXJpZnlfdWludDY0X2FuZCB2ZXJpZnlfdWludDY0X29yIHZlcmlmeV91aW50NjRfeG9yIHZlcmlmeV91aW50NjRfbm90IHZlcmlmeV91aW50NjRfbHNoaWZ0IHZlcmlmeV91aW50NjRfcnNoaWZ0IHZlcmlmeV91aW50NjRfcG93IHZlcmlmeV91aW50NjRfZXEgdmVyaWZ5X3VpbnQ2NF9uZSB2ZXJpZnlfdWludDY0X2x0IHZlcmlmeV91aW50NjRfbGUgdmVyaWZ5X3VpbnQ2NF9ndCB2ZXJpZnlfdWludDY0X2dlIHZlcmlmeV9ieXRlc19pbml0IHZlcmlmeV9ieXRlc19hZGQgdmVyaWZ5X2J5dGVzX2VxIHZlcmlmeV9ieXRlc19uZSB2ZXJpZnlfYnl0ZXNfYW5kIHZlcmlmeV9ieXRlc19vciB2ZXJpZnlfYnl0ZXNfeG9yIHZlcmlmeV9ieXRlc19ub3QgdmVyaWZ5X2JpZ3VpbnRfYWRkIHZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfc3ViIHZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbXVsIHZlcmlmeV9iaWd1aW50X211bF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfZGl2IHZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbW9kIHZlcmlmeV9iaWd1aW50X21vZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfYW5kIHZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfb3IgdmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0IHZlcmlmeV9iaWd1aW50X3hvciB2ZXJpZnlfYmlndWludF94b3JfdWludDY0IHZlcmlmeV9iaWd1aW50X2VxIHZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NCB2ZXJpZnlfYmlndWludF9uZSB2ZXJpZnlfYmlndWludF9uZV91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbHQgdmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0IHZlcmlmeV9iaWd1aW50X2xlIHZlcmlmeV9iaWd1aW50X2xlX3VpbnQ2NCB2ZXJpZnlfYmlndWludF9ndCB2ZXJpZnlfYmlndWludF9ndF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfZ2UgdmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0IHZlcmlmeV9zdHJpbmdfaW5pdCB2ZXJpZnlfc3RyaW5nX3N0YXJ0c3dpdGggdmVyaWZ5X3N0cmluZ19lbmRzd2l0aCB2ZXJpZnlfc3RyaW5nX2pvaW4gdmVyaWZ5X2xvZwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDY3OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjkKICAgIC8vIHJlc3VsdCA9IG9wLmJ0b2kocmF3X3ZhbHVlKQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9hZGRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0CiAgICAvLyByZXN1bHQgPSBhICsgYgogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfc3ViW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9zdWI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOQogICAgLy8gcmVzdWx0ID0gYSAtIGIKICAgIC0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X211bFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbXVsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQKICAgIC8vIHJlc3VsdCA9IGEgKiBiCiAgICAqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9kaXZbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2RpdjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI5CiAgICAvLyByZXN1bHQgPSBhIC8vIGIKICAgIC8KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X21vZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbW9kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzQKICAgIC8vIHJlc3VsdCA9IGEgJSBiCiAgICAlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9hbmRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2FuZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM5CiAgICAvLyByZXN1bHQgPSBhICYgYgogICAgJgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfb3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X29yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDQKICAgIC8vIHJlc3VsdCA9IGEgfCBiCiAgICB8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF94b3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X3hvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyByZXN1bHQgPSBhIF4gYgogICAgXgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbm90W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9ub3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NAogICAgLy8gcmVzdWx0ID0gfmEKICAgIH4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2xzaGlmdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbHNoaWZ0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIHJlc3VsdCA9IGEgPDwgYgogICAgc2hsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9yc2hpZnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X3JzaGlmdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY0CiAgICAvLyByZXN1bHQgPSBhID4+IGIKICAgIHNocgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfcG93W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9wb3c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2OQogICAgLy8gcmVzdWx0ID0gYSoqYgogICAgZXhwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfZXE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3NAogICAgLy8gcmVzdWx0ID0gYSA9PSBiCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9uZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyByZXN1bHQgPSBhICE9IGIKICAgICE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODQKICAgIC8vIHJlc3VsdCA9IGEgPCBiCiAgICA8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2xlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODkKICAgIC8vIHJlc3VsdCA9IGEgPD0gYgogICAgPD0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9ndFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NAogICAgLy8gcmVzdWx0ID0gYSA+IGIKICAgID4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9nZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5OQogICAgLy8gcmVzdWx0ID0gYSA+PSBiCiAgICA+PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ieXRlc19pbml0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmVzdWx0ID0gb3AuaXRvYihyYXdfdmFsdWUpCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1MDAwOAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19hZGRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfYWRkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTExCiAgICAvLyBhID0gb3AuYnplcm8ocGFkX2Ffc2l6ZSkgKyBhCiAgICBzd2FwCiAgICBiemVybwogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTEyCiAgICAvLyBiID0gb3AuYnplcm8ocGFkX2Jfc2l6ZSkgKyBiCiAgICBzd2FwCiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTEzCiAgICAvLyByZXN1bHQgPSBhICsgYgogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExNAogICAgLy8gcmVzdWx0ID0gb3Auc2hhMjU2KHJlc3VsdCkKICAgIHNoYTI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUwMDIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX2VxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTE5CiAgICAvLyByZXN1bHQgPSBhID09IGIKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfbmVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfbmU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjQKICAgIC8vIHJlc3VsdCA9IGEgIT0gYgogICAgIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19hbmRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfYW5kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTI5CiAgICAvLyByZXN1bHQgPSBhICYgYgogICAgYiYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19vcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ieXRlc19vcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gcmVzdWx0ID0gYSB8IGIKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfeG9yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX3hvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gcmVzdWx0ID0gYSBeIGIKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfbm90W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX25vdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQ0CiAgICAvLyBhID0gb3AuYnplcm8ocGFkX3NpemUpICsgYQogICAgYnplcm8KICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDUKICAgIC8vIHJlc3VsdCA9IH5hCiAgICBifgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDYKICAgIC8vIHJlc3VsdCA9IG9wLnNoYTI1NihyZXN1bHQpCiAgICBzaGEyNTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FkZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICsgYl9iaWd1aW50CiAgICBiKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfYWRkX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1OQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICsgYgogICAgaXRvYgogICAgYisKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3N1Yltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X3N1YjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IC0gYl9iaWd1aW50CiAgICBiLQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfc3ViX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3MgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IC0gYgogICAgaXRvYgogICAgYi0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X211bFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X211bDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3OQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICogYl9iaWd1aW50CiAgICBiKgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbXVsX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X211bF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICogYgogICAgaXRvYgogICAgYioKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2Rpdltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2RpdjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE5MgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IC8vIGJfYmlndWludAogICAgYi8KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9kaXZfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTgKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCAvLyBiCiAgICBpdG9iCiAgICBiLwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbW9kW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbW9kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjA1CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJSBiX2JpZ3VpbnQKICAgIGIlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9tb2RfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbW9kX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjExCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJSBiCiAgICBpdG9iCiAgICBiJQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfYW5kW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfYW5kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjE4CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJiBiX2JpZ3VpbnQKICAgIGImCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9hbmRfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfYW5kX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI0CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJiBiCiAgICBpdG9iCiAgICBiJgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfb3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9vcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzMQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IHwgYl9iaWd1aW50CiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzcKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCB8IGIKICAgIGl0b2IKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF94b3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF94b3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDQKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCBeIGJfYmlndWludAogICAgYl4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3hvcl91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF94b3JfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTAKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCBeIGIKICAgIGl0b2IKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjU3CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPT0gYl9iaWd1aW50CiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjYzCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPT0gYgogICAgaXRvYgogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9uZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcwCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgIT0gYl9iaWd1aW50CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjc2CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgIT0gYgogICAgaXRvYgogICAgYiE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9sdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjgzCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPCBiX2JpZ3VpbnQKICAgIGI8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9sdF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9sdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI4OQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IDwgYgogICAgaXRvYgogICAgYjwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTYKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA8PSBiX2JpZ3VpbnQKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMDIKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA8PSBiCiAgICBpdG9iCiAgICBiPD0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2d0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMDkKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA+IGJfYmlndWludAogICAgYj4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzE1CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPiBiCiAgICBpdG9iCiAgICBiPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9nZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyMgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ID49IGJfYmlndWludAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9nZV91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9nZV91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ID49IGIKICAgIGl0b2IKICAgIGI+PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N0cmluZ19pbml0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzMzCiAgICAvLyByZXN1bHQgPSBTdHJpbmcoIkhlbGxvLCAiKSArIGEKICAgIHB1c2hieXRlcyAiSGVsbG8sICIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzM4CiAgICAvLyByZXN1bHQgPSBhLnN0YXJ0c3dpdGgoYikKICAgIGxlbgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGxlbgogICAgPgogICAgYnogdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoX3Rlcm5hcnlfZmFsc2VAMwogICAgaW50Y18xIC8vIDAKCnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aF90ZXJuYXJ5X21lcmdlQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoX3Rlcm5hcnlfZmFsc2VAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzM4CiAgICAvLyByZXN1bHQgPSBhLnN0YXJ0c3dpdGgoYikKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMAogICAgZGlnIDIKICAgIGV4dHJhY3QzCiAgICBkaWcgMgogICAgPT0KICAgIGIgdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoX3Rlcm5hcnlfbWVyZ2VANAoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19lbmRzd2l0aFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfZW5kc3dpdGg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gcmVzdWx0ID0gYS5lbmRzd2l0aChiKQogICAgbGVuCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID4KICAgIGJ6IHZlcmlmeV9zdHJpbmdfZW5kc3dpdGhfdGVybmFyeV9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMAoKdmVyaWZ5X3N0cmluZ19lbmRzd2l0aF90ZXJuYXJ5X21lcmdlQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKdmVyaWZ5X3N0cmluZ19lbmRzd2l0aF90ZXJuYXJ5X2ZhbHNlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gcmVzdWx0ID0gYS5lbmRzd2l0aChiKQogICAgZHVwCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICAtCiAgICBkaWcgNQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0MwogICAgZGlnIDMKICAgID09CiAgICBiIHZlcmlmeV9zdHJpbmdfZW5kc3dpdGhfdGVybmFyeV9tZXJnZUA0CgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2pvaW5bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2pvaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzQ4CiAgICAvLyByZXN1bHQgPSBTdHJpbmcoIiwgIikuam9pbigoYSwgYikpCiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgIiwgIgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNzMKICAgIC8vIGxvZyhhLCBiLCBjLCBkX2JpZ3VpbnQsIGUsIGYsIGcsIGgsIGksIGosIGFyYzRfaywgYXJjNF9tLCBhcmM0X24sIG8sIHNlcD0iLSIpCiAgICB1bmNvdmVyIDEzCiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmBAQVH3x1AQABLQYVH3x1ACAxG0EBszEZFEQxGESCPARyXGkrBBcxRVkEU/NIkwSIyLJpBKRkt6sEnIsRuARvQGVOBOyaKXQEx5NwjwR923SZBKIcRD0Ebn+yEgSwB/ywBC68INQEsJVLZgTdFArvBKzkdNoEumlJkARttYHABJHI24kE2+dxWASaDyLhBGQDPTcEKnI3xQTjqURYBEL4f30EK1VCpASb4vvpBBzZJRUEZOFwXATxJxxQBCq2O3AEg0u30gRTFiDXBD+552kE+o2wvASnLqSFBLewuhkEdEYMQgSrMgc4BFKtRlQEEBVjmQQPB1lXBL2EPf8Es3fTgQSJdnJlBEVrSyMEM9G4jARr+XPqBGfNa7IEP1iAWgQeEwA5BFCdyR0EpWSiAgQjZQdjBPjI+NUEI/r3pAR9Cv4VBEhYGt8EPa75zTYaAI48AAkAFwAnADcARwBXAGcAdwCHAJcAowCzAMMA0wDnAPsBDwEjATcBSwFdAYMBmwGzAc4B6QIEAhkCNAJOAmkCgwKeArgC0wLtAwgDIgM9A1cDcgOMA6cDwQPZA/AECAQfBDcETgRmBH0ElQSsBMQE2wT6BSsFZgWIADEZFDEYFBBDNhoBVwIAFxYoTFCwIkM2GgEXNhoCFwgWKExQsCJDNhoBFzYaAhcJFihMULAiQzYaARc2GgIXCxYoTFCwIkM2GgEXNhoCFwoWKExQsCJDNhoBFzYaAhcYFihMULAiQzYaARc2GgIXGhYoTFCwIkM2GgEXNhoCFxkWKExQsCJDNhoBFzYaAhcbFihMULAiQzYaARccFihMULAiQzYaARc2GgIXkBYoTFCwIkM2GgEXNhoCF5EWKExQsCJDNhoBFzYaAheUFihMULAiQzYaARc2GgIXEikjTwJUKExQsCJDNhoBFzYaAhcTKSNPAlQoTFCwIkM2GgEXNhoCFwwpI08CVChMULAiQzYaARc2GgIXDikjTwJUKExQsCJDNhoBFzYaAhcNKSNPAlQoTFCwIkM2GgEXNhoCFw8pI08CVChMULAiQzYaARcWgAYVH3x1AAhMULAiQzYaAVcCADYaAlcCADYaAxc2GgQXTK9PA1BMr08CUFABK0xQsCJDNhoBVwIANhoCVwIAEikjTwJUKExQsCJDNhoBVwIANhoCVwIAEykjTwJUKExQsCJDNhoBVwIANhoCVwIArEkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAq0kVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIArUkVFlcGAkxQKExQsCJDNhoBVwIANhoCF69MUK4BK0xQsCJDNhoBVwIANhoCVwIAoEkVFlcGAkxQKExQsCJDNhoBVwIANhoCFxagSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgChSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFqFJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKNJFRZXBgJMUChMULAiQzYaAVcCADYaAhcWo0kVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAokkVFlcGAkxQKExQsCJDNhoBVwIANhoCFxaiSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCqSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFqpJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKxJFRZXBgJMUChMULAiQzYaAVcCADYaAhcWrEkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAq0kVFlcGAkxQKExQsCJDNhoBVwIANhoCFxarSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCtSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFq1JFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKgpI08CVChMULAiQzYaAVcCADYaAhcWqCkjTwJUKExQsCJDNhoBVwIANhoCVwIAqSkjTwJUKExQsCJDNhoBVwIANhoCFxapKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgCkKSNPAlQoTFCwIkM2GgFXAgA2GgIXFqQpI08CVChMULAiQzYaAVcCADYaAlcCAKYpI08CVChMULAiQzYaAVcCADYaAhcWpikjTwJUKExQsCJDNhoBVwIANhoCVwIApSkjTwJUKExQsCJDNhoBVwIANhoCFxalKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgCnKSNPAlQoTFCwIkM2GgFXAgA2GgIXFqcpI08CVChMULAiQzYaAVcCAIAHSGVsbG8sIExQSRUWVwYCTFAoTFCwIkM2GgFXAgBJNhoCVwIASU4CFUlPAhUNQQAMIykjTwJUKExQsCJDSwIjSwJYSwISQv/pNhoBVwIASTYaAlcCAElOAhVJTwIVSU4CDUEADCMpI08CVChMULAiQ0lLAklOAglLBUxPAlhLAxJC/+I2GgFXAgA2GgJXAgBMgAIsIFBMUEkVFlcGAkxQKExQsCJDNhoBVwIANhoCFzYaA1cCADYaBFcCADYaBTYaBjYaBzYaCDYaCTYaCjYaC1cCADYaDFcCADYaDVcCADYaDk8NKlBPDRZQKlBPDFAqUE8LUCpQTwpQKlBPCVAqUE8IUCpQTwdQKlBPBlAqUE8FUCpQTwRQKlBPA1AqUE8CUCpQTFCwIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the PrimitiveOpsContract contract + */ +export type PrimitiveOpsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_uint64_init(byte[])uint64': { + rawValue: Uint8Array + } + 'verify_uint64_add(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_sub(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_mul(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_div(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_mod(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_and(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_or(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_xor(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_not(uint64)uint64': { + a: bigint | number + } + 'verify_uint64_lshift(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_rshift(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_pow(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_eq(uint64,uint64)bool': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_ne(uint64,uint64)bool': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_lt(uint64,uint64)bool': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_le(uint64,uint64)bool': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_gt(uint64,uint64)bool': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_ge(uint64,uint64)bool': { + a: bigint | number + b: bigint | number + } + 'verify_bytes_init(uint64)byte[]': { + rawValue: bigint | number + } + 'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]': { + a: Uint8Array + b: Uint8Array + padASize: bigint | number + padBSize: bigint | number + } + 'verify_bytes_eq(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_bytes_ne(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_bytes_and(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_bytes_or(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_bytes_xor(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_bytes_not(byte[],uint64)byte[]': { + a: Uint8Array + padSize: bigint | number + } + 'verify_biguint_add(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_add_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_sub(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_sub_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_mul(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_mul_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_div(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_div_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_mod(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_mod_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_and(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_and_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_or(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_or_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_xor(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_xor_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_eq(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_eq_uint64(byte[],uint64)bool': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_ne(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_ne_uint64(byte[],uint64)bool': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_lt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_lt_uint64(byte[],uint64)bool': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_le(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_le_uint64(byte[],uint64)bool': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_gt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_gt_uint64(byte[],uint64)bool': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_ge(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_ge_uint64(byte[],uint64)bool': { + a: Uint8Array + b: bigint | number + } + 'verify_string_init(string)string': { + a: string + } + 'verify_string_startswith(string,string)bool': { + a: string + b: string + } + 'verify_string_endswith(string,string)bool': { + a: string + b: string + } + 'verify_string_join(string,string)string': { + a: string + b: string + } + 'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void': { + a: string + b: bigint | number + c: Uint8Array + d: Uint8Array + e: boolean + f: string + g: bigint | number + h: bigint | number + i: number + j: number + k: Uint8Array + m: Uint8Array + n: Uint8Array + o: Uint8Array + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_uint64_init(byte[])uint64': [rawValue: Uint8Array] + 'verify_uint64_add(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_sub(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_mul(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_div(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_mod(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_and(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_or(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_xor(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_not(uint64)uint64': [a: bigint | number] + 'verify_uint64_lshift(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_rshift(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_pow(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_eq(uint64,uint64)bool': [a: bigint | number, b: bigint | number] + 'verify_uint64_ne(uint64,uint64)bool': [a: bigint | number, b: bigint | number] + 'verify_uint64_lt(uint64,uint64)bool': [a: bigint | number, b: bigint | number] + 'verify_uint64_le(uint64,uint64)bool': [a: bigint | number, b: bigint | number] + 'verify_uint64_gt(uint64,uint64)bool': [a: bigint | number, b: bigint | number] + 'verify_uint64_ge(uint64,uint64)bool': [a: bigint | number, b: bigint | number] + 'verify_bytes_init(uint64)byte[]': [rawValue: bigint | number] + 'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]': [a: Uint8Array, b: Uint8Array, padASize: bigint | number, padBSize: bigint | number] + 'verify_bytes_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_bytes_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_bytes_and(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_bytes_or(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_bytes_xor(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_bytes_not(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] + 'verify_biguint_add(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_add_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_sub(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_sub_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_mul(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_mul_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_div(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_div_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_mod(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_mod_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_and(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_and_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_or(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_or_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_xor(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_xor_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_eq_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] + 'verify_biguint_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_ne_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] + 'verify_biguint_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_lt_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] + 'verify_biguint_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_le_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] + 'verify_biguint_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_gt_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] + 'verify_biguint_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_ge_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] + 'verify_string_init(string)string': [a: string] + 'verify_string_startswith(string,string)bool': [a: string, b: string] + 'verify_string_endswith(string,string)bool': [a: string, b: string] + 'verify_string_join(string,string)string': [a: string, b: string] + 'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void': [a: string, b: bigint | number, c: Uint8Array, d: Uint8Array, e: boolean, f: string, g: bigint | number, h: bigint | number, i: number, j: number, k: Uint8Array, m: Uint8Array, n: Uint8Array, o: Uint8Array] + } +} + +/** + * The return type for each method + */ +export type PrimitiveOpsContractReturns = { + 'verify_uint64_init(byte[])uint64': bigint + 'verify_uint64_add(uint64,uint64)uint64': bigint + 'verify_uint64_sub(uint64,uint64)uint64': bigint + 'verify_uint64_mul(uint64,uint64)uint64': bigint + 'verify_uint64_div(uint64,uint64)uint64': bigint + 'verify_uint64_mod(uint64,uint64)uint64': bigint + 'verify_uint64_and(uint64,uint64)uint64': bigint + 'verify_uint64_or(uint64,uint64)uint64': bigint + 'verify_uint64_xor(uint64,uint64)uint64': bigint + 'verify_uint64_not(uint64)uint64': bigint + 'verify_uint64_lshift(uint64,uint64)uint64': bigint + 'verify_uint64_rshift(uint64,uint64)uint64': bigint + 'verify_uint64_pow(uint64,uint64)uint64': bigint + 'verify_uint64_eq(uint64,uint64)bool': boolean + 'verify_uint64_ne(uint64,uint64)bool': boolean + 'verify_uint64_lt(uint64,uint64)bool': boolean + 'verify_uint64_le(uint64,uint64)bool': boolean + 'verify_uint64_gt(uint64,uint64)bool': boolean + 'verify_uint64_ge(uint64,uint64)bool': boolean + 'verify_bytes_init(uint64)byte[]': Uint8Array + 'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]': Uint8Array + 'verify_bytes_eq(byte[],byte[])bool': boolean + 'verify_bytes_ne(byte[],byte[])bool': boolean + 'verify_bytes_and(byte[],byte[])byte[]': Uint8Array + 'verify_bytes_or(byte[],byte[])byte[]': Uint8Array + 'verify_bytes_xor(byte[],byte[])byte[]': Uint8Array + 'verify_bytes_not(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_add(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_add_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_sub(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_sub_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_mul(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_mul_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_div(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_div_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_mod(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_mod_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_and(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_and_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_or(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_or_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_xor(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_xor_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_eq(byte[],byte[])bool': boolean + 'verify_biguint_eq_uint64(byte[],uint64)bool': boolean + 'verify_biguint_ne(byte[],byte[])bool': boolean + 'verify_biguint_ne_uint64(byte[],uint64)bool': boolean + 'verify_biguint_lt(byte[],byte[])bool': boolean + 'verify_biguint_lt_uint64(byte[],uint64)bool': boolean + 'verify_biguint_le(byte[],byte[])bool': boolean + 'verify_biguint_le_uint64(byte[],uint64)bool': boolean + 'verify_biguint_gt(byte[],byte[])bool': boolean + 'verify_biguint_gt_uint64(byte[],uint64)bool': boolean + 'verify_biguint_ge(byte[],byte[])bool': boolean + 'verify_biguint_ge_uint64(byte[],uint64)bool': boolean + 'verify_string_init(string)string': string + 'verify_string_startswith(string,string)bool': boolean + 'verify_string_endswith(string,string)bool': boolean + 'verify_string_join(string,string)string': string + 'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void': void +} + +/** + * Defines the types of available calls and state of the PrimitiveOpsContract smart contract. + */ +export type PrimitiveOpsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_uint64_init(byte[])uint64' | 'verify_uint64_init', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_init(byte[])uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_init(byte[])uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_init(byte[])uint64'] + }> + & Record<'verify_uint64_add(uint64,uint64)uint64' | 'verify_uint64_add', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_add(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_add(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_add(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_sub(uint64,uint64)uint64' | 'verify_uint64_sub', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_sub(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_sub(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_sub(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_mul(uint64,uint64)uint64' | 'verify_uint64_mul', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_mul(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_mul(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_mul(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_div(uint64,uint64)uint64' | 'verify_uint64_div', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_div(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_div(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_div(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_mod(uint64,uint64)uint64' | 'verify_uint64_mod', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_mod(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_mod(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_mod(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_and(uint64,uint64)uint64' | 'verify_uint64_and', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_and(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_and(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_and(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_or(uint64,uint64)uint64' | 'verify_uint64_or', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_or(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_or(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_or(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_xor(uint64,uint64)uint64' | 'verify_uint64_xor', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_xor(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_xor(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_xor(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_not(uint64)uint64' | 'verify_uint64_not', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_not(uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_not(uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_not(uint64)uint64'] + }> + & Record<'verify_uint64_lshift(uint64,uint64)uint64' | 'verify_uint64_lshift', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_lshift(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_lshift(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_lshift(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_rshift(uint64,uint64)uint64' | 'verify_uint64_rshift', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_rshift(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_rshift(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_rshift(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_pow(uint64,uint64)uint64' | 'verify_uint64_pow', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_pow(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_pow(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_pow(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_eq(uint64,uint64)bool' | 'verify_uint64_eq', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_eq(uint64,uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_eq(uint64,uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_uint64_eq(uint64,uint64)bool'] + }> + & Record<'verify_uint64_ne(uint64,uint64)bool' | 'verify_uint64_ne', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_ne(uint64,uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_ne(uint64,uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_uint64_ne(uint64,uint64)bool'] + }> + & Record<'verify_uint64_lt(uint64,uint64)bool' | 'verify_uint64_lt', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_lt(uint64,uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_lt(uint64,uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_uint64_lt(uint64,uint64)bool'] + }> + & Record<'verify_uint64_le(uint64,uint64)bool' | 'verify_uint64_le', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_le(uint64,uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_le(uint64,uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_uint64_le(uint64,uint64)bool'] + }> + & Record<'verify_uint64_gt(uint64,uint64)bool' | 'verify_uint64_gt', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_gt(uint64,uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_gt(uint64,uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_uint64_gt(uint64,uint64)bool'] + }> + & Record<'verify_uint64_ge(uint64,uint64)bool' | 'verify_uint64_ge', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_ge(uint64,uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_ge(uint64,uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_uint64_ge(uint64,uint64)bool'] + }> + & Record<'verify_bytes_init(uint64)byte[]' | 'verify_bytes_init', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_init(uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_init(uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_bytes_init(uint64)byte[]'] + }> + & Record<'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]' | 'verify_bytes_add', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'] + }> + & Record<'verify_bytes_eq(byte[],byte[])bool' | 'verify_bytes_eq', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_eq(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_eq(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_bytes_eq(byte[],byte[])bool'] + }> + & Record<'verify_bytes_ne(byte[],byte[])bool' | 'verify_bytes_ne', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_ne(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_ne(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_bytes_ne(byte[],byte[])bool'] + }> + & Record<'verify_bytes_and(byte[],byte[])byte[]' | 'verify_bytes_and', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_and(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_and(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_bytes_and(byte[],byte[])byte[]'] + }> + & Record<'verify_bytes_or(byte[],byte[])byte[]' | 'verify_bytes_or', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_or(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_or(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_bytes_or(byte[],byte[])byte[]'] + }> + & Record<'verify_bytes_xor(byte[],byte[])byte[]' | 'verify_bytes_xor', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_xor(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_xor(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_bytes_xor(byte[],byte[])byte[]'] + }> + & Record<'verify_bytes_not(byte[],uint64)byte[]' | 'verify_bytes_not', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_not(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_not(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_bytes_not(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_add(byte[],byte[])byte[]' | 'verify_biguint_add', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_add(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_add(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_add(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_add_uint64(byte[],uint64)byte[]' | 'verify_biguint_add_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_add_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_add_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_add_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_sub(byte[],byte[])byte[]' | 'verify_biguint_sub', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_sub(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_sub(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_sub(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_sub_uint64(byte[],uint64)byte[]' | 'verify_biguint_sub_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_sub_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_sub_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_sub_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_mul(byte[],byte[])byte[]' | 'verify_biguint_mul', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_mul(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_mul(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_mul(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_mul_uint64(byte[],uint64)byte[]' | 'verify_biguint_mul_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_mul_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_mul_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_mul_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_div(byte[],byte[])byte[]' | 'verify_biguint_div', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_div(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_div(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_div(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_div_uint64(byte[],uint64)byte[]' | 'verify_biguint_div_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_div_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_div_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_div_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_mod(byte[],byte[])byte[]' | 'verify_biguint_mod', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_mod(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_mod(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_mod(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_mod_uint64(byte[],uint64)byte[]' | 'verify_biguint_mod_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_mod_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_mod_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_mod_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_and(byte[],byte[])byte[]' | 'verify_biguint_and', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_and(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_and(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_and(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_and_uint64(byte[],uint64)byte[]' | 'verify_biguint_and_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_and_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_and_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_and_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_or(byte[],byte[])byte[]' | 'verify_biguint_or', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_or(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_or(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_or(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_or_uint64(byte[],uint64)byte[]' | 'verify_biguint_or_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_or_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_or_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_or_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_xor(byte[],byte[])byte[]' | 'verify_biguint_xor', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_xor(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_xor(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_xor(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_xor_uint64(byte[],uint64)byte[]' | 'verify_biguint_xor_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_xor_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_xor_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_xor_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_eq(byte[],byte[])bool' | 'verify_biguint_eq', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_eq(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_eq(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_eq(byte[],byte[])bool'] + }> + & Record<'verify_biguint_eq_uint64(byte[],uint64)bool' | 'verify_biguint_eq_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_eq_uint64(byte[],uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_eq_uint64(byte[],uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_eq_uint64(byte[],uint64)bool'] + }> + & Record<'verify_biguint_ne(byte[],byte[])bool' | 'verify_biguint_ne', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_ne(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_ne(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_ne(byte[],byte[])bool'] + }> + & Record<'verify_biguint_ne_uint64(byte[],uint64)bool' | 'verify_biguint_ne_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_ne_uint64(byte[],uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_ne_uint64(byte[],uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_ne_uint64(byte[],uint64)bool'] + }> + & Record<'verify_biguint_lt(byte[],byte[])bool' | 'verify_biguint_lt', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_lt(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_lt(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_lt(byte[],byte[])bool'] + }> + & Record<'verify_biguint_lt_uint64(byte[],uint64)bool' | 'verify_biguint_lt_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_lt_uint64(byte[],uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_lt_uint64(byte[],uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_lt_uint64(byte[],uint64)bool'] + }> + & Record<'verify_biguint_le(byte[],byte[])bool' | 'verify_biguint_le', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_le(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_le(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_le(byte[],byte[])bool'] + }> + & Record<'verify_biguint_le_uint64(byte[],uint64)bool' | 'verify_biguint_le_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_le_uint64(byte[],uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_le_uint64(byte[],uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_le_uint64(byte[],uint64)bool'] + }> + & Record<'verify_biguint_gt(byte[],byte[])bool' | 'verify_biguint_gt', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_gt(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_gt(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_gt(byte[],byte[])bool'] + }> + & Record<'verify_biguint_gt_uint64(byte[],uint64)bool' | 'verify_biguint_gt_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_gt_uint64(byte[],uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_gt_uint64(byte[],uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_gt_uint64(byte[],uint64)bool'] + }> + & Record<'verify_biguint_ge(byte[],byte[])bool' | 'verify_biguint_ge', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_ge(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_ge(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_ge(byte[],byte[])bool'] + }> + & Record<'verify_biguint_ge_uint64(byte[],uint64)bool' | 'verify_biguint_ge_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_ge_uint64(byte[],uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_ge_uint64(byte[],uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_ge_uint64(byte[],uint64)bool'] + }> + & Record<'verify_string_init(string)string' | 'verify_string_init', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_string_init(string)string'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_string_init(string)string'] + returns: PrimitiveOpsContractReturns['verify_string_init(string)string'] + }> + & Record<'verify_string_startswith(string,string)bool' | 'verify_string_startswith', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_string_startswith(string,string)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_string_startswith(string,string)bool'] + returns: PrimitiveOpsContractReturns['verify_string_startswith(string,string)bool'] + }> + & Record<'verify_string_endswith(string,string)bool' | 'verify_string_endswith', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_string_endswith(string,string)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_string_endswith(string,string)bool'] + returns: PrimitiveOpsContractReturns['verify_string_endswith(string,string)bool'] + }> + & Record<'verify_string_join(string,string)string' | 'verify_string_join', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_string_join(string,string)string'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_string_join(string,string)string'] + returns: PrimitiveOpsContractReturns['verify_string_join(string,string)string'] + }> + & Record<'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void' | 'verify_log', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'] + returns: PrimitiveOpsContractReturns['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type PrimitiveOpsContractSignatures = keyof PrimitiveOpsContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type PrimitiveOpsContractNonVoidMethodSignatures = keyof PrimitiveOpsContractTypes['methods'] extends infer T ? T extends keyof PrimitiveOpsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the PrimitiveOpsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = PrimitiveOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the PrimitiveOpsContract smart contract to the method's return type + */ +export type MethodReturn = PrimitiveOpsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type PrimitiveOpsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type PrimitiveOpsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: PrimitiveOpsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the PrimitiveOpsContract smart contract + */ +export abstract class PrimitiveOpsContractParamsFactory { + /** + * Constructs a no op call for the verify_uint64_init(byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Init(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_init(byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.rawValue], + } + } + /** + * Constructs a no op call for the verify_uint64_add(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Add(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_add(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_sub(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Sub(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_sub(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_mul(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Mul(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_mul(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_div(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Div(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_div(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_mod(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Mod(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_mod(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_and(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64And(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_and(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_or(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Or(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_or(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_xor(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Xor(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_xor(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_not(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Not(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_not(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_uint64_lshift(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Lshift(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_lshift(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_rshift(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Rshift(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_rshift(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_pow(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Pow(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_pow(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_eq(uint64,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Eq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_eq(uint64,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_ne(uint64,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Ne(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_ne(uint64,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_lt(uint64,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Lt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_lt(uint64,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_le(uint64,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Le(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_le(uint64,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_gt(uint64,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Gt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_gt(uint64,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_ge(uint64,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Ge(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_ge(uint64,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_bytes_init(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_init(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.rawValue], + } + } + /** + * Constructs a no op call for the verify_bytes_add(byte[],byte[],uint64,uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesAdd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.padASize, params.args.padBSize], + } + } + /** + * Constructs a no op call for the verify_bytes_eq(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_eq(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_bytes_ne(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_ne(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_bytes_and(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesAnd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_and(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_bytes_or(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesOr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_or(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_bytes_xor(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesXor(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_xor(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_bytes_not(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesNot(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_not(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], + } + } + /** + * Constructs a no op call for the verify_biguint_add(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintAdd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_add(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_add_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintAddUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_add_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_sub(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintSub(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_sub(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_sub_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintSubUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_sub_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_mul(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintMul(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_mul(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_mul_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintMulUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_mul_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_div(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintDiv(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_div(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_div_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintDivUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_div_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_mod(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintMod(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_mod(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_mod_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintModUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_mod_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_and(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintAnd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_and(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_and_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintAndUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_and_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_or(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintOr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_or(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_or_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintOrUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_or_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_xor(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintXor(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_xor(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_xor_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintXorUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_xor_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_eq(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_eq(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_eq_uint64(byte[],uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintEqUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_eq_uint64(byte[],uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_ne(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_ne(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_ne_uint64(byte[],uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintNeUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_ne_uint64(byte[],uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_lt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_lt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_lt_uint64(byte[],uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintLtUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_lt_uint64(byte[],uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_le(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_le(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_le_uint64(byte[],uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintLeUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_le_uint64(byte[],uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_gt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_gt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_gt_uint64(byte[],uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintGtUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_gt_uint64(byte[],uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_ge(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_ge(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_ge_uint64(byte[],uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintGeUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_ge_uint64(byte[],uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_string_init(string)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_init(string)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_string_startswith(string,string)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringStartswith(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_startswith(string,string)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_string_endswith(string,string)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringEndswith(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_endswith(string,string)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_string_join(string,string)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringJoin(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_join(string,string)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d, params.args.e, params.args.f, params.args.g, params.args.h, params.args.i, params.args.j, params.args.k, params.args.m, params.args.n, params.args.o], + } + } +} + +/** + * A factory to create and deploy one or more instance of the PrimitiveOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class PrimitiveOpsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `PrimitiveOpsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new PrimitiveOpsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new PrimitiveOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the PrimitiveOpsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: PrimitiveOpsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new PrimitiveOpsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the PrimitiveOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the PrimitiveOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the PrimitiveOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new PrimitiveOpsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the PrimitiveOpsContract smart contract + */ +export class PrimitiveOpsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `PrimitiveOpsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the PrimitiveOpsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `PrimitiveOpsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `PrimitiveOpsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new PrimitiveOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `PrimitiveOpsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new PrimitiveOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the PrimitiveOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_init(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Init: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Init(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_add(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Add: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Add(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_sub(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Sub: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Sub(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mul(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Mul: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Mul(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_div(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Div: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Div(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mod(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Mod: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Mod(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_and(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64And: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64And(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_or(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Or: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Or(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_xor(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Xor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Xor(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_not(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Not: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Not(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lshift(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Lshift: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Lshift(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_rshift(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Rshift: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Rshift(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_pow(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Pow: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Pow(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_eq(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Eq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Eq(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ne(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Ne: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Ne(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lt(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Lt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Lt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_le(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Le: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Le(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_gt(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Gt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Gt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ge(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Ge: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Ge(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_init(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesInit(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_add(byte[],byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesAdd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesEq(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesNe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_and(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesAnd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesAnd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_or(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesOr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesOr(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_xor(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesXor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesXor(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_not(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesNot: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesNot(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintAdd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintAddUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintAddUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintSub: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintSub(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintSubUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintSubUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintMul: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintMul(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintMulUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintMulUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintDiv: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintDiv(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintDivUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintDivUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintMod: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintMod(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintModUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintModUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintAnd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintAnd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintAndUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintAndUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintOr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintOr(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintOrUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintOrUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintXor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintXor(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintXorUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintXorUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintEq(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintEqUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintEqUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintNe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintNeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintNeUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintLt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintLtUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintLtUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintLe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintLeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintLeUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintGt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintGtUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintGtUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintGe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintGeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintGeUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyStringInit(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_startswith(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringStartswith: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyStringStartswith(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_endswith(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringEndswith: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyStringEndswith(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_join(string,string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringJoin: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyStringJoin(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyLog(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the PrimitiveOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_init(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Init: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Init(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_add(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Add: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Add(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_sub(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Sub: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Sub(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mul(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Mul: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Mul(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_div(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Div: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Div(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mod(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Mod: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Mod(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_and(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64And: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64And(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_or(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Or: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Or(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_xor(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Xor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Xor(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_not(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Not: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Not(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lshift(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Lshift: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Lshift(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_rshift(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Rshift: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Rshift(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_pow(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Pow: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Pow(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_eq(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Eq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Eq(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ne(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Ne: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Ne(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lt(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Lt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Lt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_le(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Le: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Le(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_gt(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Gt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Gt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ge(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Ge: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Ge(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_init(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesInit(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_add(byte[],byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesAdd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesEq(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesNe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_and(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesAnd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesAnd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_or(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesOr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesOr(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_xor(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesXor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesXor(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_not(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesNot: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesNot(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintAdd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintAddUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintAddUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintSub: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintSub(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintSubUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintSubUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintMul: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintMul(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintMulUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintMulUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintDiv: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintDiv(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintDivUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintDivUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintMod: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintMod(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintModUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintModUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintAnd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintAnd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintAndUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintAndUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintOr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintOr(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintOrUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintOrUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintXor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintXor(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintXorUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintXorUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintEq(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintEqUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintEqUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintNe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintNeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintNeUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintLt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintLtUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintLtUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintLe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintLeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintLeUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintGt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintGtUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintGtUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintGe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintGeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintGeUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyStringInit(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_startswith(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringStartswith: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyStringStartswith(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_endswith(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringEndswith: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyStringEndswith(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_join(string,string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringJoin: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyStringJoin(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyLog(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the PrimitiveOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_init(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Init: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Init(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_init(byte[])uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_add(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Add: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Add(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_add(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_sub(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Sub: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Sub(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_sub(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mul(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Mul: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Mul(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_mul(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_div(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Div: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Div(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_div(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mod(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Mod: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Mod(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_mod(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_and(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64And: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64And(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_and(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_or(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Or: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Or(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_or(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_xor(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Xor: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Xor(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_xor(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_not(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Not: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Not(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_not(uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lshift(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Lshift: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Lshift(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_lshift(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_rshift(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Rshift: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Rshift(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_rshift(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_pow(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Pow: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Pow(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_pow(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_eq(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Eq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Eq(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_eq(uint64,uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ne(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Ne: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Ne(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_ne(uint64,uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lt(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Lt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Lt(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_lt(uint64,uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_le(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Le: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Le(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_le(uint64,uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_gt(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Gt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Gt(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_gt(uint64,uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ge(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Ge: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Ge(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_ge(uint64,uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_init(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesInit(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_init(uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_add(byte[],byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesAdd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesAdd(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesEq(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_eq(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesNe(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_ne(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_and(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesAnd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesAnd(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_and(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_or(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesOr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesOr(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_or(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_xor(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesXor: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesXor(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_xor(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_not(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesNot: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesNot(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_not(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintAdd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintAdd(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_add(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintAddUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintAddUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_add_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintSub: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintSub(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_sub(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintSubUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintSubUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_sub_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintMul: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintMul(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_mul(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintMulUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintMulUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_mul_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintDiv: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintDiv(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_div(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintDivUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintDivUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_div_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintMod: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintMod(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_mod(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintModUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintModUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_mod_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintAnd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintAnd(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_and(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintAndUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintAndUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_and_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintOr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintOr(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_or(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintOrUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintOrUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_or_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintXor: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintXor(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_xor(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintXorUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintXorUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_xor_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintEq(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_eq(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintEqUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintEqUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_eq_uint64(byte[],uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintNe(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_ne(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintNeUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintNeUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_ne_uint64(byte[],uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintLt(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_lt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintLtUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintLtUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_lt_uint64(byte[],uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintLe(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_le(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintLeUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintLeUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_le_uint64(byte[],uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintGt(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_gt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintGtUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintGtUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_gt_uint64(byte[],uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintGe(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_ge(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintGeUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintGeUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_ge_uint64(byte[],uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyStringInit(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_string_init(string)string'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_startswith(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringStartswith: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyStringStartswith(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_string_startswith(string,string)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_endswith(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringEndswith: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyStringEndswith(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_string_endswith(string,string)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_join(string,string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringJoin: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyStringJoin(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_string_join(string,string)string'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyLog(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new PrimitiveOpsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current PrimitiveOpsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): PrimitiveOpsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_uint64_init(byte[])uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Init(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Init(params))) + return this + }, + /** + * Add a verify_uint64_add(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Add(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Add(params))) + return this + }, + /** + * Add a verify_uint64_sub(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Sub(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Sub(params))) + return this + }, + /** + * Add a verify_uint64_mul(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Mul(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Mul(params))) + return this + }, + /** + * Add a verify_uint64_div(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Div(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Div(params))) + return this + }, + /** + * Add a verify_uint64_mod(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Mod(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Mod(params))) + return this + }, + /** + * Add a verify_uint64_and(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64And(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64And(params))) + return this + }, + /** + * Add a verify_uint64_or(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Or(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Or(params))) + return this + }, + /** + * Add a verify_uint64_xor(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Xor(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Xor(params))) + return this + }, + /** + * Add a verify_uint64_not(uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Not(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Not(params))) + return this + }, + /** + * Add a verify_uint64_lshift(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Lshift(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Lshift(params))) + return this + }, + /** + * Add a verify_uint64_rshift(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Rshift(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Rshift(params))) + return this + }, + /** + * Add a verify_uint64_pow(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Pow(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Pow(params))) + return this + }, + /** + * Add a verify_uint64_eq(uint64,uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyUint64Eq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Eq(params))) + return this + }, + /** + * Add a verify_uint64_ne(uint64,uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyUint64Ne(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Ne(params))) + return this + }, + /** + * Add a verify_uint64_lt(uint64,uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyUint64Lt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Lt(params))) + return this + }, + /** + * Add a verify_uint64_le(uint64,uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyUint64Le(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Le(params))) + return this + }, + /** + * Add a verify_uint64_gt(uint64,uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyUint64Gt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Gt(params))) + return this + }, + /** + * Add a verify_uint64_ge(uint64,uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyUint64Ge(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Ge(params))) + return this + }, + /** + * Add a verify_bytes_init(uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBytesInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesInit(params))) + return this + }, + /** + * Add a verify_bytes_add(byte[],byte[],uint64,uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBytesAdd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesAdd(params))) + return this + }, + /** + * Add a verify_bytes_eq(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBytesEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesEq(params))) + return this + }, + /** + * Add a verify_bytes_ne(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBytesNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesNe(params))) + return this + }, + /** + * Add a verify_bytes_and(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBytesAnd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesAnd(params))) + return this + }, + /** + * Add a verify_bytes_or(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBytesOr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesOr(params))) + return this + }, + /** + * Add a verify_bytes_xor(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBytesXor(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesXor(params))) + return this + }, + /** + * Add a verify_bytes_not(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBytesNot(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesNot(params))) + return this + }, + /** + * Add a verify_biguint_add(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintAdd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintAdd(params))) + return this + }, + /** + * Add a verify_biguint_add_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintAddUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintAddUint64(params))) + return this + }, + /** + * Add a verify_biguint_sub(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintSub(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintSub(params))) + return this + }, + /** + * Add a verify_biguint_sub_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintSubUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintSubUint64(params))) + return this + }, + /** + * Add a verify_biguint_mul(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintMul(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintMul(params))) + return this + }, + /** + * Add a verify_biguint_mul_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintMulUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintMulUint64(params))) + return this + }, + /** + * Add a verify_biguint_div(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintDiv(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintDiv(params))) + return this + }, + /** + * Add a verify_biguint_div_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintDivUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintDivUint64(params))) + return this + }, + /** + * Add a verify_biguint_mod(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintMod(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintMod(params))) + return this + }, + /** + * Add a verify_biguint_mod_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintModUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintModUint64(params))) + return this + }, + /** + * Add a verify_biguint_and(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintAnd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintAnd(params))) + return this + }, + /** + * Add a verify_biguint_and_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintAndUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintAndUint64(params))) + return this + }, + /** + * Add a verify_biguint_or(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintOr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintOr(params))) + return this + }, + /** + * Add a verify_biguint_or_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintOrUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintOrUint64(params))) + return this + }, + /** + * Add a verify_biguint_xor(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintXor(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintXor(params))) + return this + }, + /** + * Add a verify_biguint_xor_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintXorUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintXorUint64(params))) + return this + }, + /** + * Add a verify_biguint_eq(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintEq(params))) + return this + }, + /** + * Add a verify_biguint_eq_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintEqUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintEqUint64(params))) + return this + }, + /** + * Add a verify_biguint_ne(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintNe(params))) + return this + }, + /** + * Add a verify_biguint_ne_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintNeUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintNeUint64(params))) + return this + }, + /** + * Add a verify_biguint_lt(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintLt(params))) + return this + }, + /** + * Add a verify_biguint_lt_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintLtUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintLtUint64(params))) + return this + }, + /** + * Add a verify_biguint_le(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintLe(params))) + return this + }, + /** + * Add a verify_biguint_le_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintLeUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintLeUint64(params))) + return this + }, + /** + * Add a verify_biguint_gt(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintGt(params))) + return this + }, + /** + * Add a verify_biguint_gt_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintGtUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintGtUint64(params))) + return this + }, + /** + * Add a verify_biguint_ge(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintGe(params))) + return this + }, + /** + * Add a verify_biguint_ge_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintGeUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintGeUint64(params))) + return this + }, + /** + * Add a verify_string_init(string)string method call against the PrimitiveOpsContract contract + */ + verifyStringInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringInit(params))) + return this + }, + /** + * Add a verify_string_startswith(string,string)bool method call against the PrimitiveOpsContract contract + */ + verifyStringStartswith(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringStartswith(params))) + return this + }, + /** + * Add a verify_string_endswith(string,string)bool method call against the PrimitiveOpsContract contract + */ + verifyStringEndswith(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringEndswith(params))) + return this + }, + /** + * Add a verify_string_join(string,string)string method call against the PrimitiveOpsContract contract + */ + verifyStringJoin(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringJoin(params))) + return this + }, + /** + * Add a verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void method call against the PrimitiveOpsContract contract + */ + verifyLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyLog(params))) + return this + }, + /** + * Add a clear state call to the PrimitiveOpsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as PrimitiveOpsContractComposer + } +} +export type PrimitiveOpsContractComposer = { + /** + * Calls the verify_uint64_init(byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Init(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_init(byte[])uint64'] | undefined]> + + /** + * Calls the verify_uint64_add(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Add(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_add(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_sub(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Sub(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_sub(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_mul(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Mul(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_mul(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_div(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Div(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_div(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_mod(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Mod(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_mod(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_and(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64And(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_and(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_or(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Or(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_or(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_xor(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Xor(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_xor(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_not(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Not(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_not(uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_lshift(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Lshift(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_lshift(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_rshift(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Rshift(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_rshift(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_pow(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Pow(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_pow(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_eq(uint64,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Eq(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_eq(uint64,uint64)bool'] | undefined]> + + /** + * Calls the verify_uint64_ne(uint64,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Ne(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_ne(uint64,uint64)bool'] | undefined]> + + /** + * Calls the verify_uint64_lt(uint64,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Lt(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_lt(uint64,uint64)bool'] | undefined]> + + /** + * Calls the verify_uint64_le(uint64,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Le(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_le(uint64,uint64)bool'] | undefined]> + + /** + * Calls the verify_uint64_gt(uint64,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Gt(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_gt(uint64,uint64)bool'] | undefined]> + + /** + * Calls the verify_uint64_ge(uint64,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Ge(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_ge(uint64,uint64)bool'] | undefined]> + + /** + * Calls the verify_bytes_init(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesInit(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_init(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_bytes_add(byte[],byte[],uint64,uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesAdd(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'] | undefined]> + + /** + * Calls the verify_bytes_eq(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesEq(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_eq(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_bytes_ne(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesNe(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_ne(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_bytes_and(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesAnd(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_and(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_bytes_or(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesOr(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_or(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_bytes_xor(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesXor(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_xor(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_bytes_not(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesNot(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_not(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_add(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintAdd(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_add(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_add_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintAddUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_add_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_sub(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintSub(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_sub(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_sub_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintSubUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_sub_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_mul(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintMul(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_mul(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_mul_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintMulUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_mul_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_div(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintDiv(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_div(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_div_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintDivUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_div_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_mod(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintMod(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_mod(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_mod_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintModUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_mod_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_and(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintAnd(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_and(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_and_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintAndUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_and_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_or(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintOr(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_or(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_or_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintOrUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_or_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_xor(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintXor(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_xor(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_xor_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintXorUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_xor_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_eq(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintEq(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_eq(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguint_eq_uint64(byte[],uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintEqUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_eq_uint64(byte[],uint64)bool'] | undefined]> + + /** + * Calls the verify_biguint_ne(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintNe(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_ne(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguint_ne_uint64(byte[],uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintNeUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_ne_uint64(byte[],uint64)bool'] | undefined]> + + /** + * Calls the verify_biguint_lt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintLt(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_lt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguint_lt_uint64(byte[],uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintLtUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_lt_uint64(byte[],uint64)bool'] | undefined]> + + /** + * Calls the verify_biguint_le(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintLe(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_le(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguint_le_uint64(byte[],uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintLeUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_le_uint64(byte[],uint64)bool'] | undefined]> + + /** + * Calls the verify_biguint_gt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintGt(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_gt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguint_gt_uint64(byte[],uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintGtUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_gt_uint64(byte[],uint64)bool'] | undefined]> + + /** + * Calls the verify_biguint_ge(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintGe(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_ge(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguint_ge_uint64(byte[],uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintGeUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_ge_uint64(byte[],uint64)bool'] | undefined]> + + /** + * Calls the verify_string_init(string)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringInit(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_string_init(string)string'] | undefined]> + + /** + * Calls the verify_string_startswith(string,string)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringStartswith(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_string_startswith(string,string)bool'] | undefined]> + + /** + * Calls the verify_string_endswith(string,string)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringEndswith(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_string_endswith(string,string)bool'] | undefined]> + + /** + * Calls the verify_string_join(string,string)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringJoin(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_string_join(string,string)string'] | undefined]> + + /** + * Calls the verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyLog(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the PrimitiveOpsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): PrimitiveOpsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): PrimitiveOpsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type PrimitiveOpsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/SignaturesContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/SignaturesContract.ts new file mode 100644 index 0000000..e810782 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/SignaturesContract.ts @@ -0,0 +1,1203 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"SignaturesContract","structs":{"AnotherStruct":[{"name":"one","type":"uint64"},{"name":"two","type":"string"}],"MyStruct":[{"name":"anotherStruct","type":"AnotherStruct"},{"name":"anotherStructAlias","type":"AnotherStruct"},{"name":"three","type":"uint128"},{"name":"four","type":"uint128"}]},"methods":[{"name":"create","args":[],"returns":{"type":"void"},"actions":{"create":["NoOp"],"call":[]},"readonly":false,"events":[],"recommendations":{}},{"name":"sink","args":[{"type":"string","name":"value"},{"type":"uint8[]","name":"arr"},{"type":"byte[4]","name":"fixed_bytes"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"alias","args":[{"type":"string","name":"value"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"with_txn","args":[{"type":"string","name":"value"},{"type":"pay","name":"pay"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"with_asset","args":[{"type":"string","name":"value"},{"type":"asset","name":"asset"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"with_app","args":[{"type":"string","name":"value"},{"type":"application","name":"app"},{"type":"uint64","name":"app_id"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"with_acc","args":[{"type":"string","name":"value"},{"type":"account","name":"acc"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"complex_sig","args":[{"type":"((uint64,string),(uint64,string),uint128,uint128)","struct":"MyStruct","name":"struct1"},{"type":"txn","name":"txn"},{"type":"account","name":"acc"},{"type":"uint8[]","name":"five"}],"returns":{"type":"((uint64,string),((uint64,string),(uint64,string),uint128,uint128))"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"echo_resource_by_index","args":[{"type":"asset","name":"asset"},{"type":"application","name":"app"},{"type":"account","name":"acc"}],"returns":{"type":"(uint64,uint64,address)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"echo_resource_by_value","args":[{"type":"uint64","name":"asset"},{"type":"uint64","name":"app"},{"type":"address","name":"acc"}],"returns":{"type":"(uint64,uint64,address)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":[],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[348,353,547,552],"errorMessage":"account funded"},{"pc":[284],"errorMessage":"application exists"},{"pc":[242],"errorMessage":"asset exists"},{"pc":[639],"errorMessage":"expected account to be passed by index"},{"pc":[693],"errorMessage":"expected account to be passed by value"},{"pc":[280],"errorMessage":"expected app id to match provided app id"},{"pc":[629],"errorMessage":"expected application to be passed by index"},{"pc":[687],"errorMessage":"expected application to be passed by value"},{"pc":[619],"errorMessage":"expected asset to be passed by index"},{"pc":[679],"errorMessage":"expected asset to be passed by value"},{"pc":[138],"errorMessage":"expected global to have app address"},{"pc":[132],"errorMessage":"expected global to have app id"},{"pc":[288],"errorMessage":"expected other app to have same creator"},{"pc":[143,147],"errorMessage":"expected txn to have 0"},{"pc":[392],"errorMessage":"invalid array length header"},{"pc":[400],"errorMessage":"invalid number of bytes for arc4.dynamic_array"},{"pc":[671],"errorMessage":"invalid number of bytes for arc4.static_array"},{"pc":[129,294],"errorMessage":"transaction type is appl"},{"pc":[190],"errorMessage":"transaction type is pay"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgNiAxMjMKICAgIGJ5dGVjYmxvY2sgMHgwMDAwIDB4MTUxZjdjNzUgMHgwMDAwMDAwMDAwMDAwMDAxIDB4MDAwMTMyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyNQogICAgLy8gY2xhc3MgU2lnbmF0dXJlc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDEzCiAgICBwdXNoYnl0ZXNzIDB4MmUwMTc4MWUgMHgzYjA1Y2YxNyAweDA2NThkY2MzIDB4NWI2NDQ3ZGUgMHgwNjFmNGU3NyAweGVhYTg5MTM5IDB4NTEwZTcyYTQgMHhkNmMyYWM3ZiAweDQ4MTQyZDVlIC8vIG1ldGhvZCAic2luayhzdHJpbmcsdWludDhbXSxieXRlWzRdKXZvaWQiLCBtZXRob2QgImFsaWFzKHN0cmluZyx1aW50OFtdKXZvaWQiLCBtZXRob2QgIndpdGhfdHhuKHN0cmluZyxwYXksdWludDhbXSl2b2lkIiwgbWV0aG9kICJ3aXRoX2Fzc2V0KHN0cmluZyxhc3NldCx1aW50OFtdKXZvaWQiLCBtZXRob2QgIndpdGhfYXBwKHN0cmluZyxhcHBsaWNhdGlvbix1aW50NjQsdWludDhbXSl2b2lkIiwgbWV0aG9kICJ3aXRoX2FjYyhzdHJpbmcsYWNjb3VudCx1aW50OFtdKXZvaWQiLCBtZXRob2QgImNvbXBsZXhfc2lnKCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpLHVpbnQxMjgsdWludDEyOCksdHhuLGFjY291bnQsdWludDhbXSkoKHVpbnQ2NCxzdHJpbmcpLCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpLHVpbnQxMjgsdWludDEyOCkpIiwgbWV0aG9kICJlY2hvX3Jlc291cmNlX2J5X2luZGV4KGFzc2V0LGFwcGxpY2F0aW9uLGFjY291bnQpKHVpbnQ2NCx1aW50NjQsYWRkcmVzcykiLCBtZXRob2QgImVjaG9fcmVzb3VyY2VfYnlfdmFsdWUodWludDY0LHVpbnQ2NCxhZGRyZXNzKSh1aW50NjQsdWludDY0LGFkZHJlc3MpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggc2luayBzaW5rMiB3aXRoX3R4biB3aXRoX2Fzc2V0IHdpdGhfYXBwIHdpdGhfYWNjIGNvbXBsZXhfc2lnIGVjaG9fcmVzb3VyY2VfYnlfaW5kZXggZWNob19yZXNvdXJjZV9ieV92YWx1ZQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjUKICAgIC8vIGNsYXNzIFNpZ25hdHVyZXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgcHVzaGJ5dGVzIDB4NGM1YzYxYmEgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGUKICAgIGVycgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyOAogICAgLy8gYXBwX3R4biA9IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24oMCkKICAgIGludGNfMSAvLyAwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyOQogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkICE9IDAsICJleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgaWQiCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzICE9IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozMC0zMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzICE9IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIC8vICksICJleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgYWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjgKICAgIC8vIGFwcF90eG4gPSBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKDApCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzMKICAgIC8vIGFzc2VydCBhcHBfdHhuLmFwcF9pZCA9PSAwLCAiZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMCIKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBleHBlY3RlZCB0eG4gdG8gaGF2ZSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozNAogICAgLy8gYXNzZXJ0IFR4bi5hcHBsaWNhdGlvbl9pZCA9PSAwLCAiZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMCIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5zaW5rW3JvdXRpbmddKCkgLT4gdm9pZDoKc2luazoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QodmFsaWRhdGVfZW5jb2Rpbmc9InVuc2FmZV9kaXNhYmxlZCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0MAogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDEKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHZhbGlkYXRlX2VuY29kaW5nPSJ1bnNhZmVfZGlzYWJsZWQiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5zaW5rMltyb3V0aW5nXSgpIC0+IHZvaWQ6CnNpbmsyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPSJhbGlhcyIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0NgogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDcKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9ImFsaWFzIikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF90eG5bcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX3R4bjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTEKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgdW5jb3ZlciAyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTIKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1MwogICAgLy8gYXNzZXJ0IHBheS5ncm91cF9pbmRleCA9PSAwCiAgICBkdXAKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTQKICAgIC8vIGFzc2VydCBUeG4uZ3JvdXBfaW5kZXggPT0gMQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1NQogICAgLy8gYXNzZXJ0IHBheS5hbW91bnQgPT0gMTIzCiAgICBndHhucyBBbW91bnQKICAgIGludGNfMyAvLyAxMjMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hc3NldFtyb3V0aW5nXSgpIC0+IHZvaWQ6CndpdGhfYXNzZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBhc3NlcnQgdmFsdWUKICAgIHVuY292ZXIgMgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBhc3NlcnQgYXJyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjEKICAgIC8vIGFzc2VydCBhc3NldC50b3RhbCA9PSAxMjMKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpbnRjXzMgLy8gMTIzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo2MgogICAgLy8gYXNzZXJ0IFR4bi5hc3NldHMoMCkgPT0gYXNzZXQKICAgIHR4bmEgQXNzZXRzIDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hcHBbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX2FwcDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjgKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgdW5jb3ZlciAzCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjkKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3MAogICAgLy8gYXNzZXJ0IGFwcC5pZCA9PSBhcHBfaWQsICJleHBlY3RlZCBhcHAgaWQgdG8gbWF0Y2ggcHJvdmlkZWQgYXBwIGlkIgogICAgZGlnIDEKICAgIGl0b2IKICAgIGI9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcCBpZCB0byBtYXRjaCBwcm92aWRlZCBhcHAgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBhc3NlcnQgYXBwLmNyZWF0b3IgPT0gb3AuR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgImV4cGVjdGVkIG90aGVyIGFwcCB0byBoYXZlIHNhbWUgY3JlYXRvciIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG90aGVyIGFwcCB0byBoYXZlIHNhbWUgY3JlYXRvcgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NzIKICAgIC8vIGFwcF90eG4gPSBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKDApCiAgICBpbnRjXzEgLy8gMAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjczCiAgICAvLyBhc3NlcnQgYXBwX3R4bi5hcHBzKDApID09IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkCiAgICBkdXAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25zCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9ucygwKSA9PSBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZAogICAgdHhuYSBBcHBsaWNhdGlvbnMgMAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3MgogICAgLy8gYXBwX3R4biA9IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24oMCkKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3NQogICAgLy8gYXNzZXJ0IGFwcF90eG4uYXBwcygxKSA9PSBhcHAKICAgIGludGNfMCAvLyAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9ucwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9ucygxKSA9PSBhcHAKICAgIHR4bmEgQXBwbGljYXRpb25zIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hY2Nbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX2FjYzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4MAogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4MQogICAgLy8gYXNzZXJ0IGFycgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBhc3NlcnQgYWNjLmJhbGFuY2UgPT0gYWNjLm1pbl9iYWxhbmNlICsgMTIzNAogICAgZHVwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBwdXNoaW50IDEyMzQKICAgICsKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBhc3NlcnQgVHhuLmFjY291bnRzKDApID09IFR4bi5zZW5kZXIKICAgIHR4bmEgQWNjb3VudHMgMAogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6ODQKICAgIC8vIGFzc2VydCBUeG4uYWNjb3VudHMoMSkgPT0gYWNjCiAgICB0eG5hIEFjY291bnRzIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3QuY29tcGxleF9zaWdbcm91dGluZ10oKSAtPiB2b2lkOgpjb21wbGV4X3NpZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBmaXZlLnZhbGlkYXRlKCkKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5MQogICAgLy8gYXNzZXJ0IFR4bi5udW1fYXBwX2FyZ3MgPT0gNAogICAgdHhuIE51bUFwcEFyZ3MKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTItOTMKICAgIC8vICMgc3RydWN0CiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdC5vbmUgPT0gMQogICAgZGlnIDMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDQKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyA1CiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4CiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjkyLTk0CiAgICAvLyAjIHN0cnVjdAogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3Qub25lID09IDEKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0LnR3byA9PSAiMiIKICAgIGR1cAogICAgcHVzaGludCA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdC50d28gPT0gIjIiCiAgICBieXRlY18zIC8vIDB4MDAwMTMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5NQogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3RfYWxpYXMub25lID09IDEKICAgIGRpZyA2CiAgICBsZW4KICAgIGRpZyA3CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5NS05NgogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3RfYWxpYXMub25lID09IDEKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0X2FsaWFzLnR3byA9PSAiMiIKICAgIGR1cAogICAgcHVzaGludCA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTQKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0LnR3byA9PSAiMiIKICAgIGJ5dGVjXzMgLy8gMHgwMDAxMzIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdF9hbGlhcy50d28gPT0gIjIiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5NwogICAgLy8gYXNzZXJ0IHN0cnVjdDEudGhyZWUgPT0gMwogICAgZGlnIDUKICAgIGV4dHJhY3QgNCAxNgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5OAogICAgLy8gYXNzZXJ0IHN0cnVjdDEuZm91ciA9PSA0CiAgICBkaWcgNQogICAgZXh0cmFjdCAyMCAxNgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMDAtMTAxCiAgICAvLyAjIHR4bgogICAgLy8gYXNzZXJ0IHR4bi5ncm91cF9pbmRleCA9PSBUeG4uZ3JvdXBfaW5kZXggLSAxCiAgICB1bmNvdmVyIDQKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTAzLTEwNAogICAgLy8gIyBhY2MKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygyKSA9PSBhcmM0LlVJbnQ4KDEpLmJ5dGVzICAjIGFjYyBhcnJheSByZWYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHB1c2hieXRlcyAweDAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMDUKICAgIC8vIGFzc2VydCBhY2MuYmFsYW5jZSA9PSBhY2MubWluX2JhbGFuY2UgKyAxMjM0CiAgICBkaWcgMwogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIHVuY292ZXIgNAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIHB1c2hpbnQgMTIzNAogICAgKwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTA2CiAgICAvLyBhc3NlcnQgZml2ZVswXSA9PSA1CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAxCiAgICBwdXNoYnl0ZXMgMHgwNQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHB1c2hpbnQgNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3QuZWNob19yZXNvdXJjZV9ieV9pbmRleFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmVjaG9fcmVzb3VyY2VfYnlfaW5kZXg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTAtMTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IiwKICAgIC8vICkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NldF9pZHggPSBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTE3CiAgICAvLyBhc3NlcnQgYXNzZXQgPT0gVHhuLmFzc2V0cyhhc3NldF9pZHgpLCAiZXhwZWN0ZWQgYXNzZXQgdG8gYmUgcGFzc2VkIGJ5IGluZGV4IgogICAgdHhuYXMgQXNzZXRzCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCB0byBiZSBwYXNzZWQgYnkgaW5kZXgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjExOAogICAgLy8gYXBwX2lkeCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMikpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTkKICAgIC8vIGFzc2VydCBhcHAgPT0gVHhuLmFwcGxpY2F0aW9ucyhhcHBfaWR4KSwgImV4cGVjdGVkIGFwcGxpY2F0aW9uIHRvIGJlIHBhc3NlZCBieSBpbmRleCIKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXBwbGljYXRpb24gdG8gYmUgcGFzc2VkIGJ5IGluZGV4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMjAKICAgIC8vIGFjY19pZHggPSBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDMpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTIxCiAgICAvLyBhc3NlcnQgYWNjID09IFR4bi5hY2NvdW50cyhhY2NfaWR4KSwgImV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IGluZGV4IgogICAgdHhuYXMgQWNjb3VudHMKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IGluZGV4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTAtMTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IiwKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5lY2hvX3Jlc291cmNlX2J5X3ZhbHVlW3JvdXRpbmddKCkgLT4gdm9pZDoKZWNob19yZXNvdXJjZV9ieV92YWx1ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEyNC0xMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICByZXNvdXJjZV9lbmNvZGluZz0idmFsdWUiLAogICAgLy8gKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMwCiAgICAvLyBhY2MudmFsaWRhdGUoKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMxCiAgICAvLyBhc3NldF9pZCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMzIKICAgIC8vIGFzc2VydCBhc3NldC5pZCA9PSBhc3NldF9pZCwgImV4cGVjdGVkIGFzc2V0IHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFzc2V0IHRvIGJlIHBhc3NlZCBieSB2YWx1ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMzCiAgICAvLyBhcHBfaWQgPSBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDIpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTM0CiAgICAvLyBhc3NlcnQgYXBwLmlkID09IGFwcF9pZCwgImV4cGVjdGVkIGFwcGxpY2F0aW9uIHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcGxpY2F0aW9uIHRvIGJlIHBhc3NlZCBieSB2YWx1ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTM2CiAgICAvLyBhc3NlcnQgYWNjLmJ5dGVzID09IGFkZHJlc3MsICJleHBlY3RlZCBhY2NvdW50IHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTM1CiAgICAvLyBhZGRyZXNzID0gVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMykKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gYXNzZXJ0IGFjYy5ieXRlcyA9PSBhZGRyZXNzLCAiZXhwZWN0ZWQgYWNjb3VudCB0byBiZSBwYXNzZWQgYnkgdmFsdWUiCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IHZhbHVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMjQtMTI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9InZhbHVlIiwKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAQAGeyYEAgAABBUffHUIAAAAAAAAAAEDAAEyMRkURDEYQQBHggkELgF4HgQ7Bc8XBAZY3MMEW2RH3gQGH053BOqokTkEUQ5ypATWwqx/BEgULV42GgCOCQApADcARQBuAJAA2AEJAeMCIgCABExcYbo2GgCOAQABACM4ECQSRDIIRDIKMgMTRCM4GBREMRgURCJDNhoCNhoBKBNEKBNEIkM2GgI2GgEoE0QoE0QiQzYaATEWIglJOBAiEkQ2GgJPAigTRCgTREk4FhREMRYiEkQ4CCUSRCJDNhoBNhoCF8AwNhoDTwIoE0QoE0RJcQBEJRJENjAAEkQiQzYaATYaAhfAMjYaAzYaBE8DKBNEKBNESwEWqERJcgdEMgkSRCM4ECQSRCNJwjIyCBJENjIAMggSRCMiwjJLARJENjIBEkQiQzYaATYaAhfAHDYaA08CKBNEKBNESXMAREsBcwFEgdIJCBJENhwAMQASRDYcARJEIkM2GgExFiIJNhoCF8AcNhoDSSNZgQIISwEVEkQxG4EEEkRLAyNZSwSBAllLBU8CSwJSSVcACCqoREmBCFlLARVLAk8CSwJSKxJESwYVSwdPBE8CUklXAAgqqERJgQhZSwEVUisSREsFVwQQgBAAAAAAAAAAAAAAAAAAAAADqERLBVcUEIAQAAAAAAAAAAAAAAAAAAAABKhETwQ4FjEWIgkSRDYaAoABARJESwNzAERPBHMBRIHSCQgSRE8CVwIBgAEFqESBBAgWVwYCgAIABExQTFBMUClMULAiQzYaARfAMDYaAhfAMjYaAxfAHDYaARfAMEsDEkQ2GgIXwDJLAhJENhoDF8AcSwESRE8CFk8CFlBMUClMULAiQzYaARc2GgIXNhoDSRWBIBJENhoBF0sDEkQ2GgIXSwISREk2GgMSRE8CFk8CFlBMUClMULAiQw==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +// Type definitions for ARC-56 structs + +export type AnotherStruct = { + one: bigint, + two: string +} + + +/** + * Converts the ABI tuple representation of a AnotherStruct to the struct representation + */ +export function AnotherStructFromTuple(abiTuple: [bigint, string]) { + const abiStructType = ABIStructType.fromStruct('AnotherStruct', APP_SPEC.structs) + return getStructValueFromTupleValue(abiStructType, abiTuple) as AnotherStruct +} + +export type MyStruct = { + anotherStruct: AnotherStruct, + anotherStructAlias: AnotherStruct, + three: bigint, + four: bigint +} + + +/** + * Converts the ABI tuple representation of a MyStruct to the struct representation + */ +export function MyStructFromTuple(abiTuple: [AnotherStruct, AnotherStruct, bigint, bigint]) { + const abiStructType = ABIStructType.fromStruct('MyStruct', APP_SPEC.structs) + return getStructValueFromTupleValue(abiStructType, abiTuple) as MyStruct +} + +/** + * The argument types for the SignaturesContract contract + */ +export type SignaturesContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'create()void': Record + 'sink(string,uint8[],byte[4])void': { + value: string + arr: bigint[] | number[] + fixedBytes: Uint8Array + } + 'alias(string,uint8[])void': { + value: string + arr: bigint[] | number[] + } + 'with_txn(string,pay,uint8[])void': { + value: string + pay: AppMethodCallTransactionArgument + arr: bigint[] | number[] + } + 'with_asset(string,asset,uint8[])void': { + value: string + asset: bigint + arr: bigint[] | number[] + } + 'with_app(string,application,uint64,uint8[])void': { + value: string + app: bigint + appId: bigint | number + arr: bigint[] | number[] + } + 'with_acc(string,account,uint8[])void': { + value: string + acc: Uint8Array | string + arr: bigint[] | number[] + } + 'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))': { + struct1: MyStruct + txn: AppMethodCallTransactionArgument + acc: Uint8Array | string + five: bigint[] | number[] + } + 'echo_resource_by_index(asset,application,account)(uint64,uint64,address)': { + asset: bigint + app: bigint + acc: Uint8Array | string + } + 'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)': { + asset: bigint | number + app: bigint | number + acc: string + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'create()void': [] + 'sink(string,uint8[],byte[4])void': [value: string, arr: bigint[] | number[], fixedBytes: Uint8Array] + 'alias(string,uint8[])void': [value: string, arr: bigint[] | number[]] + 'with_txn(string,pay,uint8[])void': [value: string, pay: AppMethodCallTransactionArgument, arr: bigint[] | number[]] + 'with_asset(string,asset,uint8[])void': [value: string, asset: bigint, arr: bigint[] | number[]] + 'with_app(string,application,uint64,uint8[])void': [value: string, app: bigint, appId: bigint | number, arr: bigint[] | number[]] + 'with_acc(string,account,uint8[])void': [value: string, acc: Uint8Array | string, arr: bigint[] | number[]] + 'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))': [struct1: MyStruct, txn: AppMethodCallTransactionArgument, acc: Uint8Array | string, five: bigint[] | number[]] + 'echo_resource_by_index(asset,application,account)(uint64,uint64,address)': [asset: bigint, app: bigint, acc: Uint8Array | string] + 'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)': [asset: bigint | number, app: bigint | number, acc: string] + } +} + +/** + * The return type for each method + */ +export type SignaturesContractReturns = { + 'create()void': void + 'sink(string,uint8[],byte[4])void': void + 'alias(string,uint8[])void': void + 'with_txn(string,pay,uint8[])void': void + 'with_asset(string,asset,uint8[])void': void + 'with_app(string,application,uint64,uint8[])void': void + 'with_acc(string,account,uint8[])void': void + 'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))': [[bigint, string], [[bigint, string], [bigint, string], bigint, bigint]] + 'echo_resource_by_index(asset,application,account)(uint64,uint64,address)': [bigint, bigint, string] + 'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)': [bigint, bigint, string] +} + +/** + * Defines the types of available calls and state of the SignaturesContract smart contract. + */ +export type SignaturesContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'create()void' | 'create', { + argsObj: SignaturesContractArgs['obj']['create()void'] + argsTuple: SignaturesContractArgs['tuple']['create()void'] + returns: SignaturesContractReturns['create()void'] + }> + & Record<'sink(string,uint8[],byte[4])void' | 'sink', { + argsObj: SignaturesContractArgs['obj']['sink(string,uint8[],byte[4])void'] + argsTuple: SignaturesContractArgs['tuple']['sink(string,uint8[],byte[4])void'] + returns: SignaturesContractReturns['sink(string,uint8[],byte[4])void'] + }> + & Record<'alias(string,uint8[])void' | 'alias', { + argsObj: SignaturesContractArgs['obj']['alias(string,uint8[])void'] + argsTuple: SignaturesContractArgs['tuple']['alias(string,uint8[])void'] + returns: SignaturesContractReturns['alias(string,uint8[])void'] + }> + & Record<'with_txn(string,pay,uint8[])void' | 'with_txn', { + argsObj: SignaturesContractArgs['obj']['with_txn(string,pay,uint8[])void'] + argsTuple: SignaturesContractArgs['tuple']['with_txn(string,pay,uint8[])void'] + returns: SignaturesContractReturns['with_txn(string,pay,uint8[])void'] + }> + & Record<'with_asset(string,asset,uint8[])void' | 'with_asset', { + argsObj: SignaturesContractArgs['obj']['with_asset(string,asset,uint8[])void'] + argsTuple: SignaturesContractArgs['tuple']['with_asset(string,asset,uint8[])void'] + returns: SignaturesContractReturns['with_asset(string,asset,uint8[])void'] + }> + & Record<'with_app(string,application,uint64,uint8[])void' | 'with_app', { + argsObj: SignaturesContractArgs['obj']['with_app(string,application,uint64,uint8[])void'] + argsTuple: SignaturesContractArgs['tuple']['with_app(string,application,uint64,uint8[])void'] + returns: SignaturesContractReturns['with_app(string,application,uint64,uint8[])void'] + }> + & Record<'with_acc(string,account,uint8[])void' | 'with_acc', { + argsObj: SignaturesContractArgs['obj']['with_acc(string,account,uint8[])void'] + argsTuple: SignaturesContractArgs['tuple']['with_acc(string,account,uint8[])void'] + returns: SignaturesContractReturns['with_acc(string,account,uint8[])void'] + }> + & Record<'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))' | 'complex_sig', { + argsObj: SignaturesContractArgs['obj']['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'] + argsTuple: SignaturesContractArgs['tuple']['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'] + returns: SignaturesContractReturns['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'] + }> + & Record<'echo_resource_by_index(asset,application,account)(uint64,uint64,address)' | 'echo_resource_by_index', { + argsObj: SignaturesContractArgs['obj']['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'] + argsTuple: SignaturesContractArgs['tuple']['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'] + returns: SignaturesContractReturns['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'] + }> + & Record<'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)' | 'echo_resource_by_value', { + argsObj: SignaturesContractArgs['obj']['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'] + argsTuple: SignaturesContractArgs['tuple']['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'] + returns: SignaturesContractReturns['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type SignaturesContractSignatures = keyof SignaturesContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type SignaturesContractNonVoidMethodSignatures = keyof SignaturesContractTypes['methods'] extends infer T ? T extends keyof SignaturesContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the SignaturesContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = SignaturesContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the SignaturesContract smart contract to the method's return type + */ +export type MethodReturn = SignaturesContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type SignaturesContractCreateCallParams = + | Expand & {method: 'create'} & { onComplete?: OnApplicationComplete.NoOp } & CreateSchema> + | Expand & {method: 'create()void'} & { onComplete?: OnApplicationComplete.NoOp } & CreateSchema> +/** + * Defines arguments required for the deploy method. + */ +export type SignaturesContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: SignaturesContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the SignaturesContract smart contract + */ +export abstract class SignaturesContractParamsFactory { + /** + * Gets available create ABI call param factories + */ + static get create() { + return { + _resolveByMethod(params: TParams) { + switch(params.method) { + case 'create': + case 'create()void': + return SignaturesContractParamsFactory.create.create(params) + } + throw new Error(`Unknown ' + verb + ' method`) + }, + + /** + * Constructs create ABI call params for the SignaturesContract smart contract using the create()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + create(params: CallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.NoOp }): AppClientMethodCallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.NoOp } { + return { + ...params, + method: 'create()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + + /** + * Constructs a no op call for the sink(string,uint8[],byte[4])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static sink(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'sink(string,uint8[],byte[4])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.arr, params.args.fixedBytes], + } + } + /** + * Constructs a no op call for the alias(string,uint8[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static alias(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'alias(string,uint8[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.arr], + } + } + /** + * Constructs a no op call for the with_txn(string,pay,uint8[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static withTxn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'with_txn(string,pay,uint8[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.pay, params.args.arr], + } + } + /** + * Constructs a no op call for the with_asset(string,asset,uint8[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static withAsset(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'with_asset(string,asset,uint8[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.asset, params.args.arr], + } + } + /** + * Constructs a no op call for the with_app(string,application,uint64,uint8[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static withApp(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'with_app(string,application,uint64,uint8[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.app, params.args.appId, params.args.arr], + } + } + /** + * Constructs a no op call for the with_acc(string,account,uint8[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static withAcc(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'with_acc(string,account,uint8[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.acc, params.args.arr], + } + } + /** + * Constructs a no op call for the complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128)) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static complexSig(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))' as const, + args: Array.isArray(params.args) ? params.args : [params.args.struct1, params.args.txn, params.args.acc, params.args.five], + } + } + /** + * Constructs a no op call for the echo_resource_by_index(asset,application,account)(uint64,uint64,address) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static echoResourceByIndex(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'echo_resource_by_index(asset,application,account)(uint64,uint64,address)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset, params.args.app, params.args.acc], + } + } + /** + * Constructs a no op call for the echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static echoResourceByValue(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset, params.args.app, params.args.acc], + } + } +} + +/** + * A factory to create and deploy one or more instance of the SignaturesContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class SignaturesContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `SignaturesContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new SignaturesContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new SignaturesContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the SignaturesContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: SignaturesContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + createParams: params.createParams?.method ? SignaturesContractParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (SignaturesContractCreateCallParams & { args: Uint8Array[] }) : undefined, + }) + return { result: result.result, appClient: new SignaturesContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the SignaturesContract smart contract using the create()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create params + */ + create: (params: CallParams & AppClientCompilationParams & CreateSchema & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appFactory.params.create(SignaturesContractParamsFactory.create.create(params)) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the SignaturesContract smart contract using the create()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create transaction + */ + create: (params: CallParams & AppClientCompilationParams & CreateSchema & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appFactory.createTransaction.create(SignaturesContractParamsFactory.create.create(params)) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the SignaturesContract smart contract using an ABI method call using the create()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create result + */ + create: async (params: CallParams & AppClientCompilationParams & CreateSchema & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appFactory.send.create(SignaturesContractParamsFactory.create.create(params)) + return { result: { ...result.result, return: result.result.return as unknown as (undefined | SignaturesContractReturns['create()void']) }, appClient: new SignaturesContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the SignaturesContract smart contract + */ +export class SignaturesContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `SignaturesContractClient` + * + * @param appClient An `AppClient` instance which has been created with the SignaturesContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `SignaturesContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `SignaturesContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new SignaturesContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `SignaturesContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new SignaturesContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the SignaturesContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `sink(string,uint8[],byte[4])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + sink: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.sink(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `alias(string,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + alias: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.alias(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_txn(string,pay,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + withTxn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.withTxn(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_asset(string,asset,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + withAsset: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.withAsset(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_app(string,application,uint64,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + withApp: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.withApp(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_acc(string,account,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + withAcc: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.withAcc(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + complexSig: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.complexSig(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_index(asset,application,account)(uint64,uint64,address)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + echoResourceByIndex: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.echoResourceByIndex(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + echoResourceByValue: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.echoResourceByValue(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the SignaturesContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `sink(string,uint8[],byte[4])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + sink: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.sink(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `alias(string,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + alias: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.alias(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_txn(string,pay,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + withTxn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.withTxn(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_asset(string,asset,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + withAsset: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.withAsset(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_app(string,application,uint64,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + withApp: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.withApp(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_acc(string,account,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + withAcc: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.withAcc(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + complexSig: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.complexSig(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_index(asset,application,account)(uint64,uint64,address)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + echoResourceByIndex: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.echoResourceByIndex(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + echoResourceByValue: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.echoResourceByValue(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the SignaturesContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `sink(string,uint8[],byte[4])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + sink: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.sink(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['sink(string,uint8[],byte[4])void'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `alias(string,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + alias: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.alias(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['alias(string,uint8[])void'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_txn(string,pay,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + withTxn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.withTxn(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['with_txn(string,pay,uint8[])void'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_asset(string,asset,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + withAsset: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.withAsset(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['with_asset(string,asset,uint8[])void'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_app(string,application,uint64,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + withApp: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.withApp(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['with_app(string,application,uint64,uint8[])void'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_acc(string,account,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + withAcc: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.withAcc(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['with_acc(string,account,uint8[])void'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + complexSig: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.complexSig(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_index(asset,application,account)(uint64,uint64,address)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + echoResourceByIndex: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.echoResourceByIndex(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + echoResourceByValue: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.echoResourceByValue(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new SignaturesContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current SignaturesContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): SignaturesContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a sink(string,uint8[],byte[4])void method call against the SignaturesContract contract + */ + sink(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sink(params))) + return this + }, + /** + * Add a alias(string,uint8[])void method call against the SignaturesContract contract + */ + alias(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.alias(params))) + return this + }, + /** + * Add a with_txn(string,pay,uint8[])void method call against the SignaturesContract contract + */ + withTxn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withTxn(params))) + return this + }, + /** + * Add a with_asset(string,asset,uint8[])void method call against the SignaturesContract contract + */ + withAsset(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withAsset(params))) + return this + }, + /** + * Add a with_app(string,application,uint64,uint8[])void method call against the SignaturesContract contract + */ + withApp(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withApp(params))) + return this + }, + /** + * Add a with_acc(string,account,uint8[])void method call against the SignaturesContract contract + */ + withAcc(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withAcc(params))) + return this + }, + /** + * Add a complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128)) method call against the SignaturesContract contract + */ + complexSig(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.complexSig(params))) + return this + }, + /** + * Add a echo_resource_by_index(asset,application,account)(uint64,uint64,address) method call against the SignaturesContract contract + */ + echoResourceByIndex(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.echoResourceByIndex(params))) + return this + }, + /** + * Add a echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address) method call against the SignaturesContract contract + */ + echoResourceByValue(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.echoResourceByValue(params))) + return this + }, + /** + * Add a clear state call to the SignaturesContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as SignaturesContractComposer + } +} +export type SignaturesContractComposer = { + /** + * Calls the sink(string,uint8[],byte[4])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + sink(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['sink(string,uint8[],byte[4])void'] | undefined]> + + /** + * Calls the alias(string,uint8[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + alias(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['alias(string,uint8[])void'] | undefined]> + + /** + * Calls the with_txn(string,pay,uint8[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + withTxn(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['with_txn(string,pay,uint8[])void'] | undefined]> + + /** + * Calls the with_asset(string,asset,uint8[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + withAsset(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['with_asset(string,asset,uint8[])void'] | undefined]> + + /** + * Calls the with_app(string,application,uint64,uint8[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + withApp(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['with_app(string,application,uint64,uint8[])void'] | undefined]> + + /** + * Calls the with_acc(string,account,uint8[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + withAcc(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['with_acc(string,account,uint8[])void'] | undefined]> + + /** + * Calls the complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128)) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + complexSig(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'] | undefined]> + + /** + * Calls the echo_resource_by_index(asset,application,account)(uint64,uint64,address) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + echoResourceByIndex(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'] | undefined]> + + /** + * Calls the echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + echoResourceByValue(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the SignaturesContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): SignaturesContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): SignaturesContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type SignaturesContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGet.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGet.ts new file mode 100644 index 0000000..62c4b5b --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGet.ts @@ -0,0 +1,1319 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"arcs":[],"name":"StateAcctParamsGet","structs":{},"methods":[{"name":"verify_acct_balance","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_min_balance","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_auth_addr","args":[{"name":"a","type":"account"}],"returns":{"type":"byte[]"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_num_uint","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_num_byte_slice","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_extra_app_pages","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_apps_created","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_apps_opted_in","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_assets_created","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_assets","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_boxes","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_box_bytes","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}}],"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LmFwcHJvdmFsX3Byb2dyYW06CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDE2CiAgICBtZXRob2QgInZlcmlmeV9hY2N0X2JhbGFuY2UoYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X21pbl9iYWxhbmNlKGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF9hdXRoX2FkZHIoYWNjb3VudClieXRlW10iCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50KGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhY2NvdW50KXVpbnQ2NCIKICAgIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzKGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQoYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4oYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMoYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2JveGVzKGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMoYWNjb3VudCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3ZlcmlmeV9hY2N0X2JhbGFuY2Vfcm91dGVAMiBtYWluX3ZlcmlmeV9hY2N0X21pbl9iYWxhbmNlX3JvdXRlQDMgbWFpbl92ZXJpZnlfYWNjdF9hdXRoX2FkZHJfcm91dGVANCBtYWluX3ZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50X3JvdXRlQDUgbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZV9yb3V0ZUA2IG1haW5fdmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzX3JvdXRlQDcgbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWRfcm91dGVAOCBtYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW5fcm91dGVAOSBtYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkX3JvdXRlQDEwIG1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX3JvdXRlQDExIG1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXNfcm91dGVAMTIgbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXNfcm91dGVAMTMKICAgIGVyciAvLyByZWplY3QgdHJhbnNhY3Rpb24KCm1haW5fdmVyaWZ5X2FjY3RfYmFsYW5jZV9yb3V0ZUAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXQoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X2JhbGFuY2UKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfbWluX2JhbGFuY2Vfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF9taW5fYmFsYW5jZQogICAgaXRvYgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl92ZXJpZnlfYWNjdF9hdXRoX2FkZHJfcm91dGVANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF9hdXRoX2FkZHIKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50X3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2Vfcm91dGVANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZQogICAgaXRvYgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXNfcm91dGVANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkX3JvdXRlQDg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW5fcm91dGVAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX29wdGVkX2luCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkX3JvdXRlQDEwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXQoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19yb3V0ZUAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXNfcm91dGVAMTI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXMKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYm94X2J5dGVzX3JvdXRlQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXQoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlcwogICAgaXRvYgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIHJlamVjdCB0cmFuc2FjdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50IDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXQudmVyaWZ5X2FjY3RfYmFsYW5jZShhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4LTE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9hY2N0X2JhbGFuY2Uoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMAogICAgLy8gYmFsYW5jZSwgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9iYWxhbmNlKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBiYWxhbmNlCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LnZlcmlmeV9hY2N0X21pbl9iYWxhbmNlKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X21pbl9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzLTI0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9hY2N0X21pbl9iYWxhbmNlKHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhbGdvcHkuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUKICAgIC8vIG1pbl9iYWxhbmNlLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X21pbl9iYWxhbmNlKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjYKICAgIC8vIHJldHVybiBtaW5fYmFsYW5jZQogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF9hdXRoX2FkZHIoYTogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYWNjdF9hdXRoX2FkZHI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgtMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfYXV0aF9hZGRyKHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhbGdvcHkuQnl0ZXM6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMAogICAgLy8gYXV0aF9hZGRyLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2F1dGhfYWRkcihhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEF1dGhBZGRyCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMQogICAgLy8gcmV0dXJuIGF1dGhfYWRkci5ieXRlcwogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludChhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMy0zNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludChzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM1CiAgICAvLyB0b3RhbF9udW1fdWludCwgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9udW1fdWludChhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtVWludAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzYKICAgIC8vIHJldHVybiB0b3RhbF9udW1fdWludAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOC0zOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwCiAgICAvLyB0b3RhbF9udW1fYnl0ZV9zbGljZSwgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MQogICAgLy8gcmV0dXJuIHRvdGFsX251bV9ieXRlX3NsaWNlCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LnZlcmlmeV9hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlcyhhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDMtNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzKHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhbGdvcHkuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDUKICAgIC8vIHRvdGFsX2V4dHJhX2FwcF9wYWdlcywgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEV4dHJhQXBwUGFnZXMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2CiAgICAvLyByZXR1cm4gdG90YWxfZXh0cmFfYXBwX3BhZ2VzCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgtNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkKHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhbGdvcHkuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTAKICAgIC8vIHRvdGFsX2FwcHNfY3JlYXRlZCwgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNDcmVhdGVkCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MQogICAgLy8gcmV0dXJuIHRvdGFsX2FwcHNfY3JlYXRlZAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF90b3RhbF9hcHBzX29wdGVkX2luKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTMtNTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbihzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1CiAgICAvLyB0b3RhbF9hcHBzX29wdGVkX2luLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4oYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNPcHRlZEluCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NgogICAgLy8gcmV0dXJuIHRvdGFsX2FwcHNfb3B0ZWRfaW4KICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXQudmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTgtNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MAogICAgLy8gdG90YWxfYXNzZXRzX2NyZWF0ZWQsIF92YWwgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFzc2V0c0NyZWF0ZWQKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxCiAgICAvLyByZXR1cm4gdG90YWxfYXNzZXRzX2NyZWF0ZWQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXQudmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0czoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2My02NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NQogICAgLy8gdG90YWxfYXNzZXRzLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0cyhhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXNzZXRzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NgogICAgLy8gcmV0dXJuIHRvdGFsX2Fzc2V0cwogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF90b3RhbF9ib3hlcyhhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9ib3hlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OC02OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9ib3hlcyhzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwCiAgICAvLyB0b3RhbF9ib3hlcywgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9ib3hlcyhhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94ZXMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxCiAgICAvLyByZXR1cm4gdG90YWxfYm94ZXMKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXQudmVyaWZ5X2FjY3RfdG90YWxfYm94X2J5dGVzKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3My03NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NQogICAgLy8gdG90YWxfYm94X2J5dGVzLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveF9ieXRlcyhhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94Qnl0ZXMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyByZXR1cm4gdG90YWxfYm94X2J5dGVzCiAgICByZXRzdWIK","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgaW50IDEKICAgIHJldHVybgo="},"bareActions":{"create":["NoOp"],"call":[]}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAcctParamsGet contract + */ +export type StateAcctParamsGetArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_acct_balance(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_min_balance(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_auth_addr(account)byte[]': { + a: Uint8Array | string + } + 'verify_acct_total_num_uint(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_num_byte_slice(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_extra_app_pages(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_apps_created(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_apps_opted_in(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_assets_created(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_assets(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_boxes(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_box_bytes(account)uint64': { + a: Uint8Array | string + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_acct_balance(account)uint64': [a: Uint8Array | string] + 'verify_acct_min_balance(account)uint64': [a: Uint8Array | string] + 'verify_acct_auth_addr(account)byte[]': [a: Uint8Array | string] + 'verify_acct_total_num_uint(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_num_byte_slice(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_extra_app_pages(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_apps_created(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_apps_opted_in(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_assets_created(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_assets(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_boxes(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_box_bytes(account)uint64': [a: Uint8Array | string] + } +} + +/** + * The return type for each method + */ +export type StateAcctParamsGetReturns = { + 'verify_acct_balance(account)uint64': bigint + 'verify_acct_min_balance(account)uint64': bigint + 'verify_acct_auth_addr(account)byte[]': Uint8Array + 'verify_acct_total_num_uint(account)uint64': bigint + 'verify_acct_total_num_byte_slice(account)uint64': bigint + 'verify_acct_total_extra_app_pages(account)uint64': bigint + 'verify_acct_total_apps_created(account)uint64': bigint + 'verify_acct_total_apps_opted_in(account)uint64': bigint + 'verify_acct_total_assets_created(account)uint64': bigint + 'verify_acct_total_assets(account)uint64': bigint + 'verify_acct_total_boxes(account)uint64': bigint + 'verify_acct_total_box_bytes(account)uint64': bigint +} + +/** + * Defines the types of available calls and state of the StateAcctParamsGet smart contract. + */ +export type StateAcctParamsGetTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_acct_balance(account)uint64' | 'verify_acct_balance', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_balance(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_balance(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_balance(account)uint64'] + }> + & Record<'verify_acct_min_balance(account)uint64' | 'verify_acct_min_balance', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_min_balance(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_min_balance(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_min_balance(account)uint64'] + }> + & Record<'verify_acct_auth_addr(account)byte[]' | 'verify_acct_auth_addr', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_auth_addr(account)byte[]'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_auth_addr(account)byte[]'] + returns: StateAcctParamsGetReturns['verify_acct_auth_addr(account)byte[]'] + }> + & Record<'verify_acct_total_num_uint(account)uint64' | 'verify_acct_total_num_uint', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_num_uint(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_num_uint(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_num_uint(account)uint64'] + }> + & Record<'verify_acct_total_num_byte_slice(account)uint64' | 'verify_acct_total_num_byte_slice', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_num_byte_slice(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_num_byte_slice(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_num_byte_slice(account)uint64'] + }> + & Record<'verify_acct_total_extra_app_pages(account)uint64' | 'verify_acct_total_extra_app_pages', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_extra_app_pages(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_extra_app_pages(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_extra_app_pages(account)uint64'] + }> + & Record<'verify_acct_total_apps_created(account)uint64' | 'verify_acct_total_apps_created', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_apps_created(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_apps_created(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_apps_created(account)uint64'] + }> + & Record<'verify_acct_total_apps_opted_in(account)uint64' | 'verify_acct_total_apps_opted_in', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_apps_opted_in(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_apps_opted_in(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_apps_opted_in(account)uint64'] + }> + & Record<'verify_acct_total_assets_created(account)uint64' | 'verify_acct_total_assets_created', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_assets_created(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_assets_created(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_assets_created(account)uint64'] + }> + & Record<'verify_acct_total_assets(account)uint64' | 'verify_acct_total_assets', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_assets(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_assets(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_assets(account)uint64'] + }> + & Record<'verify_acct_total_boxes(account)uint64' | 'verify_acct_total_boxes', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_boxes(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_boxes(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_boxes(account)uint64'] + }> + & Record<'verify_acct_total_box_bytes(account)uint64' | 'verify_acct_total_box_bytes', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_box_bytes(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_box_bytes(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_box_bytes(account)uint64'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAcctParamsGetSignatures = keyof StateAcctParamsGetTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateAcctParamsGetNonVoidMethodSignatures = keyof StateAcctParamsGetTypes['methods'] extends infer T ? T extends keyof StateAcctParamsGetTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAcctParamsGet smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAcctParamsGetTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAcctParamsGet smart contract to the method's return type + */ +export type MethodReturn = StateAcctParamsGetTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAcctParamsGetCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAcctParamsGetDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAcctParamsGetCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAcctParamsGet smart contract + */ +export abstract class StateAcctParamsGetParamsFactory { + /** + * Constructs a no op call for the verify_acct_balance(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctBalance(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_balance(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_min_balance(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctMinBalance(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_min_balance(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_auth_addr(account)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctAuthAddr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_auth_addr(account)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_num_uint(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalNumUint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_num_uint(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_num_byte_slice(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalNumByteSlice(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_num_byte_slice(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_extra_app_pages(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalExtraAppPages(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_extra_app_pages(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_apps_created(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAppsCreated(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_apps_created(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_apps_opted_in(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAppsOptedIn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_apps_opted_in(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_assets_created(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAssetsCreated(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_assets_created(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_assets(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAssets(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_assets(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_boxes(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_boxes(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_box_bytes(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalBoxBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_box_bytes(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateAcctParamsGet smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAcctParamsGetFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAcctParamsGetFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAcctParamsGetClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAcctParamsGetClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAcctParamsGet smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAcctParamsGetDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAcctParamsGetClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAcctParamsGet smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAcctParamsGet smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAcctParamsGet smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAcctParamsGetClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAcctParamsGet smart contract + */ +export class StateAcctParamsGetClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAcctParamsGetClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAcctParamsGet app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAcctParamsGetClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAcctParamsGetClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAcctParamsGetClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAcctParamsGetClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAcctParamsGetClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGet smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_min_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctMinBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctMinBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_auth_addr(account)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctAuthAddr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctAuthAddr(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumUint(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalExtraAppPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalExtraAppPages(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAppsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAppsOptedIn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsOptedIn(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAssetsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssetsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAssets: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssets(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxes(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalBoxBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxBytes(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGet smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_min_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctMinBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctMinBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_auth_addr(account)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctAuthAddr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctAuthAddr(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumUint(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalExtraAppPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalExtraAppPages(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAppsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAppsOptedIn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsOptedIn(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAssetsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssetsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAssets: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssets(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxes(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalBoxBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxBytes(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGet smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctBalance: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctBalance(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_balance(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_min_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctMinBalance: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctMinBalance(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_min_balance(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_auth_addr(account)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctAuthAddr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctAuthAddr(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_auth_addr(account)byte[]'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalNumUint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumUint(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_num_uint(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalNumByteSlice: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumByteSlice(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_num_byte_slice(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalExtraAppPages: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalExtraAppPages(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_extra_app_pages(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAppsCreated: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsCreated(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_apps_created(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAppsOptedIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsOptedIn(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_apps_opted_in(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAssetsCreated: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssetsCreated(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_assets_created(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAssets: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssets(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_assets(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxes(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_boxes(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalBoxBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_box_bytes(account)uint64'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAcctParamsGetClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAcctParamsGet app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAcctParamsGetComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_acct_balance(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctBalance(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctBalance(params))) + return this + }, + /** + * Add a verify_acct_min_balance(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctMinBalance(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctMinBalance(params))) + return this + }, + /** + * Add a verify_acct_auth_addr(account)byte[] method call against the StateAcctParamsGet contract + */ + verifyAcctAuthAddr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctAuthAddr(params))) + return this + }, + /** + * Add a verify_acct_total_num_uint(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalNumUint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalNumUint(params))) + return this + }, + /** + * Add a verify_acct_total_num_byte_slice(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalNumByteSlice(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalNumByteSlice(params))) + return this + }, + /** + * Add a verify_acct_total_extra_app_pages(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalExtraAppPages(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalExtraAppPages(params))) + return this + }, + /** + * Add a verify_acct_total_apps_created(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalAppsCreated(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAppsCreated(params))) + return this + }, + /** + * Add a verify_acct_total_apps_opted_in(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalAppsOptedIn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAppsOptedIn(params))) + return this + }, + /** + * Add a verify_acct_total_assets_created(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalAssetsCreated(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAssetsCreated(params))) + return this + }, + /** + * Add a verify_acct_total_assets(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalAssets(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAssets(params))) + return this + }, + /** + * Add a verify_acct_total_boxes(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalBoxes(params))) + return this + }, + /** + * Add a verify_acct_total_box_bytes(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalBoxBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalBoxBytes(params))) + return this + }, + /** + * Add a clear state call to the StateAcctParamsGet contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAcctParamsGetComposer + } +} +export type StateAcctParamsGetComposer = { + /** + * Calls the verify_acct_balance(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctBalance(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_balance(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_min_balance(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctMinBalance(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_min_balance(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_auth_addr(account)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctAuthAddr(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_auth_addr(account)byte[]'] | undefined]> + + /** + * Calls the verify_acct_total_num_uint(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalNumUint(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_num_uint(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_num_byte_slice(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalNumByteSlice(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_num_byte_slice(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_extra_app_pages(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalExtraAppPages(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_extra_app_pages(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_apps_created(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAppsCreated(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_apps_created(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_apps_opted_in(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAppsOptedIn(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_apps_opted_in(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_assets_created(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAssetsCreated(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_assets_created(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_assets(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAssets(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_assets(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_boxes(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalBoxes(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_boxes(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_box_bytes(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalBoxBytes(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_box_bytes(account)uint64'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGet smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAcctParamsGetComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAcctParamsGetComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAcctParamsGetComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGetContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGetContract.ts new file mode 100644 index 0000000..01c1c8f --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGetContract.ts @@ -0,0 +1,1526 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAcctParamsGetContract","structs":{},"methods":[{"name":"verify_acct_balance","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_min_balance","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_auth_addr","args":[{"type":"account","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_num_uint","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_num_byte_slice","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_extra_app_pages","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_apps_created","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_apps_opted_in","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_assets_created","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_assets","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_boxes","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_box_bytes","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_incentive_eligible","args":[{"type":"account","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_last_heartbeat","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_last_proposed","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[171,225],"errorMessage":"account funded"},{"pc":[175],"errorMessage":"expected Account balance to match"},{"pc":[229],"errorMessage":"expected Account min_balance to match"},{"pc":[166,220,273,301,330,359,388,417,446,475,504,533,562,598,627],"errorMessage":"expected funded by index to match"},{"pc":[190],"errorMessage":"expected op.balance by index to match"},{"pc":[181],"errorMessage":"expected op.balance to match"},{"pc":[244],"errorMessage":"expected op.min_balance by index to match"},{"pc":[235],"errorMessage":"expected op.min_balance to match"},{"pc":[164,218,271,299,328,357,386,415,444,473,502,531,560,596,625],"errorMessage":"expected value by index to match"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNAogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NWY1YjQzZTQgMHg3M2RjOTNjNyAweDU2MjZkZmViIDB4ZGM4YTI1YmYgMHgxOThlYmQ4YyAweDIzMDFhYjI2IDB4OWY2OGZjYTYgMHhhOTc1YzJkMSAweGQxZTA0ODAxIDB4YjY5NjZiZTUgMHgxOTVkNTQxOCAweDZhZGFlM2YxIDB4ZGY4Y2ZlZTUgMHg2YWQ3MGQyMSAweDE3MzVmZDIyIC8vIG1ldGhvZCAidmVyaWZ5X2FjY3RfYmFsYW5jZShhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfbWluX2JhbGFuY2UoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X2F1dGhfYWRkcihhY2NvdW50KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50KGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4oYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2JveGVzKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X2luY2VudGl2ZV9lbGlnaWJsZShhY2NvdW50KWJvb2wiLCBtZXRob2QgInZlcmlmeV9hY2N0X2xhc3RfaGVhcnRiZWF0KGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF9sYXN0X3Byb3Bvc2VkKGFjY291bnQpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X2FjY3RfYmFsYW5jZSB2ZXJpZnlfYWNjdF9taW5fYmFsYW5jZSB2ZXJpZnlfYWNjdF9hdXRoX2FkZHIgdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQgdmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2UgdmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzIHZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZCB2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX29wdGVkX2luIHZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkIHZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0cyB2ZXJpZnlfYWNjdF90b3RhbF9ib3hlcyB2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMgdmVyaWZ5X2FjY3RfaW5jZW50aXZlX2VsaWdpYmxlIHZlcmlmeV9hY2N0X2xhc3RfaGVhcnRiZWF0IHZlcmlmeV9hY2N0X2xhc3RfcHJvcG9zZWQKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyMjoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2JhbGFuY2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjcKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYmFsYW5jZShhKQogICAgZHVwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYmFsYW5jZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYS5iYWxhbmNlLCAiZXhwZWN0ZWQgQWNjb3VudCBiYWxhbmNlIHRvIG1hdGNoIgogICAgZGlnIDEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBBY2NvdW50IGJhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMgogICAgLy8gYXNzZXJ0IHZhbHVlID09IGFsZ29weS5vcC5iYWxhbmNlKGEpLCAiZXhwZWN0ZWQgb3AuYmFsYW5jZSB0byBtYXRjaCIKICAgIHN3YXAKICAgIGJhbGFuY2UKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG9wLmJhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzMtMzUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhbGdvcHkub3AuYmFsYW5jZSgKICAgIC8vICAgICBfZ2V0XzFzdF9yZWZfaW5kZXgoKQogICAgLy8gKSwgImV4cGVjdGVkIG9wLmJhbGFuY2UgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBiYWxhbmNlCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvcC5iYWxhbmNlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF9taW5fYmFsYW5jZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X21pbl9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDAKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbWluX2JhbGFuY2UoYSkKICAgIGR1cAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQxCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X21pbl9iYWxhbmNlKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDIKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhLm1pbl9iYWxhbmNlLCAiZXhwZWN0ZWQgQWNjb3VudCBtaW5fYmFsYW5jZSB0byBtYXRjaCIKICAgIGRpZyAxCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgQWNjb3VudCBtaW5fYmFsYW5jZSB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYWxnb3B5Lm9wLm1pbl9iYWxhbmNlKGEpLCAiZXhwZWN0ZWQgb3AubWluX2JhbGFuY2UgdG8gbWF0Y2giCiAgICBzd2FwCiAgICBtaW5fYmFsYW5jZQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgb3AubWluX2JhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDYtNDgKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhbGdvcHkub3AubWluX2JhbGFuY2UoCiAgICAvLyAgICAgX2dldF8xc3RfcmVmX2luZGV4KCkKICAgIC8vICksICJleHBlY3RlZCBvcC5taW5fYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaCIKICAgIG1pbl9iYWxhbmNlCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvcC5taW5fYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfYXV0aF9hZGRyW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfYXV0aF9hZGRyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTMKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYXV0aF9hZGRyKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEF1dGhBZGRyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2F1dGhfYWRkcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QXV0aEFkZHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTYKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9udW1fdWludChhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbE51bVVpbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfbnVtX3VpbnQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtVWludAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwLTcyCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlKAogICAgLy8gICAgIF9nZXRfMXN0X3JlZl9pbmRleCgpCiAgICAvLyApCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3OQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxFeHRyYUFwcFBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjgwLTgyCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlcygKICAgIC8vICAgICBfZ2V0XzFzdF9yZWZfaW5kZXgoKQogICAgLy8gKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEV4dHJhQXBwUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo4MwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6ODQKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNDcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjkwCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBcHBzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5MgogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hcHBzX29wdGVkX2luKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXBwc09wdGVkSW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXBwc19vcHRlZF9pbihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBcHBzT3B0ZWRJbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMDAKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTA1CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXNzZXRzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMDYtMTA4CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKAogICAgLy8gICAgIF9nZXRfMXN0X3JlZl9pbmRleCgpCiAgICAvLyApCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXNzZXRzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTEwCiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExNQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hc3NldHMoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTE2CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0cyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMTcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExOAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTIzCiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveGVzKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI0CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveGVzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEJveGVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjYKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTMxCiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveF9ieXRlcyhhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEJveEJ5dGVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9ib3hfYnl0ZXMoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94Qnl0ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2luY2VudGl2ZV9lbGlnaWJsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X2luY2VudGl2ZV9lbGlnaWJsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfaW5jZW50aXZlX2VsaWdpYmxlKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEluY2VudGl2ZUVsaWdpYmxlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE0MAogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9pbmNlbnRpdmVfZWxpZ2libGUoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEluY2VudGl2ZUVsaWdpYmxlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTQxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDIKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIHB1c2hpbnQgMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfbGFzdF9oZWFydGJlYXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF9sYXN0X2hlYXJ0YmVhdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDcKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbGFzdF9oZWFydGJlYXQoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TGFzdEhlYXJ0YmVhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbGFzdF9oZWFydGJlYXQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdExhc3RIZWFydGJlYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDkKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1MAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2xhc3RfcHJvcG9zZWRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF9sYXN0X3Byb3Bvc2VkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1NQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9sYXN0X3Byb3Bvc2VkKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdExhc3RQcm9wb3NlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTYKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbGFzdF9wcm9wb3NlZChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TGFzdFByb3Bvc2VkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTU3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTgKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyABASYBBBUffHUxG0EAeDEZFEQxGESCDwRfW0PkBHPck8cEVibf6wTciiW/BBmOvYwEIwGrJgSfaPymBKl1wtEE0eBIAQS2lmvlBBldVBgEatrj8QTfjP7lBGrXDSEEFzX9IjYaAI4PAAkAPwB1AJEArgDLAOgBBQEiAT8BXAF5AZYBugHXADEZFDEYFBBDNhoBF8AcSXMANhoBF3MASwNPAhJEEkRLAXMAREsBEkRMYEsBEkQ2GgEXYEsBEkQWKExQsCJDNhoBF8AcSXMBNhoBF3MBSwNPAhJEEkRLAXMBREsBEkRMeEsBEkQ2GgEXeEsBEkQWKExQsCJDNhoBF8AccwI2GgEXcwJLA08CEkQSRChMULAiQzYaARfAHHMDNhoBF3MDSwNPAhJEEkQWKExQsCJDNhoBF8AccwQ2GgEXcwRLA08CEkQSRBYoTFCwIkM2GgEXwBxzBTYaARdzBUsDTwISRBJEFihMULAiQzYaARfAHHMGNhoBF3MGSwNPAhJEEkQWKExQsCJDNhoBF8Accwc2GgEXcwdLA08CEkQSRBYoTFCwIkM2GgEXwBxzCDYaARdzCEsDTwISRBJEFihMULAiQzYaARfAHHMJNhoBF3MJSwNPAhJEEkQWKExQsCJDNhoBF8Accwo2GgEXcwpLA08CEkQSRBYoTFCwIkM2GgEXwBxzCzYaARdzC0sDTwISRBJEFihMULAiQzYaARfAHHMMNhoBF3MMSwNPAhJEEkSAAQCBAE8CVChMULAiQzYaARfAHHMONhoBF3MOSwNPAhJEEkQWKExQsCJDNhoBF8Accw02GgEXcw1LA08CEkQSRBYoTFCwIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAcctParamsGetContract contract + */ +export type StateAcctParamsGetContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_acct_balance(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_min_balance(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_auth_addr(account)address': { + a: Uint8Array | string + } + 'verify_acct_total_num_uint(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_num_byte_slice(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_extra_app_pages(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_apps_created(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_apps_opted_in(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_assets_created(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_assets(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_boxes(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_box_bytes(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_incentive_eligible(account)bool': { + a: Uint8Array | string + } + 'verify_acct_last_heartbeat(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_last_proposed(account)uint64': { + a: Uint8Array | string + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_acct_balance(account)uint64': [a: Uint8Array | string] + 'verify_acct_min_balance(account)uint64': [a: Uint8Array | string] + 'verify_acct_auth_addr(account)address': [a: Uint8Array | string] + 'verify_acct_total_num_uint(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_num_byte_slice(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_extra_app_pages(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_apps_created(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_apps_opted_in(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_assets_created(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_assets(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_boxes(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_box_bytes(account)uint64': [a: Uint8Array | string] + 'verify_acct_incentive_eligible(account)bool': [a: Uint8Array | string] + 'verify_acct_last_heartbeat(account)uint64': [a: Uint8Array | string] + 'verify_acct_last_proposed(account)uint64': [a: Uint8Array | string] + } +} + +/** + * The return type for each method + */ +export type StateAcctParamsGetContractReturns = { + 'verify_acct_balance(account)uint64': bigint + 'verify_acct_min_balance(account)uint64': bigint + 'verify_acct_auth_addr(account)address': string + 'verify_acct_total_num_uint(account)uint64': bigint + 'verify_acct_total_num_byte_slice(account)uint64': bigint + 'verify_acct_total_extra_app_pages(account)uint64': bigint + 'verify_acct_total_apps_created(account)uint64': bigint + 'verify_acct_total_apps_opted_in(account)uint64': bigint + 'verify_acct_total_assets_created(account)uint64': bigint + 'verify_acct_total_assets(account)uint64': bigint + 'verify_acct_total_boxes(account)uint64': bigint + 'verify_acct_total_box_bytes(account)uint64': bigint + 'verify_acct_incentive_eligible(account)bool': boolean + 'verify_acct_last_heartbeat(account)uint64': bigint + 'verify_acct_last_proposed(account)uint64': bigint +} + +/** + * Defines the types of available calls and state of the StateAcctParamsGetContract smart contract. + */ +export type StateAcctParamsGetContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_acct_balance(account)uint64' | 'verify_acct_balance', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_balance(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_balance(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_balance(account)uint64'] + }> + & Record<'verify_acct_min_balance(account)uint64' | 'verify_acct_min_balance', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_min_balance(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_min_balance(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_min_balance(account)uint64'] + }> + & Record<'verify_acct_auth_addr(account)address' | 'verify_acct_auth_addr', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_auth_addr(account)address'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_auth_addr(account)address'] + returns: StateAcctParamsGetContractReturns['verify_acct_auth_addr(account)address'] + }> + & Record<'verify_acct_total_num_uint(account)uint64' | 'verify_acct_total_num_uint', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_num_uint(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_num_uint(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_num_uint(account)uint64'] + }> + & Record<'verify_acct_total_num_byte_slice(account)uint64' | 'verify_acct_total_num_byte_slice', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_num_byte_slice(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_num_byte_slice(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_num_byte_slice(account)uint64'] + }> + & Record<'verify_acct_total_extra_app_pages(account)uint64' | 'verify_acct_total_extra_app_pages', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_extra_app_pages(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_extra_app_pages(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_extra_app_pages(account)uint64'] + }> + & Record<'verify_acct_total_apps_created(account)uint64' | 'verify_acct_total_apps_created', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_apps_created(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_apps_created(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_apps_created(account)uint64'] + }> + & Record<'verify_acct_total_apps_opted_in(account)uint64' | 'verify_acct_total_apps_opted_in', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_apps_opted_in(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_apps_opted_in(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_apps_opted_in(account)uint64'] + }> + & Record<'verify_acct_total_assets_created(account)uint64' | 'verify_acct_total_assets_created', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_assets_created(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_assets_created(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_assets_created(account)uint64'] + }> + & Record<'verify_acct_total_assets(account)uint64' | 'verify_acct_total_assets', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_assets(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_assets(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_assets(account)uint64'] + }> + & Record<'verify_acct_total_boxes(account)uint64' | 'verify_acct_total_boxes', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_boxes(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_boxes(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_boxes(account)uint64'] + }> + & Record<'verify_acct_total_box_bytes(account)uint64' | 'verify_acct_total_box_bytes', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_box_bytes(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_box_bytes(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_box_bytes(account)uint64'] + }> + & Record<'verify_acct_incentive_eligible(account)bool' | 'verify_acct_incentive_eligible', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_incentive_eligible(account)bool'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_incentive_eligible(account)bool'] + returns: StateAcctParamsGetContractReturns['verify_acct_incentive_eligible(account)bool'] + }> + & Record<'verify_acct_last_heartbeat(account)uint64' | 'verify_acct_last_heartbeat', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_last_heartbeat(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_last_heartbeat(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_last_heartbeat(account)uint64'] + }> + & Record<'verify_acct_last_proposed(account)uint64' | 'verify_acct_last_proposed', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_last_proposed(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_last_proposed(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_last_proposed(account)uint64'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAcctParamsGetContractSignatures = keyof StateAcctParamsGetContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateAcctParamsGetContractNonVoidMethodSignatures = keyof StateAcctParamsGetContractTypes['methods'] extends infer T ? T extends keyof StateAcctParamsGetContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAcctParamsGetContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAcctParamsGetContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAcctParamsGetContract smart contract to the method's return type + */ +export type MethodReturn = StateAcctParamsGetContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAcctParamsGetContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAcctParamsGetContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAcctParamsGetContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAcctParamsGetContract smart contract + */ +export abstract class StateAcctParamsGetContractParamsFactory { + /** + * Constructs a no op call for the verify_acct_balance(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctBalance(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_balance(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_min_balance(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctMinBalance(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_min_balance(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_auth_addr(account)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctAuthAddr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_auth_addr(account)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_num_uint(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalNumUint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_num_uint(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_num_byte_slice(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalNumByteSlice(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_num_byte_slice(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_extra_app_pages(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalExtraAppPages(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_extra_app_pages(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_apps_created(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAppsCreated(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_apps_created(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_apps_opted_in(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAppsOptedIn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_apps_opted_in(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_assets_created(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAssetsCreated(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_assets_created(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_assets(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAssets(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_assets(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_boxes(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_boxes(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_box_bytes(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalBoxBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_box_bytes(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_incentive_eligible(account)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctIncentiveEligible(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_incentive_eligible(account)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_last_heartbeat(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctLastHeartbeat(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_last_heartbeat(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_last_proposed(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctLastProposed(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_last_proposed(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateAcctParamsGetContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAcctParamsGetContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAcctParamsGetContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAcctParamsGetContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAcctParamsGetContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAcctParamsGetContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAcctParamsGetContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAcctParamsGetContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAcctParamsGetContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAcctParamsGetContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAcctParamsGetContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAcctParamsGetContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAcctParamsGetContract smart contract + */ +export class StateAcctParamsGetContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAcctParamsGetContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAcctParamsGetContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAcctParamsGetContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAcctParamsGetContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAcctParamsGetContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAcctParamsGetContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAcctParamsGetContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGetContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_min_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctMinBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctMinBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_auth_addr(account)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctAuthAddr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctAuthAddr(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumUint(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalExtraAppPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalExtraAppPages(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAppsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAppsOptedIn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsOptedIn(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAssetsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssetsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAssets: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssets(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxes(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalBoxBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxBytes(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_incentive_eligible(account)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctIncentiveEligible: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctIncentiveEligible(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_heartbeat(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctLastHeartbeat: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastHeartbeat(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_proposed(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctLastProposed: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastProposed(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGetContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_min_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctMinBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctMinBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_auth_addr(account)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctAuthAddr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctAuthAddr(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumUint(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalExtraAppPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalExtraAppPages(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAppsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAppsOptedIn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsOptedIn(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAssetsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssetsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAssets: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssets(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxes(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalBoxBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxBytes(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_incentive_eligible(account)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctIncentiveEligible: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctIncentiveEligible(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_heartbeat(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctLastHeartbeat: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastHeartbeat(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_proposed(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctLastProposed: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastProposed(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGetContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctBalance: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctBalance(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_balance(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_min_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctMinBalance: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctMinBalance(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_min_balance(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_auth_addr(account)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctAuthAddr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctAuthAddr(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_auth_addr(account)address'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalNumUint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumUint(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_num_uint(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalNumByteSlice: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumByteSlice(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_num_byte_slice(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalExtraAppPages: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalExtraAppPages(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_extra_app_pages(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAppsCreated: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsCreated(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_apps_created(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAppsOptedIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsOptedIn(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_apps_opted_in(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAssetsCreated: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssetsCreated(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_assets_created(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAssets: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssets(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_assets(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxes(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_boxes(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalBoxBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_box_bytes(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_incentive_eligible(account)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctIncentiveEligible: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctIncentiveEligible(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_incentive_eligible(account)bool'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_heartbeat(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctLastHeartbeat: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastHeartbeat(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_last_heartbeat(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_proposed(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctLastProposed: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastProposed(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_last_proposed(account)uint64'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAcctParamsGetContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAcctParamsGetContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAcctParamsGetContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_acct_balance(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctBalance(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctBalance(params))) + return this + }, + /** + * Add a verify_acct_min_balance(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctMinBalance(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctMinBalance(params))) + return this + }, + /** + * Add a verify_acct_auth_addr(account)address method call against the StateAcctParamsGetContract contract + */ + verifyAcctAuthAddr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctAuthAddr(params))) + return this + }, + /** + * Add a verify_acct_total_num_uint(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalNumUint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalNumUint(params))) + return this + }, + /** + * Add a verify_acct_total_num_byte_slice(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalNumByteSlice(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalNumByteSlice(params))) + return this + }, + /** + * Add a verify_acct_total_extra_app_pages(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalExtraAppPages(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalExtraAppPages(params))) + return this + }, + /** + * Add a verify_acct_total_apps_created(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalAppsCreated(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAppsCreated(params))) + return this + }, + /** + * Add a verify_acct_total_apps_opted_in(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalAppsOptedIn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAppsOptedIn(params))) + return this + }, + /** + * Add a verify_acct_total_assets_created(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalAssetsCreated(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAssetsCreated(params))) + return this + }, + /** + * Add a verify_acct_total_assets(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalAssets(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAssets(params))) + return this + }, + /** + * Add a verify_acct_total_boxes(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalBoxes(params))) + return this + }, + /** + * Add a verify_acct_total_box_bytes(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalBoxBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalBoxBytes(params))) + return this + }, + /** + * Add a verify_acct_incentive_eligible(account)bool method call against the StateAcctParamsGetContract contract + */ + verifyAcctIncentiveEligible(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctIncentiveEligible(params))) + return this + }, + /** + * Add a verify_acct_last_heartbeat(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctLastHeartbeat(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctLastHeartbeat(params))) + return this + }, + /** + * Add a verify_acct_last_proposed(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctLastProposed(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctLastProposed(params))) + return this + }, + /** + * Add a clear state call to the StateAcctParamsGetContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAcctParamsGetContractComposer + } +} +export type StateAcctParamsGetContractComposer = { + /** + * Calls the verify_acct_balance(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctBalance(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_balance(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_min_balance(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctMinBalance(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_min_balance(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_auth_addr(account)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctAuthAddr(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_auth_addr(account)address'] | undefined]> + + /** + * Calls the verify_acct_total_num_uint(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalNumUint(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_num_uint(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_num_byte_slice(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalNumByteSlice(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_num_byte_slice(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_extra_app_pages(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalExtraAppPages(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_extra_app_pages(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_apps_created(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAppsCreated(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_apps_created(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_apps_opted_in(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAppsOptedIn(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_apps_opted_in(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_assets_created(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAssetsCreated(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_assets_created(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_assets(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAssets(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_assets(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_boxes(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalBoxes(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_boxes(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_box_bytes(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalBoxBytes(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_box_bytes(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_incentive_eligible(account)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctIncentiveEligible(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_incentive_eligible(account)bool'] | undefined]> + + /** + * Calls the verify_acct_last_heartbeat(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctLastHeartbeat(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_last_heartbeat(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_last_proposed(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctLastProposed(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_last_proposed(account)uint64'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGetContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAcctParamsGetContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAcctParamsGetContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAcctParamsGetContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalContract.ts new file mode 100644 index 0000000..fc6b74f --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalContract.ts @@ -0,0 +1,1018 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAppGlobalContract","structs":{},"methods":[{"name":"verify_get_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_uint64","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_ex_bytes","args":[{"type":"uint64","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"(byte[],bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_ex_uint64","args":[{"type":"uint64","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"(uint64,bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_delete","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_put_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_put_bytes","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":1,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"global_uint64":{"keyType":"AVMString","valueType":"AVMUint64","key":"Z2xvYmFsX3VpbnQ2NA=="},"global_bytes":{"keyType":"AVMString","valueType":"AVMBytes","key":"Z2xvYmFsX2J5dGVz"}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQ1CiAgICAvLyBjbGFzcyBTdGF0ZUFwcEdsb2JhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxNgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4YTk5N2ExODcgMHg0ZGI4YWE0MSAweDBjMWY1NmE3IDB4YWZkZGIwODggMHg5M2E4NTJlMSAweDM2OTk2NDUxIDB4MzkyMGE1N2IgLy8gbWV0aG9kICJ2ZXJpZnlfZ2V0X2J5dGVzKGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9nZXRfdWludDY0KGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfYnl0ZXModWludDY0LGJ5dGVbXSkoYnl0ZVtdLGJvb2wpIiwgbWV0aG9kICJ2ZXJpZnlfZ2V0X2V4X3VpbnQ2NCh1aW50NjQsYnl0ZVtdKSh1aW50NjQsYm9vbCkiLCBtZXRob2QgInZlcmlmeV9kZWxldGUoYnl0ZVtdKXZvaWQiLCBtZXRob2QgInZlcmlmeV9wdXRfdWludDY0KGJ5dGVbXSx1aW50NjQpdm9pZCIsIG1ldGhvZCAidmVyaWZ5X3B1dF9ieXRlcyhieXRlW10sYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfZ2V0X2J5dGVzIHZlcmlmeV9nZXRfdWludDY0IHZlcmlmeV9nZXRfZXhfYnl0ZXMgdmVyaWZ5X2dldF9leF91aW50NjQgdmVyaWZ5X2RlbGV0ZSB2ZXJpZnlfcHV0X3VpbnQ2NCB2ZXJpZnlfcHV0X2J5dGVzCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTY6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9nZXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDU5CiAgICAvLyB2YWx1ZSA9IG9wLkFwcEdsb2JhbC5nZXRfYnl0ZXMoYSkKICAgIGFwcF9nbG9iYWxfZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDY0CiAgICAvLyB2YWx1ZSA9IG9wLkFwcEdsb2JhbC5nZXRfdWludDY0KGEpCiAgICBhcHBfZ2xvYmFsX2dldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF9leF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2OQogICAgLy8gcmV0dXJuIG9wLkFwcEdsb2JhbC5nZXRfZXhfYnl0ZXMoYSwgYikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfZXhfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDczCiAgICAvLyByZXR1cm4gb3AuQXBwR2xvYmFsLmdldF9leF91aW50NjQoYSwgYikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgc3dhcAogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9kZWxldGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGVsZXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDc3CiAgICAvLyBvcC5BcHBHbG9iYWwuZGVsZXRlKGEpCiAgICBhcHBfZ2xvYmFsX2RlbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfcHV0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgxCiAgICAvLyBvcC5BcHBHbG9iYWwucHV0KGEsIGIpCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfcHV0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3B1dF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODUKICAgIC8vIG9wLkFwcEdsb2JhbC5wdXQoYSwgYikKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmAgQVH3x1AQAxG0EAQDEZFEQxGESCBwSpl6GHBE24qkEEDB9WpwSv3bCIBJOoUuEENplkUQQ5IKV7NhoAjgcACQAeACwAVABtAHYAgwAxGRQxGBQQQzYaAVcCAGRJFRZXBgJMUChMULAiQzYaAVcCAGQWKExQsCJDNhoBFzYaAlcCAGVLARUWVwYCTwJQKSNPA1SAAgADTFBMUChMULAiQzYaARc2GgJXAgBlTBYpI08DVFAoTFCwIkM2GgFXAgBpIkM2GgFXAgA2GgIXZyJDNhoBVwIANhoCVwIAZyJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAppGlobalContract contract + */ +export type StateAppGlobalContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_get_bytes(byte[])byte[]': { + a: Uint8Array + } + 'verify_get_uint64(byte[])uint64': { + a: Uint8Array + } + 'verify_get_ex_bytes(uint64,byte[])(byte[],bool)': { + a: bigint | number + b: Uint8Array + } + 'verify_get_ex_uint64(uint64,byte[])(uint64,bool)': { + a: bigint | number + b: Uint8Array + } + 'verify_delete(byte[])void': { + a: Uint8Array + } + 'verify_put_uint64(byte[],uint64)void': { + a: Uint8Array + b: bigint | number + } + 'verify_put_bytes(byte[],byte[])void': { + a: Uint8Array + b: Uint8Array + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_get_bytes(byte[])byte[]': [a: Uint8Array] + 'verify_get_uint64(byte[])uint64': [a: Uint8Array] + 'verify_get_ex_bytes(uint64,byte[])(byte[],bool)': [a: bigint | number, b: Uint8Array] + 'verify_get_ex_uint64(uint64,byte[])(uint64,bool)': [a: bigint | number, b: Uint8Array] + 'verify_delete(byte[])void': [a: Uint8Array] + 'verify_put_uint64(byte[],uint64)void': [a: Uint8Array, b: bigint | number] + 'verify_put_bytes(byte[],byte[])void': [a: Uint8Array, b: Uint8Array] + } +} + +/** + * The return type for each method + */ +export type StateAppGlobalContractReturns = { + 'verify_get_bytes(byte[])byte[]': Uint8Array + 'verify_get_uint64(byte[])uint64': bigint + 'verify_get_ex_bytes(uint64,byte[])(byte[],bool)': [Uint8Array, boolean] + 'verify_get_ex_uint64(uint64,byte[])(uint64,bool)': [bigint, boolean] + 'verify_delete(byte[])void': void + 'verify_put_uint64(byte[],uint64)void': void + 'verify_put_bytes(byte[],byte[])void': void +} + +/** + * Defines the types of available calls and state of the StateAppGlobalContract smart contract. + */ +export type StateAppGlobalContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_get_bytes(byte[])byte[]' | 'verify_get_bytes', { + argsObj: StateAppGlobalContractArgs['obj']['verify_get_bytes(byte[])byte[]'] + argsTuple: StateAppGlobalContractArgs['tuple']['verify_get_bytes(byte[])byte[]'] + returns: StateAppGlobalContractReturns['verify_get_bytes(byte[])byte[]'] + }> + & Record<'verify_get_uint64(byte[])uint64' | 'verify_get_uint64', { + argsObj: StateAppGlobalContractArgs['obj']['verify_get_uint64(byte[])uint64'] + argsTuple: StateAppGlobalContractArgs['tuple']['verify_get_uint64(byte[])uint64'] + returns: StateAppGlobalContractReturns['verify_get_uint64(byte[])uint64'] + }> + & Record<'verify_get_ex_bytes(uint64,byte[])(byte[],bool)' | 'verify_get_ex_bytes', { + argsObj: StateAppGlobalContractArgs['obj']['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'] + argsTuple: StateAppGlobalContractArgs['tuple']['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'] + returns: StateAppGlobalContractReturns['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'] + }> + & Record<'verify_get_ex_uint64(uint64,byte[])(uint64,bool)' | 'verify_get_ex_uint64', { + argsObj: StateAppGlobalContractArgs['obj']['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'] + argsTuple: StateAppGlobalContractArgs['tuple']['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'] + returns: StateAppGlobalContractReturns['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'] + }> + & Record<'verify_delete(byte[])void' | 'verify_delete', { + argsObj: StateAppGlobalContractArgs['obj']['verify_delete(byte[])void'] + argsTuple: StateAppGlobalContractArgs['tuple']['verify_delete(byte[])void'] + returns: StateAppGlobalContractReturns['verify_delete(byte[])void'] + }> + & Record<'verify_put_uint64(byte[],uint64)void' | 'verify_put_uint64', { + argsObj: StateAppGlobalContractArgs['obj']['verify_put_uint64(byte[],uint64)void'] + argsTuple: StateAppGlobalContractArgs['tuple']['verify_put_uint64(byte[],uint64)void'] + returns: StateAppGlobalContractReturns['verify_put_uint64(byte[],uint64)void'] + }> + & Record<'verify_put_bytes(byte[],byte[])void' | 'verify_put_bytes', { + argsObj: StateAppGlobalContractArgs['obj']['verify_put_bytes(byte[],byte[])void'] + argsTuple: StateAppGlobalContractArgs['tuple']['verify_put_bytes(byte[],byte[])void'] + returns: StateAppGlobalContractReturns['verify_put_bytes(byte[],byte[])void'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + global: { + keys: { + globalUint64: bigint + globalBytes: BinaryState + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAppGlobalContractSignatures = keyof StateAppGlobalContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateAppGlobalContractNonVoidMethodSignatures = keyof StateAppGlobalContractTypes['methods'] extends infer T ? T extends keyof StateAppGlobalContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAppGlobalContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAppGlobalContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAppGlobalContract smart contract to the method's return type + */ +export type MethodReturn = StateAppGlobalContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed global state of the application. + */ +export type GlobalKeysState = StateAppGlobalContractTypes['state']['global']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAppGlobalContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAppGlobalContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAppGlobalContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppGlobalContract smart contract + */ +export abstract class StateAppGlobalContractParamsFactory { + /** + * Constructs a no op call for the verify_get_bytes(byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_bytes(byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_get_uint64(byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_uint64(byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_get_ex_bytes(uint64,byte[])(byte[],bool) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetExBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_ex_bytes(uint64,byte[])(byte[],bool)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_get_ex_uint64(uint64,byte[])(uint64,bool) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetExUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_ex_uint64(uint64,byte[])(uint64,bool)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_delete(byte[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyDelete(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_delete(byte[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_put_uint64(byte[],uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyPutUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_put_uint64(byte[],uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_put_bytes(byte[],byte[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyPutBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_put_bytes(byte[],byte[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateAppGlobalContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAppGlobalContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAppGlobalContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAppGlobalContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAppGlobalContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAppGlobalContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAppGlobalContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAppGlobalContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppGlobalContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppGlobalContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppGlobalContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAppGlobalContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAppGlobalContract smart contract + */ +export class StateAppGlobalContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAppGlobalContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAppGlobalContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAppGlobalContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAppGlobalContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAppGlobalContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAppGlobalContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAppGlobalContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_bytes(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyGetBytes(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyGetUint64(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_bytes(uint64,byte[])(byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetExBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyGetExBytes(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_uint64(uint64,byte[])(uint64,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetExUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyGetExUint64(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_delete(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyDelete: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyDelete(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_uint64(byte[],uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyPutUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyPutUint64(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_bytes(byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyPutBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyPutBytes(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_bytes(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyGetBytes(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyGetUint64(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_bytes(uint64,byte[])(byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetExBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyGetExBytes(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_uint64(uint64,byte[])(uint64,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetExUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyGetExUint64(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_delete(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyDelete: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyDelete(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_uint64(byte[],uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyPutUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyPutUint64(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_bytes(byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyPutBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyPutBytes(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_bytes(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyGetBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_get_bytes(byte[])byte[]'])} + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyGetUint64(params)) + return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_get_uint64(byte[])uint64'])} + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_bytes(uint64,byte[])(byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetExBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyGetExBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'])} + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_uint64(uint64,byte[])(uint64,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetExUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyGetExUint64(params)) + return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'])} + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_delete(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyDelete: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyDelete(params)) + return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_delete(byte[])void'])} + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_uint64(byte[],uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyPutUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyPutUint64(params)) + return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_put_uint64(byte[],uint64)void'])} + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_bytes(byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyPutBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyPutBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_put_bytes(byte[],byte[])void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAppGlobalContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAppGlobalContract app + */ + state = { + /** + * Methods to access global state for the current StateAppGlobalContract app + */ + global: { + /** + * Get all current keyed values from global state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.global.getAll() + return { + globalUint64: result.global_uint64, + globalBytes: new BinaryStateValue(result.global_bytes), + } + }, + /** + * Get the current value of the global_uint64 key in global state + */ + globalUint64: async (): Promise => { return (await this.appClient.state.global.getValue("global_uint64")) as bigint | undefined }, + /** + * Get the current value of the global_bytes key in global state + */ + globalBytes: async (): Promise => { return new BinaryStateValue((await this.appClient.state.global.getValue("global_bytes")) as Uint8Array | undefined) }, + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAppGlobalContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_get_bytes(byte[])byte[] method call against the StateAppGlobalContract contract + */ + verifyGetBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetBytes(params))) + return this + }, + /** + * Add a verify_get_uint64(byte[])uint64 method call against the StateAppGlobalContract contract + */ + verifyGetUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetUint64(params))) + return this + }, + /** + * Add a verify_get_ex_bytes(uint64,byte[])(byte[],bool) method call against the StateAppGlobalContract contract + */ + verifyGetExBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetExBytes(params))) + return this + }, + /** + * Add a verify_get_ex_uint64(uint64,byte[])(uint64,bool) method call against the StateAppGlobalContract contract + */ + verifyGetExUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetExUint64(params))) + return this + }, + /** + * Add a verify_delete(byte[])void method call against the StateAppGlobalContract contract + */ + verifyDelete(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyDelete(params))) + return this + }, + /** + * Add a verify_put_uint64(byte[],uint64)void method call against the StateAppGlobalContract contract + */ + verifyPutUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyPutUint64(params))) + return this + }, + /** + * Add a verify_put_bytes(byte[],byte[])void method call against the StateAppGlobalContract contract + */ + verifyPutBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyPutBytes(params))) + return this + }, + /** + * Add a clear state call to the StateAppGlobalContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAppGlobalContractComposer + } +} +export type StateAppGlobalContractComposer = { + /** + * Calls the verify_get_bytes(byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetBytes(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_get_bytes(byte[])byte[]'] | undefined]> + + /** + * Calls the verify_get_uint64(byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetUint64(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_get_uint64(byte[])uint64'] | undefined]> + + /** + * Calls the verify_get_ex_bytes(uint64,byte[])(byte[],bool) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetExBytes(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'] | undefined]> + + /** + * Calls the verify_get_ex_uint64(uint64,byte[])(uint64,bool) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetExUint64(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'] | undefined]> + + /** + * Calls the verify_delete(byte[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyDelete(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_delete(byte[])void'] | undefined]> + + /** + * Calls the verify_put_uint64(byte[],uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyPutUint64(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_put_uint64(byte[],uint64)void'] | undefined]> + + /** + * Calls the verify_put_bytes(byte[],byte[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyPutBytes(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_put_bytes(byte[],byte[])void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAppGlobalContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppGlobalContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAppGlobalContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalExContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalExContract.ts new file mode 100644 index 0000000..cf78371 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalExContract.ts @@ -0,0 +1,551 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAppGlobalExContract","structs":{},"methods":[],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":2,"bytes":4},"local":{"ints":0,"bytes":0}},"keys":{"global":{"global_uint64":{"keyType":"AVMString","valueType":"AVMUint64","key":"Z2xvYmFsX3VpbnQ2NA=="},"global_bytes":{"keyType":"AVMString","valueType":"AVMBytes","key":"Z2xvYmFsX2J5dGVz"},"global_uint64_explicit":{"keyType":"AVMString","valueType":"AVMUint64","key":"Z2xvYmFsX3VpbnQ2NF9leHBsaWNpdA=="},"global_bytes_explicit":{"keyType":"AVMString","valueType":"AVMBytes","key":"Z2xvYmFsX2J5dGVzX2V4cGxpY2l0"},"global_arc4_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"Z2xvYmFsX2FyYzRfYnl0ZXM="},"global_arc4_bytes_explicit":{"keyType":"AVMString","valueType":"byte[]","key":"Z2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQ="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDMxCiAgICAvLyBrZXk9Imdsb2JhbF91aW50NjQiLAogICAgcHVzaGJ5dGVzICJnbG9iYWxfdWludDY0IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzMAogICAgLy8gVUludDY0KDIpLAogICAgcHVzaGludCAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDI5LTQzMgogICAgLy8gc2VsZi5nbG9iYWxfdWludDY0ID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgVUludDY0KDIpLAogICAgLy8gICAgIGtleT0iZ2xvYmFsX3VpbnQ2NCIsCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzNQogICAgLy8ga2V5PSJnbG9iYWxfYnl0ZXMiLAogICAgcHVzaGJ5dGVzICJnbG9iYWxfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM0CiAgICAvLyBCeXRlcyhiImR1bW15X2J5dGVzIiksCiAgICBieXRlY18wIC8vIDB4NjQ3NTZkNmQ3OTVmNjI3OTc0NjU3MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzMy00MzYKICAgIC8vIHNlbGYuZ2xvYmFsX2J5dGVzID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgQnl0ZXMoYiJkdW1teV9ieXRlcyIpLAogICAgLy8gICAgIGtleT0iZ2xvYmFsX2J5dGVzIiwKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM3CiAgICAvLyBzZWxmLmdsb2JhbF91aW50NjRfZXhwbGljaXQgPSBhbGdvcHkuVUludDY0KDIpCiAgICBwdXNoYnl0ZXMgImdsb2JhbF91aW50NjRfZXhwbGljaXQiCiAgICBwdXNoaW50IDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM4CiAgICAvLyBzZWxmLmdsb2JhbF9ieXRlc19leHBsaWNpdCA9IGFsZ29weS5CeXRlcyhiImR1bW15X2J5dGVzIikKICAgIHB1c2hieXRlcyAiZ2xvYmFsX2J5dGVzX2V4cGxpY2l0IgogICAgYnl0ZWNfMCAvLyAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQwCiAgICAvLyBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIiksIGtleT0iZ2xvYmFsX2FyYzRfYnl0ZXMiCiAgICBwdXNoYnl0ZXMgImdsb2JhbF9hcmM0X2J5dGVzIgogICAgYnl0ZWNfMSAvLyAweDAwMTA2NDc1NmQ2ZDc5NWY2MTcyNjMzNDVmNjI3OTc0NjU3MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzOS00NDEKICAgIC8vIHNlbGYuZ2xvYmFsX2FyYzRfYnl0ZXMgPSBHbG9iYWxTdGF0ZSgKICAgIC8vICAgICBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIiksIGtleT0iZ2xvYmFsX2FyYzRfYnl0ZXMiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ0MgogICAgLy8gc2VsZi5nbG9iYWxfYXJjNF9ieXRlc19leHBsaWNpdCA9IGFsZ29weS5hcmM0LkR5bmFtaWNCeXRlcyhiImR1bW15X2FyYzRfYnl0ZXMiKQogICAgcHVzaGJ5dGVzICJnbG9iYWxfYXJjNF9ieXRlc19leHBsaWNpdCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDAKICAgIC8vIGFsZ29weS5hcmM0LkR5bmFtaWNCeXRlcyhiImR1bW15X2FyYzRfYnl0ZXMiKSwga2V5PSJnbG9iYWxfYXJjNF9ieXRlcyIKICAgIGJ5dGVjXzEgLy8gMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDIKICAgIC8vIHNlbGYuZ2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQgPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIikKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjcKICAgIC8vIGNsYXNzIFN0YXRlQXBwR2xvYmFsRXhDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgICEKICAgIGFzc2VydAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyYCC2R1bW15X2J5dGVzEgAQZHVtbXlfYXJjNF9ieXRlczEYQACJgA1nbG9iYWxfdWludDY0gQJngAxnbG9iYWxfYnl0ZXMoZ4AWZ2xvYmFsX3VpbnQ2NF9leHBsaWNpdIECZ4AVZ2xvYmFsX2J5dGVzX2V4cGxpY2l0KGeAEWdsb2JhbF9hcmM0X2J5dGVzKWeAGmdsb2JhbF9hcmM0X2J5dGVzX2V4cGxpY2l0KWcxGxREMRkUMRgUEEM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAppGlobalExContract contract + */ +export type StateAppGlobalExContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + } +} + +/** + * The return type for each method + */ +export type StateAppGlobalExContractReturns = { +} + +/** + * Defines the types of available calls and state of the StateAppGlobalExContract smart contract. + */ +export type StateAppGlobalExContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: {} + /** + * Defines the shape of the state of the application. + */ + state: { + global: { + keys: { + globalUint64: bigint + globalBytes: BinaryState + globalUint64Explicit: bigint + globalBytesExplicit: BinaryState + globalArc4Bytes: Uint8Array + globalArc4BytesExplicit: Uint8Array + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAppGlobalExContractSignatures = keyof StateAppGlobalExContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAppGlobalExContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAppGlobalExContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAppGlobalExContract smart contract to the method's return type + */ +export type MethodReturn = StateAppGlobalExContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed global state of the application. + */ +export type GlobalKeysState = StateAppGlobalExContractTypes['state']['global']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAppGlobalExContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAppGlobalExContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAppGlobalExContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppGlobalExContract smart contract + */ +export abstract class StateAppGlobalExContractParamsFactory { +} + +/** + * A factory to create and deploy one or more instance of the StateAppGlobalExContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAppGlobalExContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAppGlobalExContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAppGlobalExContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAppGlobalExContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAppGlobalExContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAppGlobalExContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAppGlobalExContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppGlobalExContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppGlobalExContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppGlobalExContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAppGlobalExContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAppGlobalExContract smart contract + */ +export class StateAppGlobalExContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAppGlobalExContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAppGlobalExContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAppGlobalExContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAppGlobalExContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAppGlobalExContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAppGlobalExContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAppGlobalExContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalExContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalExContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalExContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAppGlobalExContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAppGlobalExContract app + */ + state = { + /** + * Methods to access global state for the current StateAppGlobalExContract app + */ + global: { + /** + * Get all current keyed values from global state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.global.getAll() + return { + globalUint64: result.global_uint64, + globalBytes: new BinaryStateValue(result.global_bytes), + globalUint64Explicit: result.global_uint64_explicit, + globalBytesExplicit: new BinaryStateValue(result.global_bytes_explicit), + globalArc4Bytes: result.global_arc4_bytes, + globalArc4BytesExplicit: result.global_arc4_bytes_explicit, + } + }, + /** + * Get the current value of the global_uint64 key in global state + */ + globalUint64: async (): Promise => { return (await this.appClient.state.global.getValue("global_uint64")) as bigint | undefined }, + /** + * Get the current value of the global_bytes key in global state + */ + globalBytes: async (): Promise => { return new BinaryStateValue((await this.appClient.state.global.getValue("global_bytes")) as Uint8Array | undefined) }, + /** + * Get the current value of the global_uint64_explicit key in global state + */ + globalUint64Explicit: async (): Promise => { return (await this.appClient.state.global.getValue("global_uint64_explicit")) as bigint | undefined }, + /** + * Get the current value of the global_bytes_explicit key in global state + */ + globalBytesExplicit: async (): Promise => { return new BinaryStateValue((await this.appClient.state.global.getValue("global_bytes_explicit")) as Uint8Array | undefined) }, + /** + * Get the current value of the global_arc4_bytes key in global state + */ + globalArc4Bytes: async (): Promise => { return (await this.appClient.state.global.getValue("global_arc4_bytes")) as Uint8Array | undefined }, + /** + * Get the current value of the global_arc4_bytes_explicit key in global state + */ + globalArc4BytesExplicit: async (): Promise => { return (await this.appClient.state.global.getValue("global_arc4_bytes_explicit")) as Uint8Array | undefined }, + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAppGlobalExContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a clear state call to the StateAppGlobalExContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAppGlobalExContractComposer + } +} +export type StateAppGlobalExContractComposer = { + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalExContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAppGlobalExContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppGlobalExContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAppGlobalExContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalContract.ts new file mode 100644 index 0000000..be9dae8 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalContract.ts @@ -0,0 +1,1197 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAppLocalContract","structs":{},"methods":[{"name":"opt_in","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["OptIn"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_bytes","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_uint64","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_ex_bytes","args":[{"type":"address","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_ex_uint64","args":[{"type":"address","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_delete","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_exists","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_put_uint64","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_put_bytes","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":1,"bytes":1}},"keys":{"global":{},"local":{"local_uint64":{"keyType":"AVMString","valueType":"AVMUint64","key":"bG9jYWxfdWludDY0"},"local_bytes":{"keyType":"AVMString","valueType":"AVMBytes","key":"bG9jYWxfYnl0ZXM="}},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM3MgogICAgLy8gY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxOQogICAgcHVzaGJ5dGVzIDB4MzBjNmQ1OGEgLy8gbWV0aG9kICJvcHRfaW4oKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX29wdF9pbl9yb3V0ZUA1CgptYWluX3N3aXRjaF9jYXNlX25leHRANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNzIKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4YTg4MzAyZmUgMHg0OWI3ZGRmOSAweGMwNzhiZWFkIDB4YTUyZjk5MmIgMHg4YzU2YWQ5MCAweDRjN2FkODIzIDB4Y2FhN2I4NjQgMHgyNGY5ZjA4NSAvLyBtZXRob2QgInZlcmlmeV9nZXRfYnl0ZXMoYWRkcmVzcyxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZ2V0X3VpbnQ2NChhZGRyZXNzLGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfYnl0ZXMoYWRkcmVzcyx1aW50NjQsYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2dldF9leF91aW50NjQoYWRkcmVzcyx1aW50NjQsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2RlbGV0ZShhZGRyZXNzLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfZXhpc3RzKGFkZHJlc3MsYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9wdXRfdWludDY0KGFkZHJlc3MsYnl0ZVtdLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfcHV0X2J5dGVzKGFkZHJlc3MsYnl0ZVtdLGJ5dGVbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X2dldF9ieXRlcyB2ZXJpZnlfZ2V0X3VpbnQ2NCB2ZXJpZnlfZ2V0X2V4X2J5dGVzIHZlcmlmeV9nZXRfZXhfdWludDY0IHZlcmlmeV9kZWxldGUgdmVyaWZ5X2V4aXN0cyB2ZXJpZnlfcHV0X3VpbnQ2NCB2ZXJpZnlfcHV0X2J5dGVzCiAgICBlcnIKCm1haW5fb3B0X2luX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gT3B0SW4KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBvcHRfaW4KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3Qub3B0X2luW3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4NgogICAgLy8gc2VsZi5sb2NhbF9ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IEJ5dGVzKGIiZHVtbXlfYnl0ZXMiKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBwdXNoYnl0ZXNzICJsb2NhbF9ieXRlcyIgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzg3CiAgICAvLyBzZWxmLmxvY2FsX3VpbnQ2NFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IFVJbnQ2NCg5OTkpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIHB1c2hieXRlcyAibG9jYWxfdWludDY0IgogICAgcHVzaGludCA5OTkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9nZXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzkxCiAgICAvLyB2YWx1ZSA9IG9wLkFwcExvY2FsLmdldF9ieXRlcyhhLCBiKQogICAgYXBwX2xvY2FsX2dldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzk2CiAgICAvLyB2YWx1ZSA9IG9wLkFwcExvY2FsLmdldF91aW50NjQoYSwgYikKICAgIGFwcF9sb2NhbF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF9leF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gdmFsdWUsIF92YWwgPSBvcC5BcHBMb2NhbC5nZXRfZXhfYnl0ZXMoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfZXhfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDA2CiAgICAvLyB2YWx1ZSwgX3ZhbCA9IG9wLkFwcExvY2FsLmdldF9leF91aW50NjQoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9kZWxldGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGVsZXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDExCiAgICAvLyBvcC5BcHBMb2NhbC5kZWxldGUoYSwgYikKICAgIGFwcF9sb2NhbF9kZWwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZXhpc3RzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4aXN0czoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQxNQogICAgLy8gX3ZhbHVlLCBleGlzdHMgPSBvcC5BcHBMb2NhbC5nZXRfZXhfdWludDY0KGEsIDAsIGIpCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAogICAgYXBwX2xvY2FsX2dldF9leAogICAgYnVyeSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X3B1dF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfcHV0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQyMAogICAgLy8gb3AuQXBwTG9jYWwucHV0KGEsIGIsIGMpCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X3B1dF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDI0CiAgICAvLyBvcC5BcHBMb2NhbC5wdXQoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmAQQVH3x1MRtBAF+ABDDG1Yo2GgCOAQBHMRkURDEYRIIIBKiDAv4ESbfd+QTAeL6tBKUvmSsEjFatkARMetgjBMqnuGQEJPnwhTYaAI4IAEcAXwBwAI0AowCvAMoA2gAxGSISMRgQREIACDEZFDEYFBBDMgmCAgtsb2NhbF9ieXRlcwtkdW1teV9ieXRlc2YyCYAMbG9jYWxfdWludDY0gecHZiJDNhoBNhoCVwIAYkkVFlcGAkxQKExQsCJDNhoBNhoCVwIAYhYoTFCwIkM2GgE2GgIXNhoDVwIAY0hJFRZXBgJMUChMULAiQzYaATYaAhc2GgNXAgBjSBYoTFCwIkM2GgE2GgJXAgBoIkM2GgE2GgJXAgAjTGNFAYABACNPAlQoTFCwIkM2GgE2GgJXAgA2GgMXZiJDNhoBNhoCVwIANhoDVwIAZiJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAppLocalContract contract + */ +export type StateAppLocalContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'opt_in()void': Record + 'verify_get_bytes(address,byte[])byte[]': { + a: string + b: Uint8Array + } + 'verify_get_uint64(address,byte[])uint64': { + a: string + b: Uint8Array + } + 'verify_get_ex_bytes(address,uint64,byte[])byte[]': { + a: string + b: bigint | number + c: Uint8Array + } + 'verify_get_ex_uint64(address,uint64,byte[])uint64': { + a: string + b: bigint | number + c: Uint8Array + } + 'verify_delete(address,byte[])void': { + a: string + b: Uint8Array + } + 'verify_exists(address,byte[])bool': { + a: string + b: Uint8Array + } + 'verify_put_uint64(address,byte[],uint64)void': { + a: string + b: Uint8Array + c: bigint | number + } + 'verify_put_bytes(address,byte[],byte[])void': { + a: string + b: Uint8Array + c: Uint8Array + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'opt_in()void': [] + 'verify_get_bytes(address,byte[])byte[]': [a: string, b: Uint8Array] + 'verify_get_uint64(address,byte[])uint64': [a: string, b: Uint8Array] + 'verify_get_ex_bytes(address,uint64,byte[])byte[]': [a: string, b: bigint | number, c: Uint8Array] + 'verify_get_ex_uint64(address,uint64,byte[])uint64': [a: string, b: bigint | number, c: Uint8Array] + 'verify_delete(address,byte[])void': [a: string, b: Uint8Array] + 'verify_exists(address,byte[])bool': [a: string, b: Uint8Array] + 'verify_put_uint64(address,byte[],uint64)void': [a: string, b: Uint8Array, c: bigint | number] + 'verify_put_bytes(address,byte[],byte[])void': [a: string, b: Uint8Array, c: Uint8Array] + } +} + +/** + * The return type for each method + */ +export type StateAppLocalContractReturns = { + 'opt_in()void': void + 'verify_get_bytes(address,byte[])byte[]': Uint8Array + 'verify_get_uint64(address,byte[])uint64': bigint + 'verify_get_ex_bytes(address,uint64,byte[])byte[]': Uint8Array + 'verify_get_ex_uint64(address,uint64,byte[])uint64': bigint + 'verify_delete(address,byte[])void': void + 'verify_exists(address,byte[])bool': boolean + 'verify_put_uint64(address,byte[],uint64)void': void + 'verify_put_bytes(address,byte[],byte[])void': void +} + +/** + * Defines the types of available calls and state of the StateAppLocalContract smart contract. + */ +export type StateAppLocalContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'opt_in()void' | 'opt_in', { + argsObj: StateAppLocalContractArgs['obj']['opt_in()void'] + argsTuple: StateAppLocalContractArgs['tuple']['opt_in()void'] + returns: StateAppLocalContractReturns['opt_in()void'] + }> + & Record<'verify_get_bytes(address,byte[])byte[]' | 'verify_get_bytes', { + argsObj: StateAppLocalContractArgs['obj']['verify_get_bytes(address,byte[])byte[]'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_get_bytes(address,byte[])byte[]'] + returns: StateAppLocalContractReturns['verify_get_bytes(address,byte[])byte[]'] + }> + & Record<'verify_get_uint64(address,byte[])uint64' | 'verify_get_uint64', { + argsObj: StateAppLocalContractArgs['obj']['verify_get_uint64(address,byte[])uint64'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_get_uint64(address,byte[])uint64'] + returns: StateAppLocalContractReturns['verify_get_uint64(address,byte[])uint64'] + }> + & Record<'verify_get_ex_bytes(address,uint64,byte[])byte[]' | 'verify_get_ex_bytes', { + argsObj: StateAppLocalContractArgs['obj']['verify_get_ex_bytes(address,uint64,byte[])byte[]'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_get_ex_bytes(address,uint64,byte[])byte[]'] + returns: StateAppLocalContractReturns['verify_get_ex_bytes(address,uint64,byte[])byte[]'] + }> + & Record<'verify_get_ex_uint64(address,uint64,byte[])uint64' | 'verify_get_ex_uint64', { + argsObj: StateAppLocalContractArgs['obj']['verify_get_ex_uint64(address,uint64,byte[])uint64'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_get_ex_uint64(address,uint64,byte[])uint64'] + returns: StateAppLocalContractReturns['verify_get_ex_uint64(address,uint64,byte[])uint64'] + }> + & Record<'verify_delete(address,byte[])void' | 'verify_delete', { + argsObj: StateAppLocalContractArgs['obj']['verify_delete(address,byte[])void'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_delete(address,byte[])void'] + returns: StateAppLocalContractReturns['verify_delete(address,byte[])void'] + }> + & Record<'verify_exists(address,byte[])bool' | 'verify_exists', { + argsObj: StateAppLocalContractArgs['obj']['verify_exists(address,byte[])bool'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_exists(address,byte[])bool'] + returns: StateAppLocalContractReturns['verify_exists(address,byte[])bool'] + }> + & Record<'verify_put_uint64(address,byte[],uint64)void' | 'verify_put_uint64', { + argsObj: StateAppLocalContractArgs['obj']['verify_put_uint64(address,byte[],uint64)void'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_put_uint64(address,byte[],uint64)void'] + returns: StateAppLocalContractReturns['verify_put_uint64(address,byte[],uint64)void'] + }> + & Record<'verify_put_bytes(address,byte[],byte[])void' | 'verify_put_bytes', { + argsObj: StateAppLocalContractArgs['obj']['verify_put_bytes(address,byte[],byte[])void'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_put_bytes(address,byte[],byte[])void'] + returns: StateAppLocalContractReturns['verify_put_bytes(address,byte[],byte[])void'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + local: { + keys: { + localUint64: bigint + localBytes: BinaryState + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAppLocalContractSignatures = keyof StateAppLocalContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateAppLocalContractNonVoidMethodSignatures = keyof StateAppLocalContractTypes['methods'] extends infer T ? T extends keyof StateAppLocalContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAppLocalContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAppLocalContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAppLocalContract smart contract to the method's return type + */ +export type MethodReturn = StateAppLocalContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed local state of the application. + */ +export type LocalKeysState = StateAppLocalContractTypes['state']['local']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAppLocalContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAppLocalContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAppLocalContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppLocalContract smart contract + */ +export abstract class StateAppLocalContractParamsFactory { + /** + * Gets available optIn ABI call param factories + */ + static get optIn() { + return { + /** + * Constructs opt-in ABI call params for the StateAppLocalContract smart contract using the opt_in()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + optIn(params: CallParams): AppClientMethodCallParams { + return { + ...params, + method: 'opt_in()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + + /** + * Constructs a no op call for the verify_get_bytes(address,byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_bytes(address,byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_get_uint64(address,byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_uint64(address,byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_get_ex_bytes(address,uint64,byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetExBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_ex_bytes(address,uint64,byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_get_ex_uint64(address,uint64,byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetExUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_ex_uint64(address,uint64,byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_delete(address,byte[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyDelete(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_delete(address,byte[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_exists(address,byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExists(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_exists(address,byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_put_uint64(address,byte[],uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyPutUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_put_uint64(address,byte[],uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_put_bytes(address,byte[],byte[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyPutBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_put_bytes(address,byte[],byte[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateAppLocalContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAppLocalContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAppLocalContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAppLocalContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAppLocalContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAppLocalContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAppLocalContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAppLocalContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppLocalContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppLocalContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppLocalContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAppLocalContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAppLocalContract smart contract + */ +export class StateAppLocalContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAppLocalContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAppLocalContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAppLocalContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAppLocalContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAppLocalContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAppLocalContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAppLocalContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn params + */ + optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + return this.appClient.params.optIn(StateAppLocalContractParamsFactory.optIn.optIn(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_bytes(address,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyGetBytes(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_uint64(address,byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyGetUint64(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_bytes(address,uint64,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetExBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyGetExBytes(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_uint64(address,uint64,byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetExUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyGetExUint64(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_delete(address,byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyDelete: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyDelete(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_exists(address,byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExists: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyExists(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_put_uint64(address,byte[],uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyPutUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyPutUint64(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_put_bytes(address,byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyPutBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyPutBytes(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn transaction + */ + optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + return this.appClient.createTransaction.optIn(StateAppLocalContractParamsFactory.optIn.optIn(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_bytes(address,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyGetBytes(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_uint64(address,byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyGetUint64(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_bytes(address,uint64,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetExBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyGetExBytes(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_uint64(address,uint64,byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetExUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyGetExUint64(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_delete(address,byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyDelete: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyDelete(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_exists(address,byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExists: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyExists(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_put_uint64(address,byte[],uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyPutUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyPutUint64(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_put_bytes(address,byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyPutBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyPutBytes(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn result + */ + optIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + const result = await this.appClient.send.optIn(StateAppLocalContractParamsFactory.optIn.optIn(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['opt_in()void'])} + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_bytes(address,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyGetBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_get_bytes(address,byte[])byte[]'])} + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_uint64(address,byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyGetUint64(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_get_uint64(address,byte[])uint64'])} + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_bytes(address,uint64,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetExBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyGetExBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_get_ex_bytes(address,uint64,byte[])byte[]'])} + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_uint64(address,uint64,byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetExUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyGetExUint64(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_get_ex_uint64(address,uint64,byte[])uint64'])} + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_delete(address,byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyDelete: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyDelete(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_delete(address,byte[])void'])} + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_exists(address,byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExists: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyExists(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_exists(address,byte[])bool'])} + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_put_uint64(address,byte[],uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyPutUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyPutUint64(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_put_uint64(address,byte[],uint64)void'])} + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_put_bytes(address,byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyPutBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyPutBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_put_bytes(address,byte[],byte[])void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAppLocalContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAppLocalContract app + */ + state = { + /** + * Methods to access local state for the current StateAppLocalContract app + */ + local: (address: string | Address) => { + const encodedAddress = typeof address === 'string' ? address : encodeAddress(address.publicKey) + return { + /** + * Get all current keyed values from local state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.local(encodedAddress).getAll() + return { + localUint64: result.local_uint64, + localBytes: new BinaryStateValue(result.local_bytes), + } + }, + /** + * Get the current value of the local_uint64 key in local state + */ + localUint64: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("local_uint64")) as bigint | undefined }, + /** + * Get the current value of the local_bytes key in local state + */ + localBytes: async (): Promise => { return new BinaryStateValue((await this.appClient.state.local(encodedAddress).getValue("local_bytes")) as Uint8Array | undefined) }, + } + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAppLocalContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_get_bytes(address,byte[])byte[] method call against the StateAppLocalContract contract + */ + verifyGetBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetBytes(params))) + return this + }, + /** + * Add a verify_get_uint64(address,byte[])uint64 method call against the StateAppLocalContract contract + */ + verifyGetUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetUint64(params))) + return this + }, + /** + * Add a verify_get_ex_bytes(address,uint64,byte[])byte[] method call against the StateAppLocalContract contract + */ + verifyGetExBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetExBytes(params))) + return this + }, + /** + * Add a verify_get_ex_uint64(address,uint64,byte[])uint64 method call against the StateAppLocalContract contract + */ + verifyGetExUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetExUint64(params))) + return this + }, + /** + * Add a verify_delete(address,byte[])void method call against the StateAppLocalContract contract + */ + verifyDelete(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyDelete(params))) + return this + }, + /** + * Add a verify_exists(address,byte[])bool method call against the StateAppLocalContract contract + */ + verifyExists(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExists(params))) + return this + }, + /** + * Add a verify_put_uint64(address,byte[],uint64)void method call against the StateAppLocalContract contract + */ + verifyPutUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyPutUint64(params))) + return this + }, + /** + * Add a verify_put_bytes(address,byte[],byte[])void method call against the StateAppLocalContract contract + */ + verifyPutBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyPutBytes(params))) + return this + }, + get optIn() { + return { + optIn: (params: CallParams) => { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn.optIn(params))) + return this + }, + } + }, + /** + * Add a clear state call to the StateAppLocalContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAppLocalContractComposer + } +} +export type StateAppLocalContractComposer = { + /** + * Calls the verify_get_bytes(address,byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetBytes(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_get_bytes(address,byte[])byte[]'] | undefined]> + + /** + * Calls the verify_get_uint64(address,byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetUint64(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_get_uint64(address,byte[])uint64'] | undefined]> + + /** + * Calls the verify_get_ex_bytes(address,uint64,byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetExBytes(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_get_ex_bytes(address,uint64,byte[])byte[]'] | undefined]> + + /** + * Calls the verify_get_ex_uint64(address,uint64,byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetExUint64(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_get_ex_uint64(address,uint64,byte[])uint64'] | undefined]> + + /** + * Calls the verify_delete(address,byte[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyDelete(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_delete(address,byte[])void'] | undefined]> + + /** + * Calls the verify_exists(address,byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExists(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_exists(address,byte[])bool'] | undefined]> + + /** + * Calls the verify_put_uint64(address,byte[],uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyPutUint64(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_put_uint64(address,byte[],uint64)void'] | undefined]> + + /** + * Calls the verify_put_bytes(address,byte[],byte[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyPutBytes(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_put_bytes(address,byte[],byte[])void'] | undefined]> + + /** + * Gets available optIn methods + */ + readonly optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalContract smart contract using the opt_in()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + optIn(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['opt_in()void'] | undefined]> + } + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAppLocalContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppLocalContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAppLocalContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalExContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalExContract.ts new file mode 100644 index 0000000..53a53bd --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalExContract.ts @@ -0,0 +1,635 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAppLocalExContract","structs":{},"methods":[{"name":"opt_in","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["OptIn"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":1,"bytes":2}},"keys":{"global":{},"local":{"local_uint64":{"keyType":"AVMString","valueType":"AVMUint64","key":"bG9jYWxfdWludDY0"},"local_bytes":{"keyType":"AVMString","valueType":"AVMBytes","key":"bG9jYWxfYnl0ZXM="},"local_arc4_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"bG9jYWxfYXJjNF9ieXRlcw=="}},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNDYKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxFeENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA3CiAgICBwdXNoYnl0ZXMgMHgzMGM2ZDU4YSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2luX3JvdXRlQDUKICAgIGVycgoKbWFpbl9vcHRfaW5fcm91dGVANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgMSAvLyBPcHRJbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIG9wdF9pbgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA3OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbEV4Q29udHJhY3Qub3B0X2luW3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM2NQogICAgLy8gc2VsZi5sb2NhbF9ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IEJ5dGVzKGIiZHVtbXlfYnl0ZXNfZnJvbV9leHRlcm5hbF9jb250cmFjdCIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIHB1c2hieXRlc3MgImxvY2FsX2J5dGVzIiAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzM1ZjY2NzI2ZjZkNWY2NTc4NzQ2NTcyNmU2MTZjNWY2MzZmNmU3NDcyNjE2Mzc0CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzY2CiAgICAvLyBzZWxmLmxvY2FsX3VpbnQ2NFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IFVJbnQ2NCg5OSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgcHVzaGJ5dGVzICJsb2NhbF91aW50NjQiCiAgICBwdXNoaW50IDk5CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzY3CiAgICAvLyBzZWxmLmxvY2FsX2FyYzRfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjctMzY5CiAgICAvLyBzZWxmLmxvY2FsX2FyYzRfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoCiAgICAvLyAgICAgYiJkdW1teV9hcmM0X2J5dGVzIgogICAgLy8gKQogICAgcHVzaGJ5dGVzcyAibG9jYWxfYXJjNF9ieXRlcyIgMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAagAQwxtWKNhoAjgEAAQAxGYEBEjEYEERCAAgxGRQxGBQQQzIJggILbG9jYWxfYnl0ZXMiZHVtbXlfYnl0ZXNfZnJvbV9leHRlcm5hbF9jb250cmFjdGYyCYAMbG9jYWxfdWludDY0gWNmMgmCAhBsb2NhbF9hcmM0X2J5dGVzEgAQZHVtbXlfYXJjNF9ieXRlc2aBAUM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAppLocalExContract contract + */ +export type StateAppLocalExContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'opt_in()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'opt_in()void': [] + } +} + +/** + * The return type for each method + */ +export type StateAppLocalExContractReturns = { + 'opt_in()void': void +} + +/** + * Defines the types of available calls and state of the StateAppLocalExContract smart contract. + */ +export type StateAppLocalExContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'opt_in()void' | 'opt_in', { + argsObj: StateAppLocalExContractArgs['obj']['opt_in()void'] + argsTuple: StateAppLocalExContractArgs['tuple']['opt_in()void'] + returns: StateAppLocalExContractReturns['opt_in()void'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + local: { + keys: { + localUint64: bigint + localBytes: BinaryState + localArc4Bytes: Uint8Array + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAppLocalExContractSignatures = keyof StateAppLocalExContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAppLocalExContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAppLocalExContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAppLocalExContract smart contract to the method's return type + */ +export type MethodReturn = StateAppLocalExContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed local state of the application. + */ +export type LocalKeysState = StateAppLocalExContractTypes['state']['local']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAppLocalExContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAppLocalExContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAppLocalExContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppLocalExContract smart contract + */ +export abstract class StateAppLocalExContractParamsFactory { + /** + * Gets available optIn ABI call param factories + */ + static get optIn() { + return { + /** + * Constructs opt-in ABI call params for the StateAppLocalExContract smart contract using the opt_in()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + optIn(params: CallParams): AppClientMethodCallParams { + return { + ...params, + method: 'opt_in()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + +} + +/** + * A factory to create and deploy one or more instance of the StateAppLocalExContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAppLocalExContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAppLocalExContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAppLocalExContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAppLocalExContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAppLocalExContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAppLocalExContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAppLocalExContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppLocalExContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppLocalExContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppLocalExContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAppLocalExContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAppLocalExContract smart contract + */ +export class StateAppLocalExContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAppLocalExContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAppLocalExContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAppLocalExContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAppLocalExContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAppLocalExContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAppLocalExContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAppLocalExContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalExContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn params + */ + optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + return this.appClient.params.optIn(StateAppLocalExContractParamsFactory.optIn.optIn(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalExContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalExContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn transaction + */ + optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + return this.appClient.createTransaction.optIn(StateAppLocalExContractParamsFactory.optIn.optIn(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalExContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalExContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn result + */ + optIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + const result = await this.appClient.send.optIn(StateAppLocalExContractParamsFactory.optIn.optIn(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalExContractReturns['opt_in()void'])} + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalExContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAppLocalExContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAppLocalExContract app + */ + state = { + /** + * Methods to access local state for the current StateAppLocalExContract app + */ + local: (address: string | Address) => { + const encodedAddress = typeof address === 'string' ? address : encodeAddress(address.publicKey) + return { + /** + * Get all current keyed values from local state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.local(encodedAddress).getAll() + return { + localUint64: result.local_uint64, + localBytes: new BinaryStateValue(result.local_bytes), + localArc4Bytes: result.local_arc4_bytes, + } + }, + /** + * Get the current value of the local_uint64 key in local state + */ + localUint64: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("local_uint64")) as bigint | undefined }, + /** + * Get the current value of the local_bytes key in local state + */ + localBytes: async (): Promise => { return new BinaryStateValue((await this.appClient.state.local(encodedAddress).getValue("local_bytes")) as Uint8Array | undefined) }, + /** + * Get the current value of the local_arc4_bytes key in local state + */ + localArc4Bytes: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("local_arc4_bytes")) as Uint8Array | undefined }, + } + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAppLocalExContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + get optIn() { + return { + optIn: (params: CallParams) => { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn.optIn(params))) + return this + }, + } + }, + /** + * Add a clear state call to the StateAppLocalExContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAppLocalExContractComposer + } +} +export type StateAppLocalExContractComposer = { + /** + * Gets available optIn methods + */ + readonly optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalExContract smart contract using the opt_in()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + optIn(params?: CallParams): StateAppLocalExContractComposer<[...TReturns, StateAppLocalExContractReturns['opt_in()void'] | undefined]> + } + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalExContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAppLocalExContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppLocalExContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAppLocalExContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppParamsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppParamsContract.ts new file mode 100644 index 0000000..182a6a4 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppParamsContract.ts @@ -0,0 +1,1112 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAppParamsContract","structs":{},"methods":[{"name":"verify_app_params_get_approval_program","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_clear_state_program","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_global_num_uint","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_global_num_byte_slice","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_local_num_uint","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_local_num_byte_slice","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_extra_program_pages","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_creator","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_address","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[121,155,189,216,243,270,297,324,350],"errorMessage":"expected exists by index to match"},{"pc":[119,153,187,214,241,268,295,322,348],"errorMessage":"expected value by index to match"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzIKICAgIC8vIGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhiOWQxM2MxYiAweGU1YzNjODg5IDB4ZWU0ZTdiMmEgMHg3ZmEyMzRjYiAweDE5Zjc3NDM5IDB4OTJjNTcyYWEgMHhhZTljNmVmYiAweGUzNmVkNzA1IDB4OGM2NmE4NDIgLy8gbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYXBwcm92YWxfcHJvZ3JhbSh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbSh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV91aW50KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZSh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlcyh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvcih1aW50NjQpYWRkcmVzcyIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FkZHJlc3ModWludDY0KWFkZHJlc3MiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYXBwcm92YWxfcHJvZ3JhbSB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbSB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50IHZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV91aW50IHZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZSB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlcyB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvciB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzcwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfYXBwcm92YWxfcHJvZ3JhbVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzUKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FwcHJvdmFsX3Byb2dyYW0oYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFwcHJvdmFsUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FwcHJvdmFsX3Byb2dyYW0oX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBcHByb3ZhbFByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3OAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NsZWFyX3N0YXRlX3Byb2dyYW1bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgzCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9jbGVhcl9zdGF0ZV9wcm9ncmFtKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDbGVhclN0YXRlUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODQKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2NsZWFyX3N0YXRlX3Byb2dyYW0oX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDbGVhclN0YXRlUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjg2CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkxCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX3VpbnQoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEdsb2JhbE51bVVpbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkyCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX3VpbnQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1VaW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOTQKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5OQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfZ2xvYmFsX251bV9ieXRlX3NsaWNlKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzAwCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDEKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwMgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwNwogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfbG9jYWxfbnVtX3VpbnQoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcExvY2FsTnVtVWludAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDgKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2xvY2FsX251bV91aW50KF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1VaW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzA5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTUKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2xvY2FsX251bV9ieXRlX3NsaWNlKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2xvY2FsX251bV9ieXRlX3NsaWNlKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxOAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjMKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2V4dHJhX3Byb2dyYW1fcGFnZXMoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyNAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFwcFBhcmFtc0dldC5hcHBfZXh0cmFfcHJvZ3JhbV9wYWdlcyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzI1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjYKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NyZWF0b3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzMxCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9jcmVhdG9yKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDcmVhdG9yCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzMgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFwcFBhcmFtc0dldC5hcHBfY3JlYXRvcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzNAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMzkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FkZHJlc3MoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQwCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9hZGRyZXNzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQyCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyABASYBBBUffHUxG0EATjEZFEQxGESCCQS50TwbBOXDyIkE7k57KgR/ojTLBBn3dDkEksVyqgSunG77BONu1wUEjGaoQjYaAI4JAAkAKwBNAGgAgwCeALkA1ADuADEZFDEYFBBDNhoBF3IANhoBF3IASwNPAhJEEkRJFRZXBgJMUChMULAiQzYaARdyATYaARdyAUsDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcgI2GgEXcgJLA08CEkQSRBYoTFCwIkM2GgEXcgM2GgEXcgNLA08CEkQSRBYoTFCwIkM2GgEXcgQ2GgEXcgRLA08CEkQSRBYoTFCwIkM2GgEXcgU2GgEXcgVLA08CEkQSRBYoTFCwIkM2GgEXcgY2GgEXcgZLA08CEkQSRBYoTFCwIkM2GgEXcgc2GgEXcgdLA08CEkQSRChMULAiQzYaARdyCDYaARdyCEsDTwISRBJEKExQsCJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAppParamsContract contract + */ +export type StateAppParamsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_app_params_get_approval_program(uint64)byte[]': { + a: bigint | number + } + 'verify_app_params_get_clear_state_program(uint64)byte[]': { + a: bigint | number + } + 'verify_app_params_get_global_num_uint(uint64)uint64': { + a: bigint | number + } + 'verify_app_params_get_global_num_byte_slice(uint64)uint64': { + a: bigint | number + } + 'verify_app_params_get_local_num_uint(uint64)uint64': { + a: bigint | number + } + 'verify_app_params_get_local_num_byte_slice(uint64)uint64': { + a: bigint | number + } + 'verify_app_params_get_extra_program_pages(uint64)uint64': { + a: bigint | number + } + 'verify_app_params_get_creator(uint64)address': { + a: bigint | number + } + 'verify_app_params_get_address(uint64)address': { + a: bigint | number + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_app_params_get_approval_program(uint64)byte[]': [a: bigint | number] + 'verify_app_params_get_clear_state_program(uint64)byte[]': [a: bigint | number] + 'verify_app_params_get_global_num_uint(uint64)uint64': [a: bigint | number] + 'verify_app_params_get_global_num_byte_slice(uint64)uint64': [a: bigint | number] + 'verify_app_params_get_local_num_uint(uint64)uint64': [a: bigint | number] + 'verify_app_params_get_local_num_byte_slice(uint64)uint64': [a: bigint | number] + 'verify_app_params_get_extra_program_pages(uint64)uint64': [a: bigint | number] + 'verify_app_params_get_creator(uint64)address': [a: bigint | number] + 'verify_app_params_get_address(uint64)address': [a: bigint | number] + } +} + +/** + * The return type for each method + */ +export type StateAppParamsContractReturns = { + 'verify_app_params_get_approval_program(uint64)byte[]': Uint8Array + 'verify_app_params_get_clear_state_program(uint64)byte[]': Uint8Array + 'verify_app_params_get_global_num_uint(uint64)uint64': bigint + 'verify_app_params_get_global_num_byte_slice(uint64)uint64': bigint + 'verify_app_params_get_local_num_uint(uint64)uint64': bigint + 'verify_app_params_get_local_num_byte_slice(uint64)uint64': bigint + 'verify_app_params_get_extra_program_pages(uint64)uint64': bigint + 'verify_app_params_get_creator(uint64)address': string + 'verify_app_params_get_address(uint64)address': string +} + +/** + * Defines the types of available calls and state of the StateAppParamsContract smart contract. + */ +export type StateAppParamsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_app_params_get_approval_program(uint64)byte[]' | 'verify_app_params_get_approval_program', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_approval_program(uint64)byte[]'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_approval_program(uint64)byte[]'] + returns: StateAppParamsContractReturns['verify_app_params_get_approval_program(uint64)byte[]'] + }> + & Record<'verify_app_params_get_clear_state_program(uint64)byte[]' | 'verify_app_params_get_clear_state_program', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_clear_state_program(uint64)byte[]'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_clear_state_program(uint64)byte[]'] + returns: StateAppParamsContractReturns['verify_app_params_get_clear_state_program(uint64)byte[]'] + }> + & Record<'verify_app_params_get_global_num_uint(uint64)uint64' | 'verify_app_params_get_global_num_uint', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_global_num_uint(uint64)uint64'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_global_num_uint(uint64)uint64'] + returns: StateAppParamsContractReturns['verify_app_params_get_global_num_uint(uint64)uint64'] + }> + & Record<'verify_app_params_get_global_num_byte_slice(uint64)uint64' | 'verify_app_params_get_global_num_byte_slice', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_global_num_byte_slice(uint64)uint64'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_global_num_byte_slice(uint64)uint64'] + returns: StateAppParamsContractReturns['verify_app_params_get_global_num_byte_slice(uint64)uint64'] + }> + & Record<'verify_app_params_get_local_num_uint(uint64)uint64' | 'verify_app_params_get_local_num_uint', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_local_num_uint(uint64)uint64'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_local_num_uint(uint64)uint64'] + returns: StateAppParamsContractReturns['verify_app_params_get_local_num_uint(uint64)uint64'] + }> + & Record<'verify_app_params_get_local_num_byte_slice(uint64)uint64' | 'verify_app_params_get_local_num_byte_slice', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_local_num_byte_slice(uint64)uint64'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_local_num_byte_slice(uint64)uint64'] + returns: StateAppParamsContractReturns['verify_app_params_get_local_num_byte_slice(uint64)uint64'] + }> + & Record<'verify_app_params_get_extra_program_pages(uint64)uint64' | 'verify_app_params_get_extra_program_pages', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_extra_program_pages(uint64)uint64'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_extra_program_pages(uint64)uint64'] + returns: StateAppParamsContractReturns['verify_app_params_get_extra_program_pages(uint64)uint64'] + }> + & Record<'verify_app_params_get_creator(uint64)address' | 'verify_app_params_get_creator', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_creator(uint64)address'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_creator(uint64)address'] + returns: StateAppParamsContractReturns['verify_app_params_get_creator(uint64)address'] + }> + & Record<'verify_app_params_get_address(uint64)address' | 'verify_app_params_get_address', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_address(uint64)address'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_address(uint64)address'] + returns: StateAppParamsContractReturns['verify_app_params_get_address(uint64)address'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAppParamsContractSignatures = keyof StateAppParamsContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateAppParamsContractNonVoidMethodSignatures = keyof StateAppParamsContractTypes['methods'] extends infer T ? T extends keyof StateAppParamsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAppParamsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAppParamsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAppParamsContract smart contract to the method's return type + */ +export type MethodReturn = StateAppParamsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAppParamsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAppParamsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAppParamsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppParamsContract smart contract + */ +export abstract class StateAppParamsContractParamsFactory { + /** + * Constructs a no op call for the verify_app_params_get_approval_program(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetApprovalProgram(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_approval_program(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_clear_state_program(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetClearStateProgram(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_clear_state_program(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_global_num_uint(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetGlobalNumUint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_global_num_uint(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_global_num_byte_slice(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetGlobalNumByteSlice(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_global_num_byte_slice(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_local_num_uint(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetLocalNumUint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_local_num_uint(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_local_num_byte_slice(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetLocalNumByteSlice(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_local_num_byte_slice(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_extra_program_pages(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetExtraProgramPages(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_extra_program_pages(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_creator(uint64)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetCreator(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_creator(uint64)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_address(uint64)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetAddress(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_address(uint64)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateAppParamsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAppParamsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAppParamsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAppParamsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAppParamsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAppParamsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAppParamsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAppParamsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppParamsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppParamsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppParamsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAppParamsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAppParamsContract smart contract + */ +export class StateAppParamsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAppParamsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAppParamsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAppParamsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAppParamsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAppParamsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAppParamsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAppParamsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StateAppParamsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_approval_program(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetApprovalProgram: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetApprovalProgram(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_clear_state_program(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetClearStateProgram: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetClearStateProgram(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_uint(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetGlobalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumUint(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_byte_slice(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetGlobalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_uint(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetLocalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumUint(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_byte_slice(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetLocalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_extra_program_pages(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetExtraProgramPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetExtraProgramPages(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_creator(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetCreator: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetCreator(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_address(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetAddress: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetAddress(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StateAppParamsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_approval_program(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetApprovalProgram: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetApprovalProgram(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_clear_state_program(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetClearStateProgram: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetClearStateProgram(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_uint(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetGlobalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumUint(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_byte_slice(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetGlobalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_uint(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetLocalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumUint(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_byte_slice(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetLocalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_extra_program_pages(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetExtraProgramPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetExtraProgramPages(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_creator(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetCreator: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetCreator(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_address(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetAddress: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetAddress(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StateAppParamsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_approval_program(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetApprovalProgram: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetApprovalProgram(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_approval_program(uint64)byte[]'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_clear_state_program(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetClearStateProgram: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetClearStateProgram(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_clear_state_program(uint64)byte[]'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_uint(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetGlobalNumUint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumUint(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_global_num_uint(uint64)uint64'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_byte_slice(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetGlobalNumByteSlice: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumByteSlice(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_global_num_byte_slice(uint64)uint64'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_uint(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetLocalNumUint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumUint(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_local_num_uint(uint64)uint64'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_byte_slice(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetLocalNumByteSlice: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumByteSlice(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_local_num_byte_slice(uint64)uint64'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_extra_program_pages(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetExtraProgramPages: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetExtraProgramPages(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_extra_program_pages(uint64)uint64'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_creator(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetCreator: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetCreator(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_creator(uint64)address'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_address(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetAddress: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetAddress(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_address(uint64)address'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAppParamsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAppParamsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAppParamsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_app_params_get_approval_program(uint64)byte[] method call against the StateAppParamsContract contract + */ + verifyAppParamsGetApprovalProgram(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetApprovalProgram(params))) + return this + }, + /** + * Add a verify_app_params_get_clear_state_program(uint64)byte[] method call against the StateAppParamsContract contract + */ + verifyAppParamsGetClearStateProgram(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetClearStateProgram(params))) + return this + }, + /** + * Add a verify_app_params_get_global_num_uint(uint64)uint64 method call against the StateAppParamsContract contract + */ + verifyAppParamsGetGlobalNumUint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetGlobalNumUint(params))) + return this + }, + /** + * Add a verify_app_params_get_global_num_byte_slice(uint64)uint64 method call against the StateAppParamsContract contract + */ + verifyAppParamsGetGlobalNumByteSlice(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetGlobalNumByteSlice(params))) + return this + }, + /** + * Add a verify_app_params_get_local_num_uint(uint64)uint64 method call against the StateAppParamsContract contract + */ + verifyAppParamsGetLocalNumUint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetLocalNumUint(params))) + return this + }, + /** + * Add a verify_app_params_get_local_num_byte_slice(uint64)uint64 method call against the StateAppParamsContract contract + */ + verifyAppParamsGetLocalNumByteSlice(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetLocalNumByteSlice(params))) + return this + }, + /** + * Add a verify_app_params_get_extra_program_pages(uint64)uint64 method call against the StateAppParamsContract contract + */ + verifyAppParamsGetExtraProgramPages(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetExtraProgramPages(params))) + return this + }, + /** + * Add a verify_app_params_get_creator(uint64)address method call against the StateAppParamsContract contract + */ + verifyAppParamsGetCreator(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetCreator(params))) + return this + }, + /** + * Add a verify_app_params_get_address(uint64)address method call against the StateAppParamsContract contract + */ + verifyAppParamsGetAddress(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetAddress(params))) + return this + }, + /** + * Add a clear state call to the StateAppParamsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAppParamsContractComposer + } +} +export type StateAppParamsContractComposer = { + /** + * Calls the verify_app_params_get_approval_program(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetApprovalProgram(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_approval_program(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_app_params_get_clear_state_program(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetClearStateProgram(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_clear_state_program(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_app_params_get_global_num_uint(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetGlobalNumUint(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_global_num_uint(uint64)uint64'] | undefined]> + + /** + * Calls the verify_app_params_get_global_num_byte_slice(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetGlobalNumByteSlice(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_global_num_byte_slice(uint64)uint64'] | undefined]> + + /** + * Calls the verify_app_params_get_local_num_uint(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetLocalNumUint(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_local_num_uint(uint64)uint64'] | undefined]> + + /** + * Calls the verify_app_params_get_local_num_byte_slice(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetLocalNumByteSlice(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_local_num_byte_slice(uint64)uint64'] | undefined]> + + /** + * Calls the verify_app_params_get_extra_program_pages(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetExtraProgramPages(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_extra_program_pages(uint64)uint64'] | undefined]> + + /** + * Calls the verify_app_params_get_creator(uint64)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetCreator(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_creator(uint64)address'] | undefined]> + + /** + * Calls the verify_app_params_get_address(uint64)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetAddress(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_address(uint64)address'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the StateAppParamsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAppParamsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppParamsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAppParamsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetHoldingContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetHoldingContract.ts new file mode 100644 index 0000000..c46961a --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetHoldingContract.ts @@ -0,0 +1,631 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAssetHoldingContract","structs":{},"methods":[{"name":"verify_asset_holding_get","args":[{"type":"address","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_frozen_get","args":[{"type":"address","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gY2xhc3MgU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4OGY1MjM1YjQgMHhkZTdhMzlmNiAvLyBtZXRob2QgInZlcmlmeV9hc3NldF9ob2xkaW5nX2dldChhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hc3NldF9mcm96ZW5fZ2V0KGFkZHJlc3MsdWludDY0KWJvb2wiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXQgdmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXQKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdC52ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2NQogICAgLy8gYmFsYW5jZSwgX3ZhbCA9IG9wLkFzc2V0SG9sZGluZ0dldC5hc3NldF9iYWxhbmNlKGEsIGIpCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRIb2xkaW5nQ29udHJhY3QudmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfZnJvemVuX2dldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcwCiAgICAvLyBmcm96ZW4sIF92YWwgPSBvcC5Bc3NldEhvbGRpbmdHZXQuYXNzZXRfZnJvemVuKGEsIGIpCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEZyb3plbgogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIHB1c2hpbnQgMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyYBBBUffHUxG0EAHTEZFEQxGESCAgSPUjW0BN56OfY2GgCOAgAJABsAMRkUMRgUEEM2GgE2GgIXcABIFihMULCBAUM2GgE2GgIXcAFIgAEAgQBPAlQoTFCwgQFD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAssetHoldingContract contract + */ +export type StateAssetHoldingContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_asset_holding_get(address,uint64)uint64': { + a: string + b: bigint | number + } + 'verify_asset_frozen_get(address,uint64)bool': { + a: string + b: bigint | number + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_asset_holding_get(address,uint64)uint64': [a: string, b: bigint | number] + 'verify_asset_frozen_get(address,uint64)bool': [a: string, b: bigint | number] + } +} + +/** + * The return type for each method + */ +export type StateAssetHoldingContractReturns = { + 'verify_asset_holding_get(address,uint64)uint64': bigint + 'verify_asset_frozen_get(address,uint64)bool': boolean +} + +/** + * Defines the types of available calls and state of the StateAssetHoldingContract smart contract. + */ +export type StateAssetHoldingContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_asset_holding_get(address,uint64)uint64' | 'verify_asset_holding_get', { + argsObj: StateAssetHoldingContractArgs['obj']['verify_asset_holding_get(address,uint64)uint64'] + argsTuple: StateAssetHoldingContractArgs['tuple']['verify_asset_holding_get(address,uint64)uint64'] + returns: StateAssetHoldingContractReturns['verify_asset_holding_get(address,uint64)uint64'] + }> + & Record<'verify_asset_frozen_get(address,uint64)bool' | 'verify_asset_frozen_get', { + argsObj: StateAssetHoldingContractArgs['obj']['verify_asset_frozen_get(address,uint64)bool'] + argsTuple: StateAssetHoldingContractArgs['tuple']['verify_asset_frozen_get(address,uint64)bool'] + returns: StateAssetHoldingContractReturns['verify_asset_frozen_get(address,uint64)bool'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAssetHoldingContractSignatures = keyof StateAssetHoldingContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateAssetHoldingContractNonVoidMethodSignatures = keyof StateAssetHoldingContractTypes['methods'] extends infer T ? T extends keyof StateAssetHoldingContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAssetHoldingContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAssetHoldingContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAssetHoldingContract smart contract to the method's return type + */ +export type MethodReturn = StateAssetHoldingContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAssetHoldingContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAssetHoldingContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAssetHoldingContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAssetHoldingContract smart contract + */ +export abstract class StateAssetHoldingContractParamsFactory { + /** + * Constructs a no op call for the verify_asset_holding_get(address,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetHoldingGet(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_holding_get(address,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_asset_frozen_get(address,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetFrozenGet(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_frozen_get(address,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateAssetHoldingContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAssetHoldingContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAssetHoldingContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAssetHoldingContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAssetHoldingContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAssetHoldingContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAssetHoldingContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAssetHoldingContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAssetHoldingContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAssetHoldingContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAssetHoldingContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAssetHoldingContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAssetHoldingContract smart contract + */ +export class StateAssetHoldingContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAssetHoldingContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAssetHoldingContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAssetHoldingContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAssetHoldingContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAssetHoldingContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAssetHoldingContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAssetHoldingContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StateAssetHoldingContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_holding_get(address,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetHoldingGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetHoldingContractParamsFactory.verifyAssetHoldingGet(params)) + }, + + /** + * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_frozen_get(address,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetFrozenGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetHoldingContractParamsFactory.verifyAssetFrozenGet(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StateAssetHoldingContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_holding_get(address,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetHoldingGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetHoldingContractParamsFactory.verifyAssetHoldingGet(params)) + }, + + /** + * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_frozen_get(address,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetFrozenGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetHoldingContractParamsFactory.verifyAssetFrozenGet(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StateAssetHoldingContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_holding_get(address,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetHoldingGet: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetHoldingContractParamsFactory.verifyAssetHoldingGet(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetHoldingContractReturns['verify_asset_holding_get(address,uint64)uint64'])} + }, + + /** + * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_frozen_get(address,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetFrozenGet: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetHoldingContractParamsFactory.verifyAssetFrozenGet(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetHoldingContractReturns['verify_asset_frozen_get(address,uint64)bool'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAssetHoldingContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAssetHoldingContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAssetHoldingContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_asset_holding_get(address,uint64)uint64 method call against the StateAssetHoldingContract contract + */ + verifyAssetHoldingGet(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetHoldingGet(params))) + return this + }, + /** + * Add a verify_asset_frozen_get(address,uint64)bool method call against the StateAssetHoldingContract contract + */ + verifyAssetFrozenGet(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetFrozenGet(params))) + return this + }, + /** + * Add a clear state call to the StateAssetHoldingContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAssetHoldingContractComposer + } +} +export type StateAssetHoldingContractComposer = { + /** + * Calls the verify_asset_holding_get(address,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetHoldingGet(params?: CallParams): StateAssetHoldingContractComposer<[...TReturns, StateAssetHoldingContractReturns['verify_asset_holding_get(address,uint64)uint64'] | undefined]> + + /** + * Calls the verify_asset_frozen_get(address,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetFrozenGet(params?: CallParams): StateAssetHoldingContractComposer<[...TReturns, StateAssetHoldingContractReturns['verify_asset_frozen_get(address,uint64)bool'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the StateAssetHoldingContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAssetHoldingContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAssetHoldingContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAssetHoldingContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetParamsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetParamsContract.ts new file mode 100644 index 0000000..b627ecf --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetParamsContract.ts @@ -0,0 +1,1319 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAssetParamsContract","structs":{},"methods":[{"name":"verify_asset_params_get_total","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_decimals","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_default_frozen","args":[{"type":"uint64","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_unit_name","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_name","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_url","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_metadata_hash","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_manager","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_reserve","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_freeze","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_clawback","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_creator","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[142,169,196,230,264,298,332,366,392,418,444,470],"errorMessage":"expected exists by index to match"},{"pc":[140,167,194,228,262,296,330,364,390,416,442,468],"errorMessage":"expected value by index to match"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzQKICAgIC8vIGNsYXNzIFN0YXRlQXNzZXRQYXJhbXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGYwNWRhN2E0IDB4YzBlOWMzMTUgMHhkODUyODI3MyAweGY0NDY4YWQ5IDB4MjI5ZDEyZjcgMHhkZjUzNGY3YiAweGUwNTBiNWE5IDB4OGIyYTJkNTggMHhlZTE1YzRmNyAweDE1NzU0NGZmIDB4MTA0OTJjMDcgMHg1MjI5ZmEzNyAvLyBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3RvdGFsKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlY2ltYWxzKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlZmF1bHRfZnJvemVuKHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWUodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbmFtZSh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmwodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaCh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyKHVpbnQ2NClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9yZXNlcnZlKHVpbnQ2NClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemUodWludDY0KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NsYXdiYWNrKHVpbnQ2NClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jcmVhdG9yKHVpbnQ2NClhZGRyZXNzIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWwgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVjaW1hbHMgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVmYXVsdF9mcm96ZW4gdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdW5pdF9uYW1lIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X25hbWUgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdXJsIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21ldGFkYXRhX2hhc2ggdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWFuYWdlciB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9yZXNlcnZlIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2ZyZWV6ZSB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jbGF3YmFjayB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jcmVhdG9yCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF90b3RhbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTc3CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfdG90YWwoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzgKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF90b3RhbChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3OQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTgwCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVjaW1hbHNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWNpbWFsczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTg1CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfZGVjaW1hbHMoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9kZWNpbWFscyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVmYXVsdF9mcm96ZW5bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTkzCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfZGVmYXVsdF9mcm96ZW4oYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWZhdWx0RnJvemVuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2RlZmF1bHRfZnJvemVuKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlZmF1bHRGcm96ZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxOTUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHB1c2hieXRlcyAweDAwCiAgICBwdXNoaW50IDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3VuaXRfbmFtZShhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3VuaXRfbmFtZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjA0CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X25hbWVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9uYW1lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9uYW1lKGEpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTAKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9uYW1lKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTEKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxMgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmw6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxNwogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3VybChhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTgKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF91cmwoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjE5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21ldGFkYXRhX2hhc2g6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X21ldGFkYXRhX2hhc2goYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNZXRhZGF0YUhhc2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjI2CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbWV0YWRhdGFfaGFzaChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNZXRhZGF0YUhhc2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWFuYWdlcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjMzCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbWFuYWdlcihhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1hbmFnZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjM0CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbWFuYWdlcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjM1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzYKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9yZXNlcnZlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfcmVzZXJ2ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQxCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfcmVzZXJ2ZShhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFJlc2VydmUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQyCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfcmVzZXJ2ZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRSZXNlcnZlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDQKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2ZyZWV6ZShhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldEZyZWV6ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTAKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9mcmVlemUoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTIKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jbGF3YmFja1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NsYXdiYWNrOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTcKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9jbGF3YmFjayhhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NsYXdiYWNrKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjU5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jcmVhdG9yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY3JlYXRvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjY1CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjY2CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjY3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjgKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyABASYBBBUffHUxG0EAYzEZFEQxGESCDATwXaekBMDpwxUE2FKCcwT0RorZBCKdEvcE31NPewTgULWpBIsqLVgE7hXE9wQVdUT/BBBJLAcEUin6NzYaAI4MAAkAJAA/AGEAgwClAMcA6QEDAR0BNwFRADEZFDEYFBBDNhoBF3EANhoBF3EASwNPAhJEEkQWKExQsCJDNhoBF3EBNhoBF3EBSwNPAhJEEkQWKExQsCJDNhoBF3ECNhoBF3ECSwNPAhJEEkSAAQCBAE8CVChMULAiQzYaARdxAzYaARdxA0sDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcQQ2GgEXcQRLA08CEkQSREkVFlcGAkxQKExQsCJDNhoBF3EFNhoBF3EFSwNPAhJEEkRJFRZXBgJMUChMULAiQzYaARdxBjYaARdxBksDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcQc2GgEXcQdLA08CEkQSRChMULAiQzYaARdxCDYaARdxCEsDTwISRBJEKExQsCJDNhoBF3EJNhoBF3EJSwNPAhJEEkQoTFCwIkM2GgEXcQo2GgEXcQpLA08CEkQSRChMULAiQzYaARdxCzYaARdxC0sDTwISRBJEKExQsCJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAssetParamsContract contract + */ +export type StateAssetParamsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_asset_params_get_total(uint64)uint64': { + a: bigint | number + } + 'verify_asset_params_get_decimals(uint64)uint64': { + a: bigint | number + } + 'verify_asset_params_get_default_frozen(uint64)bool': { + a: bigint | number + } + 'verify_asset_params_get_unit_name(uint64)byte[]': { + a: bigint | number + } + 'verify_asset_params_get_name(uint64)byte[]': { + a: bigint | number + } + 'verify_asset_params_get_url(uint64)byte[]': { + a: bigint | number + } + 'verify_asset_params_get_metadata_hash(uint64)byte[]': { + a: bigint | number + } + 'verify_asset_params_get_manager(uint64)address': { + a: bigint | number + } + 'verify_asset_params_get_reserve(uint64)address': { + a: bigint | number + } + 'verify_asset_params_get_freeze(uint64)address': { + a: bigint | number + } + 'verify_asset_params_get_clawback(uint64)address': { + a: bigint | number + } + 'verify_asset_params_get_creator(uint64)address': { + a: bigint | number + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_asset_params_get_total(uint64)uint64': [a: bigint | number] + 'verify_asset_params_get_decimals(uint64)uint64': [a: bigint | number] + 'verify_asset_params_get_default_frozen(uint64)bool': [a: bigint | number] + 'verify_asset_params_get_unit_name(uint64)byte[]': [a: bigint | number] + 'verify_asset_params_get_name(uint64)byte[]': [a: bigint | number] + 'verify_asset_params_get_url(uint64)byte[]': [a: bigint | number] + 'verify_asset_params_get_metadata_hash(uint64)byte[]': [a: bigint | number] + 'verify_asset_params_get_manager(uint64)address': [a: bigint | number] + 'verify_asset_params_get_reserve(uint64)address': [a: bigint | number] + 'verify_asset_params_get_freeze(uint64)address': [a: bigint | number] + 'verify_asset_params_get_clawback(uint64)address': [a: bigint | number] + 'verify_asset_params_get_creator(uint64)address': [a: bigint | number] + } +} + +/** + * The return type for each method + */ +export type StateAssetParamsContractReturns = { + 'verify_asset_params_get_total(uint64)uint64': bigint + 'verify_asset_params_get_decimals(uint64)uint64': bigint + 'verify_asset_params_get_default_frozen(uint64)bool': boolean + 'verify_asset_params_get_unit_name(uint64)byte[]': Uint8Array + 'verify_asset_params_get_name(uint64)byte[]': Uint8Array + 'verify_asset_params_get_url(uint64)byte[]': Uint8Array + 'verify_asset_params_get_metadata_hash(uint64)byte[]': Uint8Array + 'verify_asset_params_get_manager(uint64)address': string + 'verify_asset_params_get_reserve(uint64)address': string + 'verify_asset_params_get_freeze(uint64)address': string + 'verify_asset_params_get_clawback(uint64)address': string + 'verify_asset_params_get_creator(uint64)address': string +} + +/** + * Defines the types of available calls and state of the StateAssetParamsContract smart contract. + */ +export type StateAssetParamsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_asset_params_get_total(uint64)uint64' | 'verify_asset_params_get_total', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_total(uint64)uint64'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_total(uint64)uint64'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_total(uint64)uint64'] + }> + & Record<'verify_asset_params_get_decimals(uint64)uint64' | 'verify_asset_params_get_decimals', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_decimals(uint64)uint64'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_decimals(uint64)uint64'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_decimals(uint64)uint64'] + }> + & Record<'verify_asset_params_get_default_frozen(uint64)bool' | 'verify_asset_params_get_default_frozen', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_default_frozen(uint64)bool'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_default_frozen(uint64)bool'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_default_frozen(uint64)bool'] + }> + & Record<'verify_asset_params_get_unit_name(uint64)byte[]' | 'verify_asset_params_get_unit_name', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_unit_name(uint64)byte[]'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_unit_name(uint64)byte[]'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_unit_name(uint64)byte[]'] + }> + & Record<'verify_asset_params_get_name(uint64)byte[]' | 'verify_asset_params_get_name', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_name(uint64)byte[]'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_name(uint64)byte[]'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_name(uint64)byte[]'] + }> + & Record<'verify_asset_params_get_url(uint64)byte[]' | 'verify_asset_params_get_url', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_url(uint64)byte[]'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_url(uint64)byte[]'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_url(uint64)byte[]'] + }> + & Record<'verify_asset_params_get_metadata_hash(uint64)byte[]' | 'verify_asset_params_get_metadata_hash', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_metadata_hash(uint64)byte[]'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_metadata_hash(uint64)byte[]'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_metadata_hash(uint64)byte[]'] + }> + & Record<'verify_asset_params_get_manager(uint64)address' | 'verify_asset_params_get_manager', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_manager(uint64)address'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_manager(uint64)address'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_manager(uint64)address'] + }> + & Record<'verify_asset_params_get_reserve(uint64)address' | 'verify_asset_params_get_reserve', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_reserve(uint64)address'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_reserve(uint64)address'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_reserve(uint64)address'] + }> + & Record<'verify_asset_params_get_freeze(uint64)address' | 'verify_asset_params_get_freeze', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_freeze(uint64)address'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_freeze(uint64)address'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_freeze(uint64)address'] + }> + & Record<'verify_asset_params_get_clawback(uint64)address' | 'verify_asset_params_get_clawback', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_clawback(uint64)address'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_clawback(uint64)address'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_clawback(uint64)address'] + }> + & Record<'verify_asset_params_get_creator(uint64)address' | 'verify_asset_params_get_creator', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_creator(uint64)address'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_creator(uint64)address'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_creator(uint64)address'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAssetParamsContractSignatures = keyof StateAssetParamsContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateAssetParamsContractNonVoidMethodSignatures = keyof StateAssetParamsContractTypes['methods'] extends infer T ? T extends keyof StateAssetParamsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAssetParamsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAssetParamsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAssetParamsContract smart contract to the method's return type + */ +export type MethodReturn = StateAssetParamsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAssetParamsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAssetParamsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAssetParamsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAssetParamsContract smart contract + */ +export abstract class StateAssetParamsContractParamsFactory { + /** + * Constructs a no op call for the verify_asset_params_get_total(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetTotal(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_total(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_decimals(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetDecimals(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_decimals(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_default_frozen(uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetDefaultFrozen(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_default_frozen(uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_unit_name(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetUnitName(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_unit_name(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_name(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetName(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_name(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_url(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetUrl(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_url(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_metadata_hash(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetMetadataHash(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_metadata_hash(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_manager(uint64)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetManager(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_manager(uint64)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_reserve(uint64)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetReserve(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_reserve(uint64)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_freeze(uint64)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetFreeze(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_freeze(uint64)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_clawback(uint64)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetClawback(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_clawback(uint64)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_creator(uint64)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetCreator(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_creator(uint64)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateAssetParamsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAssetParamsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAssetParamsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAssetParamsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAssetParamsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAssetParamsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAssetParamsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAssetParamsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAssetParamsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAssetParamsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAssetParamsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAssetParamsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAssetParamsContract smart contract + */ +export class StateAssetParamsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAssetParamsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAssetParamsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAssetParamsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAssetParamsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAssetParamsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAssetParamsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAssetParamsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StateAssetParamsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_total(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetTotal: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetTotal(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_decimals(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetDecimals: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDecimals(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_default_frozen(uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetDefaultFrozen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDefaultFrozen(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_unit_name(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetUnitName: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUnitName(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_name(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetName: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetName(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_url(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetUrl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUrl(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_metadata_hash(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetMetadataHash: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetMetadataHash(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_manager(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetManager: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetManager(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_reserve(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetReserve: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetReserve(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_freeze(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetFreeze: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetFreeze(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_clawback(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetClawback: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetClawback(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_creator(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetCreator: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetCreator(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StateAssetParamsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_total(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetTotal: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetTotal(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_decimals(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetDecimals: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDecimals(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_default_frozen(uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetDefaultFrozen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDefaultFrozen(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_unit_name(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetUnitName: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUnitName(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_name(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetName: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetName(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_url(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetUrl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUrl(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_metadata_hash(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetMetadataHash: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetMetadataHash(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_manager(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetManager: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetManager(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_reserve(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetReserve: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetReserve(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_freeze(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetFreeze: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetFreeze(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_clawback(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetClawback: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetClawback(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_creator(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetCreator: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetCreator(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StateAssetParamsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_total(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetTotal: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetTotal(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_total(uint64)uint64'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_decimals(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetDecimals: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDecimals(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_decimals(uint64)uint64'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_default_frozen(uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetDefaultFrozen: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDefaultFrozen(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_default_frozen(uint64)bool'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_unit_name(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetUnitName: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUnitName(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_unit_name(uint64)byte[]'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_name(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetName: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetName(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_name(uint64)byte[]'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_url(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetUrl: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUrl(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_url(uint64)byte[]'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_metadata_hash(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetMetadataHash: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetMetadataHash(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_metadata_hash(uint64)byte[]'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_manager(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetManager: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetManager(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_manager(uint64)address'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_reserve(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetReserve: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetReserve(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_reserve(uint64)address'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_freeze(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetFreeze: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetFreeze(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_freeze(uint64)address'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_clawback(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetClawback: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetClawback(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_clawback(uint64)address'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_creator(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetCreator: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetCreator(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_creator(uint64)address'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAssetParamsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAssetParamsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAssetParamsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_asset_params_get_total(uint64)uint64 method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetTotal(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetTotal(params))) + return this + }, + /** + * Add a verify_asset_params_get_decimals(uint64)uint64 method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetDecimals(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetDecimals(params))) + return this + }, + /** + * Add a verify_asset_params_get_default_frozen(uint64)bool method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetDefaultFrozen(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetDefaultFrozen(params))) + return this + }, + /** + * Add a verify_asset_params_get_unit_name(uint64)byte[] method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetUnitName(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetUnitName(params))) + return this + }, + /** + * Add a verify_asset_params_get_name(uint64)byte[] method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetName(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetName(params))) + return this + }, + /** + * Add a verify_asset_params_get_url(uint64)byte[] method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetUrl(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetUrl(params))) + return this + }, + /** + * Add a verify_asset_params_get_metadata_hash(uint64)byte[] method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetMetadataHash(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetMetadataHash(params))) + return this + }, + /** + * Add a verify_asset_params_get_manager(uint64)address method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetManager(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetManager(params))) + return this + }, + /** + * Add a verify_asset_params_get_reserve(uint64)address method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetReserve(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetReserve(params))) + return this + }, + /** + * Add a verify_asset_params_get_freeze(uint64)address method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetFreeze(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetFreeze(params))) + return this + }, + /** + * Add a verify_asset_params_get_clawback(uint64)address method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetClawback(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetClawback(params))) + return this + }, + /** + * Add a verify_asset_params_get_creator(uint64)address method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetCreator(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetCreator(params))) + return this + }, + /** + * Add a clear state call to the StateAssetParamsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAssetParamsContractComposer + } +} +export type StateAssetParamsContractComposer = { + /** + * Calls the verify_asset_params_get_total(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetTotal(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_total(uint64)uint64'] | undefined]> + + /** + * Calls the verify_asset_params_get_decimals(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetDecimals(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_decimals(uint64)uint64'] | undefined]> + + /** + * Calls the verify_asset_params_get_default_frozen(uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetDefaultFrozen(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_default_frozen(uint64)bool'] | undefined]> + + /** + * Calls the verify_asset_params_get_unit_name(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetUnitName(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_unit_name(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_asset_params_get_name(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetName(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_name(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_asset_params_get_url(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetUrl(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_url(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_asset_params_get_metadata_hash(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetMetadataHash(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_metadata_hash(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_asset_params_get_manager(uint64)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetManager(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_manager(uint64)address'] | undefined]> + + /** + * Calls the verify_asset_params_get_reserve(uint64)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetReserve(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_reserve(uint64)address'] | undefined]> + + /** + * Calls the verify_asset_params_get_freeze(uint64)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetFreeze(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_freeze(uint64)address'] | undefined]> + + /** + * Calls the verify_asset_params_get_clawback(uint64)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetClawback(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_clawback(uint64)address'] | undefined]> + + /** + * Calls the verify_asset_params_get_creator(uint64)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetCreator(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_creator(uint64)address'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the StateAssetParamsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAssetParamsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAssetParamsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAssetParamsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateMutations.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateMutations.ts new file mode 100644 index 0000000..01c58bc --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateMutations.ts @@ -0,0 +1,880 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateMutations","structs":{},"methods":[{"name":"append","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"modify","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get","args":[],"returns":{"type":"(uint64,string)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":3},"local":{"ints":0,"bytes":1}},"keys":{"global":{"no_proxy":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"bm9fcHJveHk="},"glob_assign":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"Z2xvYl9hc3NpZ24="},"glob":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"Z2xvYg=="}},"local":{"loc":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"bG9j"}},"box":{"box":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"Ym94"}}},"maps":{"global":{},"local":{},"box":{"map":{"keyType":"address","valueType":"(uint64,string)[]","prefix":"bWFw"}}}},"bareActions":{"create":["NoOp"],"call":["OptIn"]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[526,795,931],"errorMessage":"check self.box exists"},{"pc":[481,684,921],"errorMessage":"check self.glob exists"},{"pc":[440,577,916],"errorMessage":"check self.glob_assign exists"},{"pc":[506,742,928],"errorMessage":"check self.loc exists for account"},{"pc":[553,855,938],"errorMessage":"check self.map entry exists"},{"pc":[460,630,912],"errorMessage":"check self.no_proxy exists"},{"pc":[962],"errorMessage":"expected box == no_proxy"},{"pc":[950],"errorMessage":"expected global == no_proxy"},{"pc":[944],"errorMessage":"expected global assign == no_proxy"},{"pc":[956],"errorMessage":"expected local == no_proxy"},{"pc":[966],"errorMessage":"expected map == no_proxy"},{"pc":[593,619,646,672,700,726,758,784,811,837,871,897],"errorMessage":"index access is out of bounds"},{"pc":[585,638,692,750,803,863],"errorMessage":"invalid array length header"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA4CiAgICBieXRlY2Jsb2NrICJib3giICJub19wcm94eSIgMHgwMDAwICJnbG9iX2Fzc2lnbiIgImdsb2IiICJsb2MiIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YSAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0ICJtYXAiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MjQKICAgIC8vIHNlbGYubm9fcHJveHkgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weToyMgogICAgLy8gY2xhc3MgU3RhdGVNdXRhdGlvbnMoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AxMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NTI2ZThiYmYgMHg5NWZlZjEzZCAweDBjMjk0NDRiIC8vIG1ldGhvZCAiYXBwZW5kKCl2b2lkIiwgbWV0aG9kICJtb2RpZnkoKXZvaWQiLCBtZXRob2QgImdldCgpKHVpbnQ2NCxzdHJpbmcpW10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhcHBlbmQgbW9kaWZ5IGdldAogICAgZXJyCgptYWluX2JhcmVfcm91dGluZ0AxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weToyMgogICAgLy8gY2xhc3MgU3RhdGVNdXRhdGlvbnMoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHN3aXRjaCBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDEzIG1haW5fb3B0X2luQDE0CiAgICBlcnIKCm1haW5fb3B0X2luQDE0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMxCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18zIC8vICJnbG9iX2Fzc2lnbiIKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM0CiAgICAvLyBzZWxmLmdsb2IudmFsdWUgPSBNeUFycmF5KCkKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzMKICAgIC8vIHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzQKICAgIC8vIHNlbGYuZ2xvYi52YWx1ZSA9IE15QXJyYXkoKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNQogICAgLy8gc2VsZi5ib3gudmFsdWUgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM1CiAgICAvLyBzZWxmLmJveC52YWx1ZSA9IE15QXJyYXkoKQogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM2CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgdHhuIFNlbmRlcgogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM2CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM3CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM3CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMxCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMzoKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQoYXJyYXlfaXRlbXNfY291bnQ6IHVpbnQ2NCwgYXJyYXlfaGVhZF9hbmRfdGFpbDogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0LCBuZXdfaGVhZF9hbmRfdGFpbDogYnl0ZXMpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQ6CiAgICBwcm90byA0IDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzAgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQoc291cmNlOiBieXRlcywgbmV3X2l0ZW06IGJ5dGVzLCBpbmRleDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBzdWJzdHJpbmcgMCAyCiAgICBkdXAKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAyCiAgICBkaWcgMQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA1CiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZHVwCiAgICBkaWcgNAogICAgLQogICAgY292ZXIgNgogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGNvdmVyIDYKICAgIGRpZyA0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA1CiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgc3dhcAoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDUKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgMgogICAgc3dhcAogICAgcmVwbGFjZTMKICAgIGZyYW1lX2J1cnkgMwogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNQogICAgYiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU11dGF0aW9ucy5zdGF0ZW11dGF0aW9ucy5TdGF0ZU11dGF0aW9ucy5hcHBlbmRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBlbmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDIKICAgIC8vIGFyciA9IHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUuY29weSgpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYl9hc3NpZ24gZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDMKICAgIC8vIGFyci5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIGJ5dGVjIDYgLy8gMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMGEwMDAzNjI2MTdhCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ1CiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gYXJyLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ2CiAgICAvLyBzZWxmLm5vX3Byb3h5LmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vX3Byb3h5IGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQzCiAgICAvLyBhcnIuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBieXRlYyA2IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ2CiAgICAvLyBzZWxmLm5vX3Byb3h5LmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0NwogICAgLy8gc2VsZi5nbG9iLnZhbHVlLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYiBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0NwogICAgLy8gc2VsZi5nbG9iLnZhbHVlLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ4CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImxvYyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxvYyBleGlzdHMgZm9yIGFjY291bnQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0OAogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl0uYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgc3dhcAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ5CiAgICAvLyBzZWxmLmJveC52YWx1ZS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveCBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0OQogICAgLy8gc2VsZi5ib3gudmFsdWUuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18wIC8vICJib3giCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTAKICAgIC8vIHNlbGYubWFwW1R4bi5zZW5kZXJdLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hcCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1MAogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0uYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVNdXRhdGlvbnMuc3RhdGVtdXRhdGlvbnMuU3RhdGVNdXRhdGlvbnMubW9kaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKbW9kaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU2CiAgICAvLyBhcnIgPSBzZWxmLmdsb2JfYXNzaWduLnZhbHVlLmNvcHkoKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImdsb2JfYXNzaWduIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JfYXNzaWduIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU3CiAgICAvLyBhcnJbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NwogICAgLy8gYXJyWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU4CiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gYXJyLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYwCiAgICAvLyBzZWxmLm5vX3Byb3h5WzBdLmJheiA9IG1vZGlmaWVkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAibm9fcHJveHkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9fcHJveHkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NAogICAgLy8gbW9kaWZpZWQgPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgYnl0ZWMgNyAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjAKICAgIC8vIHNlbGYubm9fcHJveHlbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGNvbmNhdAogICAgc3dhcAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBieXRlY18xIC8vICJub19wcm94eSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjEKICAgIC8vIHNlbGYuZ2xvYi52YWx1ZVswXS5iYXogPSBtb2RpZmllZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYiBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MQogICAgLy8gc2VsZi5nbG9iLnZhbHVlWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNCAvLyAiZ2xvYiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjIKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdWzBdLmJheiA9IG1vZGlmaWVkCiAgICB0eG4gU2VuZGVyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJsb2MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sb2MgZXhpc3RzIGZvciBhY2NvdW50CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NAogICAgLy8gbW9kaWZpZWQgPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgYnl0ZWMgNyAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjIKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgc3dhcAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYzCiAgICAvLyBzZWxmLmJveC52YWx1ZVswXS5iYXogPSBtb2RpZmllZAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTQKICAgIC8vIG1vZGlmaWVkID0gYXJjNC5TdHJpbmcoIm1vZGlmaWVkIikKICAgIGJ5dGVjIDcgLy8gMHgwMDA4NmQ2ZjY0Njk2NjY5NjU2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYzCiAgICAvLyBzZWxmLmJveC52YWx1ZVswXS5iYXogPSBtb2RpZmllZAogICAgY29uY2F0CiAgICBzd2FwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjY0CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXVswXS5iYXogPSBtb2RpZmllZAogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hcCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2NAogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl1bMF0uYmF6ID0gbW9kaWZpZWQKICAgIGNvbmNhdAogICAgc3dhcAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU11dGF0aW9ucy5zdGF0ZW11dGF0aW9ucy5TdGF0ZU11dGF0aW9ucy5nZXRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjgKICAgIC8vIGEwID0gc2VsZi5ub19wcm94eS5jb3B5KCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJub19wcm94eSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub19wcm94eSBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2OQogICAgLy8gYTEgPSBzZWxmLmdsb2JfYXNzaWduLnZhbHVlLmNvcHkoKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImdsb2JfYXNzaWduIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JfYXNzaWduIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjcwCiAgICAvLyBhMiA9IHNlbGYuZ2xvYi52YWx1ZS5jb3B5KCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJnbG9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2IgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzEKICAgIC8vIGEzID0gc2VsZi5sb2NbVHhuLnNlbmRlcl0uY29weSgpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubG9jIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjcyCiAgICAvLyBhNCA9IHNlbGYuYm94LnZhbHVlLmNvcHkoKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjczCiAgICAvLyBhNSA9IHNlbGYubWFwW1R4bi5zZW5kZXJdLmNvcHkoKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXAgZW50cnkgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzUKICAgIC8vIGFzc2VydCBhMCA9PSBhMSwgImV4cGVjdGVkIGdsb2JhbCBhc3NpZ24gPT0gbm9fcHJveHkiCiAgICBkaWcgNQogICAgdW5jb3ZlciA1CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGdsb2JhbCBhc3NpZ24gPT0gbm9fcHJveHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3NgogICAgLy8gYXNzZXJ0IGEwID09IGEyLCAiZXhwZWN0ZWQgZ2xvYmFsID09IG5vX3Byb3h5IgogICAgZGlnIDQKICAgIHVuY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgPT0gbm9fcHJveHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3NwogICAgLy8gYXNzZXJ0IGEwID09IGEzLCAiZXhwZWN0ZWQgbG9jYWwgPT0gbm9fcHJveHkiCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxvY2FsID09IG5vX3Byb3h5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzgKICAgIC8vIGFzc2VydCBhMCA9PSBhNCwgImV4cGVjdGVkIGJveCA9PSBub19wcm94eSIKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYm94ID09IG5vX3Byb3h5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzkKICAgIC8vIGFzc2VydCBhMCA9PSBhNSwgImV4cGVjdGVkIG1hcCA9PSBub19wcm94eSIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG1hcCA9PSBub19wcm94eQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAAECCCYJA2JveAhub19wcm94eQIAAAtnbG9iX2Fzc2lnbgRnbG9iA2xvYxEAAgAAAAAAAAABAAoAA2JhegoACG1vZGlmaWVkA21hcDEYQAADKSpnMRtBACQxGRREMRhEggMEUm6LvwSV/vE9BAwpREs2GgCOAwE2Ab8DDgAxGY0CACMAAQAxGEQrKmcnBCpnKLxIKCq/MQAnBSpmJwgxAFBJvEgqvyNDMRgUQ4oEAYAASYv+JAuL/CQLIosEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAIowEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiYoDAYv9UQACSReL/VcCAIv/JAtLAUxZi/8jCCQLSwJLAVlLAxVLBYv/CSMJSwFPA08CTUlLBAlOBov+FU4GSwQiTwVSi/5QTwRPAk8DUlBOAkwkC0yLBYsEDEEAIIsDSYsFSU4DWYsCCIsBCRZXBgJLAkxdjAMkCIwFQv/YiwCLA1CMAIkiK2VESSJZTFcCACMnBoj+6StMZyIpZURJIllMVwIAIycGiP7VKUxnIicEZURJIllMVwIAIycGiP7AJwRMZzEASSInBWNESSJZTFcCACMnBoj+pycFTGYovkRJIllMVwIAIycGiP6TKLxIKEy/JwgxAFBJvkRJIllMVwIAIycGiP54SwG8SL8jQyIrZURJVwIASwEiWUsBIllLASMJSwMVSwQkWU8CTU8DTgJSSSVZIkxYJwdQTEQiiP7AK0xnIillRElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/ospTGciJwRlRElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/lUnBExnMQBJIicFY0RJVwIASwEiWUsBIllLASMJSwMVSwQkWU8CTU8DTgJSSSVZIkxYJwdQTEQiiP4bJwVMZii+RElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/eYovEgoTL8nCDEAUEm+RElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/apLAbxIvyNDIillRCIrZUQiJwRlRDEAIicFY0QovkQnCDEAUL5ESwVPBRJESwRPBBJESwNPAxJESwJPAhJESwESRIAEFR98dUxQsCND","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateMutations contract + */ +export type StateMutationsArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'append()void': Record + 'modify()void': Record + 'get()(uint64,string)[]': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'append()void': [] + 'modify()void': [] + 'get()(uint64,string)[]': [] + } +} + +/** + * The return type for each method + */ +export type StateMutationsReturns = { + 'append()void': void + 'modify()void': void + 'get()(uint64,string)[]': [bigint, string][] +} + +/** + * Defines the types of available calls and state of the StateMutations smart contract. + */ +export type StateMutationsTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'append()void' | 'append', { + argsObj: StateMutationsArgs['obj']['append()void'] + argsTuple: StateMutationsArgs['tuple']['append()void'] + returns: StateMutationsReturns['append()void'] + }> + & Record<'modify()void' | 'modify', { + argsObj: StateMutationsArgs['obj']['modify()void'] + argsTuple: StateMutationsArgs['tuple']['modify()void'] + returns: StateMutationsReturns['modify()void'] + }> + & Record<'get()(uint64,string)[]' | 'get', { + argsObj: StateMutationsArgs['obj']['get()(uint64,string)[]'] + argsTuple: StateMutationsArgs['tuple']['get()(uint64,string)[]'] + returns: StateMutationsReturns['get()(uint64,string)[]'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + global: { + keys: { + noProxy: [bigint, string][] + globAssign: [bigint, string][] + glob: [bigint, string][] + } + maps: {} + } + local: { + keys: { + loc: [bigint, string][] + } + maps: {} + } + box: { + keys: { + box: [bigint, string][] + } + maps: { + map: Map + } + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type StateMutationsSignatures = keyof StateMutationsTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateMutationsNonVoidMethodSignatures = keyof StateMutationsTypes['methods'] extends infer T ? T extends keyof StateMutationsTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateMutations smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateMutationsTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateMutations smart contract to the method's return type + */ +export type MethodReturn = StateMutationsTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed global state of the application. + */ +export type GlobalKeysState = StateMutationsTypes['state']['global']['keys'] + +/** + * Defines the shape of the keyed local state of the application. + */ +export type LocalKeysState = StateMutationsTypes['state']['local']['keys'] + +/** + * Defines the shape of the keyed box state of the application. + */ +export type BoxKeysState = StateMutationsTypes['state']['box']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateMutationsCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateMutationsDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateMutationsCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateMutations smart contract + */ +export abstract class StateMutationsParamsFactory { + /** + * Constructs a no op call for the append()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static append(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'append()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the modify()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static modify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'modify()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get()(uint64,string)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static get(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get()(uint64,string)[]' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateMutations smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateMutationsFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateMutationsFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateMutationsClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateMutationsClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateMutations smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateMutationsDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateMutationsClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateMutations smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateMutations smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateMutations smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateMutationsClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateMutations smart contract + */ +export class StateMutationsClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateMutationsClient` + * + * @param appClient An `AppClient` instance which has been created with the StateMutations app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateMutationsClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateMutationsClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateMutationsClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateMutationsClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateMutationsClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateMutations smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The optIn result + */ + bare: (params?: Expand) => { + return this.appClient.params.bare.optIn(params) + }, + }, + + /** + * Makes a clear_state call to an existing instance of the StateMutations smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateMutations smart contract using the `append()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + append: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(StateMutationsParamsFactory.append(params)) + }, + + /** + * Makes a call to the StateMutations smart contract using the `modify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + modify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(StateMutationsParamsFactory.modify(params)) + }, + + /** + * Makes a call to the StateMutations smart contract using the `get()(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + get: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(StateMutationsParamsFactory.get(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateMutations smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The optIn result + */ + bare: (params?: Expand) => { + return this.appClient.createTransaction.bare.optIn(params) + }, + }, + + /** + * Makes a clear_state call to an existing instance of the StateMutations smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateMutations smart contract using the `append()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + append: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(StateMutationsParamsFactory.append(params)) + }, + + /** + * Makes a call to the StateMutations smart contract using the `modify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + modify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(StateMutationsParamsFactory.modify(params)) + }, + + /** + * Makes a call to the StateMutations smart contract using the `get()(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + get: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(StateMutationsParamsFactory.get(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateMutations smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The optIn result + */ + bare: (params?: Expand) => { + return this.appClient.send.bare.optIn(params) + }, + }, + + /** + * Makes a clear_state call to an existing instance of the StateMutations smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateMutations smart contract using the `append()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + append: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(StateMutationsParamsFactory.append(params)) + return {...result, return: result.return as unknown as (undefined | StateMutationsReturns['append()void'])} + }, + + /** + * Makes a call to the StateMutations smart contract using the `modify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + modify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(StateMutationsParamsFactory.modify(params)) + return {...result, return: result.return as unknown as (undefined | StateMutationsReturns['modify()void'])} + }, + + /** + * Makes a call to the StateMutations smart contract using the `get()(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + get: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(StateMutationsParamsFactory.get(params)) + return {...result, return: result.return as unknown as (undefined | StateMutationsReturns['get()(uint64,string)[]'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateMutationsClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateMutations app + */ + state = { + /** + * Methods to access global state for the current StateMutations app + */ + global: { + /** + * Get all current keyed values from global state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.global.getAll() + return { + noProxy: result.no_proxy, + globAssign: result.glob_assign, + glob: result.glob, + } + }, + /** + * Get the current value of the no_proxy key in global state + */ + noProxy: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.global.getValue("no_proxy")) as [bigint, string][] | undefined }, + /** + * Get the current value of the glob_assign key in global state + */ + globAssign: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.global.getValue("glob_assign")) as [bigint, string][] | undefined }, + /** + * Get the current value of the glob key in global state + */ + glob: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.global.getValue("glob")) as [bigint, string][] | undefined }, + }, + /** + * Methods to access local state for the current StateMutations app + */ + local: (address: string | Address) => { + const encodedAddress = typeof address === 'string' ? address : encodeAddress(address.publicKey) + return { + /** + * Get all current keyed values from local state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.local(encodedAddress).getAll() + return { + loc: result.loc, + } + }, + /** + * Get the current value of the loc key in local state + */ + loc: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.local(encodedAddress).getValue("loc")) as [bigint, string][] | undefined }, + } + }, + /** + * Methods to access box state for the current StateMutations app + */ + box: { + /** + * Get all current keyed values from box state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.box.getAll() + return { + box: result.box, + } + }, + /** + * Get the current value of the box key in box state + */ + box: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.box.getValue("box")) as [bigint, string][] | undefined }, + /** + * Get values from the map map in box state + */ + map: { + /** + * Get all current values of the map map in box state + */ + getMap: async (): Promise> => { return (await this.appClient.state.box.getMap("map")) as Map }, + /** + * Get a current value of the map map by key from box state + */ + value: async (key: string): Promise<[bigint, string][] | undefined> => { return await this.appClient.state.box.getMapValue("map", key) as [bigint, string][] | undefined }, + }, + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateMutationsComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a append()void method call against the StateMutations contract + */ + append(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.append(params))) + return this + }, + /** + * Add a modify()void method call against the StateMutations contract + */ + modify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.modify(params))) + return this + }, + /** + * Add a get()(uint64,string)[] method call against the StateMutations contract + */ + get(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.get(params))) + return this + }, + get optIn() { + return { + bare: (params?: AppClientBareCallParams ) => { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.optIn.bare(params))) + return this + }, + } + }, + /** + * Add a clear state call to the StateMutations contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateMutationsComposer + } +} +export type StateMutationsComposer = { + /** + * Calls the append()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + append(params?: CallParams): StateMutationsComposer<[...TReturns, StateMutationsReturns['append()void'] | undefined]> + + /** + * Calls the modify()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + modify(params?: CallParams): StateMutationsComposer<[...TReturns, StateMutationsReturns['modify()void'] | undefined]> + + /** + * Calls the get()(uint64,string)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + get(params?: CallParams): StateMutationsComposer<[...TReturns, StateMutationsReturns['get()(uint64,string)[]'] | undefined]> + + /** + * Gets available optIn methods + */ + readonly optIn: { + /** + * Opts the user into an existing instance of the StateMutations smart contract using a bare call. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + bare(params?: AppClientBareCallParams ): StateMutationsComposer + } + + /** + * Makes a clear_state call to an existing instance of the StateMutations smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateMutationsComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateMutationsComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateMutationsComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StaticSizeContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StaticSizeContract.ts new file mode 100644 index 0000000..a0eb9be --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StaticSizeContract.ts @@ -0,0 +1,1009 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StaticSizeContract","structs":{},"methods":[{"name":"test_array","args":[{"type":"uint64","name":"x1"},{"type":"uint64","name":"y1"},{"type":"uint64","name":"x2"},{"type":"uint64","name":"y2"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_extend_from_tuple","args":[{"type":"((uint64,uint64),(uint64,uint64))","name":"some_more"}],"returns":{"type":"(uint64,uint64)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_extend_from_arc4_tuple","args":[{"type":"((uint64,uint64),(uint64,uint64))","name":"some_more"}],"returns":{"type":"(uint64,uint64)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_bool_array","args":[{"type":"uint64","name":"length"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_arc4_conversion","args":[{"type":"uint64","name":"length"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"sum_array","args":[{"type":"uint64[]","name":"arc4_arr"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_arc4_bool","args":[],"returns":{"type":"bool[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":1,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{"count":{"keyType":"AVMString","valueType":"AVMUint64","key":"Y291bnQ="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[1188,1205,1215],"errorMessage":"check self.count exists"},{"pc":[1033],"errorMessage":"expected 3 bytes"},{"pc":[750,761,861,1026,1115],"errorMessage":"expected correct length"},{"pc":[1053,1128],"errorMessage":"expected correct value at 0"},{"pc":[1073,1141],"errorMessage":"expected correct value at 1"},{"pc":[1154],"errorMessage":"expected correct value at 2"},{"pc":[1166],"errorMessage":"expected correct value at 3"},{"pc":[403,478,517,637,665,784,883,1035,1056,1117,1130,1143,1155],"errorMessage":"index access is out of bounds"},{"pc":[653,1018],"errorMessage":"invalid array length header"},{"pc":[729,753,840,908,999,1098],"errorMessage":"max array length exceeded"},{"pc":[283,342,377],"errorMessage":"overflow"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAxNiAxNDQKICAgIGJ5dGVjYmxvY2sgMHggMHgxNTFmN2M3NSAiY291bnQiIDB4MDAgMHgwMDAwCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjM5CiAgICAvLyBzZWxmLmNvdW50ID0gVUludDY0KDApCiAgICBieXRlY18yIC8vICJjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjM3CiAgICAvLyBjbGFzcyBTdGF0aWNTaXplQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDI4ZDdjMWI4IDB4ZmE5Y2I5NzMgMHg2MDM5YTI0MCAweGY4ZmQ2OGE3IDB4MWYwMjhkYjEgMHgwOTZiM2E1OSAweDhkNmUzYTI1IC8vIG1ldGhvZCAidGVzdF9hcnJheSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2V4dGVuZF9mcm9tX3R1cGxlKCgodWludDY0LHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQpKSkodWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAidGVzdF9leHRlbmRfZnJvbV9hcmM0X3R1cGxlKCgodWludDY0LHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQpKSkodWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAidGVzdF9ib29sX2FycmF5KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRlc3RfYXJjNF9jb252ZXJzaW9uKHVpbnQ2NCl1aW50NjRbXSIsIG1ldGhvZCAic3VtX2FycmF5KHVpbnQ2NFtdKXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9hcmM0X2Jvb2woKWJvb2xbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHRlc3RfYXJyYXkgdGVzdF9leHRlbmRfZnJvbV90dXBsZSB0ZXN0X2V4dGVuZF9mcm9tX2FyYzRfdHVwbGUgdGVzdF9ib29sX2FycmF5IHRlc3RfYXJjNF9jb252ZXJzaW9uIHN1bV9hcnJheSB0ZXN0X2FyYzRfYm9vbAogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9iaXRzKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIHJlYWRfc3RlcDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYml0czoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiAyCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwbiAyCiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAtNAogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgY292ZXIgMgogICAgc3dhcAogICAgcHVzaGludCA3CiAgICArCiAgICBpbnRjXzIgLy8gOAogICAgLwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNwogICAgKwogICAgaW50Y18yIC8vIDgKICAgIC8KICAgIGR1cAogICAgY292ZXIgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl9pZl9lbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgLQogICAgYnplcm8KICAgIGZyYW1lX2RpZyA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgNAoKZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl9pZl9lbHNlQDI6CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDE2CiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBmcmFtZV9idXJ5IDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfd2hpbGVfdG9wQDM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfYWZ0ZXJfd2hpbGVANQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBnZXRiaXQKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX3doaWxlX3RvcEAzCgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX3doaWxlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC50ZXN0X2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcnJheToKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDMKICAgIC8vIHNlbGYuY291bnQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQ2CiAgICAvLyBQb2ludCh4PWFyYzQuVUludDY0KCksIHk9VUludDY0KCksIG90aGVyPXNlbGYueHRyYSgpKSwKICAgIGNhbGxzdWIgeHRyYQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0NwogICAgLy8gUG9pbnQoeD14MSwgeT15MSwgb3RoZXI9c2VsZi54dHJhKCkpLAogICAgY2FsbHN1YiB4dHJhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQ4CiAgICAvLyBQb2ludCh4PXgyLCB5PXkyLCBvdGhlcj1zZWxmLnh0cmEoKSksCiAgICBjYWxsc3ViIHh0cmEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDQtNTAKICAgIC8vIHBhdGggPSBSZWZlcmVuY2VBcnJheSgKICAgIC8vICAgICAoCiAgICAvLyAgICAgICAgIFBvaW50KHg9YXJjNC5VSW50NjQoKSwgeT1VSW50NjQoKSwgb3RoZXI9c2VsZi54dHJhKCkpLAogICAgLy8gICAgICAgICBQb2ludCh4PXgxLCB5PXkxLCBvdGhlcj1zZWxmLnh0cmEoKSksCiAgICAvLyAgICAgICAgIFBvaW50KHg9eDIsIHk9eTIsIG90aGVyPXNlbGYueHRyYSgpKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICBkaWcgMTEKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgcHVzaGludCA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMTIKICAgIGRpZyAxCiAgICBifAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTQKICAgIGl0b2IKICAgIHVuY292ZXIgMTUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgZGlnIDkKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgdW5jb3ZlciA5CiAgICBkaWcgNAogICAgYnwKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgdW5jb3ZlciA4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIGJ8CiAgICBjb25jYXQKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjUxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjUxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBkdXAKICAgIHB1c2hpbnQgMwogICAgPAogICAgYnogdGVzdF9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1MgogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuYiA9PSBpICsgMQogICAgZHVwMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjIDQgLy8gMTQ0CiAgICAqCiAgICBpbnRjIDQgLy8gMTQ0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGV4dHJhY3QgMTYgMTI4CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1MwogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuZC5mb28gPT0gaSArIDIKICAgIHN3YXAKICAgIGV4dHJhY3QgNDggMTYKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIHVuY292ZXIgMwogICAgcHVzaGludCAyCiAgICArCiAgICBpdG9iCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1NAogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuZC5iYXIgPT0gKGkgKyAxKSAqIChpICsgMSkKICAgIGV4dHJhY3QgOCA4CiAgICBkaWcgMQogICAgZGlnIDIKICAgICoKICAgIGl0b2IKICAgIGI9PQogICAgYXNzZXJ0CiAgICBidXJ5IDEKICAgIGIgdGVzdF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1NgogICAgLy8gQm94KEltbXV0YWJsZUFycmF5W1BvaW50XSwga2V5PSJhIikudmFsdWUgPSBwYXRoLmZyZWV6ZSgpCiAgICBkdXAKICAgIGxlbgogICAgaW50YyA0IC8vIDE0NAogICAgLwogICAgZHVwCiAgICBidXJ5IDEwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzICJhIgogICAgYm94X2RlbAogICAgcG9wCiAgICBwdXNoYnl0ZXMgImEiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2OAogICAgLy8gbGFzdF9wb2ludCA9IHBhdGhbMF0KICAgIGV4dHJhY3QgMCAxNDQgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIGJ1cnkgMTAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2OQogICAgLy8gbGVuZ3RoID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTcwCiAgICAvLyBmb3IgcG9pbnRfaWR4IGluIHVyYW5nZSgxLCBwYXRoLmxlbmd0aCk6CiAgICBpbnRjXzEgLy8gMQogICAgYnVyeSAzCgp0ZXN0X2FycmF5X2Zvcl9oZWFkZXJANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTcwCiAgICAvLyBmb3IgcG9pbnRfaWR4IGluIHVyYW5nZSgxLCBwYXRoLmxlbmd0aCk6CiAgICBkaWcgMgogICAgZGlnIDgKICAgIDwKICAgIGJ6IHRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDE1CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzEKICAgIC8vIHBvaW50ID0gcGF0aFtwb2ludF9pZHhdCiAgICBkaWcgMwogICAgaW50YyA0IC8vIDE0NAogICAgKgogICAgaW50YyA0IC8vIDE0NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXBuIDIKICAgIGV4dHJhY3QgMCA4CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzIKICAgIC8vIGlmIHBvaW50LnggPCBsYXN0X3BvaW50Lng6CiAgICBkaWcgMTAKICAgIGI8CiAgICBieiB0ZXN0X2FycmF5X2Vsc2VfYm9keUAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzMKICAgIC8vIGR4ID0gbGFzdF9wb2ludC54LmFzX3VpbnQ2NCgpIC0gcG9pbnQueC5hc191aW50NjQoKQogICAgZGlnIDEwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2OAogICAgLy8gbGFzdF9wb2ludCA9IHBhdGhbMF0KICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3MwogICAgLy8gZHggPSBsYXN0X3BvaW50LnguYXNfdWludDY0KCkgLSBwb2ludC54LmFzX3VpbnQ2NCgpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzEKICAgIC8vIHBvaW50ID0gcGF0aFtwb2ludF9pZHhdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzMKICAgIC8vIGR4ID0gbGFzdF9wb2ludC54LmFzX3VpbnQ2NCgpIC0gcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIGJ1cnkgNwoKdGVzdF9hcnJheV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzYKICAgIC8vIGlmIHBvaW50LnkgPCBsYXN0X3BvaW50Lnk6CiAgICBkaWcgMwogICAgZGlnIDYKICAgIDwKICAgIGJ6IHRlc3RfYXJyYXlfZWxzZV9ib2R5QDEzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3NwogICAgLy8gZHkgPSBsYXN0X3BvaW50LnkgLSBwb2ludC55CiAgICBkaWcgNQogICAgZGlnIDQKICAgIC0KCnRlc3RfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTgwCiAgICAvLyBsZW5ndGggKz0gb3Auc3FydChkeCAqIGR4ICsgZHkgKiBkeSkKICAgIGRpZyA3CiAgICBkdXAKICAgICoKICAgIHN3YXAKICAgIGR1cAogICAgKgogICAgKwogICAgc3FydAogICAgZGlnIDUKICAgICsKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzAKICAgIC8vIGZvciBwb2ludF9pZHggaW4gdXJhbmdlKDEsIHBhdGgubGVuZ3RoKToKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAzCiAgICBiIHRlc3RfYXJyYXlfZm9yX2hlYWRlckA3Cgp0ZXN0X2FycmF5X2Vsc2VfYm9keUAxMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTc5CiAgICAvLyBkeSA9IHBvaW50LnkgLSBsYXN0X3BvaW50LnkKICAgIGRpZyAzCiAgICBkaWcgNgogICAgLQogICAgYiB0ZXN0X2FycmF5X2FmdGVyX2lmX2Vsc2VAMTQKCnRlc3RfYXJyYXlfZWxzZV9ib2R5QDEwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzEKICAgIC8vIHBvaW50ID0gcGF0aFtwb2ludF9pZHhdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzUKICAgIC8vIGR4ID0gcG9pbnQueC5hc191aW50NjQoKSAtIGxhc3RfcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjgKICAgIC8vIGxhc3RfcG9pbnQgPSBwYXRoWzBdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzUKICAgIC8vIGR4ID0gcG9pbnQueC5hc191aW50NjQoKSAtIGxhc3RfcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIGJ1cnkgNwogICAgYiB0ZXN0X2FycmF5X2FmdGVyX2lmX2Vsc2VAMTEKCnRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyA0CiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QudGVzdF9leHRlbmRfZnJvbV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZXh0ZW5kX2Zyb21fdHVwbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgMTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMTYgMTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjIKICAgIC8vIGFyci5leHRlbmQoc29tZV9tb3JlKQogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2MwogICAgLy8gbGFzdCA9IGFyclstMV0KICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMTYKICAgIC8KICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyAxNgogICAgKgogICAgZGlnIDIKICAgIHN3YXAKICAgIGludGNfMyAvLyAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY0CiAgICAvLyBhc3NlcnQgbGFzdCA9PSBzb21lX21vcmVbMV0KICAgIGR1cAogICAgdW5jb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY1CiAgICAvLyByZXN1bHQgPSBhcnIuZnJlZXplKCkKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2NgogICAgLy8gYXNzZXJ0IHJlc3VsdFstMV0gPT0gbGFzdAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDE2CiAgICAqCiAgICBpbnRjXzMgLy8gMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfZXh0ZW5kX2Zyb21fYXJjNF90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZXh0ZW5kX2Zyb21fYXJjNF90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojc1CiAgICAvLyByZXR1cm4gYXJyLmZyZWV6ZSgpCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDE2CiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfYm9vbF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYm9vbF9hcnJheToKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3OQogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbYm9vbF0oKQogICAgYnl0ZWNfMCAvLyAweAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGludGNfMSAvLyAxCgp0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjgzCiAgICAvLyBhcnIuYXBwZW5kKGkgJSAyID09IDApCiAgICBkdXBuIDIKICAgIHB1c2hpbnQgMgogICAgJQogICAgIQogICAgZGlnIDQKICAgIHN3YXAKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMgogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojg0CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGgsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGxlbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6ODcKICAgIC8vIGFycjIuZXh0ZW5kKGFycikKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4OAogICAgLy8gYXNzZXJ0IGFycjIubGVuZ3RoID09IGxlbmd0aCAqIDIsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDIKICAgICoKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6OTAKICAgIC8vIGNvdW50ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjkxCiAgICAvLyBmb3IgdmFsIGluIGFycjoKICAgIGxlbgogICAgYnVyeSA3CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1Cgp0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5MQogICAgLy8gZm9yIHZhbCBpbiBhcnI6CiAgICBkaWcgNAogICAgZGlnIDcKICAgIDwKICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9mb3JAMTEKICAgIGRpZyAyCiAgICBkaWcgNQogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5MgogICAgLy8gaWYgdmFsOgogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5MwogICAgLy8gY291bnQgKz0gMQogICAgZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDYKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDk6CiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiB0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckA2Cgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfZm9yQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyA1CiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QudGVzdF9hcmM0X2NvbnZlcnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY29udmVyc2lvbjoKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5OAogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbYXJjNC5VSW50NjRdKCkKICAgIGJ5dGVjXzAgLy8gMHgKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTAxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMSwgbGVuZ3RoICsgMSk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaW50Y18xIC8vIDEKCnRlc3RfYXJjNF9jb252ZXJzaW9uX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTAxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMSwgbGVuZ3RoICsgMSk6CiAgICBkdXAKICAgIGRpZyAyCiAgICA8CiAgICBieiB0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDIKICAgIC8vIGFyci5hcHBlbmQoYXJjNC5VSW50NjQoaSkpCiAgICBkdXBuIDIKICAgIGl0b2IKICAgIGRpZyA0CiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDEKICAgIC8vIGZvciBpIGluIHVyYW5nZSgxLCBsZW5ndGggKyAxKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9hcmM0X2NvbnZlcnNpb25fZm9yX2hlYWRlckAyCgp0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9mb3JANToKICAgIGRpZyAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwMwogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gbGVuZ3RoLCAiZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgiCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBkdXAKICAgIGJ1cnkgOAogICAgZGlnIDQKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTA0CiAgICAvLyBjb3VudCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9hcmM0X2NvbnZlcnNpb25fZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDUKICAgIC8vIGZvciB2YWwgaW4gYXJyOgogICAgZGlnIDQKICAgIGRpZyA3CiAgICA8CiAgICBieiB0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9mb3JAMTEKICAgIGRpZyAyCiAgICBkaWcgNQogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTA2CiAgICAvLyBpZiB2YWw6CiAgICBieXRlY18wIC8vIDB4CiAgICBiIT0KICAgIGJ6IHRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDcKICAgIC8vIGNvdW50ICs9IDEKICAgIGRpZyA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA2Cgp0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9pZl9lbHNlQDk6CiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiB0ZXN0X2FyYzRfY29udmVyc2lvbl9mb3JfaGVhZGVyQDYKCnRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2ZvckAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTA5CiAgICAvLyBhcmM0X2FyciA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSgpCiAgICBieXRlYyA0IC8vIDB4MDAwMAogICAgZGlnIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTEwCiAgICAvLyBhcmM0X2Fyci5leHRlbmQoYXJyKQogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC5zdW1fYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgpzdW1fYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTE3CiAgICAvLyBhcnIuZXh0ZW5kKGFyYzRfYXJyKQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMTkKICAgIC8vIHRvdGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjAKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgIC8KICAgIGludGNfMCAvLyAwCgpzdW1fYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjAKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IHN1bV9hcnJheV9hZnRlcl9mb3JANQogICAgZGlnIDMKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEyMQogICAgLy8gdG90YWwgKz0gaXRlbS5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA0CiAgICArCiAgICBidXJ5IDQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgc3VtX2FycmF5X2Zvcl9oZWFkZXJAMgoKc3VtX2FycmF5X2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0MgogICAgLy8gYXJyLmFwcGVuZChhcmM0LkJvb2woVHhuLnNlbmRlciA9PSBUeG4ucmVjZWl2ZXIpKQogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICA9PQogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQzCiAgICAvLyBhcnIuYXBwZW5kKGFyYzQuQm9vbChUeG4uc2VuZGVyICE9IFR4bi5yZWNlaXZlcikpCiAgICB0eG4gU2VuZGVyCiAgICB0eG4gUmVjZWl2ZXIKICAgICE9CiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ2CiAgICAvLyBkeW5fYXJyLmV4dGVuZChhcnIpCiAgICBsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ1CiAgICAvLyBkeW5fYXJyID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5Cb29sXSgpCiAgICBieXRlYyA0IC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDYKICAgIC8vIGR5bl9hcnIuZXh0ZW5kKGFycikKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDcKICAgIC8vIGFzc2VydCBkeW5fYXJyLmxlbmd0aCA9PSAyLCAiZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgiCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGR1cAogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0OAogICAgLy8gYXNzZXJ0IGR5bl9hcnIuYnl0ZXMubGVuZ3RoID09IDMsICJleHBlY3RlZCAzIGJ5dGVzIgogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDMgYnl0ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ5CiAgICAvLyBhc3NlcnQgZHluX2FyclswXSA9PSAoVHhuLnNlbmRlciA9PSBUeG4ucmVjZWl2ZXIpLCAiZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAwIgogICAgZHVwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMTYKICAgIGdldGJpdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgPT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE1MAogICAgLy8gYXNzZXJ0IGR5bl9hcnJbMV0gPT0gKFR4bi5zZW5kZXIgIT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMSIKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hpbnQgMTcKICAgIGdldGJpdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxCiAgICBpbnRjXzAgLy8gMAoKdGVzdF9hcmM0X2Jvb2xfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTMtMTU1CiAgICAvLyAjIG5vdGU6IG5vdCBzdXBwb3J0ZWQgY3VycmVudGx5CiAgICAvLyAjIGFycjIuZXh0ZW5kKGR5bl9hcnJheSkKICAgIC8vIGZvciBiIGluIGR5bl9hcnI6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2FyYzRfYm9vbF9hZnRlcl9mb3JANQogICAgZHVwbiAyCiAgICBpbnRjXzMgLy8gMTYKICAgICsKICAgIGRpZyA1CiAgICBzd2FwCiAgICBnZXRiaXQKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTYKICAgIC8vIGFycjIuYXBwZW5kKGIpCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FyYzRfYm9vbF9mb3JfaGVhZGVyQDIKCnRlc3RfYXJjNF9ib29sX2FmdGVyX2ZvckA1OgogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTU3CiAgICAvLyBhc3NlcnQgYXJyMi5sZW5ndGggPT0gNCwgImV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoIgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTgKICAgIC8vIGFzc2VydCBhcnIyWzBdID09IChUeG4uc2VuZGVyID09IFR4bi5yZWNlaXZlciksICJleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDAiCiAgICBkdXAKICAgIGV4dHJhY3QgMCAxIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICA9PQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTU5CiAgICAvLyBhc3NlcnQgYXJyMlsxXSA9PSAoVHhuLnNlbmRlciAhPSBUeG4ucmVjZWl2ZXIpLCAiZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxIgogICAgZHVwCiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2MAogICAgLy8gYXNzZXJ0IGFycjJbMl0gPT0gKFR4bi5zZW5kZXIgPT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMiIKICAgIGR1cAogICAgZXh0cmFjdCAyIDEgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG4gU2VuZGVyCiAgICB0eG4gUmVjZWl2ZXIKICAgID09CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjEKICAgIC8vIGFzc2VydCBhcnIyWzNdID09IChUeG4uc2VuZGVyICE9IFR4bi5yZWNlaXZlciksICJleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDMiCiAgICBleHRyYWN0IDMgMSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAzCiAgICBkaWcgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjMKICAgIC8vIHJldHVybiBhcnIuZnJlZXplKCkKICAgIGR1cAogICAgbGVuCiAgICBieXRlYyA0IC8vIDB4MDAwMAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYml0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QueHRyYSgpIC0+IHVpbnQ2NCwgdWludDY0LCBieXRlcywgYnl0ZXMsIGJ5dGVzOgp4dHJhOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjYKICAgIC8vIHNlbGYuY291bnQgKz0gMQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEyOAogICAgLy8gYT1UeG4ubnVtX2FwcF9hcmdzLAogICAgdHhuIE51bUFwcEFyZ3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTMwCiAgICAvLyBjPVR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEzMQogICAgLy8gZD1zZWxmLm1vcmUoKSwKICAgIGNhbGxzdWIgbW9yZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMzIKICAgIC8vIGU9QmlnVUludChzZWxmLmNvdW50KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3VudCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTI3LTEzMwogICAgLy8gcmV0dXJuIFh0cmEoCiAgICAvLyAgICAgYT1UeG4ubnVtX2FwcF9hcmdzLAogICAgLy8gICAgIGI9c2VsZi5jb3VudCwKICAgIC8vICAgICBjPVR4bi5zZW5kZXIsCiAgICAvLyAgICAgZD1zZWxmLm1vcmUoKSwKICAgIC8vICAgICBlPUJpZ1VJbnQoc2VsZi5jb3VudCksCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0Lm1vcmUoKSAtPiBieXRlczoKbW9yZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTM3CiAgICAvLyByZXR1cm4gTW9yZShmb289YXJjNC5VSW50NjQoc2VsZi5jb3VudCArIDEpLCBiYXI9YXJjNC5VSW50NjQoc2VsZi5jb3VudCAqIHNlbGYuY291bnQpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50IGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZGlnIDEKICAgIHVuY292ZXIgMgogICAgKgogICAgaXRvYgogICAgY29uY2F0CiAgICByZXRzdWIK","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAFAAEIEJABJgUABBUffHUFY291bnQBAAIAADEYQAADKiJnMRtBAEAxGRREMRhEggcEKNfBuAT6nLlzBGA5okAE+P1opwQfAo2xBAlrOlkEjW46JTYaAI4HAIEB+QI8Ak8CxgM4A2sAMRkUMRgUEEOKBAEoRwKL/CJZRwKL/ghJFlcGAIv8TFwATgJMgQcIJApJTwKBBwgkCklOAgxBAAyLBosFCa+LBExQjAQijACLAyUISYwCi/4IjAGLAosBDEEAIIv9iwBJTgJTiwSLAklOA08CVIwEIwiMAov/CIwAQv/YiwSMAIkiSShHBTYaATYaAhc2GgM2GgQXKiJniAOfiAOciAOZTw4WTw4WUE8NUE8MUEsLFYFADkSBQK9PDEsBq08CTFCAEAAAAAAAAAAAAAAAAAAAAABMUE8OFk8PTFBPDBZPDBZQTwtQTwpQSwkVgUAORE8JSwSrUFBQTwcWTwhMUE8HFk8HFlBPBlBPBVBLBBWBQA5ETwRPBKtQUFAiSYEDDEEAOUpJTgIhBAshBFhXEIBJJFtLAiMITEsBEkRMVzAQSVcACE8DgQIIFqhEVwgISwFLAgsWqERFAUL/wEsBSRUhBApJRQoWVwYCSwFQgAFhvEiAAWFMv1cAkElFC0lXAAhFCiRbRQYiRQUjRQNLAksIDEEAXEsBSwMhBAshBFhHAlcACEwkW0UGSwqkQQA2SwoiW0wiWwlFB0sDSwYMQQAcSwVLBAlLB0kLTEkLCJJLBQhFBUsCIwhFA0L/sEsDSwYJQv/hIltLCiJbCUUHQv/ISwQWKUxQsCNDNhoBSVcAEExXEBBMSwFQSRUlCkkjCSULSwJMJVhJTwQSREwWVwYCTwJQSSJZIwlLAVcCAEwlCyVYTwISRClMULAjQzYaAUkVJQoWVwYCTFApTFCwI0MoRwI2GgEXSShMIwgjSUsCDEEAGEcCgQIYFEsETCsiTwJUUEUEIwhFAUL/4UsCRwIVSwZJTgQSREsBUBVPAoECCxJEIkUHFUUHIkUFSwRLBwxBABpLAksFI1giU0EABksFIwhFBksEIwhFBUL/3ksFFilMULAjQyhHAjYaARdJKEwjCCNJSwIMQQAQRwIWSwRMUEUEIwhFAUL/6UsCFSQKSUUISwQSRCJFBiJFBUsESwcMQQAcSwJLBSQLJFgoqUEABksFIwhFBksEIwhFBUL/3CcESwNQSVcCABUkChZXBgJcAClMULAjQzYaAVcCAEkiTBUkCiJJSwIMQQAWSwNLAUlOAiQLW0sECEUEIwhFAUL/40sCFilMULAjQzEAMQcSKyJPAlQxADEHEysiTwJUUEcCFScESwJPAiSI/HxJTgJJIllJTgNJgQISREsBFYEDEkRJREsBJVMrIk8CVCJTMQAxBxISRCMNRIERUysiTwJUIlMxADEHExJEIklLAwxBABpHAiUISwVMUysiTwJUSwNMUEUDIwhFAUL/30sBSRWBBBJESVcAASJTMQAxBxISRElXAQEiUzEAMQcTEkRJVwIBIlMxADEHEhJEVwMBIlMxADEHExJESwRJFScETgIkiPvWKUxQsCNDIiplRCMIKksBZzEbMQCIAAoiKmVEFk8DTgSJIiplREkjCBZLAU8CCxZQiQ==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StaticSizeContract contract + */ +export type StaticSizeContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'test_array(uint64,uint64,uint64,uint64)uint64': { + x1: bigint | number + y1: bigint | number + x2: bigint | number + y2: bigint | number + } + 'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': { + someMore: [[bigint | number, bigint | number], [bigint | number, bigint | number]] + } + 'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': { + someMore: [[bigint | number, bigint | number], [bigint | number, bigint | number]] + } + 'test_bool_array(uint64)uint64': { + length: bigint | number + } + 'test_arc4_conversion(uint64)uint64[]': { + length: bigint | number + } + 'sum_array(uint64[])uint64': { + arc4Arr: bigint[] | number[] + } + 'test_arc4_bool()bool[]': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'test_array(uint64,uint64,uint64,uint64)uint64': [x1: bigint | number, y1: bigint | number, x2: bigint | number, y2: bigint | number] + 'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': [someMore: [[bigint | number, bigint | number], [bigint | number, bigint | number]]] + 'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': [someMore: [[bigint | number, bigint | number], [bigint | number, bigint | number]]] + 'test_bool_array(uint64)uint64': [length: bigint | number] + 'test_arc4_conversion(uint64)uint64[]': [length: bigint | number] + 'sum_array(uint64[])uint64': [arc4Arr: bigint[] | number[]] + 'test_arc4_bool()bool[]': [] + } +} + +/** + * The return type for each method + */ +export type StaticSizeContractReturns = { + 'test_array(uint64,uint64,uint64,uint64)uint64': bigint + 'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': [bigint, bigint][] + 'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': [bigint, bigint][] + 'test_bool_array(uint64)uint64': bigint + 'test_arc4_conversion(uint64)uint64[]': bigint[] + 'sum_array(uint64[])uint64': bigint + 'test_arc4_bool()bool[]': boolean[] +} + +/** + * Defines the types of available calls and state of the StaticSizeContract smart contract. + */ +export type StaticSizeContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'test_array(uint64,uint64,uint64,uint64)uint64' | 'test_array', { + argsObj: StaticSizeContractArgs['obj']['test_array(uint64,uint64,uint64,uint64)uint64'] + argsTuple: StaticSizeContractArgs['tuple']['test_array(uint64,uint64,uint64,uint64)uint64'] + returns: StaticSizeContractReturns['test_array(uint64,uint64,uint64,uint64)uint64'] + }> + & Record<'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]' | 'test_extend_from_tuple', { + argsObj: StaticSizeContractArgs['obj']['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] + argsTuple: StaticSizeContractArgs['tuple']['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] + returns: StaticSizeContractReturns['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] + }> + & Record<'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]' | 'test_extend_from_arc4_tuple', { + argsObj: StaticSizeContractArgs['obj']['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] + argsTuple: StaticSizeContractArgs['tuple']['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] + returns: StaticSizeContractReturns['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] + }> + & Record<'test_bool_array(uint64)uint64' | 'test_bool_array', { + argsObj: StaticSizeContractArgs['obj']['test_bool_array(uint64)uint64'] + argsTuple: StaticSizeContractArgs['tuple']['test_bool_array(uint64)uint64'] + returns: StaticSizeContractReturns['test_bool_array(uint64)uint64'] + }> + & Record<'test_arc4_conversion(uint64)uint64[]' | 'test_arc4_conversion', { + argsObj: StaticSizeContractArgs['obj']['test_arc4_conversion(uint64)uint64[]'] + argsTuple: StaticSizeContractArgs['tuple']['test_arc4_conversion(uint64)uint64[]'] + returns: StaticSizeContractReturns['test_arc4_conversion(uint64)uint64[]'] + }> + & Record<'sum_array(uint64[])uint64' | 'sum_array', { + argsObj: StaticSizeContractArgs['obj']['sum_array(uint64[])uint64'] + argsTuple: StaticSizeContractArgs['tuple']['sum_array(uint64[])uint64'] + returns: StaticSizeContractReturns['sum_array(uint64[])uint64'] + }> + & Record<'test_arc4_bool()bool[]' | 'test_arc4_bool', { + argsObj: StaticSizeContractArgs['obj']['test_arc4_bool()bool[]'] + argsTuple: StaticSizeContractArgs['tuple']['test_arc4_bool()bool[]'] + returns: StaticSizeContractReturns['test_arc4_bool()bool[]'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + global: { + keys: { + count: bigint + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type StaticSizeContractSignatures = keyof StaticSizeContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StaticSizeContractNonVoidMethodSignatures = keyof StaticSizeContractTypes['methods'] extends infer T ? T extends keyof StaticSizeContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StaticSizeContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StaticSizeContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StaticSizeContract smart contract to the method's return type + */ +export type MethodReturn = StaticSizeContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed global state of the application. + */ +export type GlobalKeysState = StaticSizeContractTypes['state']['global']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StaticSizeContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StaticSizeContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StaticSizeContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StaticSizeContract smart contract + */ +export abstract class StaticSizeContractParamsFactory { + /** + * Constructs a no op call for the test_array(uint64,uint64,uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_array(uint64,uint64,uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.x1, params.args.y1, params.args.x2, params.args.y2], + } + } + /** + * Constructs a no op call for the test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testExtendFromTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.someMore], + } + } + /** + * Constructs a no op call for the test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testExtendFromArc4Tuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.someMore], + } + } + /** + * Constructs a no op call for the test_bool_array(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testBoolArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_bool_array(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.length], + } + } + /** + * Constructs a no op call for the test_arc4_conversion(uint64)uint64[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testArc4Conversion(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_arc4_conversion(uint64)uint64[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.length], + } + } + /** + * Constructs a no op call for the sum_array(uint64[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static sumArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'sum_array(uint64[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arc4Arr], + } + } + /** + * Constructs a no op call for the test_arc4_bool()bool[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_arc4_bool()bool[]' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StaticSizeContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StaticSizeContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StaticSizeContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StaticSizeContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StaticSizeContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StaticSizeContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StaticSizeContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StaticSizeContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StaticSizeContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StaticSizeContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StaticSizeContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StaticSizeContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StaticSizeContract smart contract + */ +export class StaticSizeContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StaticSizeContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StaticSizeContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StaticSizeContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StaticSizeContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StaticSizeContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StaticSizeContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StaticSizeContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StaticSizeContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_array(uint64,uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StaticSizeContractParamsFactory.testArray(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testExtendFromTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StaticSizeContractParamsFactory.testExtendFromTuple(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testExtendFromArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StaticSizeContractParamsFactory.testExtendFromArc4Tuple(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_bool_array(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testBoolArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StaticSizeContractParamsFactory.testBoolArray(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_arc4_conversion(uint64)uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testArc4Conversion: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StaticSizeContractParamsFactory.testArc4Conversion(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `sum_array(uint64[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + sumArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StaticSizeContractParamsFactory.sumArray(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_arc4_bool()bool[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(StaticSizeContractParamsFactory.testArc4Bool(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StaticSizeContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_array(uint64,uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testArray(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testExtendFromTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testExtendFromTuple(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testExtendFromArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testExtendFromArc4Tuple(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_bool_array(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testBoolArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testBoolArray(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_arc4_conversion(uint64)uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testArc4Conversion: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testArc4Conversion(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `sum_array(uint64[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + sumArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.sumArray(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_arc4_bool()bool[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testArc4Bool(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StaticSizeContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_array(uint64,uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testArray(params)) + return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_array(uint64,uint64,uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testExtendFromTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testExtendFromTuple(params)) + return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'])} + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testExtendFromArc4Tuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testExtendFromArc4Tuple(params)) + return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'])} + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_bool_array(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testBoolArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testBoolArray(params)) + return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_bool_array(uint64)uint64'])} + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_arc4_conversion(uint64)uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testArc4Conversion: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testArc4Conversion(params)) + return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_arc4_conversion(uint64)uint64[]'])} + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `sum_array(uint64[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + sumArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StaticSizeContractParamsFactory.sumArray(params)) + return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['sum_array(uint64[])uint64'])} + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_arc4_bool()bool[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testArc4Bool(params)) + return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_arc4_bool()bool[]'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StaticSizeContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StaticSizeContract app + */ + state = { + /** + * Methods to access global state for the current StaticSizeContract app + */ + global: { + /** + * Get all current keyed values from global state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.global.getAll() + return { + count: result.count, + } + }, + /** + * Get the current value of the count key in global state + */ + count: async (): Promise => { return (await this.appClient.state.global.getValue("count")) as bigint | undefined }, + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): StaticSizeContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a test_array(uint64,uint64,uint64,uint64)uint64 method call against the StaticSizeContract contract + */ + testArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testArray(params))) + return this + }, + /** + * Add a test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] method call against the StaticSizeContract contract + */ + testExtendFromTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testExtendFromTuple(params))) + return this + }, + /** + * Add a test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] method call against the StaticSizeContract contract + */ + testExtendFromArc4Tuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testExtendFromArc4Tuple(params))) + return this + }, + /** + * Add a test_bool_array(uint64)uint64 method call against the StaticSizeContract contract + */ + testBoolArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBoolArray(params))) + return this + }, + /** + * Add a test_arc4_conversion(uint64)uint64[] method call against the StaticSizeContract contract + */ + testArc4Conversion(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testArc4Conversion(params))) + return this + }, + /** + * Add a sum_array(uint64[])uint64 method call against the StaticSizeContract contract + */ + sumArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sumArray(params))) + return this + }, + /** + * Add a test_arc4_bool()bool[] method call against the StaticSizeContract contract + */ + testArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testArc4Bool(params))) + return this + }, + /** + * Add a clear state call to the StaticSizeContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StaticSizeContractComposer + } +} +export type StaticSizeContractComposer = { + /** + * Calls the test_array(uint64,uint64,uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testArray(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_array(uint64,uint64,uint64,uint64)uint64'] | undefined]> + + /** + * Calls the test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testExtendFromTuple(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] | undefined]> + + /** + * Calls the test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testExtendFromArc4Tuple(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] | undefined]> + + /** + * Calls the test_bool_array(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testBoolArray(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_bool_array(uint64)uint64'] | undefined]> + + /** + * Calls the test_arc4_conversion(uint64)uint64[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testArc4Conversion(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_arc4_conversion(uint64)uint64[]'] | undefined]> + + /** + * Calls the sum_array(uint64[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + sumArray(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['sum_array(uint64[])uint64'] | undefined]> + + /** + * Calls the test_arc4_bool()bool[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testArc4Bool(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_arc4_bool()bool[]'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the StaticSizeContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StaticSizeContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StaticSizeContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StaticSizeContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/TuplesContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/TuplesContract.ts new file mode 100644 index 0000000..1e2fe54 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/TuplesContract.ts @@ -0,0 +1,558 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"TuplesContract","structs":{},"methods":[{"name":"test_tuple_with_primitive_type","args":[],"returns":{"type":"(uint64,bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9UdXBsZXMvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgVHVwbGVzQ29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHg3MjI5ZDc5YSAvLyBtZXRob2QgInRlc3RfdHVwbGVfd2l0aF9wcmltaXRpdmVfdHlwZSgpKHVpbnQ2NCxib29sKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdF90dXBsZV93aXRoX3ByaW1pdGl2ZV90eXBlX3JvdXRlQDMKICAgIGVycgoKbWFpbl90ZXN0X3R1cGxlX3dpdGhfcHJpbWl0aXZlX3R5cGVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9UdXBsZXMvY29udHJhY3QucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDAwMDA4MAogICAgbG9nCiAgICBwdXNoaW50IDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAogARyKdeaNhoAjgEAAQAxGRQxGBBEgA0VH3x1AAAAAAAAAACAsIEBQzEZFDEYFBBD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the TuplesContract contract + */ +export type TuplesContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'test_tuple_with_primitive_type()(uint64,bool)': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'test_tuple_with_primitive_type()(uint64,bool)': [] + } +} + +/** + * The return type for each method + */ +export type TuplesContractReturns = { + 'test_tuple_with_primitive_type()(uint64,bool)': [bigint, boolean] +} + +/** + * Defines the types of available calls and state of the TuplesContract smart contract. + */ +export type TuplesContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'test_tuple_with_primitive_type()(uint64,bool)' | 'test_tuple_with_primitive_type', { + argsObj: TuplesContractArgs['obj']['test_tuple_with_primitive_type()(uint64,bool)'] + argsTuple: TuplesContractArgs['tuple']['test_tuple_with_primitive_type()(uint64,bool)'] + returns: TuplesContractReturns['test_tuple_with_primitive_type()(uint64,bool)'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type TuplesContractSignatures = keyof TuplesContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type TuplesContractNonVoidMethodSignatures = keyof TuplesContractTypes['methods'] extends infer T ? T extends keyof TuplesContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the TuplesContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = TuplesContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the TuplesContract smart contract to the method's return type + */ +export type MethodReturn = TuplesContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type TuplesContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type TuplesContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: TuplesContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the TuplesContract smart contract + */ +export abstract class TuplesContractParamsFactory { + /** + * Constructs a no op call for the test_tuple_with_primitive_type()(uint64,bool) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testTupleWithPrimitiveType(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_tuple_with_primitive_type()(uint64,bool)' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the TuplesContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class TuplesContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `TuplesContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new TuplesContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new TuplesContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the TuplesContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: TuplesContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new TuplesContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the TuplesContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the TuplesContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the TuplesContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new TuplesContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the TuplesContract smart contract + */ +export class TuplesContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `TuplesContractClient` + * + * @param appClient An `AppClient` instance which has been created with the TuplesContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `TuplesContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `TuplesContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new TuplesContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `TuplesContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new TuplesContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the TuplesContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the TuplesContract smart contract using the `test_tuple_with_primitive_type()(uint64,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testTupleWithPrimitiveType: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(TuplesContractParamsFactory.testTupleWithPrimitiveType(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the TuplesContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the TuplesContract smart contract using the `test_tuple_with_primitive_type()(uint64,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testTupleWithPrimitiveType: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(TuplesContractParamsFactory.testTupleWithPrimitiveType(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the TuplesContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the TuplesContract smart contract using the `test_tuple_with_primitive_type()(uint64,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testTupleWithPrimitiveType: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(TuplesContractParamsFactory.testTupleWithPrimitiveType(params)) + return {...result, return: result.return as unknown as (undefined | TuplesContractReturns['test_tuple_with_primitive_type()(uint64,bool)'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new TuplesContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current TuplesContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): TuplesContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a test_tuple_with_primitive_type()(uint64,bool) method call against the TuplesContract contract + */ + testTupleWithPrimitiveType(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testTupleWithPrimitiveType(params))) + return this + }, + /** + * Add a clear state call to the TuplesContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as TuplesContractComposer + } +} +export type TuplesContractComposer = { + /** + * Calls the test_tuple_with_primitive_type()(uint64,bool) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testTupleWithPrimitiveType(params?: CallParams): TuplesContractComposer<[...TReturns, TuplesContractReturns['test_tuple_with_primitive_type()(uint64,bool)'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the TuplesContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): TuplesContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): TuplesContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type TuplesContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/VerifierContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/VerifierContract.ts new file mode 100644 index 0000000..9633b90 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/VerifierContract.ts @@ -0,0 +1,554 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"VerifierContract","structs":{},"methods":[{"name":"verify","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[56],"errorMessage":"Txn must be pay"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvdmVyaWZpZXIucHk6MTEKICAgIC8vIGNsYXNzIFZlcmlmaWVyQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweDY1YTlhZWNjIC8vIG1ldGhvZCAidmVyaWZ5KCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl92ZXJpZnlfcm91dGVAMwogICAgZXJyCgptYWluX3ZlcmlmeV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC92ZXJpZmllci5weToxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiB2ZXJpZnkKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLmR5bmFtaWNfaXR4bl9ncm91cC52ZXJpZmllci5WZXJpZmllckNvbnRyYWN0LnZlcmlmeVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvdmVyaWZpZXIucHk6MTQKICAgIC8vIGZvciBpIGluIHVyYW5nZShUeG4uZ3JvdXBfaW5kZXgpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIHB1c2hpbnQgMAoKdmVyaWZ5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvdmVyaWZpZXIucHk6MTQKICAgIC8vIGZvciBpIGluIHVyYW5nZShUeG4uZ3JvdXBfaW5kZXgpOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogdmVyaWZ5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL3ZlcmlmaWVyLnB5OjE2CiAgICAvLyBhc3NlcnQgdHhuLnR5cGUgPT0gVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQsICJUeG4gbXVzdCBiZSBwYXkiCiAgICBkdXBuIDIKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIFR4biBtdXN0IGJlIHBheQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC92ZXJpZmllci5weToxNAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKFR4bi5ncm91cF9pbmRleCk6CiAgICBwdXNoaW50IDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB2ZXJpZnlfZm9yX2hlYWRlckAyCgp2ZXJpZnlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL3ZlcmlmaWVyLnB5OjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgARlqa7MNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEMxFoEASUsCDEEAEEcCOBCBARJEgQEIRQFC/+mBAUM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the VerifierContract contract + */ +export type VerifierContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify()void': [] + } +} + +/** + * The return type for each method + */ +export type VerifierContractReturns = { + 'verify()void': void +} + +/** + * Defines the types of available calls and state of the VerifierContract smart contract. + */ +export type VerifierContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify()void' | 'verify', { + argsObj: VerifierContractArgs['obj']['verify()void'] + argsTuple: VerifierContractArgs['tuple']['verify()void'] + returns: VerifierContractReturns['verify()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type VerifierContractSignatures = keyof VerifierContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the VerifierContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = VerifierContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the VerifierContract smart contract to the method's return type + */ +export type MethodReturn = VerifierContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type VerifierContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type VerifierContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: VerifierContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the VerifierContract smart contract + */ +export abstract class VerifierContractParamsFactory { + /** + * Constructs a no op call for the verify()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the VerifierContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class VerifierContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `VerifierContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new VerifierContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new VerifierContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the VerifierContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: VerifierContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new VerifierContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the VerifierContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the VerifierContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the VerifierContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new VerifierContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the VerifierContract smart contract + */ +export class VerifierContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `VerifierContractClient` + * + * @param appClient An `AppClient` instance which has been created with the VerifierContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `VerifierContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `VerifierContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new VerifierContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `VerifierContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new VerifierContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the VerifierContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the VerifierContract smart contract using the `verify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(VerifierContractParamsFactory.verify(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the VerifierContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the VerifierContract smart contract using the `verify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(VerifierContractParamsFactory.verify(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the VerifierContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the VerifierContract smart contract using the `verify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(VerifierContractParamsFactory.verify(params)) + return {...result, return: result.return as unknown as (undefined | VerifierContractReturns['verify()void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new VerifierContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current VerifierContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): VerifierContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify()void method call against the VerifierContract contract + */ + verify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verify(params))) + return this + }, + /** + * Add a clear state call to the VerifierContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as VerifierContractComposer + } +} +export type VerifierContractComposer = { + /** + * Calls the verify()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verify(params?: CallParams): VerifierContractComposer<[...TReturns, VerifierContractReturns['verify()void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the VerifierContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): VerifierContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): VerifierContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type VerifierContractComposerResults = Expand + diff --git a/pytest-junit.xml b/pytest-junit.xml new file mode 100644 index 0000000..6590adf --- /dev/null +++ b/pytest-junit.xml @@ -0,0 +1 @@ + \ No newline at end of file From c9ad072df6978693efa4169d60d5c39e3fb17099 Mon Sep 17 00:00:00 2001 From: p2arthur Date: Mon, 9 Mar 2026 21:25:14 -0700 Subject: [PATCH 11/12] ci: add branch references to the generator --- examples/p-py/.algokit/.copier-answers.yml | 4 +- .../create-devcontainer/copier.yaml | 4 - .../create-devcontainer/devcontainer.json | 19 - examples/p-py/.editorconfig | 10 - examples/p-py/.gitattributes | 1 - .../.github/workflows/p-py-contracts-cd.yaml | 44 - .../.github/workflows/p-py-contracts-ci.yaml | 65 - .../.github/workflows/p-py-frontend-cd.yaml | 36 - .../.github/workflows/p-py-frontend-ci.yaml | 47 - examples/p-py/.gitignore | 170 - examples/p-py/copy_files.sh | 23 + .../AppCalls.tsx | 0 .../src => inject_content}/Home.tsx | 0 examples/p-py/projects/.gitkeep | 0 .../projects/p-py-contracts/.algokit.toml | 57 - .../.algokit/.copier-answers.yml | 10 - .../generators/create_contract/copier.yaml | 10 - .../{{ contract_name }}/contract.py.j2 | 9 - .../{{ contract_name }}/deploy_config.py.j2 | 44 - .../generators/create_env_file/copier.yaml | 49 - ... %}.env.{{custom_network_name}}{% endif %} | 7 - ... if is_localnet %}.env.localnet{% endif %} | 7 - ...{% if is_mainnet %}.env.mainnet{% endif %} | 3 - ...{% if is_testnet %}.env.testnet{% endif %} | 3 - .../projects/p-py-contracts/.editorconfig | 10 - .../p-py/projects/p-py-contracts/.gitignore | 180 - ...ing-started-with-your-algokit-project.tour | 56 - .../p-py-contracts/.vscode/extensions.json | 12 - .../p-py-contracts/.vscode/launch.json | 52 - .../p-py-contracts/.vscode/settings.json | 54 - .../p-py-contracts/.vscode/tasks.json | 79 - .../p-py/projects/p-py-contracts/README.md | 154 - .../p-py/projects/p-py-contracts/poetry.toml | 3 - .../projects/p-py-contracts/pyproject.toml | 65 - .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 217 - .../smart_contracts/hello_world/contract.py | 8 - .../hello_world/deploy_config.py | 44 - .../projects/p-py-contracts/tests/__init__.py | 0 .../projects/p-py-contracts/tests/conftest.py | 20 - .../tests/hello_world_client_test.py | 55 - .../p-py-contracts/tests/hello_world_test.py | 24 - .../p-py/projects/p-py-frontend/.algokit.toml | 17 - .../.algokit/.copier-answers.yml | 9 - .../p-py/projects/p-py-frontend/.editorconfig | 9 - .../p-py/projects/p-py-frontend/.env.template | 70 - .../p-py/projects/p-py-frontend/.eslintrc | 27 - .../p-py/projects/p-py-frontend/.gitignore | 38 - examples/p-py/projects/p-py-frontend/.npmrc | 1 - .../projects/p-py-frontend/.prettierignore | 12 - .../projects/p-py-frontend/.prettierrc.cjs | 10 - .../p-py-frontend/.vscode/extensions.json | 14 - .../p-py-frontend/.vscode/launch.json | 68 - .../p-py-frontend/.vscode/settings.json | 13 - .../projects/p-py-frontend/.vscode/tasks.json | 15 - .../p-py/projects/p-py-frontend/README.md | 124 - .../p-py/projects/p-py-frontend/index.html | 12 - .../projects/p-py-frontend/jest.config.ts | 20 - .../p-py/projects/p-py-frontend/package.json | 81 - .../p-py-frontend/playwright.config.ts | 73 - .../projects/p-py-frontend/postcss.config.cjs | 6 - .../projects/p-py-frontend/public/index.html | 37 - .../projects/p-py-frontend/public/robots.txt | 3 - .../p-py/projects/p-py-frontend/src/App.tsx | 56 - .../p-py-frontend/src/assets/logo.svg | 1 - .../p-py-frontend/src/components/Account.tsx | 24 - .../src/components/ConnectWallet.tsx | 86 - .../src/components/ErrorBoundary.tsx | 46 - .../p-py-frontend/src/components/Transact.tsx | 85 - .../p-py-frontend/src/contracts/AppCall.ts | 558 -- .../src/contracts/AppExpectingEffects.ts | 630 --- .../src/contracts/Arc4InnerTxnsContract.ts | 556 -- .../src/contracts/Arc4PrimitiveOpsContract.ts | 3982 -------------- .../src/contracts/BoxContract.ts | 2352 --------- .../p-py-frontend/src/contracts/Contract.ts | 621 --- .../p-py-frontend/src/contracts/ContractV0.ts | 621 --- .../p-py-frontend/src/contracts/ContractV1.ts | 621 --- .../src/contracts/CryptoOpsContract.ts | 1422 ----- .../src/contracts/DynamicArrayInitContract.ts | 755 --- .../src/contracts/DynamicItxnGroup.ts | 629 --- .../src/contracts/GlobalStateContract.ts | 2649 ---------- .../src/contracts/GlobalStateValidator.ts | 557 -- .../p-py-frontend/src/contracts/HelloWorld.ts | 560 -- .../src/contracts/ITxnOpsContract.ts | 554 -- .../src/contracts/ImmutableArrayContract.ts | 2231 -------- .../contracts/ImmutableArrayInitContract.ts | 755 --- .../src/contracts/LocalStateContract.ts | 1746 ------ .../src/contracts/MiscellaneousOpsContract.ts | 3082 ----------- .../src/contracts/PrimitiveOpsContract.ts | 4701 ----------------- .../p-py-frontend/src/contracts/README.md | 14 - .../src/contracts/SignaturesContract.ts | 1203 ----- .../src/contracts/StateAcctParamsGet.ts | 1319 ----- .../contracts/StateAcctParamsGetContract.ts | 1526 ------ .../src/contracts/StateAppGlobalContract.ts | 1018 ---- .../src/contracts/StateAppGlobalExContract.ts | 551 -- .../src/contracts/StateAppLocalContract.ts | 1197 ----- .../src/contracts/StateAppLocalExContract.ts | 635 --- .../src/contracts/StateAppParamsContract.ts | 1112 ---- .../contracts/StateAssetHoldingContract.ts | 631 --- .../src/contracts/StateAssetParamsContract.ts | 1319 ----- .../src/contracts/StateMutations.ts | 880 --- .../src/contracts/StaticSizeContract.ts | 1009 ---- .../src/contracts/TuplesContract.ts | 558 -- .../src/contracts/VerifierContract.ts | 554 -- .../p-py-frontend/src/interfaces/network.ts | 25 - .../p-py/projects/p-py-frontend/src/main.tsx | 13 - .../p-py-frontend/src/styles/main.css | 3 - .../src/utils/ellipseAddress.spec.tsx | 15 - .../p-py-frontend/src/utils/ellipseAddress.ts | 3 - .../src/utils/network/getAlgoClientConfigs.ts | 41 - .../projects/p-py-frontend/src/vite-env.d.ts | 24 - .../p-py-frontend/tailwind.config.cjs | 12 - .../p-py-frontend/tests/example.spec.ts | 40 - .../p-py/projects/p-py-frontend/tsconfig.json | 38 - .../projects/p-py-frontend/tsconfig.node.json | 9 - .../projects/p-py-frontend/vite.config.ts | 15 - examples/p-tls/.algokit/.copier-answers.yml | 4 +- .../create-devcontainer/copier.yaml | 4 - .../create-devcontainer/devcontainer.json | 19 - examples/p-tls/.editorconfig | 10 - examples/p-tls/.gitattributes | 1 - .../.github/workflows/p-tls-frontend-cd.yaml | 36 - .../.github/workflows/p-tls-frontend-ci.yaml | 47 - examples/p-tls/.gitignore | 170 - examples/p-tls/copy_files.sh | 23 + .../AppCalls.tsx | 0 .../src => inject_content}/Home.tsx | 0 examples/p-tls/projects/.gitkeep | 0 .../projects/p-tls-contracts/.algokit.toml | 15 - .../projects/p-tls-contracts/.eslintrc.js | 56 - .../p-tls/projects/p-tls-contracts/.gitignore | 1 - .../projects/p-tls-contracts/.prettierrc.toml | 6 - .../p-tls-contracts/.vscode/extensions.json | 5 - .../p-tls-contracts/.vscode/settings.json | 5 - .../p-tls/projects/p-tls-contracts/README.md | 25 - .../__test__/Calculator.test.ts | 46 - .../contracts/Calculator.algo.ts | 57 - .../contracts/clients/.gitkeep | 0 .../projects/p-tls-contracts/jest.config.js | 6 - .../projects/p-tls-contracts/package.json | 36 - .../projects/p-tls-contracts/tsconfig.json | 103 - .../projects/p-tls-frontend/.algokit.toml | 17 - .../.algokit/.copier-answers.yml | 9 - .../projects/p-tls-frontend/.editorconfig | 9 - .../projects/p-tls-frontend/.env.template | 70 - .../p-tls/projects/p-tls-frontend/.eslintrc | 27 - .../p-tls/projects/p-tls-frontend/.gitignore | 38 - examples/p-tls/projects/p-tls-frontend/.npmrc | 1 - .../projects/p-tls-frontend/.prettierignore | 12 - .../projects/p-tls-frontend/.prettierrc.cjs | 10 - .../p-tls-frontend/.vscode/extensions.json | 14 - .../p-tls-frontend/.vscode/launch.json | 68 - .../p-tls-frontend/.vscode/settings.json | 13 - .../p-tls-frontend/.vscode/tasks.json | 15 - .../p-tls/projects/p-tls-frontend/README.md | 124 - .../p-tls/projects/p-tls-frontend/index.html | 12 - .../projects/p-tls-frontend/jest.config.ts | 20 - .../projects/p-tls-frontend/package.json | 81 - .../p-tls-frontend/playwright.config.ts | 73 - .../p-tls-frontend/postcss.config.cjs | 6 - .../projects/p-tls-frontend/public/index.html | 37 - .../projects/p-tls-frontend/public/robots.txt | 3 - .../p-tls/projects/p-tls-frontend/src/App.tsx | 56 - .../p-tls-frontend/src/assets/logo.svg | 1 - .../p-tls-frontend/src/components/Account.tsx | 24 - .../src/components/ConnectWallet.tsx | 86 - .../src/components/ErrorBoundary.tsx | 46 - .../src/components/Transact.tsx | 85 - .../p-tls-frontend/src/contracts/README.md | 14 - .../p-tls-frontend/src/interfaces/network.ts | 25 - .../projects/p-tls-frontend/src/main.tsx | 13 - .../p-tls-frontend/src/styles/main.css | 3 - .../src/utils/ellipseAddress.spec.tsx | 15 - .../src/utils/ellipseAddress.ts | 3 - .../src/utils/network/getAlgoClientConfigs.ts | 41 - .../projects/p-tls-frontend/src/vite-env.d.ts | 24 - .../p-tls-frontend/tailwind.config.cjs | 12 - .../p-tls-frontend/tests/example.spec.ts | 40 - .../projects/p-tls-frontend/tsconfig.json | 38 - .../p-tls-frontend/tsconfig.node.json | 9 - .../projects/p-tls-frontend/vite.config.ts | 15 - examples/p-ts/.algokit/.copier-answers.yml | 4 +- .../create-devcontainer/copier.yaml | 4 - .../create-devcontainer/devcontainer.json | 19 - examples/p-ts/.editorconfig | 10 - examples/p-ts/.gitattributes | 1 - .../.github/workflows/p-ts-contracts-cd.yaml | 45 - .../.github/workflows/p-ts-contracts-ci.yaml | 72 - .../.github/workflows/p-ts-frontend-cd.yaml | 36 - .../.github/workflows/p-ts-frontend-ci.yaml | 47 - examples/p-ts/.gitignore | 170 - examples/p-ts/copy_files.sh | 23 + .../AppCalls.tsx | 0 .../src => inject_content}/Home.tsx | 0 examples/p-ts/projects/.gitkeep | 0 .../projects/p-ts-contracts/.algokit.toml | 56 - .../.algokit/.copier-answers.yml | 9 - .../generators/create_contract/copier.yaml | 15 - .../{{ contract_name }}/contract.algo.ts.j2 | 7 - .../{{ contract_name }}/deploy-config.ts.j2 | 33 - ...tests %}contract.e2e.spec.ts{% endif %}.j2 | 35 - ...ude_tests %}contract.spec.ts{% endif %}.j2 | 14 - .../generators/create_env_file/copier.yaml | 49 - ... %}.env.{{custom_network_name}}{% endif %} | 7 - ... if is_localnet %}.env.localnet{% endif %} | 7 - ...{% if is_mainnet %}.env.mainnet{% endif %} | 3 - ...{% if is_testnet %}.env.testnet{% endif %} | 3 - .../projects/p-ts-contracts/.editorconfig | 7 - .../p-ts/projects/p-ts-contracts/.gitignore | 62 - examples/p-ts/projects/p-ts-contracts/.npmrc | 1 - .../projects/p-ts-contracts/.prettierignore | 13 - .../projects/p-ts-contracts/.prettierrc.js | 4 - ...ing-started-with-your-algokit-project.tour | 56 - .../p-ts-contracts/.vscode/extensions.json | 10 - .../p-ts-contracts/.vscode/launch.json | 58 - .../p-ts-contracts/.vscode/settings.json | 19 - .../p-ts-contracts/.vscode/tasks.json | 69 - .../p-ts/projects/p-ts-contracts/README.md | 157 - .../projects/p-ts-contracts/eslint.config.mjs | 18 - .../p-ts/projects/p-ts-contracts/package.json | 48 - .../hello_world/contract.algo.spec.ts | 14 - .../hello_world/contract.algo.ts | 7 - .../hello_world/contract.e2e.spec.ts | 52 - .../hello_world/deploy-config.ts | 33 - .../p-ts-contracts/smart_contracts/index.ts | 63 - .../projects/p-ts-contracts/tsconfig.json | 14 - .../projects/p-ts-contracts/vitest.config.mts | 21 - .../p-ts/projects/p-ts-frontend/.algokit.toml | 17 - .../.algokit/.copier-answers.yml | 9 - .../p-ts/projects/p-ts-frontend/.editorconfig | 9 - .../p-ts/projects/p-ts-frontend/.env.template | 70 - .../p-ts/projects/p-ts-frontend/.eslintrc | 27 - .../p-ts/projects/p-ts-frontend/.gitignore | 38 - examples/p-ts/projects/p-ts-frontend/.npmrc | 1 - .../projects/p-ts-frontend/.prettierignore | 12 - .../projects/p-ts-frontend/.prettierrc.cjs | 10 - .../p-ts-frontend/.vscode/extensions.json | 14 - .../p-ts-frontend/.vscode/launch.json | 68 - .../p-ts-frontend/.vscode/settings.json | 13 - .../projects/p-ts-frontend/.vscode/tasks.json | 15 - .../p-ts/projects/p-ts-frontend/README.md | 124 - .../p-ts/projects/p-ts-frontend/index.html | 12 - .../projects/p-ts-frontend/jest.config.ts | 20 - .../p-ts/projects/p-ts-frontend/package.json | 81 - .../p-ts-frontend/playwright.config.ts | 73 - .../projects/p-ts-frontend/postcss.config.cjs | 6 - .../projects/p-ts-frontend/public/index.html | 37 - .../projects/p-ts-frontend/public/robots.txt | 3 - .../p-ts/projects/p-ts-frontend/src/App.tsx | 56 - .../p-ts-frontend/src/assets/logo.svg | 1 - .../p-ts-frontend/src/components/Account.tsx | 24 - .../src/components/ConnectWallet.tsx | 86 - .../src/components/ErrorBoundary.tsx | 46 - .../p-ts-frontend/src/components/Transact.tsx | 85 - .../p-ts-frontend/src/contracts/README.md | 14 - .../p-ts-frontend/src/interfaces/network.ts | 25 - .../p-ts/projects/p-ts-frontend/src/main.tsx | 13 - .../p-ts-frontend/src/styles/main.css | 3 - .../src/utils/ellipseAddress.spec.tsx | 15 - .../p-ts-frontend/src/utils/ellipseAddress.ts | 3 - .../src/utils/network/getAlgoClientConfigs.ts | 41 - .../projects/p-ts-frontend/src/vite-env.d.ts | 24 - .../p-ts-frontend/tailwind.config.cjs | 12 - .../p-ts-frontend/tests/example.spec.ts | 40 - .../p-ts/projects/p-ts-frontend/tsconfig.json | 38 - .../projects/p-ts-frontend/tsconfig.node.json | 9 - .../projects/p-ts-frontend/vite.config.ts | 15 - examples/s-py/.algokit/.copier-answers.yml | 4 +- .../create-devcontainer/copier.yaml | 4 - .../create-devcontainer/devcontainer.json | 19 - examples/s-py/.editorconfig | 10 - examples/s-py/.gitattributes | 1 - examples/s-py/.gitignore | 170 - examples/s-py/copy_files.sh | 23 + .../AppCalls.tsx | 0 .../src => inject_content}/Home.tsx | 0 examples/s-py/projects/.gitkeep | 0 .../projects/s-py-contracts/.algokit.toml | 46 - .../.algokit/.copier-answers.yml | 10 - .../generators/create_contract/copier.yaml | 10 - .../{{ contract_name }}/contract.py.j2 | 9 - .../{{ contract_name }}/deploy-config.ts.j2 | 33 - .../generators/create_env_file/copier.yaml | 49 - ... %}.env.{{custom_network_name}}{% endif %} | 7 - ... if is_localnet %}.env.localnet{% endif %} | 7 - ...{% if is_mainnet %}.env.mainnet{% endif %} | 3 - ...{% if is_testnet %}.env.testnet{% endif %} | 3 - .../projects/s-py-contracts/.editorconfig | 10 - .../s-py/projects/s-py-contracts/.gitignore | 180 - examples/s-py/projects/s-py-contracts/.npmrc | 1 - .../projects/s-py-contracts/.prettierignore | 12 - .../projects/s-py-contracts/.prettierrc.js | 10 - ...ing-started-with-your-algokit-project.tour | 51 - .../s-py-contracts/.vscode/extensions.json | 10 - .../s-py-contracts/.vscode/launch.json | 57 - .../s-py-contracts/.vscode/settings.json | 38 - .../s-py-contracts/.vscode/tasks.json | 79 - .../s-py/projects/s-py-contracts/README.md | 106 - .../s-py/projects/s-py-contracts/package.json | 27 - .../s-py/projects/s-py-contracts/poetry.toml | 3 - .../projects/s-py-contracts/pyproject.toml | 22 - .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 188 - .../smart_contracts/hello_world/contract.py | 8 - .../hello_world/deploy-config.ts | 33 - .../s-py-contracts/smart_contracts/index.ts | 66 - .../projects/s-py-contracts/tsconfig.json | 25 - .../s-py/projects/s-py-frontend/.algokit.toml | 11 - .../.algokit/.copier-answers.yml | 8 - .../s-py/projects/s-py-frontend/.env.template | 70 - .../s-py/projects/s-py-frontend/.gitignore | 38 - examples/s-py/projects/s-py-frontend/.npmrc | 1 - .../s-py-frontend/.vscode/extensions.json | 7 - .../s-py-frontend/.vscode/launch.json | 68 - .../s-py-frontend/.vscode/settings.json | 6 - .../projects/s-py-frontend/.vscode/tasks.json | 15 - .../s-py/projects/s-py-frontend/README.md | 76 - .../s-py/projects/s-py-frontend/index.html | 12 - .../s-py/projects/s-py-frontend/package.json | 64 - .../projects/s-py-frontend/public/index.html | 37 - .../projects/s-py-frontend/public/robots.txt | 3 - .../s-py/projects/s-py-frontend/src/App.tsx | 56 - .../s-py-frontend/src/assets/logo.svg | 1 - .../s-py-frontend/src/components/Account.tsx | 24 - .../src/components/ConnectWallet.tsx | 86 - .../src/components/ErrorBoundary.tsx | 46 - .../s-py-frontend/src/components/Transact.tsx | 85 - .../s-py-frontend/src/contracts/README.md | 14 - .../s-py-frontend/src/interfaces/network.ts | 25 - .../s-py/projects/s-py-frontend/src/main.tsx | 13 - .../projects/s-py-frontend/src/styles/App.css | 126 - .../s-py-frontend/src/utils/ellipseAddress.ts | 3 - .../src/utils/network/getAlgoClientConfigs.ts | 41 - .../projects/s-py-frontend/src/vite-env.d.ts | 24 - .../s-py/projects/s-py-frontend/tsconfig.json | 38 - .../projects/s-py-frontend/tsconfig.node.json | 9 - .../projects/s-py-frontend/vite.config.ts | 15 - examples/s-tls/.algokit/.copier-answers.yml | 4 +- .../create-devcontainer/copier.yaml | 4 - .../create-devcontainer/devcontainer.json | 19 - examples/s-tls/.editorconfig | 10 - examples/s-tls/.gitattributes | 1 - examples/s-tls/.gitignore | 170 - examples/s-tls/copy_files.sh | 23 + .../AppCalls.tsx | 0 .../src => inject_content}/Home.tsx | 0 examples/s-tls/projects/.gitkeep | 0 .../projects/s-tls-contracts/.algokit.toml | 15 - .../projects/s-tls-contracts/.eslintrc.js | 56 - .../s-tls/projects/s-tls-contracts/.gitignore | 1 - .../projects/s-tls-contracts/.prettierrc.toml | 6 - .../s-tls-contracts/.vscode/extensions.json | 5 - .../s-tls-contracts/.vscode/settings.json | 5 - .../s-tls/projects/s-tls-contracts/README.md | 25 - .../__test__/Calculator.test.ts | 46 - .../contracts/Calculator.algo.ts | 57 - .../contracts/clients/.gitkeep | 0 .../projects/s-tls-contracts/jest.config.js | 6 - .../projects/s-tls-contracts/package.json | 36 - .../projects/s-tls-contracts/tsconfig.json | 103 - .../projects/s-tls-frontend/.algokit.toml | 11 - .../.algokit/.copier-answers.yml | 8 - .../projects/s-tls-frontend/.env.template | 70 - .../s-tls/projects/s-tls-frontend/.gitignore | 38 - examples/s-tls/projects/s-tls-frontend/.npmrc | 1 - .../s-tls-frontend/.vscode/extensions.json | 7 - .../s-tls-frontend/.vscode/launch.json | 68 - .../s-tls-frontend/.vscode/settings.json | 6 - .../s-tls-frontend/.vscode/tasks.json | 15 - .../s-tls/projects/s-tls-frontend/README.md | 76 - .../s-tls/projects/s-tls-frontend/index.html | 12 - .../projects/s-tls-frontend/package.json | 64 - .../projects/s-tls-frontend/public/index.html | 37 - .../projects/s-tls-frontend/public/robots.txt | 3 - .../s-tls/projects/s-tls-frontend/src/App.tsx | 56 - .../s-tls-frontend/src/assets/logo.svg | 1 - .../s-tls-frontend/src/components/Account.tsx | 24 - .../src/components/ConnectWallet.tsx | 86 - .../src/components/ErrorBoundary.tsx | 46 - .../src/components/Transact.tsx | 85 - .../s-tls-frontend/src/contracts/README.md | 14 - .../s-tls-frontend/src/interfaces/network.ts | 25 - .../projects/s-tls-frontend/src/main.tsx | 13 - .../s-tls-frontend/src/styles/App.css | 126 - .../src/utils/ellipseAddress.ts | 3 - .../src/utils/network/getAlgoClientConfigs.ts | 41 - .../projects/s-tls-frontend/src/vite-env.d.ts | 24 - .../projects/s-tls-frontend/tsconfig.json | 38 - .../s-tls-frontend/tsconfig.node.json | 9 - .../projects/s-tls-frontend/vite.config.ts | 15 - examples/s-ts/.algokit/.copier-answers.yml | 4 +- .../create-devcontainer/copier.yaml | 4 - .../create-devcontainer/devcontainer.json | 19 - examples/s-ts/.editorconfig | 10 - examples/s-ts/.gitattributes | 1 - examples/s-ts/.gitignore | 170 - examples/s-ts/copy_files.sh | 23 + .../AppCalls.tsx | 0 .../src => inject_content}/Home.tsx | 0 examples/s-ts/projects/.gitkeep | 0 .../projects/s-ts-contracts/.algokit.toml | 44 - .../.algokit/.copier-answers.yml | 9 - .../generators/create_contract/copier.yaml | 15 - .../{{ contract_name }}/contract.algo.ts.j2 | 7 - .../{{ contract_name }}/deploy-config.ts.j2 | 33 - ...tests %}contract.e2e.spec.ts{% endif %}.j2 | 35 - ...ude_tests %}contract.spec.ts{% endif %}.j2 | 14 - .../generators/create_env_file/copier.yaml | 49 - ... %}.env.{{custom_network_name}}{% endif %} | 7 - ... if is_localnet %}.env.localnet{% endif %} | 7 - ...{% if is_mainnet %}.env.mainnet{% endif %} | 3 - ...{% if is_testnet %}.env.testnet{% endif %} | 3 - .../s-ts/projects/s-ts-contracts/.gitignore | 62 - ...ing-started-with-your-algokit-project.tour | 46 - .../s-ts-contracts/.vscode/extensions.json | 7 - .../s-ts-contracts/.vscode/launch.json | 58 - .../s-ts-contracts/.vscode/settings.json | 4 - .../s-ts-contracts/.vscode/tasks.json | 69 - .../s-ts/projects/s-ts-contracts/README.md | 107 - .../s-ts/projects/s-ts-contracts/package.json | 34 - .../hello_world/contract.algo.ts | 7 - .../hello_world/deploy-config.ts | 33 - .../s-ts-contracts/smart_contracts/index.ts | 63 - .../projects/s-ts-contracts/tsconfig.json | 14 - .../s-ts/projects/s-ts-frontend/.algokit.toml | 11 - .../.algokit/.copier-answers.yml | 8 - .../s-ts/projects/s-ts-frontend/.env.template | 70 - .../s-ts/projects/s-ts-frontend/.gitignore | 38 - examples/s-ts/projects/s-ts-frontend/.npmrc | 1 - .../s-ts-frontend/.vscode/extensions.json | 7 - .../s-ts-frontend/.vscode/launch.json | 68 - .../s-ts-frontend/.vscode/settings.json | 6 - .../projects/s-ts-frontend/.vscode/tasks.json | 15 - .../s-ts/projects/s-ts-frontend/README.md | 76 - .../s-ts/projects/s-ts-frontend/index.html | 12 - .../s-ts/projects/s-ts-frontend/package.json | 64 - .../projects/s-ts-frontend/public/index.html | 37 - .../projects/s-ts-frontend/public/robots.txt | 3 - .../s-ts/projects/s-ts-frontend/src/App.tsx | 56 - .../s-ts-frontend/src/assets/logo.svg | 1 - .../s-ts-frontend/src/components/Account.tsx | 24 - .../src/components/ConnectWallet.tsx | 86 - .../src/components/ErrorBoundary.tsx | 46 - .../s-ts-frontend/src/components/Transact.tsx | 85 - .../s-ts-frontend/src/contracts/README.md | 14 - .../s-ts-frontend/src/interfaces/network.ts | 25 - .../s-ts/projects/s-ts-frontend/src/main.tsx | 13 - .../projects/s-ts-frontend/src/styles/App.css | 126 - .../s-ts-frontend/src/utils/ellipseAddress.ts | 3 - .../src/utils/network/getAlgoClientConfigs.ts | 41 - .../projects/s-ts-frontend/src/vite-env.d.ts | 24 - .../s-ts/projects/s-ts-frontend/tsconfig.json | 38 - .../projects/s-ts-frontend/tsconfig.node.json | 9 - .../projects/s-ts-frontend/vite.config.ts | 15 - pytest-junit.xml | 268 +- tests/test_templates.py | 9 +- 456 files changed, 424 insertions(+), 56252 deletions(-) delete mode 100644 examples/p-py/.algokit/generators/create-devcontainer/copier.yaml delete mode 100644 examples/p-py/.algokit/generators/create-devcontainer/devcontainer.json delete mode 100644 examples/p-py/.editorconfig delete mode 100644 examples/p-py/.gitattributes delete mode 100644 examples/p-py/.github/workflows/p-py-contracts-cd.yaml delete mode 100644 examples/p-py/.github/workflows/p-py-contracts-ci.yaml delete mode 100644 examples/p-py/.github/workflows/p-py-frontend-cd.yaml delete mode 100644 examples/p-py/.github/workflows/p-py-frontend-ci.yaml delete mode 100644 examples/p-py/.gitignore create mode 100644 examples/p-py/copy_files.sh rename examples/p-py/{projects/p-py-frontend/src/components => inject_content}/AppCalls.tsx (100%) rename examples/p-py/{projects/p-py-frontend/src => inject_content}/Home.tsx (100%) delete mode 100644 examples/p-py/projects/.gitkeep delete mode 100644 examples/p-py/projects/p-py-contracts/.algokit.toml delete mode 100644 examples/p-py/projects/p-py-contracts/.algokit/.copier-answers.yml delete mode 100644 examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/copier.yaml delete mode 100644 examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.py.j2 delete mode 100644 examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy_config.py.j2 delete mode 100644 examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/copier.yaml delete mode 100644 examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} delete mode 100644 examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} delete mode 100644 examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} delete mode 100644 examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} delete mode 100644 examples/p-py/projects/p-py-contracts/.editorconfig delete mode 100644 examples/p-py/projects/p-py-contracts/.gitignore delete mode 100644 examples/p-py/projects/p-py-contracts/.tours/getting-started-with-your-algokit-project.tour delete mode 100644 examples/p-py/projects/p-py-contracts/.vscode/extensions.json delete mode 100644 examples/p-py/projects/p-py-contracts/.vscode/launch.json delete mode 100644 examples/p-py/projects/p-py-contracts/.vscode/settings.json delete mode 100644 examples/p-py/projects/p-py-contracts/.vscode/tasks.json delete mode 100644 examples/p-py/projects/p-py-contracts/README.md delete mode 100644 examples/p-py/projects/p-py-contracts/poetry.toml delete mode 100644 examples/p-py/projects/p-py-contracts/pyproject.toml delete mode 100644 examples/p-py/projects/p-py-contracts/smart_contracts/__init__.py delete mode 100644 examples/p-py/projects/p-py-contracts/smart_contracts/__main__.py delete mode 100644 examples/p-py/projects/p-py-contracts/smart_contracts/hello_world/contract.py delete mode 100644 examples/p-py/projects/p-py-contracts/smart_contracts/hello_world/deploy_config.py delete mode 100644 examples/p-py/projects/p-py-contracts/tests/__init__.py delete mode 100644 examples/p-py/projects/p-py-contracts/tests/conftest.py delete mode 100644 examples/p-py/projects/p-py-contracts/tests/hello_world_client_test.py delete mode 100644 examples/p-py/projects/p-py-contracts/tests/hello_world_test.py delete mode 100644 examples/p-py/projects/p-py-frontend/.algokit.toml delete mode 100644 examples/p-py/projects/p-py-frontend/.algokit/.copier-answers.yml delete mode 100644 examples/p-py/projects/p-py-frontend/.editorconfig delete mode 100644 examples/p-py/projects/p-py-frontend/.env.template delete mode 100644 examples/p-py/projects/p-py-frontend/.eslintrc delete mode 100644 examples/p-py/projects/p-py-frontend/.gitignore delete mode 100644 examples/p-py/projects/p-py-frontend/.npmrc delete mode 100644 examples/p-py/projects/p-py-frontend/.prettierignore delete mode 100644 examples/p-py/projects/p-py-frontend/.prettierrc.cjs delete mode 100644 examples/p-py/projects/p-py-frontend/.vscode/extensions.json delete mode 100644 examples/p-py/projects/p-py-frontend/.vscode/launch.json delete mode 100644 examples/p-py/projects/p-py-frontend/.vscode/settings.json delete mode 100644 examples/p-py/projects/p-py-frontend/.vscode/tasks.json delete mode 100644 examples/p-py/projects/p-py-frontend/README.md delete mode 100644 examples/p-py/projects/p-py-frontend/index.html delete mode 100644 examples/p-py/projects/p-py-frontend/jest.config.ts delete mode 100644 examples/p-py/projects/p-py-frontend/package.json delete mode 100644 examples/p-py/projects/p-py-frontend/playwright.config.ts delete mode 100644 examples/p-py/projects/p-py-frontend/postcss.config.cjs delete mode 100644 examples/p-py/projects/p-py-frontend/public/index.html delete mode 100644 examples/p-py/projects/p-py-frontend/public/robots.txt delete mode 100644 examples/p-py/projects/p-py-frontend/src/App.tsx delete mode 100644 examples/p-py/projects/p-py-frontend/src/assets/logo.svg delete mode 100644 examples/p-py/projects/p-py-frontend/src/components/Account.tsx delete mode 100644 examples/p-py/projects/p-py-frontend/src/components/ConnectWallet.tsx delete mode 100644 examples/p-py/projects/p-py-frontend/src/components/ErrorBoundary.tsx delete mode 100644 examples/p-py/projects/p-py-frontend/src/components/Transact.tsx delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/AppCall.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/AppExpectingEffects.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/Arc4InnerTxnsContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/Arc4PrimitiveOpsContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/BoxContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/Contract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ContractV0.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ContractV1.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/CryptoOpsContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/DynamicArrayInitContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/DynamicItxnGroup.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateValidator.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/HelloWorld.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ITxnOpsContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayInitContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/LocalStateContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/MiscellaneousOpsContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/PrimitiveOpsContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/README.md delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/SignaturesContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGet.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGetContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalExContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalExContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppParamsContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAssetHoldingContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAssetParamsContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateMutations.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StaticSizeContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/TuplesContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/VerifierContract.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/interfaces/network.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/main.tsx delete mode 100644 examples/p-py/projects/p-py-frontend/src/styles/main.css delete mode 100644 examples/p-py/projects/p-py-frontend/src/utils/ellipseAddress.spec.tsx delete mode 100644 examples/p-py/projects/p-py-frontend/src/utils/ellipseAddress.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/utils/network/getAlgoClientConfigs.ts delete mode 100644 examples/p-py/projects/p-py-frontend/src/vite-env.d.ts delete mode 100644 examples/p-py/projects/p-py-frontend/tailwind.config.cjs delete mode 100644 examples/p-py/projects/p-py-frontend/tests/example.spec.ts delete mode 100644 examples/p-py/projects/p-py-frontend/tsconfig.json delete mode 100644 examples/p-py/projects/p-py-frontend/tsconfig.node.json delete mode 100644 examples/p-py/projects/p-py-frontend/vite.config.ts delete mode 100644 examples/p-tls/.algokit/generators/create-devcontainer/copier.yaml delete mode 100644 examples/p-tls/.algokit/generators/create-devcontainer/devcontainer.json delete mode 100644 examples/p-tls/.editorconfig delete mode 100644 examples/p-tls/.gitattributes delete mode 100644 examples/p-tls/.github/workflows/p-tls-frontend-cd.yaml delete mode 100644 examples/p-tls/.github/workflows/p-tls-frontend-ci.yaml delete mode 100644 examples/p-tls/.gitignore create mode 100644 examples/p-tls/copy_files.sh rename examples/p-tls/{projects/p-tls-frontend/src/components => inject_content}/AppCalls.tsx (100%) rename examples/p-tls/{projects/p-tls-frontend/src => inject_content}/Home.tsx (100%) delete mode 100644 examples/p-tls/projects/.gitkeep delete mode 100644 examples/p-tls/projects/p-tls-contracts/.algokit.toml delete mode 100644 examples/p-tls/projects/p-tls-contracts/.eslintrc.js delete mode 100644 examples/p-tls/projects/p-tls-contracts/.gitignore delete mode 100644 examples/p-tls/projects/p-tls-contracts/.prettierrc.toml delete mode 100644 examples/p-tls/projects/p-tls-contracts/.vscode/extensions.json delete mode 100644 examples/p-tls/projects/p-tls-contracts/.vscode/settings.json delete mode 100644 examples/p-tls/projects/p-tls-contracts/README.md delete mode 100644 examples/p-tls/projects/p-tls-contracts/__test__/Calculator.test.ts delete mode 100644 examples/p-tls/projects/p-tls-contracts/contracts/Calculator.algo.ts delete mode 100644 examples/p-tls/projects/p-tls-contracts/contracts/clients/.gitkeep delete mode 100644 examples/p-tls/projects/p-tls-contracts/jest.config.js delete mode 100644 examples/p-tls/projects/p-tls-contracts/package.json delete mode 100644 examples/p-tls/projects/p-tls-contracts/tsconfig.json delete mode 100644 examples/p-tls/projects/p-tls-frontend/.algokit.toml delete mode 100644 examples/p-tls/projects/p-tls-frontend/.algokit/.copier-answers.yml delete mode 100644 examples/p-tls/projects/p-tls-frontend/.editorconfig delete mode 100644 examples/p-tls/projects/p-tls-frontend/.env.template delete mode 100644 examples/p-tls/projects/p-tls-frontend/.eslintrc delete mode 100644 examples/p-tls/projects/p-tls-frontend/.gitignore delete mode 100644 examples/p-tls/projects/p-tls-frontend/.npmrc delete mode 100644 examples/p-tls/projects/p-tls-frontend/.prettierignore delete mode 100644 examples/p-tls/projects/p-tls-frontend/.prettierrc.cjs delete mode 100644 examples/p-tls/projects/p-tls-frontend/.vscode/extensions.json delete mode 100644 examples/p-tls/projects/p-tls-frontend/.vscode/launch.json delete mode 100644 examples/p-tls/projects/p-tls-frontend/.vscode/settings.json delete mode 100644 examples/p-tls/projects/p-tls-frontend/.vscode/tasks.json delete mode 100644 examples/p-tls/projects/p-tls-frontend/README.md delete mode 100644 examples/p-tls/projects/p-tls-frontend/index.html delete mode 100644 examples/p-tls/projects/p-tls-frontend/jest.config.ts delete mode 100644 examples/p-tls/projects/p-tls-frontend/package.json delete mode 100644 examples/p-tls/projects/p-tls-frontend/playwright.config.ts delete mode 100644 examples/p-tls/projects/p-tls-frontend/postcss.config.cjs delete mode 100644 examples/p-tls/projects/p-tls-frontend/public/index.html delete mode 100644 examples/p-tls/projects/p-tls-frontend/public/robots.txt delete mode 100644 examples/p-tls/projects/p-tls-frontend/src/App.tsx delete mode 100644 examples/p-tls/projects/p-tls-frontend/src/assets/logo.svg delete mode 100644 examples/p-tls/projects/p-tls-frontend/src/components/Account.tsx delete mode 100644 examples/p-tls/projects/p-tls-frontend/src/components/ConnectWallet.tsx delete mode 100644 examples/p-tls/projects/p-tls-frontend/src/components/ErrorBoundary.tsx delete mode 100644 examples/p-tls/projects/p-tls-frontend/src/components/Transact.tsx delete mode 100644 examples/p-tls/projects/p-tls-frontend/src/contracts/README.md delete mode 100644 examples/p-tls/projects/p-tls-frontend/src/interfaces/network.ts delete mode 100644 examples/p-tls/projects/p-tls-frontend/src/main.tsx delete mode 100644 examples/p-tls/projects/p-tls-frontend/src/styles/main.css delete mode 100644 examples/p-tls/projects/p-tls-frontend/src/utils/ellipseAddress.spec.tsx delete mode 100644 examples/p-tls/projects/p-tls-frontend/src/utils/ellipseAddress.ts delete mode 100644 examples/p-tls/projects/p-tls-frontend/src/utils/network/getAlgoClientConfigs.ts delete mode 100644 examples/p-tls/projects/p-tls-frontend/src/vite-env.d.ts delete mode 100644 examples/p-tls/projects/p-tls-frontend/tailwind.config.cjs delete mode 100644 examples/p-tls/projects/p-tls-frontend/tests/example.spec.ts delete mode 100644 examples/p-tls/projects/p-tls-frontend/tsconfig.json delete mode 100644 examples/p-tls/projects/p-tls-frontend/tsconfig.node.json delete mode 100644 examples/p-tls/projects/p-tls-frontend/vite.config.ts delete mode 100644 examples/p-ts/.algokit/generators/create-devcontainer/copier.yaml delete mode 100644 examples/p-ts/.algokit/generators/create-devcontainer/devcontainer.json delete mode 100644 examples/p-ts/.editorconfig delete mode 100644 examples/p-ts/.gitattributes delete mode 100644 examples/p-ts/.github/workflows/p-ts-contracts-cd.yaml delete mode 100644 examples/p-ts/.github/workflows/p-ts-contracts-ci.yaml delete mode 100644 examples/p-ts/.github/workflows/p-ts-frontend-cd.yaml delete mode 100644 examples/p-ts/.github/workflows/p-ts-frontend-ci.yaml delete mode 100644 examples/p-ts/.gitignore create mode 100644 examples/p-ts/copy_files.sh rename examples/p-ts/{projects/p-ts-frontend/src/components => inject_content}/AppCalls.tsx (100%) rename examples/p-ts/{projects/p-ts-frontend/src => inject_content}/Home.tsx (100%) delete mode 100644 examples/p-ts/projects/.gitkeep delete mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit.toml delete mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit/.copier-answers.yml delete mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/copier.yaml delete mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.algo.ts.j2 delete mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 delete mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 delete mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.spec.ts{% endif %}.j2 delete mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/copier.yaml delete mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} delete mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} delete mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} delete mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} delete mode 100644 examples/p-ts/projects/p-ts-contracts/.editorconfig delete mode 100644 examples/p-ts/projects/p-ts-contracts/.gitignore delete mode 100644 examples/p-ts/projects/p-ts-contracts/.npmrc delete mode 100644 examples/p-ts/projects/p-ts-contracts/.prettierignore delete mode 100644 examples/p-ts/projects/p-ts-contracts/.prettierrc.js delete mode 100644 examples/p-ts/projects/p-ts-contracts/.tours/getting-started-with-your-algokit-project.tour delete mode 100644 examples/p-ts/projects/p-ts-contracts/.vscode/extensions.json delete mode 100644 examples/p-ts/projects/p-ts-contracts/.vscode/launch.json delete mode 100644 examples/p-ts/projects/p-ts-contracts/.vscode/settings.json delete mode 100644 examples/p-ts/projects/p-ts-contracts/.vscode/tasks.json delete mode 100644 examples/p-ts/projects/p-ts-contracts/README.md delete mode 100644 examples/p-ts/projects/p-ts-contracts/eslint.config.mjs delete mode 100644 examples/p-ts/projects/p-ts-contracts/package.json delete mode 100644 examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.spec.ts delete mode 100644 examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.ts delete mode 100644 examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.e2e.spec.ts delete mode 100644 examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/deploy-config.ts delete mode 100644 examples/p-ts/projects/p-ts-contracts/smart_contracts/index.ts delete mode 100644 examples/p-ts/projects/p-ts-contracts/tsconfig.json delete mode 100644 examples/p-ts/projects/p-ts-contracts/vitest.config.mts delete mode 100644 examples/p-ts/projects/p-ts-frontend/.algokit.toml delete mode 100644 examples/p-ts/projects/p-ts-frontend/.algokit/.copier-answers.yml delete mode 100644 examples/p-ts/projects/p-ts-frontend/.editorconfig delete mode 100644 examples/p-ts/projects/p-ts-frontend/.env.template delete mode 100644 examples/p-ts/projects/p-ts-frontend/.eslintrc delete mode 100644 examples/p-ts/projects/p-ts-frontend/.gitignore delete mode 100644 examples/p-ts/projects/p-ts-frontend/.npmrc delete mode 100644 examples/p-ts/projects/p-ts-frontend/.prettierignore delete mode 100644 examples/p-ts/projects/p-ts-frontend/.prettierrc.cjs delete mode 100644 examples/p-ts/projects/p-ts-frontend/.vscode/extensions.json delete mode 100644 examples/p-ts/projects/p-ts-frontend/.vscode/launch.json delete mode 100644 examples/p-ts/projects/p-ts-frontend/.vscode/settings.json delete mode 100644 examples/p-ts/projects/p-ts-frontend/.vscode/tasks.json delete mode 100644 examples/p-ts/projects/p-ts-frontend/README.md delete mode 100644 examples/p-ts/projects/p-ts-frontend/index.html delete mode 100644 examples/p-ts/projects/p-ts-frontend/jest.config.ts delete mode 100644 examples/p-ts/projects/p-ts-frontend/package.json delete mode 100644 examples/p-ts/projects/p-ts-frontend/playwright.config.ts delete mode 100644 examples/p-ts/projects/p-ts-frontend/postcss.config.cjs delete mode 100644 examples/p-ts/projects/p-ts-frontend/public/index.html delete mode 100644 examples/p-ts/projects/p-ts-frontend/public/robots.txt delete mode 100644 examples/p-ts/projects/p-ts-frontend/src/App.tsx delete mode 100644 examples/p-ts/projects/p-ts-frontend/src/assets/logo.svg delete mode 100644 examples/p-ts/projects/p-ts-frontend/src/components/Account.tsx delete mode 100644 examples/p-ts/projects/p-ts-frontend/src/components/ConnectWallet.tsx delete mode 100644 examples/p-ts/projects/p-ts-frontend/src/components/ErrorBoundary.tsx delete mode 100644 examples/p-ts/projects/p-ts-frontend/src/components/Transact.tsx delete mode 100644 examples/p-ts/projects/p-ts-frontend/src/contracts/README.md delete mode 100644 examples/p-ts/projects/p-ts-frontend/src/interfaces/network.ts delete mode 100644 examples/p-ts/projects/p-ts-frontend/src/main.tsx delete mode 100644 examples/p-ts/projects/p-ts-frontend/src/styles/main.css delete mode 100644 examples/p-ts/projects/p-ts-frontend/src/utils/ellipseAddress.spec.tsx delete mode 100644 examples/p-ts/projects/p-ts-frontend/src/utils/ellipseAddress.ts delete mode 100644 examples/p-ts/projects/p-ts-frontend/src/utils/network/getAlgoClientConfigs.ts delete mode 100644 examples/p-ts/projects/p-ts-frontend/src/vite-env.d.ts delete mode 100644 examples/p-ts/projects/p-ts-frontend/tailwind.config.cjs delete mode 100644 examples/p-ts/projects/p-ts-frontend/tests/example.spec.ts delete mode 100644 examples/p-ts/projects/p-ts-frontend/tsconfig.json delete mode 100644 examples/p-ts/projects/p-ts-frontend/tsconfig.node.json delete mode 100644 examples/p-ts/projects/p-ts-frontend/vite.config.ts delete mode 100644 examples/s-py/.algokit/generators/create-devcontainer/copier.yaml delete mode 100644 examples/s-py/.algokit/generators/create-devcontainer/devcontainer.json delete mode 100644 examples/s-py/.editorconfig delete mode 100644 examples/s-py/.gitattributes delete mode 100644 examples/s-py/.gitignore create mode 100644 examples/s-py/copy_files.sh rename examples/s-py/{projects/s-py-frontend/src/components => inject_content}/AppCalls.tsx (100%) rename examples/s-py/{projects/s-py-frontend/src => inject_content}/Home.tsx (100%) delete mode 100644 examples/s-py/projects/.gitkeep delete mode 100644 examples/s-py/projects/s-py-contracts/.algokit.toml delete mode 100644 examples/s-py/projects/s-py-contracts/.algokit/.copier-answers.yml delete mode 100644 examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/copier.yaml delete mode 100644 examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.py.j2 delete mode 100644 examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 delete mode 100644 examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/copier.yaml delete mode 100644 examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} delete mode 100644 examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} delete mode 100644 examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} delete mode 100644 examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} delete mode 100644 examples/s-py/projects/s-py-contracts/.editorconfig delete mode 100644 examples/s-py/projects/s-py-contracts/.gitignore delete mode 100644 examples/s-py/projects/s-py-contracts/.npmrc delete mode 100644 examples/s-py/projects/s-py-contracts/.prettierignore delete mode 100644 examples/s-py/projects/s-py-contracts/.prettierrc.js delete mode 100644 examples/s-py/projects/s-py-contracts/.tours/getting-started-with-your-algokit-project.tour delete mode 100644 examples/s-py/projects/s-py-contracts/.vscode/extensions.json delete mode 100644 examples/s-py/projects/s-py-contracts/.vscode/launch.json delete mode 100644 examples/s-py/projects/s-py-contracts/.vscode/settings.json delete mode 100644 examples/s-py/projects/s-py-contracts/.vscode/tasks.json delete mode 100644 examples/s-py/projects/s-py-contracts/README.md delete mode 100644 examples/s-py/projects/s-py-contracts/package.json delete mode 100644 examples/s-py/projects/s-py-contracts/poetry.toml delete mode 100644 examples/s-py/projects/s-py-contracts/pyproject.toml delete mode 100644 examples/s-py/projects/s-py-contracts/smart_contracts/__init__.py delete mode 100644 examples/s-py/projects/s-py-contracts/smart_contracts/__main__.py delete mode 100644 examples/s-py/projects/s-py-contracts/smart_contracts/hello_world/contract.py delete mode 100644 examples/s-py/projects/s-py-contracts/smart_contracts/hello_world/deploy-config.ts delete mode 100644 examples/s-py/projects/s-py-contracts/smart_contracts/index.ts delete mode 100644 examples/s-py/projects/s-py-contracts/tsconfig.json delete mode 100644 examples/s-py/projects/s-py-frontend/.algokit.toml delete mode 100644 examples/s-py/projects/s-py-frontend/.algokit/.copier-answers.yml delete mode 100644 examples/s-py/projects/s-py-frontend/.env.template delete mode 100644 examples/s-py/projects/s-py-frontend/.gitignore delete mode 100644 examples/s-py/projects/s-py-frontend/.npmrc delete mode 100644 examples/s-py/projects/s-py-frontend/.vscode/extensions.json delete mode 100644 examples/s-py/projects/s-py-frontend/.vscode/launch.json delete mode 100644 examples/s-py/projects/s-py-frontend/.vscode/settings.json delete mode 100644 examples/s-py/projects/s-py-frontend/.vscode/tasks.json delete mode 100644 examples/s-py/projects/s-py-frontend/README.md delete mode 100644 examples/s-py/projects/s-py-frontend/index.html delete mode 100644 examples/s-py/projects/s-py-frontend/package.json delete mode 100644 examples/s-py/projects/s-py-frontend/public/index.html delete mode 100644 examples/s-py/projects/s-py-frontend/public/robots.txt delete mode 100644 examples/s-py/projects/s-py-frontend/src/App.tsx delete mode 100644 examples/s-py/projects/s-py-frontend/src/assets/logo.svg delete mode 100644 examples/s-py/projects/s-py-frontend/src/components/Account.tsx delete mode 100644 examples/s-py/projects/s-py-frontend/src/components/ConnectWallet.tsx delete mode 100644 examples/s-py/projects/s-py-frontend/src/components/ErrorBoundary.tsx delete mode 100644 examples/s-py/projects/s-py-frontend/src/components/Transact.tsx delete mode 100644 examples/s-py/projects/s-py-frontend/src/contracts/README.md delete mode 100644 examples/s-py/projects/s-py-frontend/src/interfaces/network.ts delete mode 100644 examples/s-py/projects/s-py-frontend/src/main.tsx delete mode 100644 examples/s-py/projects/s-py-frontend/src/styles/App.css delete mode 100644 examples/s-py/projects/s-py-frontend/src/utils/ellipseAddress.ts delete mode 100644 examples/s-py/projects/s-py-frontend/src/utils/network/getAlgoClientConfigs.ts delete mode 100644 examples/s-py/projects/s-py-frontend/src/vite-env.d.ts delete mode 100644 examples/s-py/projects/s-py-frontend/tsconfig.json delete mode 100644 examples/s-py/projects/s-py-frontend/tsconfig.node.json delete mode 100644 examples/s-py/projects/s-py-frontend/vite.config.ts delete mode 100644 examples/s-tls/.algokit/generators/create-devcontainer/copier.yaml delete mode 100644 examples/s-tls/.algokit/generators/create-devcontainer/devcontainer.json delete mode 100644 examples/s-tls/.editorconfig delete mode 100644 examples/s-tls/.gitattributes delete mode 100644 examples/s-tls/.gitignore create mode 100644 examples/s-tls/copy_files.sh rename examples/s-tls/{projects/s-tls-frontend/src/components => inject_content}/AppCalls.tsx (100%) rename examples/s-tls/{projects/s-tls-frontend/src => inject_content}/Home.tsx (100%) delete mode 100644 examples/s-tls/projects/.gitkeep delete mode 100644 examples/s-tls/projects/s-tls-contracts/.algokit.toml delete mode 100644 examples/s-tls/projects/s-tls-contracts/.eslintrc.js delete mode 100644 examples/s-tls/projects/s-tls-contracts/.gitignore delete mode 100644 examples/s-tls/projects/s-tls-contracts/.prettierrc.toml delete mode 100644 examples/s-tls/projects/s-tls-contracts/.vscode/extensions.json delete mode 100644 examples/s-tls/projects/s-tls-contracts/.vscode/settings.json delete mode 100644 examples/s-tls/projects/s-tls-contracts/README.md delete mode 100644 examples/s-tls/projects/s-tls-contracts/__test__/Calculator.test.ts delete mode 100644 examples/s-tls/projects/s-tls-contracts/contracts/Calculator.algo.ts delete mode 100644 examples/s-tls/projects/s-tls-contracts/contracts/clients/.gitkeep delete mode 100644 examples/s-tls/projects/s-tls-contracts/jest.config.js delete mode 100644 examples/s-tls/projects/s-tls-contracts/package.json delete mode 100644 examples/s-tls/projects/s-tls-contracts/tsconfig.json delete mode 100644 examples/s-tls/projects/s-tls-frontend/.algokit.toml delete mode 100644 examples/s-tls/projects/s-tls-frontend/.algokit/.copier-answers.yml delete mode 100644 examples/s-tls/projects/s-tls-frontend/.env.template delete mode 100644 examples/s-tls/projects/s-tls-frontend/.gitignore delete mode 100644 examples/s-tls/projects/s-tls-frontend/.npmrc delete mode 100644 examples/s-tls/projects/s-tls-frontend/.vscode/extensions.json delete mode 100644 examples/s-tls/projects/s-tls-frontend/.vscode/launch.json delete mode 100644 examples/s-tls/projects/s-tls-frontend/.vscode/settings.json delete mode 100644 examples/s-tls/projects/s-tls-frontend/.vscode/tasks.json delete mode 100644 examples/s-tls/projects/s-tls-frontend/README.md delete mode 100644 examples/s-tls/projects/s-tls-frontend/index.html delete mode 100644 examples/s-tls/projects/s-tls-frontend/package.json delete mode 100644 examples/s-tls/projects/s-tls-frontend/public/index.html delete mode 100644 examples/s-tls/projects/s-tls-frontend/public/robots.txt delete mode 100644 examples/s-tls/projects/s-tls-frontend/src/App.tsx delete mode 100644 examples/s-tls/projects/s-tls-frontend/src/assets/logo.svg delete mode 100644 examples/s-tls/projects/s-tls-frontend/src/components/Account.tsx delete mode 100644 examples/s-tls/projects/s-tls-frontend/src/components/ConnectWallet.tsx delete mode 100644 examples/s-tls/projects/s-tls-frontend/src/components/ErrorBoundary.tsx delete mode 100644 examples/s-tls/projects/s-tls-frontend/src/components/Transact.tsx delete mode 100644 examples/s-tls/projects/s-tls-frontend/src/contracts/README.md delete mode 100644 examples/s-tls/projects/s-tls-frontend/src/interfaces/network.ts delete mode 100644 examples/s-tls/projects/s-tls-frontend/src/main.tsx delete mode 100644 examples/s-tls/projects/s-tls-frontend/src/styles/App.css delete mode 100644 examples/s-tls/projects/s-tls-frontend/src/utils/ellipseAddress.ts delete mode 100644 examples/s-tls/projects/s-tls-frontend/src/utils/network/getAlgoClientConfigs.ts delete mode 100644 examples/s-tls/projects/s-tls-frontend/src/vite-env.d.ts delete mode 100644 examples/s-tls/projects/s-tls-frontend/tsconfig.json delete mode 100644 examples/s-tls/projects/s-tls-frontend/tsconfig.node.json delete mode 100644 examples/s-tls/projects/s-tls-frontend/vite.config.ts delete mode 100644 examples/s-ts/.algokit/generators/create-devcontainer/copier.yaml delete mode 100644 examples/s-ts/.algokit/generators/create-devcontainer/devcontainer.json delete mode 100644 examples/s-ts/.editorconfig delete mode 100644 examples/s-ts/.gitattributes delete mode 100644 examples/s-ts/.gitignore create mode 100644 examples/s-ts/copy_files.sh rename examples/s-ts/{projects/s-ts-frontend/src/components => inject_content}/AppCalls.tsx (100%) rename examples/s-ts/{projects/s-ts-frontend/src => inject_content}/Home.tsx (100%) delete mode 100644 examples/s-ts/projects/.gitkeep delete mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit.toml delete mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit/.copier-answers.yml delete mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/copier.yaml delete mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.algo.ts.j2 delete mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 delete mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 delete mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.spec.ts{% endif %}.j2 delete mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/copier.yaml delete mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} delete mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} delete mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} delete mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} delete mode 100644 examples/s-ts/projects/s-ts-contracts/.gitignore delete mode 100644 examples/s-ts/projects/s-ts-contracts/.tours/getting-started-with-your-algokit-project.tour delete mode 100644 examples/s-ts/projects/s-ts-contracts/.vscode/extensions.json delete mode 100644 examples/s-ts/projects/s-ts-contracts/.vscode/launch.json delete mode 100644 examples/s-ts/projects/s-ts-contracts/.vscode/settings.json delete mode 100644 examples/s-ts/projects/s-ts-contracts/.vscode/tasks.json delete mode 100644 examples/s-ts/projects/s-ts-contracts/README.md delete mode 100644 examples/s-ts/projects/s-ts-contracts/package.json delete mode 100644 examples/s-ts/projects/s-ts-contracts/smart_contracts/hello_world/contract.algo.ts delete mode 100644 examples/s-ts/projects/s-ts-contracts/smart_contracts/hello_world/deploy-config.ts delete mode 100644 examples/s-ts/projects/s-ts-contracts/smart_contracts/index.ts delete mode 100644 examples/s-ts/projects/s-ts-contracts/tsconfig.json delete mode 100644 examples/s-ts/projects/s-ts-frontend/.algokit.toml delete mode 100644 examples/s-ts/projects/s-ts-frontend/.algokit/.copier-answers.yml delete mode 100644 examples/s-ts/projects/s-ts-frontend/.env.template delete mode 100644 examples/s-ts/projects/s-ts-frontend/.gitignore delete mode 100644 examples/s-ts/projects/s-ts-frontend/.npmrc delete mode 100644 examples/s-ts/projects/s-ts-frontend/.vscode/extensions.json delete mode 100644 examples/s-ts/projects/s-ts-frontend/.vscode/launch.json delete mode 100644 examples/s-ts/projects/s-ts-frontend/.vscode/settings.json delete mode 100644 examples/s-ts/projects/s-ts-frontend/.vscode/tasks.json delete mode 100644 examples/s-ts/projects/s-ts-frontend/README.md delete mode 100644 examples/s-ts/projects/s-ts-frontend/index.html delete mode 100644 examples/s-ts/projects/s-ts-frontend/package.json delete mode 100644 examples/s-ts/projects/s-ts-frontend/public/index.html delete mode 100644 examples/s-ts/projects/s-ts-frontend/public/robots.txt delete mode 100644 examples/s-ts/projects/s-ts-frontend/src/App.tsx delete mode 100644 examples/s-ts/projects/s-ts-frontend/src/assets/logo.svg delete mode 100644 examples/s-ts/projects/s-ts-frontend/src/components/Account.tsx delete mode 100644 examples/s-ts/projects/s-ts-frontend/src/components/ConnectWallet.tsx delete mode 100644 examples/s-ts/projects/s-ts-frontend/src/components/ErrorBoundary.tsx delete mode 100644 examples/s-ts/projects/s-ts-frontend/src/components/Transact.tsx delete mode 100644 examples/s-ts/projects/s-ts-frontend/src/contracts/README.md delete mode 100644 examples/s-ts/projects/s-ts-frontend/src/interfaces/network.ts delete mode 100644 examples/s-ts/projects/s-ts-frontend/src/main.tsx delete mode 100644 examples/s-ts/projects/s-ts-frontend/src/styles/App.css delete mode 100644 examples/s-ts/projects/s-ts-frontend/src/utils/ellipseAddress.ts delete mode 100644 examples/s-ts/projects/s-ts-frontend/src/utils/network/getAlgoClientConfigs.ts delete mode 100644 examples/s-ts/projects/s-ts-frontend/src/vite-env.d.ts delete mode 100644 examples/s-ts/projects/s-ts-frontend/tsconfig.json delete mode 100644 examples/s-ts/projects/s-ts-frontend/tsconfig.node.json delete mode 100644 examples/s-ts/projects/s-ts-frontend/vite.config.ts diff --git a/examples/p-py/.algokit/.copier-answers.yml b/examples/p-py/.algokit/.copier-answers.yml index a833cc8..7753a3e 100644 --- a/examples/p-py/.algokit/.copier-answers.yml +++ b/examples/p-py/.algokit/.copier-answers.yml @@ -1,6 +1,6 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 2.1.8-9-g7d7ad4b -_src_path: /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpu5fp3052/template +_commit: 2.1.8-11-g7668422 +_src_path: /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template author_email: None author_name: None cloud_provider: netlify diff --git a/examples/p-py/.algokit/generators/create-devcontainer/copier.yaml b/examples/p-py/.algokit/generators/create-devcontainer/copier.yaml deleted file mode 100644 index e98f334..0000000 --- a/examples/p-py/.algokit/generators/create-devcontainer/copier.yaml +++ /dev/null @@ -1,4 +0,0 @@ -_tasks: - - "echo '==== Successfully generated new .devcontainer.json file 🚀 ===='" - -_templates_suffix: ".j2" diff --git a/examples/p-py/.algokit/generators/create-devcontainer/devcontainer.json b/examples/p-py/.algokit/generators/create-devcontainer/devcontainer.json deleted file mode 100644 index 6452c65..0000000 --- a/examples/p-py/.algokit/generators/create-devcontainer/devcontainer.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "forwardPorts": [4001, 4002, 8980, 5173], - "portsAttributes": { - "4001": { - "label": "algod" - }, - "4002": { - "label": "kmd" - }, - "8980": { - "label": "indexer" - }, - "5173": { - "label": "vite" - } - }, - "postCreateCommand": "mkdir -p ~/.config/algokit && pipx install algokit && sudo chown -R codespace:codespace ~/.config/algokit", - "postStartCommand": "for i in {1..5}; do algokit localnet status > /dev/null 2>&1 && break || sleep 30; algokit localnet reset; done" -} diff --git a/examples/p-py/.editorconfig b/examples/p-py/.editorconfig deleted file mode 100644 index 5e550a1..0000000 --- a/examples/p-py/.editorconfig +++ /dev/null @@ -1,10 +0,0 @@ -[*] -charset = utf-8 -insert_final_newline = true -end_of_line = lf -indent_style = space -indent_size = 2 -tab_width = 2 -max_line_length = 140 -trim_trailing_whitespace = true -single_quote = true diff --git a/examples/p-py/.gitattributes b/examples/p-py/.gitattributes deleted file mode 100644 index 6313b56..0000000 --- a/examples/p-py/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text=auto eol=lf diff --git a/examples/p-py/.github/workflows/p-py-contracts-cd.yaml b/examples/p-py/.github/workflows/p-py-contracts-cd.yaml deleted file mode 100644 index 567b072..0000000 --- a/examples/p-py/.github/workflows/p-py-contracts-cd.yaml +++ /dev/null @@ -1,44 +0,0 @@ -name: Release p-py-contracts - -on: - workflow_call: - -jobs: - deploy-testnet: - runs-on: "ubuntu-latest" - - environment: contract-testnet - steps: - - name: Checkout source code - uses: actions/checkout@v4 - - - name: Install poetry - run: | - pipx install poetry - pipx inject poetry poetry-plugin-export - - - name: Set up Python 3.12 - uses: actions/setup-python@v5 - with: - python-version: "3.12" - cache: "poetry" - - - name: Install algokit - run: pipx install algokit - - - name: Bootstrap dependencies - run: algokit project bootstrap all --project-name 'p-py-contracts' - - - name: Configure git - shell: bash - run: | - # set git user and email as test invoke git - git config --global user.email "actions@github.com" && git config --global user.name "github-actions" - - - name: Deploy to testnet - run: algokit project deploy testnet --project-name 'p-py-contracts' - env: - # This is the account that becomes the creator of the contract - DEPLOYER_MNEMONIC: ${{ secrets.DEPLOYER_MNEMONIC }} - # The dispenser account is used to ensure the deployer account is funded - DISPENSER_MNEMONIC: ${{ secrets.DISPENSER_MNEMONIC }} diff --git a/examples/p-py/.github/workflows/p-py-contracts-ci.yaml b/examples/p-py/.github/workflows/p-py-contracts-ci.yaml deleted file mode 100644 index 288a486..0000000 --- a/examples/p-py/.github/workflows/p-py-contracts-ci.yaml +++ /dev/null @@ -1,65 +0,0 @@ -name: Validate p-py-contracts - -on: - workflow_call: - -jobs: - validate: - runs-on: "ubuntu-latest" - steps: - - name: Checkout source code - uses: actions/checkout@v4 - - - name: Install poetry - run: | - pipx install poetry - pipx inject poetry poetry-plugin-export - - - name: Set up Python 3.12 - uses: actions/setup-python@v5 - with: - python-version: "3.12" - cache: "poetry" - - - name: Install algokit - run: pipx install algokit - - - name: Start LocalNet - run: algokit localnet start - - - name: Bootstrap dependencies - run: algokit project bootstrap all --project-name 'p-py-contracts' - - - name: Configure git - shell: bash - run: | - # set git user and email as test invoke git - git config --global user.email "actions@github.com" && git config --global user.name "github-actions" - - - name: Audit python dependencies - run: algokit project run audit --project-name 'p-py-contracts' - - - name: Lint and format python dependencies - run: algokit project run lint --project-name 'p-py-contracts' - - - name: Run tests - shell: bash - run: | - set -o pipefail - algokit project run test --project-name 'p-py-contracts' - - - name: Build smart contracts - run: algokit project run build --project-name 'p-py-contracts' - - - name: Scan TEAL files for issues - run: algokit project run audit-teal --project-name 'p-py-contracts' - - # # Uncomment to enable TEAL static analysis with snapshoting using Tealer package - # # Would first require running locally using audit-teal command and committing the snapshots into source control - # # Please note, tealer has a known bug that may result in large snapshot file sizes, track resolution here: - # # https://github.com/crytic/tealer/issues/101 - # - name: Check output stability of the smart contracts - # run: algokit project run ci-teal-diff --project-name 'p-py-contracts' - - - name: Run deployer against LocalNet - run: algokit project deploy localnet --project-name 'p-py-contracts' diff --git a/examples/p-py/.github/workflows/p-py-frontend-cd.yaml b/examples/p-py/.github/workflows/p-py-frontend-cd.yaml deleted file mode 100644 index 4049a93..0000000 --- a/examples/p-py/.github/workflows/p-py-frontend-cd.yaml +++ /dev/null @@ -1,36 +0,0 @@ -name: Release p-py-frontend - -on: - workflow_call: -permissions: - contents: read - packages: read - -jobs: - - deploy: - runs-on: ubuntu-latest - name: Deploy to Netlify - environment: frontend-prod - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Setup node - uses: actions/setup-node@v3 - with: - node-version: 18 - - - name: Install algokit - run: pipx install algokit - - - name: Bootstrap dependencies - run: algokit project bootstrap all --project-name 'p-py-frontend' - - - name: Publish to Netlify - env: - NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} - NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - run: algokit project run ci-deploy-netlify - \ No newline at end of file diff --git a/examples/p-py/.github/workflows/p-py-frontend-ci.yaml b/examples/p-py/.github/workflows/p-py-frontend-ci.yaml deleted file mode 100644 index fafb514..0000000 --- a/examples/p-py/.github/workflows/p-py-frontend-ci.yaml +++ /dev/null @@ -1,47 +0,0 @@ -name: Validate p-py-frontend - -on: - - workflow_call: - - -jobs: - validate: - runs-on: 'ubuntu-latest' - steps: - - name: Check out repository - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup node - uses: actions/setup-node@v3 - with: - node-version: 18 - - - name: Install poetry - run: pipx install poetry - - - name: Set up Python 3.12 - uses: actions/setup-python@v5 - with: - python-version: "3.12" - cache: "poetry" - - - name: Install algokit - run: pipx install algokit - - - name: Install dependencies - run: algokit project bootstrap all --project-name 'p-py-frontend' - - - - name: Run linters - run: algokit project run lint --project-name 'p-py-frontend' - - - - name: Run unit tests - run: algokit project run test --project-name 'p-py-frontend' - - - - name: Build - run: algokit project run build --project-name 'p-py-frontend' diff --git a/examples/p-py/.gitignore b/examples/p-py/.gitignore deleted file mode 100644 index 4105eb2..0000000 --- a/examples/p-py/.gitignore +++ /dev/null @@ -1,170 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -#pdm.lock -# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it -# in version control. -# https://pdm.fming.dev/#use-with-ide -.pdm.toml - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Ruff (linter) -.ruff_cache/ - -# Cython debug symbols -cython_debug/ - -# PyCharm -.idea/ -!.idea/runConfigurations - -# macOS -.DS_Store - -# Received approval test files -*.received.* - -# NPM -node_modules - diff --git a/examples/p-py/copy_files.sh b/examples/p-py/copy_files.sh new file mode 100644 index 0000000..749b01f --- /dev/null +++ b/examples/p-py/copy_files.sh @@ -0,0 +1,23 @@ + +#!/bin/bash +# Script to copy required files to the frontend project +# Usage: ./copy_files.sh + + +project_name="$1" +frontend_root="./projects/${project_name}-frontend" + +# Ensure directories exist +mkdir -p "${frontend_root}/src/components" + +# Copy files +cp "./inject_content/Home.tsx" "${frontend_root}/src/Home.tsx" +cp "./inject_content/AppCalls.tsx" "${frontend_root}/src/components/AppCalls.tsx" + +echo "Template completed successfully!" +# remove inject_content folder +rm -rf "./inject_content" +# self destruct the file +rm -f "$0" + + diff --git a/examples/p-py/projects/p-py-frontend/src/components/AppCalls.tsx b/examples/p-py/inject_content/AppCalls.tsx similarity index 100% rename from examples/p-py/projects/p-py-frontend/src/components/AppCalls.tsx rename to examples/p-py/inject_content/AppCalls.tsx diff --git a/examples/p-py/projects/p-py-frontend/src/Home.tsx b/examples/p-py/inject_content/Home.tsx similarity index 100% rename from examples/p-py/projects/p-py-frontend/src/Home.tsx rename to examples/p-py/inject_content/Home.tsx diff --git a/examples/p-py/projects/.gitkeep b/examples/p-py/projects/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/examples/p-py/projects/p-py-contracts/.algokit.toml b/examples/p-py/projects/p-py-contracts/.algokit.toml deleted file mode 100644 index 845e015..0000000 --- a/examples/p-py/projects/p-py-contracts/.algokit.toml +++ /dev/null @@ -1,57 +0,0 @@ -[algokit] -min_version = "v2.0.0" - -[generate.smart-contract] -description = "Generate a new smart contract for existing project" -path = ".algokit/generators/create_contract" - -[generate.env-file] -description = "Generate a new generic or Algorand network specific .env file" -path = ".algokit/generators/create_env_file" - -[project] -type = 'contract' -name = 'p-py-contracts' -artifacts = 'smart_contracts/artifacts' - -[project.deploy] -command = "poetry run python -m smart_contracts deploy" - -[project.deploy.testnet] -environment_secrets = [ - "DEPLOYER_MNEMONIC", - "DISPENSER_MNEMONIC", -] - -[project.deploy.mainnet] -environment_secrets = [ - "DEPLOYER_MNEMONIC", - "DISPENSER_MNEMONIC", -] - -[project.run] -# Commands intented for use locally and in CI -build = { commands = [ - 'poetry run python -m smart_contracts build', -], description = 'Build all smart contracts in the project' } -test = { commands = [ - 'poetry run pytest', -], description = 'Run smart contract tests' } -audit = { commands = [ - 'poetry run pip-audit', -], description = 'Audit with pip-audit. NOTE: If used with poetry >v2, make sure to install `poetry-plugin-export` as per https://github.com/python-poetry/poetry-plugin-export#installation.' } -lint = { commands = [ - 'poetry run black --check --diff .', - 'poetry run ruff check .', - 'poetry run mypy', -], description = 'Perform linting' } -audit-teal = { commands = [ - # 🚨 IMPORTANT 🚨: For strict TEAL validation, remove --exclude statements. The default starter contract is not for production. Ensure thorough testing and adherence to best practices in smart contract development. This is not a replacement for a professional audit. - 'algokit task analyze smart_contracts/artifacts --recursive --force --exclude rekey-to --exclude is-updatable --exclude missing-fee-check --exclude is-deletable --exclude can-close-asset --exclude can-close-account --exclude unprotected-deletable --exclude unprotected-updatable', -], description = 'Audit TEAL files' } - -# Commands intented for CI only, prefixed with `ci-` by convention -ci-teal-diff = { commands = [ - 'git add -N ./smart_contracts/artifacts', - 'git diff --exit-code --minimal ./smart_contracts/artifacts', -], description = 'Check TEAL files for differences' } diff --git a/examples/p-py/projects/p-py-contracts/.algokit/.copier-answers.yml b/examples/p-py/projects/p-py-contracts/.algokit/.copier-answers.yml deleted file mode 100644 index ac678d7..0000000 --- a/examples/p-py/projects/p-py-contracts/.algokit/.copier-answers.yml +++ /dev/null @@ -1,10 +0,0 @@ -# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 1.8.1-13-g270c4a5 -_src_path: gh:algorandfoundation/algokit-python-template -author_email: None -author_name: None -contract_name: hello_world -deployment_language: python -preset_name: production -project_name: p-py-contracts - diff --git a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/copier.yaml b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/copier.yaml deleted file mode 100644 index 73805de..0000000 --- a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/copier.yaml +++ /dev/null @@ -1,10 +0,0 @@ -_tasks: - - "echo '==== Successfully initialized new smart contract 🚀 ===='" - -contract_name: - type: str - help: Name of your new contract. - placeholder: "my-new-contract" - default: "my-new-contract" - -_templates_suffix: ".j2" diff --git a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.py.j2 b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.py.j2 deleted file mode 100644 index 829e3a0..0000000 --- a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.py.j2 +++ /dev/null @@ -1,9 +0,0 @@ -# pyright: reportMissingModuleSource=false -from algopy import ARC4Contract, String -from algopy.arc4 import abimethod - - -class {{ contract_name.split('_')|map('capitalize')|join }}(ARC4Contract): - @abimethod() - def hello(self, name: String) -> String: - return "Hello, " + name diff --git a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy_config.py.j2 b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy_config.py.j2 deleted file mode 100644 index 194ba5e..0000000 --- a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy_config.py.j2 +++ /dev/null @@ -1,44 +0,0 @@ -import logging - -import algokit_utils - -logger = logging.getLogger(__name__) - - -# define deployment behaviour based on supplied app spec -def deploy() -> None: - from smart_contracts.artifacts.{{ contract_name }}.{{ contract_name }}_client import ( - {{ contract_name.split('_')|map('capitalize')|join }}Factory, - HelloArgs, - ) - - algorand = algokit_utils.AlgorandClient.from_environment() - deployer_ = algorand.account.from_environment("DEPLOYER") - - factory = algorand.client.get_typed_app_factory( - {{ contract_name.split('_')|map('capitalize')|join }}Factory, default_sender=deployer_.addr - ) - - app_client, result = factory.deploy( - on_update=algokit_utils.OnUpdate.AppendApp, - on_schema_break=algokit_utils.OnSchemaBreak.AppendApp, - ) - - if result.operation_performed in [ - algokit_utils.OperationPerformed.Create, - algokit_utils.OperationPerformed.Replace, - ]: - algorand.send.payment( - algokit_utils.PaymentParams( - amount=algokit_utils.AlgoAmount(algo=1), - sender=deployer_.addr, - receiver=app_client.app_address, - ) - ) - - name = "world" - response = app_client.send.hello(args=HelloArgs(name=name)) - logger.info( - f"Called hello on {app_client.app_name} ({app_client.app_id}) " - f"with name={name}, received: {response.abi_return}" - ) diff --git a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/copier.yaml b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/copier.yaml deleted file mode 100644 index afa2cac..0000000 --- a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/copier.yaml +++ /dev/null @@ -1,49 +0,0 @@ -_tasks: - - "echo '==== Successfully generated new .env file 🚀 ===='" - -target_network: - type: str - help: Name of your target network. - choices: - - mainnet - - testnet - - localnet - - custom - default: "localnet" - when: "{{ not use_generic_env }}" - -custom_network_name: - type: str - help: Name of your custom Algorand network. - placeholder: "custom" - when: "{{ not use_generic_env and target_network == 'custom' }}" - -is_localnet: - type: bool - help: Whether to deploy on localnet. - placeholder: "true" - default: "{{ target_network == 'localnet' and not use_generic_env }}" - when: 'false' - -is_testnet: - type: bool - help: Whether to deploy on testnet. - placeholder: "true" - default: "{{ target_network == 'testnet' and not use_generic_env }}" - when: 'false' - -is_mainnet: - type: bool - help: Whether to deploy on mainnet. - placeholder: "true" - default: "{{ target_network == 'mainnet' and not use_generic_env }}" - when: 'false' - -is_customnet: - type: bool - help: Whether to deploy on custom network. - placeholder: "true" - default: "{{ target_network == 'custom' and not use_generic_env }}" - when: 'false' - -_templates_suffix: ".j2" diff --git a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} deleted file mode 100644 index cfc9f21..0000000 --- a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} +++ /dev/null @@ -1,7 +0,0 @@ -# this file contains algorand network settings for interacting with testnet via algonode -ALGOD_TOKEN={YOUR_ALGOD_TOKEN} -ALGOD_SERVER={YOUR_ALGOD_SERVER_URL} -ALGOD_PORT={YOUR_ALGOD_PORT} -INDEXER_TOKEN={YOUR_INDEXER_TOKEN} -INDEXER_SERVER={YOUR_INDEXER_SERVER_URL} -INDEXER_PORT={YOUR_INDEXER_PORT} diff --git a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} deleted file mode 100644 index fcbf442..0000000 --- a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} +++ /dev/null @@ -1,7 +0,0 @@ -# this file should contain environment variables specific to algokit localnet -ALGOD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -ALGOD_SERVER=http://localhost -ALGOD_PORT=4001 -INDEXER_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -INDEXER_SERVER=http://localhost -INDEXER_PORT=8980 diff --git a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} deleted file mode 100644 index bb9a787..0000000 --- a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} +++ /dev/null @@ -1,3 +0,0 @@ -# this file contains algorand network settings for interacting with testnet via algonode -ALGOD_SERVER=https://mainnet-api.algonode.cloud -INDEXER_SERVER=https://mainnet-idx.algonode.cloud diff --git a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} deleted file mode 100644 index eeea43d..0000000 --- a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} +++ /dev/null @@ -1,3 +0,0 @@ -# this file contains algorand network settings for interacting with testnet via algonode -ALGOD_SERVER=https://testnet-api.algonode.cloud -INDEXER_SERVER=https://testnet-idx.algonode.cloud diff --git a/examples/p-py/projects/p-py-contracts/.editorconfig b/examples/p-py/projects/p-py-contracts/.editorconfig deleted file mode 100644 index e2fda34..0000000 --- a/examples/p-py/projects/p-py-contracts/.editorconfig +++ /dev/null @@ -1,10 +0,0 @@ -root=true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -insert_final_newline = true - -[*.py] -indent_size = 4 diff --git a/examples/p-py/projects/p-py-contracts/.gitignore b/examples/p-py/projects/p-py-contracts/.gitignore deleted file mode 100644 index 070829c..0000000 --- a/examples/p-py/projects/p-py-contracts/.gitignore +++ /dev/null @@ -1,180 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ -coverage/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -#pdm.lock -# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it -# in version control. -# https://pdm.fming.dev/#use-with-ide -.pdm.toml - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -.env.* -!.env.*.template -!.env.template -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Ruff (linter) -.ruff_cache/ - -# Cython debug symbols -cython_debug/ - -# PyCharm -.idea -!.idea/ -.idea/* -!.idea/runConfigurations/ - -# macOS -.DS_Store - -# Received approval test files -*.received.* - -# NPM -node_modules - -# AlgoKit -debug_traces/ -.algokit/static-analysis/ # Replace with .algokit/static-analysis/tealer/ to enable snapshot checks in CI -.algokit/sources diff --git a/examples/p-py/projects/p-py-contracts/.tours/getting-started-with-your-algokit-project.tour b/examples/p-py/projects/p-py-contracts/.tours/getting-started-with-your-algokit-project.tour deleted file mode 100644 index 48867d6..0000000 --- a/examples/p-py/projects/p-py-contracts/.tours/getting-started-with-your-algokit-project.tour +++ /dev/null @@ -1,56 +0,0 @@ -{ - "$schema": "https://aka.ms/codetour-schema", - "title": "Getting Started with Your AlgoKit Project", - "steps": [ - { - "file": "README.md", - "description": "Welcome to your brand new AlgoKit template-based project. In this tour, we will guide you through the main features and capabilities included in the template.", - "line": 3 - }, - { - "file": "README.md", - "description": "Start by ensuring you have followed the setup of pre-requisites.", - "line": 9 - }, - { - "file": ".algokit.toml", - "description": "This is the main configuration file used by algokit-cli to manage the project. The default template includes a starter 'Hello World' contract that is deployed via the `algokit-utils` package (either `ts` or `py`, depending on your choice). To create a new smart contract, you can use the [`algokit generate`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md) command and invoke a pre-bundled generator template by running `algokit generate smart-contract` (see how it is defined in the `.algokit.toml`, you can create your own generators if needed). This action will create a new folder in the `smart_contracts` directory, named after your project. Each folder contains a `contract.py` file, which is the entry point for your contract implementation, and `deploy_config.py` | `deployConfig.ts` files (depending on the language chosen for the template), that perform the deployment of the contract. Additionally you can define custom commands to run (similar to `npm` scripts), see definitions under `[project]` section in `.algokit.toml`.", - "line": 1 - }, - { - "file": "smart_contracts/hello_world/deploy_config.py", - "description": "The default deployment scripts invoke a sample method on the starter contract that demonstrates how to interact with your deployed Algorand on-chain applications using the [`AlgoKit Typed Clients`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md#1-typed-clients) feature. The invocation if deploy is aliased in `.algokit.toml` file, allowing simple deployments via `algokit project deploy` command.", - "line": 32 - }, - { - "file": "tests/hello_world_test.py", - "description": "If you opted to include unit tests, the default tests provided demonstrate an example of mocking, setting up fixtures, and testing smart contract calls on an AlgoKit typed client.", - "line": 36 - }, - { - "file": ".env.localnet.template", - "description": "Environment files are a crucial mechanism that allows you to set up the [`algokit deploy`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/deploy.md) feature to simplify deploying your contracts in CI/CD environments (please note we still recommend careful evaluation when it comes to deployment to MainNet). Clone the file and remove the `.template` suffix to apply the changes to deployment scripts and launch configurations. The network prefix `localnet|testnet|mainnet` is primarily optimized for `algokit deploy`. The order of loading the variables is `.env.{network}` < `.env`.", - "line": 2 - }, - { - "file": ".vscode/launch.json", - "description": "Refer to the pre-bundled Visual Studio launch configurations, offering various options on how to execute the build and deployment of your smart contracts. Alternatively execute `algokit project run` to see list of available custom commands.", - "line": 5 - }, - { - "file": ".vscode/extensions.json", - "description": "We highly recommend installing the recommended extensions to get the most out of this template starter project in your VSCode IDE.", - "line": 3 - }, - { - "file": "smart_contracts/__main__.py", - "description": "Uncomment the following lines to enable complementary utilities that will generate artifacts required for the [AlgoKit AVM Debugger](https://github.com/algorandfoundation/algokit-avm-vscode-debugger) VSCode plugin available on the [VSCode Extension Marketplace](https://marketplace.visualstudio.com/items?itemName=algorandfoundation.algokit-avm-vscode-debugger). A new folder will be automatically created in the `.algokit` directory with source maps of all TEAL contracts in this workspace, as well as traces that will appear in a folder at the root of the workspace. You can then use the traces as entry points to trigger the debug extension. Make sure to have the `.algokit.toml` file available at the root of the workspace.", - "line": 15 - }, - { - "file": "smart_contracts/_helpers/__init__.py", - "description": "This folder contains helper scripts for contract management. These automate tasks like compiling, generating clients, and deploying. Usually, you won't need to edit these files, but advanced users can expand them for custom needs.", - "line": 1 - } - ] -} diff --git a/examples/p-py/projects/p-py-contracts/.vscode/extensions.json b/examples/p-py/projects/p-py-contracts/.vscode/extensions.json deleted file mode 100644 index 1d2e7cf..0000000 --- a/examples/p-py/projects/p-py-contracts/.vscode/extensions.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "recommendations": [ - "ms-python.python", - "charliermarsh.ruff", - "matangover.mypy", - "ms-python.black-formatter", - "tamasfe.even-better-toml", - "editorconfig.editorconfig", - "vsls-contrib.codetour", - "algorandfoundation.algokit-avm-vscode-debugger" - ] -} diff --git a/examples/p-py/projects/p-py-contracts/.vscode/launch.json b/examples/p-py/projects/p-py-contracts/.vscode/launch.json deleted file mode 100644 index dbaea6e..0000000 --- a/examples/p-py/projects/p-py-contracts/.vscode/launch.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Build & Deploy contracts", - "type": "python", - "request": "launch", - "module": "smart_contracts", - "cwd": "${workspaceFolder}", - "preLaunchTask": "Start AlgoKit LocalNet", - "env": { - "ALGOD_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "ALGOD_SERVER": "http://localhost", - "ALGOD_PORT": "4001", - "INDEXER_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "INDEXER_SERVER": "http://localhost", - "INDEXER_PORT": "8980" - } - }, - { - "name": "Deploy contracts", - "type": "python", - "request": "launch", - "module": "smart_contracts", - "args": ["deploy"], - "cwd": "${workspaceFolder}", - "env": { - "ALGOD_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "ALGOD_SERVER": "http://localhost", - "ALGOD_PORT": "4001", - "INDEXER_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "INDEXER_SERVER": "http://localhost", - "INDEXER_PORT": "8980" - } - }, - { - "name": "Build contracts", - "type": "python", - "request": "launch", - "module": "smart_contracts", - "args": ["build"], - "cwd": "${workspaceFolder}" - }, - { - "type": "avm", - "request": "launch", - "name": "Debug TEAL via AlgoKit AVM Debugger", - "simulateTraceFile": "${workspaceFolder}/${command:PickSimulateTraceFile}", - "stopOnEntry": true - } - ] -} diff --git a/examples/p-py/projects/p-py-contracts/.vscode/settings.json b/examples/p-py/projects/p-py-contracts/.vscode/settings.json deleted file mode 100644 index 8849569..0000000 --- a/examples/p-py/projects/p-py-contracts/.vscode/settings.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - // General - see also /.editorconfig - "editor.formatOnSave": true, - "files.exclude": { - "**/.git": true, - "**/.DS_Store": true, - "**/Thumbs.db": true, - ".mypy_cache": true, - ".pytest_cache": true, - ".ruff_cache": true, - "**/__pycache__": true, - ".idea": true - }, - - // Python - "python.analysis.autoImportCompletions": true, - "python.analysis.extraPaths": ["${workspaceFolder}/smart_contracts"], - "python.analysis.diagnosticSeverityOverrides": { - "reportMissingModuleSource": "none" - }, - "python.defaultInterpreterPath": "${workspaceFolder}/.venv", - "[python]": { - "editor.codeActionsOnSave": { - "source.fixAll": "explicit", - // Prevent default import sorting from running; Ruff will sort imports for us anyway - "source.organizeImports": "never" - }, - "editor.defaultFormatter": "ms-python.black-formatter", - }, - "black-formatter.args": ["--config=pyproject.toml"], - "python.testing.pytestEnabled": true, - "ruff.enable": true, - "ruff.lint.run": "onSave", - "ruff.lint.args": ["--config=pyproject.toml"], - "ruff.importStrategy": "fromEnvironment", - "ruff.fixAll": true, //lint and fix all files in workspace - "ruff.organizeImports": true, //organize imports on save - "ruff.codeAction.disableRuleComment": { - "enable": true - }, - "ruff.codeAction.fixViolation": { - "enable": true - }, - "python.analysis.typeCheckingMode": "off", - "mypy.configFile": "pyproject.toml", - // set to empty array to use config from project - "mypy.targets": [], - "mypy.runUsingActiveInterpreter": true, - - // On Windows, if execution policy is set to Signed (default) then it won't be able to activate the venv - // so instead let's set it to RemoteSigned for VS Code terminal - "terminal.integrated.shellArgs.windows": ["-ExecutionPolicy", "RemoteSigned"], - "algorandPython.languageServer.enable": true, -} diff --git a/examples/p-py/projects/p-py-contracts/.vscode/tasks.json b/examples/p-py/projects/p-py-contracts/.vscode/tasks.json deleted file mode 100644 index eb1e767..0000000 --- a/examples/p-py/projects/p-py-contracts/.vscode/tasks.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "Build contracts", - "command": "${workspaceFolder}/.venv/bin/python", - "windows": { - "command": "${workspaceFolder}/.venv/Scripts/python.exe" - }, - "args": ["-m", "smart_contracts", "build"], - "options": { - "cwd": "${workspaceFolder}" - }, - "group": { - "kind": "build", - "isDefault": true - }, - "problemMatcher": [] - }, - { - "label": "Build contracts (+ LocalNet)", - "command": "${workspaceFolder}/.venv/bin/python", - "windows": { - "command": "${workspaceFolder}/.venv/Scripts/python.exe" - }, - "args": ["-m", "smart_contracts", "build"], - "options": { - "cwd": "${workspaceFolder}" - }, - "dependsOn": "Start AlgoKit LocalNet", - "problemMatcher": [] - }, - { - "label": "Start AlgoKit LocalNet", - "command": "algokit", - "args": ["localnet", "start"], - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "problemMatcher": [] - }, - { - "label": "Stop AlgoKit LocalNet", - "command": "algokit", - "args": ["localnet", "stop"], - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "problemMatcher": [] - }, - { - "label": "Reset AlgoKit LocalNet", - "command": "algokit", - "args": ["localnet", "reset"], - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "problemMatcher": [] - }, - { - "label": "Analyze TEAL contracts with AlgoKit Tealer integration", - "command": "algokit", - "args": [ - "task", - "analyze", - "${workspaceFolder}/.algokit", - "--recursive", - "--force" - ], - "options": { - "cwd": "${workspaceFolder}" - }, - "problemMatcher": [] - } - ] -} diff --git a/examples/p-py/projects/p-py-contracts/README.md b/examples/p-py/projects/p-py-contracts/README.md deleted file mode 100644 index 484b7d2..0000000 --- a/examples/p-py/projects/p-py-contracts/README.md +++ /dev/null @@ -1,154 +0,0 @@ -# p-py-contracts - -This project has been generated using AlgoKit. See below for default getting started instructions. - -# Setup - -### Pre-requisites - -- [Python 3.12](https://www.python.org/downloads/) or later -- [Docker](https://www.docker.com/) (only required for LocalNet) - -> For interactive tour over the codebase, download [vsls-contrib.codetour](https://marketplace.visualstudio.com/items?itemName=vsls-contrib.codetour) extension for VS Code, then open the [`.codetour.json`](./.tours/getting-started-with-your-algokit-project.tour) file in code tour extension. - -### Initial Setup - -#### 1. Clone the Repository -Start by cloning this repository to your local machine. - -#### 2. Install Pre-requisites -Ensure the following pre-requisites are installed and properly configured: - -- **Docker**: Required for running a local Algorand network. [Install Docker](https://www.docker.com/). -- **AlgoKit CLI**: Essential for project setup and operations. Install the latest version from [AlgoKit CLI Installation Guide](https://github.com/algorandfoundation/algokit-cli#install). Verify installation with `algokit --version`, expecting `2.0.0` or later. - -#### 3. Bootstrap Your Local Environment -Run the following commands within the project folder: - -- **Install Poetry**: Required for Python dependency management. [Installation Guide](https://python-poetry.org/docs/#installation). Verify with `poetry -V` to see version `1.2`+. -- **Setup Project**: Execute `algokit project bootstrap all` to install dependencies and setup a Python virtual environment in `.venv`. -- **Configure environment**: Execute `algokit generate env-file -a target_network localnet` to create a `.env.localnet` file with default configuration for `localnet`. -- **Start LocalNet**: Use `algokit localnet start` to initiate a local Algorand network. - -### Development Workflow - -#### Terminal -Directly manage and interact with your project using AlgoKit commands: - -1. **Build Contracts**: `algokit project run build` compiles all smart contracts. You can also specify a specific contract by passing the name of the contract folder as an extra argument. -For example: `algokit project run build -- hello_world` will only build the `hello_world` contract. -2. **Deploy**: Use `algokit project deploy localnet` to deploy contracts to the local network. You can also specify a specific contract by passing the name of the contract folder as an extra argument. -For example: `algokit project deploy localnet -- hello_world` will only deploy the `hello_world` contract. - -#### VS Code -For a seamless experience with breakpoint debugging and other features: - -1. **Open Project**: In VS Code, open the repository root. -2. **Install Extensions**: Follow prompts to install recommended extensions. -3. **Debugging**: - - Use `F5` to start debugging. - - **Windows Users**: Select the Python interpreter at `./.venv/Scripts/python.exe` via `Ctrl/Cmd + Shift + P` > `Python: Select Interpreter` before the first run. - -#### JetBrains IDEs -While primarily optimized for VS Code, JetBrains IDEs are supported: - -1. **Open Project**: In your JetBrains IDE, open the repository root. -2. **Automatic Setup**: The IDE should configure the Python interpreter and virtual environment. -3. **Debugging**: Use `Shift+F10` or `Ctrl+R` to start debugging. Note: Windows users may encounter issues with pre-launch tasks due to a known bug. See [JetBrains forums](https://youtrack.jetbrains.com/issue/IDEA-277486/Shell-script-configuration-cannot-run-as-before-launch-task) for workarounds. - -## AlgoKit Workspaces and Project Management -This project supports both standalone and monorepo setups through AlgoKit workspaces. Leverage [`algokit project run`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md) commands for efficient monorepo project orchestration and management across multiple projects within a workspace. - -## AlgoKit Generators - -This template provides a set of [algokit generators](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md) that allow you to further modify the project instantiated from the template to fit your needs, as well as giving you a base to build your own extensions to invoke via the `algokit generate` command. - -### Generate Smart Contract - -By default the template creates a single `HelloWorld` contract under hello_world folder in the `smart_contracts` directory. To add a new contract: - -1. From the root of the project (`../`) execute `algokit generate smart-contract`. This will create a new starter smart contract and deployment configuration file under `{your_contract_name}` subfolder in the `smart_contracts` directory. -2. Each contract potentially has different creation parameters and deployment steps. Hence, you need to define your deployment logic in `deploy_config.py`file. -3. `config.py` file will automatically build all contracts in the `smart_contracts` directory. If you want to build specific contracts manually, modify the default code provided by the template in `config.py` file. - -> Please note, above is just a suggested convention tailored for the base configuration and structure of this template. The default code supplied by the template in `config.py` and `index.ts` (if using ts clients) files are tailored for the suggested convention. You are free to modify the structure and naming conventions as you see fit. - -### Generate '.env' files - -By default the template instance does not contain any env files. Using [`algokit project deploy`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/deploy.md) against `localnet` | `testnet` | `mainnet` will use default values for `algod` and `indexer` unless overwritten via `.env` or `.env.{target_network}`. - -To generate a new `.env` or `.env.{target_network}` file, run `algokit generate env-file` - -### Debugging Smart Contracts - -This project is optimized to work with AlgoKit AVM Debugger extension. To activate it: -Refer to the commented header in the `__main__.py` file in the `smart_contracts` folder. - -If you have opted in to include VSCode launch configurations in your project, you can also use the `Debug TEAL via AlgoKit AVM Debugger` launch configuration to interactively select an available trace file and launch the debug session for your smart contract. - -For information on using and setting up the `AlgoKit AVM Debugger` VSCode extension refer [here](https://github.com/algorandfoundation/algokit-avm-vscode-debugger). To install the extension from the VSCode Marketplace, use the following link: [AlgoKit AVM Debugger extension](https://marketplace.visualstudio.com/items?itemName=algorandfoundation.algokit-avm-vscode-debugger).### Continuous Integration / Continuous Deployment (CI/CD) - -This project uses [GitHub Actions](https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions) to define CI/CD workflows, which are located in the [.github/workflows](`../../.github/workflows`) folder. - -> Please note, if you instantiated the project with --workspace flag in `algokit init` it will automatically attempt to move the contents of the `.github` folder to the root of the workspace. - -### AlgoKit Workspaces - -To define custom `algokit project run` commands refer to [documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md). This allows orchestration of commands spanning across multiple projects within an algokit workspace based project (monorepo). - -#### Setting up GitHub for CI/CD workflow and TestNet deployment - - 1. Every time you have a change to your smart contract, and when you first initialize the project you need to [build the contract](#initial-setup) and then commit the `smart_contracts/artifacts` folder so the [output stability](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/articles/output_stability.md) tests pass - 2. Decide what values you want to use for the `allow_update`, `allow_delete` and the `on_schema_break`, `on_update` parameters specified in [`contract.py`](./smart_contracts/hello_world/contract.py). - When deploying to LocalNet these values are both set to allow update and replacement of the app for convenience. But for non-LocalNet networks - the defaults are more conservative. - These default values will allow the smart contract to be deployed initially, but will not allow the app to be updated or deleted if is changed and the build will instead fail. - To help you decide it may be helpful to read the [AlgoKit Utils app deployment documentation](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/docs/capabilities/app-deploy.md) or the [AlgoKit smart contract deployment architecture](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/architecture-decisions/2023-01-12_smart-contract-deployment.md#upgradeable-and-deletable-contracts). - 3. Create a [Github Environment](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#creating-an-environment) named `Test`. - Note: If you have a private repository and don't have GitHub Enterprise then Environments won't work and you'll need to convert the GitHub Action to use a different approach. Ignore this step if you picked `Starter` preset. - 4. Create or obtain a mnemonic for an Algorand account for use on TestNet to deploy apps, referred to as the `DEPLOYER` account. - 5. Store the mnemonic as a [secret](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#environment-secrets) `DEPLOYER_MNEMONIC` - in the Test environment created in step 3. - 6. The account used to deploy the smart contract will require enough funds to create the app, and also fund it. There are two approaches available here: - * Either, ensure the account is funded outside of CI/CD. - In Testnet, funds can be obtained by using the [Algorand TestNet dispenser](https://bank.testnet.algorand.network/) and we recommend provisioning 50 ALGOs. - * Or, fund the account as part of the CI/CD process by using a `DISPENSER_MNEMONIC` GitHub Environment secret to point to a separate `DISPENSER` account that you maintain ALGOs in (similarly, you need to provision ALGOs into this account using the [TestNet dispenser](https://bank.testnet.algorand.network/)). - -#### Continuous Integration - -For pull requests and pushes to `main` branch against this repository the following checks are automatically performed by GitHub Actions: - - Python dependencies are audited using [pip-audit](https://pypi.org/project/pip-audit/) - - Code formatting is checked using [Black](https://github.com/psf/black) - - Linting is checked using [Ruff](https://github.com/charliermarsh/ruff) - - Types are checked using [mypy](https://mypy-lang.org/) -- The base framework for testing is [pytest](https://docs.pytest.org/), and the project includes two separate kinds of tests: -- - `Algorand Python` smart contract unit tests, that are run using [`algorand-python-testing`](https://pypi.org/project/algorand-python-testing/), which are executed in a Python intepreter emulating major AVM behaviour -- - Python `ApplicationClient` tests that are run against `algokit localnet` and test the behaviour in a real network enviornment - - Smart contract artifacts are built - - Smart contract artifacts are checked for [output stability](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/articles/output_stability.md). - - Smart contract is deployed to a AlgoKit LocalNet instance - -> NOTE: By default smart contract artifacts are compiled with `--debug-level` set to 0, to change this, modify the compiler invocation under `smart_contracts/_helpers/build.py` - -#### Continuous Deployment - -For pushes to `main` branch, after the above checks pass, the following deployment actions are performed: - - The smart contract(s) are deployed to TestNet using [AlgoNode](https://algonode.io). - -> Please note deployment is also performed via `algokit deploy` command which can be invoked both via CI as seen on this project, or locally. For more information on how to use `algokit deploy` please see [AlgoKit documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/deploy.md). - -# Tools - -This project makes use of Algorand Python to build Algorand smart contracts. The following tools are in use: - -- [Algorand](https://www.algorand.com/) - Layer 1 Blockchain; [Developer portal](https://dev.algorand.co/), [Why Algorand?](https://dev.algorand.co/getting-started/why-algorand/) -- [AlgoKit](https://github.com/algorandfoundation/algokit-cli) - One-stop shop tool for developers building on the Algorand network; [docs](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/algokit.md), [intro tutorial](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/tutorials/intro.md) -- [Algorand Python](https://github.com/algorandfoundation/puya) - A semantically and syntactically compatible, typed Python language that works with standard Python tooling and allows you to express smart contracts (apps) and smart signatures (logic signatures) for deployment on the Algorand Virtual Machine (AVM); [docs](https://github.com/algorandfoundation/puya), [examples](https://github.com/algorandfoundation/puya/tree/main/examples) -- [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-py) - A set of core Algorand utilities that make it easier to build solutions on Algorand. -- [Poetry](https://python-poetry.org/): Python packaging and dependency management.- [Black](https://github.com/psf/black): A Python code formatter.- [Ruff](https://github.com/charliermarsh/ruff): An extremely fast Python linter. - -- [mypy](https://mypy-lang.org/): Static type checker. -- [pytest](https://docs.pytest.org/): Automated testing. -- [pip-audit](https://pypi.org/project/pip-audit/): Tool for scanning Python environments for packages with known vulnerabilities. -It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. - diff --git a/examples/p-py/projects/p-py-contracts/poetry.toml b/examples/p-py/projects/p-py-contracts/poetry.toml deleted file mode 100644 index 5fcef8c..0000000 --- a/examples/p-py/projects/p-py-contracts/poetry.toml +++ /dev/null @@ -1,3 +0,0 @@ -[virtualenvs] -in-project = true -prefer-active-python = true diff --git a/examples/p-py/projects/p-py-contracts/pyproject.toml b/examples/p-py/projects/p-py-contracts/pyproject.toml deleted file mode 100644 index e8c0604..0000000 --- a/examples/p-py/projects/p-py-contracts/pyproject.toml +++ /dev/null @@ -1,65 +0,0 @@ -[tool.poetry] -name = "p-py-contracts" -version = "0.1.0" -description = "Algorand smart contracts" -authors = ["None "] -readme = "README.md" -package-mode = false - -[tool.poetry.dependencies] -python = "^3.12" -algokit-utils = "^5.0.0a13" -python-dotenv = "^1.0.0" -algorand-python = "^3" -algorand-python-testing = {git = "https://github.com/algorandfoundation/algorand-python-testing.git", branch = "refactor/util-v5"} - -[tool.poetry.group.dev.dependencies] -algokit-client-generator = "^3.0.0a3" -black = {extras = ["d"], version = "*"} -ruff = "^0.9.4" -mypy = "^1" -pytest = "*" -pytest-cov = "*" -pip-audit = "*" -puyapy = "*" - -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" - -[tool.ruff] -line-length = 120 -lint.select = ["E", "F", "ANN", "UP", "N", "C4", "B", "A", "YTT", "W", "FBT", "Q", "RUF", "I"] -lint.unfixable = ["B", "RUF"] - -[tool.ruff.lint.flake8-annotations] -allow-star-arg-any = true -suppress-none-returning = true - -[tool.pytest.ini_options] -pythonpath = ["smart_contracts", "tests"] - -[tool.mypy] -files = "smart_contracts/" -python_version = "3.12" -disallow_any_generics = true -disallow_subclassing_any = true -disallow_untyped_calls = true -disallow_untyped_defs = true -disallow_incomplete_defs = true -check_untyped_defs = true -disallow_untyped_decorators = true -warn_redundant_casts = true -warn_unused_ignores = true -warn_return_any = true -strict_equality = true -extra_checks = true -disallow_any_unimported = true -disallow_any_expr = true -disallow_any_decorated = true -disallow_any_explicit = true -# Remove if you prefer to use mypy's default behavior against -# untyped types -[[tool.mypy.overrides]] -module = "tests.*" -disallow_any_expr = false diff --git a/examples/p-py/projects/p-py-contracts/smart_contracts/__init__.py b/examples/p-py/projects/p-py-contracts/smart_contracts/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/examples/p-py/projects/p-py-contracts/smart_contracts/__main__.py b/examples/p-py/projects/p-py-contracts/smart_contracts/__main__.py deleted file mode 100644 index fa68e36..0000000 --- a/examples/p-py/projects/p-py-contracts/smart_contracts/__main__.py +++ /dev/null @@ -1,217 +0,0 @@ -import dataclasses -import importlib -import logging -import subprocess -import sys -from collections.abc import Callable -from pathlib import Path -from shutil import rmtree - -from algokit_utils.config import config -from dotenv import load_dotenv - -# Set trace_all to True to capture all transactions, defaults to capturing traces only on failure -# Learn more about using AlgoKit AVM Debugger to debug your TEAL source codes and inspect various kinds of -# Algorand transactions in atomic groups -> https://github.com/algorandfoundation/algokit-avm-vscode-debugger -config.configure(debug=True, trace_all=False) - -# Set up logging and load environment variables. -logging.basicConfig( - level=logging.DEBUG, format="%(asctime)s %(levelname)-10s: %(message)s" -) -logger = logging.getLogger(__name__) -logger.info("Loading .env") -load_dotenv() - -# Determine the root path based on this file's location. -root_path = Path(__file__).parent - -# ----------------------- Contract Configuration ----------------------- # - - -@dataclasses.dataclass -class SmartContract: - path: Path - name: str - deploy: Callable[[], None] | None = None - - -def import_contract(folder: Path) -> Path: - """Imports the contract from a folder if it exists.""" - contract_path = folder / "contract.py" - if contract_path.exists(): - return contract_path - else: - raise Exception(f"Contract not found in {folder}") - - -def import_deploy_if_exists(folder: Path) -> Callable[[], None] | None: - """Imports the deploy function from a folder if it exists.""" - try: - module_name = f"{folder.parent.name}.{folder.name}.deploy_config" - deploy_module = importlib.import_module(module_name) - return deploy_module.deploy # type: ignore[no-any-return, misc] - except ImportError: - return None - - -def has_contract_file(directory: Path) -> bool: - """Checks whether the directory contains a contract.py file.""" - return (directory / "contract.py").exists() - - -# Use the current directory (root_path) as the base for contract folders and exclude -# folders that start with '_' (internal helpers). -contracts: list[SmartContract] = [ - SmartContract( - path=import_contract(folder), - name=folder.name, - deploy=import_deploy_if_exists(folder), - ) - for folder in root_path.iterdir() - if folder.is_dir() and has_contract_file(folder) and not folder.name.startswith("_") -] - -# -------------------------- Build Logic -------------------------- # - -deployment_extension = "py" - - -def _get_output_path(output_dir: Path, deployment_extension: str) -> Path: - """Constructs the output path for the generated client file.""" - return output_dir / Path( - "{contract_name}" - + ("_client" if deployment_extension == "py" else "Client") - + f".{deployment_extension}" - ) - - -def build(output_dir: Path, contract_path: Path) -> Path: - """ - Builds the contract by exporting (compiling) its source and generating a client. - If the output directory already exists, it is cleared. - """ - output_dir = output_dir.resolve() - if output_dir.exists(): - rmtree(output_dir) - output_dir.mkdir(exist_ok=True, parents=True) - logger.info(f"Exporting {contract_path} to {output_dir}") - - build_result = subprocess.run( - [ - "algokit", - "--no-color", - "compile", - "python", - str(contract_path.resolve()), - f"--out-dir={output_dir}", - "--output-source-map", - ], - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - text=True, - ) - - if build_result.stdout: - print(build_result.stdout) - - if build_result.returncode: - raise Exception(f"Could not build contract:\n{build_result.stdout}") - - # Look for arc56.json files and generate the client based on them. - app_spec_file_names: list[str] = [ - file.name for file in output_dir.glob("*.arc56.json") - ] - - client_file: str | None = None - if not app_spec_file_names: - logger.warning( - "No '*.arc56.json' file found (likely a logic signature being compiled). Skipping client generation." - ) - else: - for file_name in app_spec_file_names: - client_file = file_name - print(file_name) - generate_result = subprocess.run( - [ - "algokit", - "generate", - "client", - str(output_dir), - "--output", - str(_get_output_path(output_dir, deployment_extension)), - ], - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - text=True, - ) - - if generate_result.stdout: - print(generate_result.stdout) - - if generate_result.returncode: - if "No such command" in generate_result.stdout: - raise Exception( - "Could not generate typed client, requires AlgoKit 2.0.0 or later. Please update AlgoKit" - ) - else: - raise Exception( - f"Could not generate typed client:\n{generate_result.stdout}" - ) - if client_file: - return output_dir / client_file - return output_dir - - -# --------------------------- Main Logic --------------------------- # - - -def main(action: str, contract_name: str | None = None) -> None: - """Main entry point to build and/or deploy smart contracts.""" - artifact_path = root_path / "artifacts" - # Filter contracts based on an optional specific contract name. - filtered_contracts = [ - contract - for contract in contracts - if contract_name is None or contract.name == contract_name - ] - - match action: - case "build": - for contract in filtered_contracts: - logger.info(f"Building app at {contract.path}") - build(artifact_path / contract.name, contract.path) - case "deploy": - for contract in filtered_contracts: - output_dir = artifact_path / contract.name - app_spec_file_name = next( - ( - file.name - for file in output_dir.iterdir() - if file.is_file() and file.suffixes == [".arc56", ".json"] - ), - None, - ) - if app_spec_file_name is None: - raise Exception("Could not deploy app, .arc56.json file not found") - if contract.deploy: - logger.info(f"Deploying app {contract.name}") - contract.deploy() - case "all": - for contract in filtered_contracts: - logger.info(f"Building app at {contract.path}") - build(artifact_path / contract.name, contract.path) - if contract.deploy: - logger.info(f"Deploying {contract.name}") - contract.deploy() - case _: - logger.error(f"Unknown action: {action}") - - -if __name__ == "__main__": - if len(sys.argv) > 2: - main(sys.argv[1], sys.argv[2]) - elif len(sys.argv) > 1: - main(sys.argv[1]) - else: - main("all") diff --git a/examples/p-py/projects/p-py-contracts/smart_contracts/hello_world/contract.py b/examples/p-py/projects/p-py-contracts/smart_contracts/hello_world/contract.py deleted file mode 100644 index 8a8d12b..0000000 --- a/examples/p-py/projects/p-py-contracts/smart_contracts/hello_world/contract.py +++ /dev/null @@ -1,8 +0,0 @@ -from algopy import ARC4Contract, String -from algopy.arc4 import abimethod - - -class HelloWorld(ARC4Contract): - @abimethod() - def hello(self, name: String) -> String: - return "Hello, " + name diff --git a/examples/p-py/projects/p-py-contracts/smart_contracts/hello_world/deploy_config.py b/examples/p-py/projects/p-py-contracts/smart_contracts/hello_world/deploy_config.py deleted file mode 100644 index cf0bb15..0000000 --- a/examples/p-py/projects/p-py-contracts/smart_contracts/hello_world/deploy_config.py +++ /dev/null @@ -1,44 +0,0 @@ -import logging - -import algokit_utils - -logger = logging.getLogger(__name__) - - -# define deployment behaviour based on supplied app spec -def deploy() -> None: - from smart_contracts.artifacts.hello_world.hello_world_client import ( - HelloArgs, - HelloWorldFactory, - ) - - algorand = algokit_utils.AlgorandClient.from_environment() - deployer_ = algorand.account.from_environment("DEPLOYER") - - factory = algorand.client.get_typed_app_factory( - HelloWorldFactory, default_sender=deployer_.addr - ) - - app_client, result = factory.deploy( - on_update=algokit_utils.OnUpdate.AppendApp, - on_schema_break=algokit_utils.OnSchemaBreak.AppendApp, - ) - - if result.operation_performed in [ - algokit_utils.OperationPerformed.Create, - algokit_utils.OperationPerformed.Replace, - ]: - algorand.send.payment( - algokit_utils.PaymentParams( - amount=algokit_utils.AlgoAmount(algo=1), - sender=deployer_.addr, - receiver=app_client.app_address, - ) - ) - - name = "world" - response = app_client.send.hello(args=HelloArgs(name=name)) - logger.info( - f"Called hello on {app_client.app_name} ({app_client.app_id}) " - f"with name={name}, received: {response.abi_return}" - ) diff --git a/examples/p-py/projects/p-py-contracts/tests/__init__.py b/examples/p-py/projects/p-py-contracts/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/examples/p-py/projects/p-py-contracts/tests/conftest.py b/examples/p-py/projects/p-py-contracts/tests/conftest.py deleted file mode 100644 index c15f645..0000000 --- a/examples/p-py/projects/p-py-contracts/tests/conftest.py +++ /dev/null @@ -1,20 +0,0 @@ -import pytest -from algokit_utils import AlgorandClient -from algokit_utils.config import config - -# Uncomment if you want to load network specific or generic .env file -# @pytest.fixture(autouse=True, scope="session") -# def environment_fixture() -> None: -# env_path = Path(__file__).parent.parent / ".env" -# load_dotenv(env_path) - -config.configure( - debug=True, - # trace_all=True, # uncomment to trace all transactions -) - - -@pytest.fixture(scope="session") -def algorand_client() -> AlgorandClient: - # by default we are using localnet algod - return AlgorandClient.from_environment() diff --git a/examples/p-py/projects/p-py-contracts/tests/hello_world_client_test.py b/examples/p-py/projects/p-py-contracts/tests/hello_world_client_test.py deleted file mode 100644 index 1ce278f..0000000 --- a/examples/p-py/projects/p-py-contracts/tests/hello_world_client_test.py +++ /dev/null @@ -1,55 +0,0 @@ -import algokit_utils -import pytest -from algokit_utils import ( - AddressWithSigners, - AlgoAmount, - AlgorandClient, -) - -from smart_contracts.artifacts.hello_world.hello_world_client import ( - HelloWorldClient, - HelloWorldFactory, -) - - -@pytest.fixture() -def deployer(algorand_client: AlgorandClient) -> AddressWithSigners: - account = algorand_client.account.from_environment("DEPLOYER") - algorand_client.account.ensure_funded_from_environment( - account_to_fund=account.addr, min_spending_balance=AlgoAmount.from_algo(10) - ) - return account - - -@pytest.fixture() -def hello_world_client( - algorand_client: AlgorandClient, deployer: AddressWithSigners -) -> HelloWorldClient: - factory = algorand_client.client.get_typed_app_factory( - HelloWorldFactory, default_sender=deployer.addr - ) - - client, _ = factory.deploy( - on_schema_break=algokit_utils.OnSchemaBreak.AppendApp, - on_update=algokit_utils.OnUpdate.AppendApp, - ) - return client - - -def test_says_hello(hello_world_client: HelloWorldClient) -> None: - result = hello_world_client.send.hello(args=("World",)) - assert result.abi_return == "Hello, World" - - -def test_simulate_says_hello_with_correct_budget_consumed( - hello_world_client: HelloWorldClient, -) -> None: - result = ( - hello_world_client.new_group() - .hello(args=("World",)) - .hello(args=("Jane",)) - .simulate() - ) - assert result.returns[0].value == "Hello, World" - assert result.returns[1].value == "Hello, Jane" - assert result.simulate_response.txn_groups[0].app_budget_consumed < 100 diff --git a/examples/p-py/projects/p-py-contracts/tests/hello_world_test.py b/examples/p-py/projects/p-py-contracts/tests/hello_world_test.py deleted file mode 100644 index b2d41ee..0000000 --- a/examples/p-py/projects/p-py-contracts/tests/hello_world_test.py +++ /dev/null @@ -1,24 +0,0 @@ -from collections.abc import Iterator - -import pytest -from algopy_testing import AlgopyTestContext, algopy_testing_context - -from smart_contracts.hello_world.contract import HelloWorld - - -@pytest.fixture() -def context() -> Iterator[AlgopyTestContext]: - with algopy_testing_context() as ctx: - yield ctx - - -def test_hello(context: AlgopyTestContext) -> None: - # Arrange - dummy_input = context.any.string(length=10) - contract = HelloWorld() - - # Act - output = contract.hello(dummy_input) - - # Assert - assert output == f"Hello, {dummy_input}" diff --git a/examples/p-py/projects/p-py-frontend/.algokit.toml b/examples/p-py/projects/p-py-frontend/.algokit.toml deleted file mode 100644 index 22ec37f..0000000 --- a/examples/p-py/projects/p-py-frontend/.algokit.toml +++ /dev/null @@ -1,17 +0,0 @@ -[algokit] -min_version = "v2.0.0" - -[project] -type = "frontend" -name = 'p-py-frontend' -artifacts = "src/contracts" - -[project.run] -build = { commands = ['npm run build'], description = 'Build frontend' } -test = { commands = ['npm run test'], description = 'Run frontend tests' } -lint = { commands = ['npm run lint'], description = 'Lint frontend code' } -ci-deploy-netlify = { commands = [ - 'npm install --global netlify-cli@latest', - 'netlify login', - 'netlify deploy --build --prod' - ], description = 'Deploy to Netlify' } diff --git a/examples/p-py/projects/p-py-frontend/.algokit/.copier-answers.yml b/examples/p-py/projects/p-py-frontend/.algokit/.copier-answers.yml deleted file mode 100644 index 7af32d8..0000000 --- a/examples/p-py/projects/p-py-frontend/.algokit/.copier-answers.yml +++ /dev/null @@ -1,9 +0,0 @@ -# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 1.1.1-13-gc5abe59 -_src_path: gh:algorandfoundation/algokit-react-frontend-template -author_email: None -author_name: None -cloud_provider: netlify -preset_name: production -project_name: p-py-frontend - diff --git a/examples/p-py/projects/p-py-frontend/.editorconfig b/examples/p-py/projects/p-py-frontend/.editorconfig deleted file mode 100644 index a83b72c..0000000 --- a/examples/p-py/projects/p-py-frontend/.editorconfig +++ /dev/null @@ -1,9 +0,0 @@ -[*] -charset = utf-8 -insert_final_newline = true -end_of_line = lf -indent_style = space -indent_size = 2 -tab_width = 2 -max_line_length = 140 -trim_trailing_whitespace = true diff --git a/examples/p-py/projects/p-py-frontend/.env.template b/examples/p-py/projects/p-py-frontend/.env.template deleted file mode 100644 index 5dfbb2d..0000000 --- a/examples/p-py/projects/p-py-frontend/.env.template +++ /dev/null @@ -1,70 +0,0 @@ -# ====================== -# LocalNet configuration -# uncomment below to use -# ====================== - -VITE_ENVIRONMENT=local - -# Algod -VITE_ALGOD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -VITE_ALGOD_SERVER=http://localhost -VITE_ALGOD_PORT=4001 -VITE_ALGOD_NETWORK=localnet - -# Indexer -VITE_INDEXER_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -VITE_INDEXER_SERVER=http://localhost -VITE_INDEXER_PORT=8980 - -# KMD -# Please note: -# 1. This is only needed for LocalNet since -# by default KMD provider is ignored on other networks. -# 2. AlgoKit LocalNet starts with a single wallet called 'unencrypted-default-wallet', -# with heaps of tokens available for testing. -VITE_KMD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -VITE_KMD_SERVER=http://localhost -VITE_KMD_PORT=4002 -VITE_KMD_WALLET="unencrypted-default-wallet" -VITE_KMD_PASSWORD="" - -# # ====================== -# # TestNet configuration: -# # uncomment below to use -# # ====================== - -# VITE_ENVIRONMENT=local - -# # Algod -# VITE_ALGOD_TOKEN="" -# VITE_ALGOD_SERVER="https://testnet-api.algonode.cloud" -# VITE_ALGOD_PORT="" -# VITE_ALGOD_NETWORK="testnet" - -# # Indexer -# VITE_INDEXER_TOKEN="" -# VITE_INDEXER_SERVER="https://testnet-idx.algonode.cloud" -# VITE_INDEXER_PORT="" - - -# # ====================== -# # MainNet configuration: -# # uncomment below to use -# # ====================== - -# VITE_ENVIRONMENT=production - -# # Algod -# VITE_ALGOD_TOKEN="" -# VITE_ALGOD_SERVER="https://mainnet-api.algonode.cloud" -# VITE_ALGOD_PORT="" -# VITE_ALGOD_NETWORK="mainnet" - -# # Indexer -# VITE_INDEXER_TOKEN="" -# VITE_INDEXER_SERVER="https://mainnet-idx.algonode.cloud" -# VITE_INDEXER_PORT="" - - -# Add your Web3Auth Client ID here if you want to test Web3Auth integration on TestNet or Mainnet -# VITE_WEB3_AUTH_CLIENT_ID="" \ No newline at end of file diff --git a/examples/p-py/projects/p-py-frontend/.eslintrc b/examples/p-py/projects/p-py-frontend/.eslintrc deleted file mode 100644 index 868fe37..0000000 --- a/examples/p-py/projects/p-py-frontend/.eslintrc +++ /dev/null @@ -1,27 +0,0 @@ -{ - "root": true, - "env": { - "node": true - }, - "parser": "@typescript-eslint/parser", - "plugins": ["@typescript-eslint", "prettier"], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "plugin:prettier/recommended" - ], - "rules": { - "prettier/prettier": "warn", - "no-console": "warn", - "@typescript-eslint/no-unused-vars": [ - "warn", - { - "ignoreRestSiblings": true, - "argsIgnorePattern": "^_", - "destructuredArrayIgnorePattern": "^_" - } - ], - "prefer-template": "error" - } -} diff --git a/examples/p-py/projects/p-py-frontend/.gitignore b/examples/p-py/projects/p-py-frontend/.gitignore deleted file mode 100644 index b1ce837..0000000 --- a/examples/p-py/projects/p-py-frontend/.gitignore +++ /dev/null @@ -1,38 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/build - - -# dotenv environment variable files -.env -env/ - -# misc -/dist -.DS_Store - - -npm-debug.log* -yarn-debug.log* -yarn-error.log* -/test-results/ -/playwright-report/ -/playwright/.cache/ - -# PyCharm -.idea -!.idea/ -.idea/* -!.idea/runConfigurations/ - -.vercel -.netlify diff --git a/examples/p-py/projects/p-py-frontend/.npmrc b/examples/p-py/projects/p-py-frontend/.npmrc deleted file mode 100644 index c42da84..0000000 --- a/examples/p-py/projects/p-py-frontend/.npmrc +++ /dev/null @@ -1 +0,0 @@ -engine-strict = true diff --git a/examples/p-py/projects/p-py-frontend/.prettierignore b/examples/p-py/projects/p-py-frontend/.prettierignore deleted file mode 100644 index dbda6ae..0000000 --- a/examples/p-py/projects/p-py-frontend/.prettierignore +++ /dev/null @@ -1,12 +0,0 @@ -# don't ever format node_modules -node_modules -# don't lint format output (make sure it's set to your correct build folder name) -dist -build -# don't format nyc coverage output -coverage -# don't format generated types -**/generated/types.d.ts -**/generated/types.ts -# don't format ide files -.idea diff --git a/examples/p-py/projects/p-py-frontend/.prettierrc.cjs b/examples/p-py/projects/p-py-frontend/.prettierrc.cjs deleted file mode 100644 index 066b8e5..0000000 --- a/examples/p-py/projects/p-py-frontend/.prettierrc.cjs +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - singleQuote: true, - jsxSingleQuote: false, - semi: false, - tabWidth: 2, - trailingComma: 'all', - printWidth: 140, - endOfLine: 'lf', - arrowParens: 'always', -} diff --git a/examples/p-py/projects/p-py-frontend/.vscode/extensions.json b/examples/p-py/projects/p-py-frontend/.vscode/extensions.json deleted file mode 100644 index 5c94122..0000000 --- a/examples/p-py/projects/p-py-frontend/.vscode/extensions.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "recommendations": [ - "EditorConfig.EditorConfig", - "dotenv.dotenv-vscode", - "esbenp.prettier-vscode", - "dbaeumer.vscode-eslint", - "krysenlo.vite-plugin-eslint-problemmatcher", - "ms-playwright.playwright", - "Orta.vscode-jest", - "bradlc.vscode-tailwindcss", - "csstools.postcss", - ] -} - diff --git a/examples/p-py/projects/p-py-frontend/.vscode/launch.json b/examples/p-py/projects/p-py-frontend/.vscode/launch.json deleted file mode 100644 index 7edaf04..0000000 --- a/examples/p-py/projects/p-py-frontend/.vscode/launch.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "configurations": [ - { - "type": "msedge", - "request": "launch", - "name": "Run (Edge)", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - "presentation": { - "hidden": false, - "group": "2. Web" - } - }, - { - "type": "chrome", - "request": "launch", - "name": "Run (Chrome)", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - "presentation": { - "hidden": false, - "group": "2. Web" - } - }, - { - "type": "firefox", - "request": "launch", - "name": "Run (Firefox)", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - "presentation": { - "hidden": false, - "group": "2. Web" - } - }, - { - "name": "Run dApp", - "type": "node", - "request": "launch", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "dev"], - "cwd": "${workspaceRoot}", - "console": "integratedTerminal", - "skipFiles": ["/**", "node_modules/**"], - "presentation": { - "hidden": false, - "group": "1. Run Project", - "order": 1 - } - }, - { - "name": "Run dApp (+ LocalNet)", - "type": "node", - "request": "launch", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "dev"], - "cwd": "${workspaceRoot}", - "console": "integratedTerminal", - "skipFiles": ["/**", "node_modules/**"], - "preLaunchTask": "Start AlgoKit LocalNet", - "presentation": { - "hidden": false, - "group": "1. Run Project", - "order": 1 - } - } - ] -} diff --git a/examples/p-py/projects/p-py-frontend/.vscode/settings.json b/examples/p-py/projects/p-py-frontend/.vscode/settings.json deleted file mode 100644 index f1d7017..0000000 --- a/examples/p-py/projects/p-py-frontend/.vscode/settings.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "editor.formatOnSave": true, - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit", - "source.organizeImports": "explicit" - }, - "dotenv.enableAutocloaking": false, - "jest.autoRun": { - "watch": false, - "onSave": "test-file" - } -} diff --git a/examples/p-py/projects/p-py-frontend/.vscode/tasks.json b/examples/p-py/projects/p-py-frontend/.vscode/tasks.json deleted file mode 100644 index d611c4f..0000000 --- a/examples/p-py/projects/p-py-frontend/.vscode/tasks.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "Start AlgoKit LocalNet", - "command": "algokit", - "args": ["localnet", "start"], - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "problemMatcher": [] - } - ] -} diff --git a/examples/p-py/projects/p-py-frontend/README.md b/examples/p-py/projects/p-py-frontend/README.md deleted file mode 100644 index 223078a..0000000 --- a/examples/p-py/projects/p-py-frontend/README.md +++ /dev/null @@ -1,124 +0,0 @@ -# p-py-frontend - -This starter React project has been generated using AlgoKit. See below for default getting started instructions. - -# Setup - -### Initial Setup - -#### 1. Clone the Repository -Start by cloning this repository to your local machine. - -#### 2. Install Pre-requisites -Ensure the following pre-requisites are installed and properly configured: - -- **npm**: Node package manager. Install from [Node.js Installation Guide](https://nodejs.org/en/download/). Verify with `npm -v` to see version `18.12`+. -- **AlgoKit CLI**: Essential for project setup and operations. Install the latest version from [AlgoKit CLI Installation Guide](https://github.com/algorandfoundation/algokit-cli#install). Verify installation with `algokit --version`, expecting `2.0.0` or later. - -#### 3. Bootstrap Your Local Environment -Run the following commands within the project folder: - -- **Install Project Dependencies**: With `algokit project bootstrap all`, ensure all dependencies are ready. - -### Development Workflow - -#### Terminal -Directly manage and interact with your project using AlgoKit commands: - -1. **Build Contracts**: `algokit project run build` builds react web app and links with smart contracts in workspace, if any. -2. Remaining set of command for linting, testing and deployment can be found in respective [package.json](./package.json) file and [.algokit.toml](./.algokit.toml) files. - -#### VS Code -For a seamless experience with breakpoint debugging and other features: - -1. **Open Project**: In VS Code, open the repository root. -2. **Install Extensions**: Follow prompts to install recommended extensions. -3. **Debugging**: - - Use `F5` to start debugging. - - **Windows Users**: Select the Python interpreter at `./.venv/Scripts/python.exe` via `Ctrl/Cmd + Shift + P` > `Python: Select Interpreter` before the first run. - -#### Other IDEs -While primarily optimized for VS Code, Jetbrains WebStorm has base support for this project: - -1. **Open Project**: In your JetBrains IDE, open the repository root. -2. **Automatic Setup**: The IDE should configure the Python interpreter and virtual environment. -3. **Debugging**: Use `Shift+F10` or `Ctrl+R` to start debugging. Note: Windows users may encounter issues with pre-launch tasks due to a known bug. See [JetBrains forums](https://youtrack.jetbrains.com/issue/IDEA-277486/Shell-script-configuration-cannot-run-as-before-launch-task) for workarounds. - -## AlgoKit Workspaces and Project Management -This project supports both standalone and monorepo setups through AlgoKit workspaces. Leverage [`algokit project run`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md) commands for efficient monorepo project orchestration and management across multiple projects within a workspace. - -> Please note, by default frontend is pre configured to run against Algorand LocalNet. If you want to run against TestNet or MainNet, comment out the current environment variable and uncomment the relevant one in [`.env`](.env) file that is created after running bootstrap command and based on [`.env.template`](.env.template). - -### Continuous Integration - -This project uses [GitHub Actions](https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions) to define CI workflows, which are located in the [.github/workflows](`../../.github/workflows`) folder. - -For pull requests and pushes to `main` branch against this repository the following checks are automatically performed by GitHub Actions: - -- `install`: Installs dependencies using `npm` -- `lint`: Lints the codebase using `ESLint` -- `build`: Builds the codebase using `vite` - -> Please note, if you instantiated the project via `algokit init` without explicitly specifying the `--no-workspace` flag, we will automatically attempt to move the contents of the `.github` folder to the root of the workspace. - -### Continuous Deployment - -The project template provides base Github Actions workflows for continuous deployment to [Netlify](https://www.netlify.com/) or [Vercel](https://vercel.com/). These workflows are located in the [`.github/workflows`](./.github/workflows) folder. - -**Please note**: when configuring the github repository for the first time. Depending on selected provider you will need to set the provider secrets in the repository settings. Default setup provided by the template allows you to manage the secrets via environment variables and secrets on your github repository. - - -#### Setting up environment variables and secrets for webapp deployment - -For Vercel: -1. Retrieve your [Vercel Access Token](https://vercel.com/support/articles/how-do-i-use-a-vercel-api-access-token) -2. Install the [Vercel CLI](https://vercel.com/cli) and run `vercel login` -3. Inside your folder, run `vercel link` to create a new Vercel project -4. Inside the generated `.vercel` folder, save the `projectId` and `orgId` from the `project.json` -5. Inside GitHub, add `VERCEL_TOKEN`, `VERCEL_ORG_ID`, and `VERCEL_PROJECT_ID` as [secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets). -6. Create an .env file containing ENV vars for the project (pointing to testnet or mainnet), drag and drop the .env file to upload initial batch of default environment variables to your vercel project. -7. Upon invocation, CD pipeline will pull the VITE_ prefixed environment variables, build the project and deploy to the specified environment. - -For Netlify: -1. Retrieve your [Netlify Access Token](https://docs.netlify.com/cli/get-started/#obtain-a-token-in-the-netlify-ui) -2. Inside your folder run `netlify login` -3. Inside your folder run `netlify sites:create` to create a new site, obtain NETLIFY_SITE_ID from the output -4. Inside GitHub, add `NETLIFY_AUTH_TOKEN` and `NETLIFY_SITE_ID` as [secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets). -5. Define the VITE_ prefixed environment variables in netlify environment variables under site settings. -6. Upon invocation, CD pipeline will build the project and deploy to the specified environment. - -> If you prefer alternative deployment methods, you can modify the relevant workflow files from the [`.github/workflows`](./.github/workflows) folder or modify deploy scripts in `.algokit.toml`. - - -# Algorand Wallet integrations - -The template comes with [`use-wallet`](https://github.com/txnlab/use-wallet) integration, which provides a React hook for connecting to an Algorand wallet providers. The following wallet providers are included by default: -- LocalNet: -- - [KMD/Local Wallet](https://github.com/TxnLab/use-wallet#kmd-algorand-key-management-daemon) - Algorand's Key Management Daemon (KMD) is a service that manages Algorand private keys and signs transactions. Works best with AlgoKit LocalNet and allows you to easily test and interact with your dApps locally. -- TestNet and others: -- - [Pera Wallet](https://perawallet.app). -- - [Defly Wallet](https://defly.app). -- - [Exodus Wallet](https://www.exodus.com). -- - [Daffi Wallet](https://www.daffi.me). - -Refer to official [`use-wallet`](https://github.com/txnlab/use-wallet) documentation for detailed guidelines on how to integrate with other wallet providers (such as WalletConnect v2). Too see implementation details on the use wallet hook and initialization of extra wallet providers refer to [`App.tsx`](./src/App.tsx). - -# Tools - -This project makes use of React and Tailwind to provider a base project configuration to develop frontends for your Algorand dApps and interactions with smart contracts. The following tools are in use: - -- [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-ts) - Various TypeScript utilities to simplify interactions with Algorand and AlgoKit. -- [React](https://reactjs.org/) - A JavaScript library for building user interfaces. -- [Tailwind CSS](https://tailwindcss.com/) - A utility-first CSS framework for rapidly building custom designs. -- [daisyUI](https://daisyui.com/) - A component library for Tailwind CSS. -- [use-wallet](https://github.com/txnlab/use-wallet) - A React hook for connecting to an Algorand wallet providers. -- [npm](https://www.npmjs.com/): Node.js package manager -- [jest](https://jestjs.io/): JavaScript testing framework -- [playwright](https://playwright.dev/): Browser automation library -- [Prettier](https://prettier.io/): Opinionated code formatter -- [ESLint](https://eslint.org/): Tool for identifying and reporting on patterns in JavaScript -- Github Actions workflows for build validation -It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. -# Integrating with smart contracts and application clients - -Refer to the detailed guidance on [integrating with smart contracts and application clients](./src/contracts/README.md). In essence, for any smart contract codebase generated with AlgoKit or other tools that produce compile contracts into ARC34 compliant app specifications, you can use the `algokit generate` command to generate TypeScript or Python typed client. Once generated simply drag and drop the generated client into `./src/contracts` and import it into your React components as you see fit. diff --git a/examples/p-py/projects/p-py-frontend/index.html b/examples/p-py/projects/p-py-frontend/index.html deleted file mode 100644 index 5a2ef4f..0000000 --- a/examples/p-py/projects/p-py-frontend/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - AlgoKit React Template - - -
- - - diff --git a/examples/p-py/projects/p-py-frontend/jest.config.ts b/examples/p-py/projects/p-py-frontend/jest.config.ts deleted file mode 100644 index 28a8c3d..0000000 --- a/examples/p-py/projects/p-py-frontend/jest.config.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { Config } from '@jest/types' - -const config: Config.InitialOptions = { - preset: 'ts-jest', - testEnvironment: 'node', - testMatch: ['**/*.spec.ts', '**/*.spec.tsx'], - moduleDirectories: ['node_modules', 'src'], - transform: { - '': [ - 'ts-jest', - { - tsconfig: 'tsconfig.test.json', - }, - ], - }, - coveragePathIgnorePatterns: ['tests'], - testPathIgnorePatterns: ['/tests/'], - } - -export default config diff --git a/examples/p-py/projects/p-py-frontend/package.json b/examples/p-py/projects/p-py-frontend/package.json deleted file mode 100644 index 1704502..0000000 --- a/examples/p-py/projects/p-py-frontend/package.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "name": "p-py-frontend", - "version": "0.1.0", - "author": { - "name": "None", - "email": "None" - }, - "private": true, - "type": "module", - "engines": { - "node": ">=20.0", - "npm": ">=9.0" - }, - "devDependencies": { - "@algorandfoundation/algokit-client-generator": "^7.0.0-alpha.5", - "@types/node": "^18.17.14", - "@types/react": "^18.2.11", - "@types/react-dom": "^18.2.4", - "@vitejs/plugin-react": "^4.2.1", - "autoprefixer": "^10.4.14", - "eslint": "^8.56.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.1.3", - "@typescript-eslint/eslint-plugin": "^7.0.2", - "@typescript-eslint/parser": "^7.0.2", - "postcss": "^8.4.24", - "tailwindcss": "3.3.2", - "ts-jest": "^29.1.1", - "@types/jest": "29.5.2", - "ts-node": "^10.9.1", - "typescript": "^5.1.6", - "@playwright/test": "^1.35.0", - "playwright": "^1.35.0", - "vite": "^5.0.0", - "vite-plugin-node-polyfills": "^0.22.0" - }, - "dependencies": { - "@algorandfoundation/algokit-utils": "^10.0.0-alpha.40", - "@blockshake/defly-connect": "^1.2.1", - "@perawallet/connect": "^1.4.1", - "@txnlab/use-wallet": "^4.6.0", - "@txnlab/use-wallet-react": "^4.6.0", - "@web3auth/modal": "^9.7.0", - "daisyui": "^4.0.0", - "notistack": "^3.0.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "tslib": "^2.6.2" - }, - "scripts": { - "generate:app-clients": "algokit project link --all", - "dev": "npm run generate:app-clients && vite", - "build": "npm run generate:app-clients && tsc && vite build", - "test": "jest --coverage --passWithNoTests", - "playwright:test": "playwright test", - "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "lint:fix": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0 --fix", - "preview": "vite preview" - }, - "eslintConfig": { - "extends": [ - "react-app/jest", - "react-app" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "overrides": { - "ws@>7.0.0 <7.5.9": "7.5.10" - } -} diff --git a/examples/p-py/projects/p-py-frontend/playwright.config.ts b/examples/p-py/projects/p-py-frontend/playwright.config.ts deleted file mode 100644 index d7cbca6..0000000 --- a/examples/p-py/projects/p-py-frontend/playwright.config.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { defineConfig, devices } from '@playwright/test' - -/** - * Read environment variables from file. - * https://github.com/motdotla/dotenv - */ -// require('dotenv').config(); - -/** - * See https://playwright.dev/docs/test-configuration. - */ -export default defineConfig({ - testDir: './tests', - /* Run tests in files in parallel */ - fullyParallel: true, - /* Fail the build on CI if you accidentally left test.only in the source code. */ - forbidOnly: !!process.env.CI, - /* Retry on CI only */ - retries: process.env.CI ? 2 : 0, - /* Opt out of parallel tests on CI. */ - workers: process.env.CI ? 1 : undefined, - /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: 'html', - /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ - use: { - /* Base URL to use in actions like `await page.goto('/')`. */ - // baseURL: 'http://127.0.0.1:3000', - - /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ - trace: 'on-first-retry', - testIdAttribute: 'data-test-id', - }, - - /* Configure projects for major browsers */ - projects: [ - { - name: 'chromium', - use: { ...devices['Desktop Chrome'] }, - }, - - { - name: 'firefox', - use: { ...devices['Desktop Firefox'] }, - }, - - /* Test against mobile viewports. */ - // { - // name: 'Mobile Chrome', - // use: { ...devices['Pixel 5'] }, - // }, - // { - // name: 'Mobile Safari', - // use: { ...devices['iPhone 12'] }, - // }, - - /* Test against branded browsers. */ - // { - // name: 'Microsoft Edge', - // use: { ...devices['Desktop Edge'], channel: 'msedge' }, - // }, - // { - // name: 'Google Chrome', - // use: { ..devices['Desktop Chrome'], channel: 'chrome' }, - // }, - ], - - /* Run your local dev server before starting the tests */ - webServer: { - command: 'npm run dev', - url: 'http://localhost:5173', - reuseExistingServer: !process.env.CI, - }, -}) diff --git a/examples/p-py/projects/p-py-frontend/postcss.config.cjs b/examples/p-py/projects/p-py-frontend/postcss.config.cjs deleted file mode 100644 index 33ad091..0000000 --- a/examples/p-py/projects/p-py-frontend/postcss.config.cjs +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -} diff --git a/examples/p-py/projects/p-py-frontend/public/index.html b/examples/p-py/projects/p-py-frontend/public/index.html deleted file mode 100644 index 0d3a3a5..0000000 --- a/examples/p-py/projects/p-py-frontend/public/index.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - React App - - - -
- - - diff --git a/examples/p-py/projects/p-py-frontend/public/robots.txt b/examples/p-py/projects/p-py-frontend/public/robots.txt deleted file mode 100644 index e9e57dc..0000000 --- a/examples/p-py/projects/p-py-frontend/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * -Disallow: diff --git a/examples/p-py/projects/p-py-frontend/src/App.tsx b/examples/p-py/projects/p-py-frontend/src/App.tsx deleted file mode 100644 index f346006..0000000 --- a/examples/p-py/projects/p-py-frontend/src/App.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { SupportedWallet, WalletId, WalletManager, WalletProvider } from '@txnlab/use-wallet-react' -import { SnackbarProvider } from 'notistack' -import Home from './Home' -import { getAlgodConfigFromViteEnvironment, getKmdConfigFromViteEnvironment } from './utils/network/getAlgoClientConfigs' - -let supportedWallets: SupportedWallet[] -if (import.meta.env.VITE_ALGOD_NETWORK === 'localnet') { - const kmdConfig = getKmdConfigFromViteEnvironment() - supportedWallets = [ - { - id: WalletId.KMD, - options: { - baseServer: kmdConfig.server, - token: String(kmdConfig.token), - port: String(kmdConfig.port), - }, - }, - ] -} else { - supportedWallets = [ - { id: WalletId.DEFLY }, - { id: WalletId.PERA }, - { id: WalletId.EXODUS }, - // If you are interested in WalletConnect v2 provider - // refer to https://github.com/TxnLab/use-wallet for detailed integration instructions - ] -} - -export default function App() { - const algodConfig = getAlgodConfigFromViteEnvironment() - - const walletManager = new WalletManager({ - wallets: supportedWallets, - defaultNetwork: algodConfig.network, - networks: { - [algodConfig.network]: { - algod: { - baseServer: algodConfig.server, - port: algodConfig.port, - token: String(algodConfig.token), - }, - }, - }, - options: { - resetNetwork: true, - }, - }) - - return ( - - - - - - ) -} diff --git a/examples/p-py/projects/p-py-frontend/src/assets/logo.svg b/examples/p-py/projects/p-py-frontend/src/assets/logo.svg deleted file mode 100644 index 7169476..0000000 --- a/examples/p-py/projects/p-py-frontend/src/assets/logo.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/examples/p-py/projects/p-py-frontend/src/components/Account.tsx b/examples/p-py/projects/p-py-frontend/src/components/Account.tsx deleted file mode 100644 index 081ce47..0000000 --- a/examples/p-py/projects/p-py-frontend/src/components/Account.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { useWallet } from '@txnlab/use-wallet-react' -import { useMemo } from 'react' -import { ellipseAddress } from '../utils/ellipseAddress' -import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' - -const Account = () => { - const { activeAddress } = useWallet() - const algoConfig = getAlgodConfigFromViteEnvironment() - - const networkName = useMemo(() => { - return algoConfig.network === '' ? 'localnet' : algoConfig.network.toLocaleLowerCase() - }, [algoConfig.network]) - - return ( -
- ) -} - -export default Account diff --git a/examples/p-py/projects/p-py-frontend/src/components/ConnectWallet.tsx b/examples/p-py/projects/p-py-frontend/src/components/ConnectWallet.tsx deleted file mode 100644 index 8ff01dc..0000000 --- a/examples/p-py/projects/p-py-frontend/src/components/ConnectWallet.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import { useWallet, Wallet, WalletId } from '@txnlab/use-wallet-react' -import Account from './Account' - -interface ConnectWalletInterface { - openModal: boolean - closeModal: () => void -} - -const ConnectWallet = ({ openModal, closeModal }: ConnectWalletInterface) => { - const { wallets, activeAddress } = useWallet() - - const isKmd = (wallet: Wallet) => wallet.id === WalletId.KMD - - return ( - -
-

Select wallet provider

- -
- {activeAddress && ( - <> - -
- - )} - - {!activeAddress && - wallets?.map((wallet) => ( - - ))} -
- -
- - {activeAddress && ( - - )} -
- -
- ) -} -export default ConnectWallet diff --git a/examples/p-py/projects/p-py-frontend/src/components/ErrorBoundary.tsx b/examples/p-py/projects/p-py-frontend/src/components/ErrorBoundary.tsx deleted file mode 100644 index 435bf61..0000000 --- a/examples/p-py/projects/p-py-frontend/src/components/ErrorBoundary.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import React, { ReactNode } from 'react' - -interface ErrorBoundaryProps { - children: ReactNode -} - -interface ErrorBoundaryState { - hasError: boolean - error: Error | null -} - -class ErrorBoundary extends React.Component { - constructor(props: ErrorBoundaryProps) { - super(props) - this.state = { hasError: false, error: null } - } - - static getDerivedStateFromError(error: Error): ErrorBoundaryState { - // Update state so the next render will show the fallback UI. - return { hasError: true, error: error } - } - - render(): ReactNode { - if (this.state.hasError) { - // You can render any custom fallback UI - return ( -
-
-
-

Error occured

-

- {this.state.error?.message.includes('Attempt to get default algod configuration') - ? 'Please make sure to set up your environment variables correctly. Create a .env file based on .env.template and fill in the required values. This controls the network and credentials for connections with Algod and Indexer.' - : this.state.error?.message} -

-
-
-
- ) - } - - return this.props.children - } -} - -export default ErrorBoundary diff --git a/examples/p-py/projects/p-py-frontend/src/components/Transact.tsx b/examples/p-py/projects/p-py-frontend/src/components/Transact.tsx deleted file mode 100644 index 3f8191d..0000000 --- a/examples/p-py/projects/p-py-frontend/src/components/Transact.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { algo, AlgorandClient } from '@algorandfoundation/algokit-utils' -import { encodeTransactionRaw } from '@algorandfoundation/algokit-utils/transact' -import { useWallet } from '@txnlab/use-wallet-react' -import { useSnackbar } from 'notistack' -import { useState } from 'react' -import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' - -interface TransactInterface { - openModal: boolean - setModalState: (value: boolean) => void -} - -const Transact = ({ openModal, setModalState }: TransactInterface) => { - const [loading, setLoading] = useState(false) - const [receiverAddress, setReceiverAddress] = useState('') - - const algodConfig = getAlgodConfigFromViteEnvironment() - const algorand = AlgorandClient.fromConfig({ algodConfig }) - - const { enqueueSnackbar } = useSnackbar() - - const { signTransactions, activeAddress } = useWallet() - - const handleSubmitAlgo = async () => { - setLoading(true) - - if (!signTransactions || !activeAddress) { - enqueueSnackbar('Please connect wallet first', { variant: 'warning' }) - return - } - - try { - enqueueSnackbar('Sending transaction...', { variant: 'info' }) - const result = await algorand.send.payment({ - signer: async (txnGroup, indexesToSign) => { - const encoded = txnGroup.map((txn) => encodeTransactionRaw(txn)) - const signed = await signTransactions(encoded, indexesToSign) - return signed.filter((s): s is Uint8Array => s !== null) - }, - sender: activeAddress, - receiver: receiverAddress, - amount: algo(1), - }) - enqueueSnackbar(`Transaction sent: ${result.txIds[0]}`, { variant: 'success' }) - setReceiverAddress('') - } catch (e) { - enqueueSnackbar('Failed to send transaction', { variant: 'error' }) - } - - setLoading(false) - } - - return ( - -
-

Send payment transaction

-
- { - setReceiverAddress(e.target.value) - }} - /> -
- - -
-
-
- ) -} - -export default Transact diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/AppCall.ts b/examples/p-py/projects/p-py-frontend/src/contracts/AppCall.ts deleted file mode 100644 index c61e144..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/AppCall.ts +++ /dev/null @@ -1,558 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"AppCall","structs":{},"methods":[{"name":"some_value","args":[],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NAogICAgLy8gY2xhc3MgQXBwQ2FsbChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANQogICAgcHVzaGJ5dGVzIDB4ZDM0NzllNjUgLy8gbWV0aG9kICJzb21lX3ZhbHVlKCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3NvbWVfdmFsdWVfcm91dGVAMwogICAgZXJyCgptYWluX3NvbWVfdmFsdWVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIHNvbWVfdmFsdWUKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyZWF0ZWRBcHBBc3NldC5vdGhlci5BcHBDYWxsLnNvbWVfdmFsdWVbcm91dGluZ10oKSAtPiB2b2lkOgpzb21lX3ZhbHVlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9vdGhlci5weTo3CiAgICAvLyByZXR1cm4gR2xvYmFsLmdyb3VwX3NpemUgKiAoVHhuLmdyb3VwX2luZGV4ICsgMSkKICAgIGdsb2JhbCBHcm91cFNpemUKICAgIHR4biBHcm91cEluZGV4CiAgICBwdXNoaW50IDEKICAgICsKICAgICoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcHVzaGludCAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgATTR55lNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEMyBDEWgQEICxaABBUffHVMULCBAUM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the AppCall contract - */ -export type AppCallArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'some_value()uint64': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'some_value()uint64': [] - } -} - -/** - * The return type for each method - */ -export type AppCallReturns = { - 'some_value()uint64': bigint -} - -/** - * Defines the types of available calls and state of the AppCall smart contract. - */ -export type AppCallTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'some_value()uint64' | 'some_value', { - argsObj: AppCallArgs['obj']['some_value()uint64'] - argsTuple: AppCallArgs['tuple']['some_value()uint64'] - returns: AppCallReturns['some_value()uint64'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type AppCallSignatures = keyof AppCallTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type AppCallNonVoidMethodSignatures = keyof AppCallTypes['methods'] extends infer T ? T extends keyof AppCallTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the AppCall smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = AppCallTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the AppCall smart contract to the method's return type - */ -export type MethodReturn = AppCallTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type AppCallCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type AppCallDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: AppCallCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the AppCall smart contract - */ -export abstract class AppCallParamsFactory { - /** - * Constructs a no op call for the some_value()uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static someValue(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'some_value()uint64' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } -} - -/** - * A factory to create and deploy one or more instance of the AppCall smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class AppCallFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `AppCallFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new AppCallClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new AppCallClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the AppCall smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: AppCallDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new AppCallClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the AppCall smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the AppCall smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the AppCall smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new AppCallClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the AppCall smart contract - */ -export class AppCallClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `AppCallClient` - * - * @param appClient An `AppClient` instance which has been created with the AppCall app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `AppCallClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `AppCallClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new AppCallClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `AppCallClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new AppCallClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the AppCall smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the AppCall smart contract using the `some_value()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - someValue: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(AppCallParamsFactory.someValue(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the AppCall smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the AppCall smart contract using the `some_value()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - someValue: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(AppCallParamsFactory.someValue(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the AppCall smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the AppCall smart contract using the `some_value()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - someValue: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(AppCallParamsFactory.someValue(params)) - return {...result, return: result.return as unknown as (undefined | AppCallReturns['some_value()uint64'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new AppCallClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current AppCall app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): AppCallComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a some_value()uint64 method call against the AppCall contract - */ - someValue(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.someValue(params))) - return this - }, - /** - * Add a clear state call to the AppCall contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as AppCallComposer - } -} -export type AppCallComposer = { - /** - * Calls the some_value()uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - someValue(params?: CallParams): AppCallComposer<[...TReturns, AppCallReturns['some_value()uint64'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the AppCall smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): AppCallComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): AppCallComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type AppCallComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/AppExpectingEffects.ts b/examples/p-py/projects/p-py-frontend/src/contracts/AppExpectingEffects.ts deleted file mode 100644 index 1a953ef..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/AppExpectingEffects.ts +++ /dev/null @@ -1,630 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"AppExpectingEffects","structs":{},"methods":[{"name":"create_group","args":[{"type":"acfg","name":"asset_create"},{"type":"appl","name":"app_create"}],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"log_group","args":[{"type":"appl","name":"app_call"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[159],"errorMessage":"application log value is not the result of an ABI return"},{"pc":[96],"errorMessage":"expected app created"},{"pc":[81],"errorMessage":"expected asset created"},{"pc":[105],"errorMessage":"expected correct app id"},{"pc":[90],"errorMessage":"expected correct asset id"},{"pc":[139],"errorMessage":"expected correct method called"},{"pc":[145],"errorMessage":"expected logs"},{"pc":[65],"errorMessage":"transaction type is acfg"},{"pc":[75,126],"errorMessage":"transaction type is appl"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBBcHBFeHBlY3RpbmdFZmZlY3RzKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg2ZDNhMDQzOSAweDYyYTBlZjYyIC8vIG1ldGhvZCAiY3JlYXRlX2dyb3VwKGFjZmcsYXBwbCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19ncm91cChhcHBsKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGVfZ3JvdXAgbG9nX2dyb3VwCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyZWF0ZWRBcHBBc3NldC5jb250cmFjdC5BcHBFeHBlY3RpbmdFZmZlY3RzLmNyZWF0ZV9ncm91cFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZV9ncm91cDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFjZmcKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjExCiAgICAvLyBhc3NlcnQgYXNzZXRfY3JlYXRlLmNyZWF0ZWRfYXNzZXQuaWQsICJleHBlY3RlZCBhc3NldCBjcmVhdGVkIgogICAgZGlnIDEKICAgIGd0eG5zIENyZWF0ZWRBc3NldElECiAgICBkdXAKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCBjcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjEzCiAgICAvLyBvcC5nYWlkKGFzc2V0X2NyZWF0ZS5ncm91cF9pbmRleCkgPT0gYXNzZXRfY3JlYXRlLmNyZWF0ZWRfYXNzZXQuaWQKICAgIHVuY292ZXIgMgogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgZ2FpZHMKICAgIGRpZyAxCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToxMi0xNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5nYWlkKGFzc2V0X2NyZWF0ZS5ncm91cF9pbmRleCkgPT0gYXNzZXRfY3JlYXRlLmNyZWF0ZWRfYXNzZXQuaWQKICAgIC8vICksICJleHBlY3RlZCBjb3JyZWN0IGFzc2V0IGlkIgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgYXNzZXQgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MTUKICAgIC8vIGFzc2VydCBhcHBfY3JlYXRlLmNyZWF0ZWRfYXBwLmlkLCAiZXhwZWN0ZWQgYXBwIGNyZWF0ZWQiCiAgICBkaWcgMQogICAgZ3R4bnMgQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcCBjcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjE3CiAgICAvLyBvcC5nYWlkKGFwcF9jcmVhdGUuZ3JvdXBfaW5kZXgpID09IGFwcF9jcmVhdGUuY3JlYXRlZF9hcHAuaWQKICAgIHVuY292ZXIgMgogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgZ2FpZHMKICAgIGRpZyAxCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToxNi0xOAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5nYWlkKGFwcF9jcmVhdGUuZ3JvdXBfaW5kZXgpID09IGFwcF9jcmVhdGUuY3JlYXRlZF9hcHAuaWQKICAgIC8vICksICJleHBlY3RlZCBjb3JyZWN0IGFwcCBpZCIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGFwcCBpZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcmVhdGVkQXBwQXNzZXQuY29udHJhY3QuQXBwRXhwZWN0aW5nRWZmZWN0cy5sb2dfZ3JvdXBbcm91dGluZ10oKSAtPiB2b2lkOgpsb2dfZ3JvdXA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgYXBwX2NhbGwuYXBwX2FyZ3MoMCkgPT0gYXJjNC5hcmM0X3NpZ25hdHVyZSgKICAgIGR1cAogICAgcHVzaGludCAwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToyNC0yNgogICAgLy8gYXNzZXJ0IGFwcF9jYWxsLmFwcF9hcmdzKDApID09IGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgInNvbWVfdmFsdWUoKXVpbnQ2NCIKICAgIC8vICksICJleHBlY3RlZCBjb3JyZWN0IG1ldGhvZCBjYWxsZWQiCiAgICBwdXNoYnl0ZXMgMHhkMzQ3OWU2NSAvLyBtZXRob2QgInNvbWVfdmFsdWUoKXVpbnQ2NCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBtZXRob2QgY2FsbGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjI3CiAgICAvLyBhc3NlcnQgYXBwX2NhbGwubnVtX2xvZ3MgPT0gMSwgImV4cGVjdGVkIGxvZ3MiCiAgICBkdXAKICAgIGd0eG5zIE51bUxvZ3MKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxvZ3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MjkKICAgIC8vIGFyYzQuVUludDY0LmZyb21fbG9nKGFwcF9jYWxsLmxhc3RfbG9nKQogICAgZHVwCiAgICBndHhucyBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjMwCiAgICAvLyA9PSAoYXBwX2NhbGwuZ3JvdXBfaW5kZXggKyAxKSAqIEdsb2JhbC5ncm91cF9zaXplCiAgICBzd2FwCiAgICBndHhucyBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgKgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToyOS0zMAogICAgLy8gYXJjNC5VSW50NjQuZnJvbV9sb2coYXBwX2NhbGwubGFzdF9sb2cpCiAgICAvLyA9PSAoYXBwX2NhbGwuZ3JvdXBfaW5kZXggKyAxKSAqIEdsb2JhbC5ncm91cF9zaXplCiAgICBpdG9iCiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MjgtMzEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgYXJjNC5VSW50NjQuZnJvbV9sb2coYXBwX2NhbGwubGFzdF9sb2cpCiAgICAvLyAgICAgPT0gKGFwcF9jYWxsLmdyb3VwX2luZGV4ICsgMSkgKiBHbG9iYWwuZ3JvdXBfc2l6ZQogICAgLy8gKQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQYmAQQVH3x1MRtBAB0xGRREMRhEggIEbToEOQRioO9iNhoAjgIACQBIADEZFDEYFBBDMRaBAglJOBCBAxJEMRYiCUk4ECMSREsBODxJRE8COBY9SwESREsBOD1JRE8COBY9SwESREwWTBZQKExQsCJDMRYiCUk4ECMSREmBAMIagATTR55lEkRJODsiEkRJOD5JVwQATFcABCgSREw4FiIIMgQLFqhEIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the AppExpectingEffects contract - */ -export type AppExpectingEffectsArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'create_group(acfg,appl)(uint64,uint64)': { - assetCreate?: AppMethodCallTransactionArgument - appCreate: AppMethodCallTransactionArgument - } - 'log_group(appl)void': { - appCall: AppMethodCallTransactionArgument - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'create_group(acfg,appl)(uint64,uint64)': [assetCreate: AppMethodCallTransactionArgument | undefined, appCreate: AppMethodCallTransactionArgument] - 'log_group(appl)void': [appCall: AppMethodCallTransactionArgument] - } -} - -/** - * The return type for each method - */ -export type AppExpectingEffectsReturns = { - 'create_group(acfg,appl)(uint64,uint64)': [bigint, bigint] - 'log_group(appl)void': void -} - -/** - * Defines the types of available calls and state of the AppExpectingEffects smart contract. - */ -export type AppExpectingEffectsTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'create_group(acfg,appl)(uint64,uint64)' | 'create_group', { - argsObj: AppExpectingEffectsArgs['obj']['create_group(acfg,appl)(uint64,uint64)'] - argsTuple: AppExpectingEffectsArgs['tuple']['create_group(acfg,appl)(uint64,uint64)'] - returns: AppExpectingEffectsReturns['create_group(acfg,appl)(uint64,uint64)'] - }> - & Record<'log_group(appl)void' | 'log_group', { - argsObj: AppExpectingEffectsArgs['obj']['log_group(appl)void'] - argsTuple: AppExpectingEffectsArgs['tuple']['log_group(appl)void'] - returns: AppExpectingEffectsReturns['log_group(appl)void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type AppExpectingEffectsSignatures = keyof AppExpectingEffectsTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type AppExpectingEffectsNonVoidMethodSignatures = keyof AppExpectingEffectsTypes['methods'] extends infer T ? T extends keyof AppExpectingEffectsTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the AppExpectingEffects smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = AppExpectingEffectsTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the AppExpectingEffects smart contract to the method's return type - */ -export type MethodReturn = AppExpectingEffectsTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type AppExpectingEffectsCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type AppExpectingEffectsDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: AppExpectingEffectsCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the AppExpectingEffects smart contract - */ -export abstract class AppExpectingEffectsParamsFactory { - /** - * Constructs a no op call for the create_group(acfg,appl)(uint64,uint64) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static createGroup(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'create_group(acfg,appl)(uint64,uint64)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.assetCreate, params.args.appCreate], - } - } - /** - * Constructs a no op call for the log_group(appl)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static logGroup(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'log_group(appl)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.appCall], - } - } -} - -/** - * A factory to create and deploy one or more instance of the AppExpectingEffects smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class AppExpectingEffectsFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `AppExpectingEffectsFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new AppExpectingEffectsClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new AppExpectingEffectsClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the AppExpectingEffects smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: AppExpectingEffectsDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new AppExpectingEffectsClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the AppExpectingEffects smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the AppExpectingEffects smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the AppExpectingEffects smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new AppExpectingEffectsClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the AppExpectingEffects smart contract - */ -export class AppExpectingEffectsClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `AppExpectingEffectsClient` - * - * @param appClient An `AppClient` instance which has been created with the AppExpectingEffects app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `AppExpectingEffectsClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `AppExpectingEffectsClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new AppExpectingEffectsClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `AppExpectingEffectsClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new AppExpectingEffectsClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the AppExpectingEffects smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the AppExpectingEffects smart contract using the `create_group(acfg,appl)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - createGroup: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(AppExpectingEffectsParamsFactory.createGroup(params)) - }, - - /** - * Makes a call to the AppExpectingEffects smart contract using the `log_group(appl)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - logGroup: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(AppExpectingEffectsParamsFactory.logGroup(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the AppExpectingEffects smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the AppExpectingEffects smart contract using the `create_group(acfg,appl)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - createGroup: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(AppExpectingEffectsParamsFactory.createGroup(params)) - }, - - /** - * Makes a call to the AppExpectingEffects smart contract using the `log_group(appl)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - logGroup: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(AppExpectingEffectsParamsFactory.logGroup(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the AppExpectingEffects smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the AppExpectingEffects smart contract using the `create_group(acfg,appl)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - createGroup: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(AppExpectingEffectsParamsFactory.createGroup(params)) - return {...result, return: result.return as unknown as (undefined | AppExpectingEffectsReturns['create_group(acfg,appl)(uint64,uint64)'])} - }, - - /** - * Makes a call to the AppExpectingEffects smart contract using the `log_group(appl)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - logGroup: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(AppExpectingEffectsParamsFactory.logGroup(params)) - return {...result, return: result.return as unknown as (undefined | AppExpectingEffectsReturns['log_group(appl)void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new AppExpectingEffectsClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current AppExpectingEffects app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): AppExpectingEffectsComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a create_group(acfg,appl)(uint64,uint64) method call against the AppExpectingEffects contract - */ - createGroup(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createGroup(params))) - return this - }, - /** - * Add a log_group(appl)void method call against the AppExpectingEffects contract - */ - logGroup(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.logGroup(params))) - return this - }, - /** - * Add a clear state call to the AppExpectingEffects contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as AppExpectingEffectsComposer - } -} -export type AppExpectingEffectsComposer = { - /** - * Calls the create_group(acfg,appl)(uint64,uint64) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - createGroup(params?: CallParams): AppExpectingEffectsComposer<[...TReturns, AppExpectingEffectsReturns['create_group(acfg,appl)(uint64,uint64)'] | undefined]> - - /** - * Calls the log_group(appl)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - logGroup(params?: CallParams): AppExpectingEffectsComposer<[...TReturns, AppExpectingEffectsReturns['log_group(appl)void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the AppExpectingEffects smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): AppExpectingEffectsComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): AppExpectingEffectsComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type AppExpectingEffectsComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/Arc4InnerTxnsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/Arc4InnerTxnsContract.ts deleted file mode 100644 index afe3303..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/Arc4InnerTxnsContract.ts +++ /dev/null @@ -1,556 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"Arc4InnerTxnsContract","structs":{},"methods":[{"name":"opt_in_dummy_asset","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0SW5uZXJUeG5zL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIEFyYzRJbm5lclR4bnNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANQogICAgcHVzaGJ5dGVzIDB4YWIzOWM1NWEgLy8gbWV0aG9kICJvcHRfaW5fZHVtbXlfYXNzZXQodWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX29wdF9pbl9kdW1teV9hc3NldF9yb3V0ZUAzCiAgICBlcnIKCm1haW5fb3B0X2luX2R1bW15X2Fzc2V0X3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIG9wdF9pbl9kdW1teV9hc3NldAoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNElubmVyVHhucy5jb250cmFjdC5BcmM0SW5uZXJUeG5zQ29udHJhY3Qub3B0X2luX2R1bW15X2Fzc2V0W3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luX2R1bW15X2Fzc2V0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRJbm5lclR4bnMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo3LTExCiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0SW5uZXJUeG5zL2NvbnRyYWN0LnB5OjkKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRJbm5lclR4bnMvY29udHJhY3QucHk6Ny04CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo3LTExCiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgASrOcVaNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEM2GgEXsTIKshSyEYEEshCBALIBs4EBQw==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the Arc4InnerTxnsContract contract - */ -export type Arc4InnerTxnsContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'opt_in_dummy_asset(uint64)void': { - asset: bigint | number - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'opt_in_dummy_asset(uint64)void': [asset: bigint | number] - } -} - -/** - * The return type for each method - */ -export type Arc4InnerTxnsContractReturns = { - 'opt_in_dummy_asset(uint64)void': void -} - -/** - * Defines the types of available calls and state of the Arc4InnerTxnsContract smart contract. - */ -export type Arc4InnerTxnsContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'opt_in_dummy_asset(uint64)void' | 'opt_in_dummy_asset', { - argsObj: Arc4InnerTxnsContractArgs['obj']['opt_in_dummy_asset(uint64)void'] - argsTuple: Arc4InnerTxnsContractArgs['tuple']['opt_in_dummy_asset(uint64)void'] - returns: Arc4InnerTxnsContractReturns['opt_in_dummy_asset(uint64)void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type Arc4InnerTxnsContractSignatures = keyof Arc4InnerTxnsContractTypes['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the Arc4InnerTxnsContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = Arc4InnerTxnsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the Arc4InnerTxnsContract smart contract to the method's return type - */ -export type MethodReturn = Arc4InnerTxnsContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type Arc4InnerTxnsContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type Arc4InnerTxnsContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: Arc4InnerTxnsContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the Arc4InnerTxnsContract smart contract - */ -export abstract class Arc4InnerTxnsContractParamsFactory { - /** - * Constructs a no op call for the opt_in_dummy_asset(uint64)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static optInDummyAsset(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'opt_in_dummy_asset(uint64)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.asset], - } - } -} - -/** - * A factory to create and deploy one or more instance of the Arc4InnerTxnsContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class Arc4InnerTxnsContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `Arc4InnerTxnsContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new Arc4InnerTxnsContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new Arc4InnerTxnsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the Arc4InnerTxnsContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: Arc4InnerTxnsContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new Arc4InnerTxnsContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Arc4InnerTxnsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Arc4InnerTxnsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Arc4InnerTxnsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new Arc4InnerTxnsContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the Arc4InnerTxnsContract smart contract - */ -export class Arc4InnerTxnsContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `Arc4InnerTxnsContractClient` - * - * @param appClient An `AppClient` instance which has been created with the Arc4InnerTxnsContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `Arc4InnerTxnsContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `Arc4InnerTxnsContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new Arc4InnerTxnsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `Arc4InnerTxnsContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new Arc4InnerTxnsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the Arc4InnerTxnsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the Arc4InnerTxnsContract smart contract using the `opt_in_dummy_asset(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - optInDummyAsset: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4InnerTxnsContractParamsFactory.optInDummyAsset(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the Arc4InnerTxnsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the Arc4InnerTxnsContract smart contract using the `opt_in_dummy_asset(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - optInDummyAsset: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4InnerTxnsContractParamsFactory.optInDummyAsset(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the Arc4InnerTxnsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the Arc4InnerTxnsContract smart contract using the `opt_in_dummy_asset(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - optInDummyAsset: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4InnerTxnsContractParamsFactory.optInDummyAsset(params)) - return {...result, return: result.return as unknown as (undefined | Arc4InnerTxnsContractReturns['opt_in_dummy_asset(uint64)void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new Arc4InnerTxnsContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current Arc4InnerTxnsContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): Arc4InnerTxnsContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a opt_in_dummy_asset(uint64)void method call against the Arc4InnerTxnsContract contract - */ - optInDummyAsset(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optInDummyAsset(params))) - return this - }, - /** - * Add a clear state call to the Arc4InnerTxnsContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as Arc4InnerTxnsContractComposer - } -} -export type Arc4InnerTxnsContractComposer = { - /** - * Calls the opt_in_dummy_asset(uint64)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - optInDummyAsset(params?: CallParams): Arc4InnerTxnsContractComposer<[...TReturns, Arc4InnerTxnsContractReturns['opt_in_dummy_asset(uint64)void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the Arc4InnerTxnsContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): Arc4InnerTxnsContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): Arc4InnerTxnsContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type Arc4InnerTxnsContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/Arc4PrimitiveOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/Arc4PrimitiveOpsContract.ts deleted file mode 100644 index 355f633..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/Arc4PrimitiveOpsContract.ts +++ /dev/null @@ -1,3982 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"Arc4PrimitiveOpsContract","structs":{},"methods":[{"name":"verify_uintn_uintn_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_init","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint32"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_init","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint256"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint32"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint256"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint32"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint256"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_as_uint64","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_as_biguint","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint512"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn64_as_uint64","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn64_as_biguint","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint512"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ufixednxm_bytes","args":[{"type":"ufixed32x8","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bigufixednxm_bytes","args":[{"type":"ufixed256x16","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ufixednxm_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"ufixed32x8"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bigufixednxm_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"ufixed256x16"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ufixednxm_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"ufixed32x8"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bigufixednxm_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"ufixed256x16"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_init","args":[{"type":"string","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_add","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_eq","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_bytes","args":[{"type":"string","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bool_bytes","args":[{"type":"bool","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bool_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bool_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_emit","args":[{"type":"string","name":"a"},{"type":"uint512","name":"b"},{"type":"uint64","name":"c"},{"type":"byte[]","name":"d"},{"type":"uint64","name":"e"},{"type":"bool","name":"f"},{"type":"byte[]","name":"g"},{"type":"string","name":"h"},{"type":"uint64","name":"m"},{"type":"uint256","name":"n"},{"type":"ufixed32x8","name":"o"},{"type":"ufixed256x16","name":"p"},{"type":"bool","name":"q"},{"type":"byte[]","name":"r"},{"type":"byte[]","name":"s"},{"type":"byte[]","name":"t"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[{"name":"SwappedArc4","args":[{"type":"uint64","name":"m"},{"type":"uint256","name":"n"},{"type":"ufixed32x8","name":"o"},{"type":"ufixed256x16","name":"p"},{"type":"bool","name":"q"},{"type":"uint8[3]","name":"r"},{"type":"uint16[]","name":"s"},{"type":"(uint32,uint64,string)","name":"t"}]},{"name":"Swapped","args":[{"type":"string","name":"field1"},{"type":"uint512","name":"field2"},{"type":"uint64","name":"field3"},{"type":"byte[]","name":"field4"},{"type":"uint64","name":"field5"},{"type":"bool","name":"field6"},{"type":"byte[]","name":"field7"},{"type":"string","name":"field8"},{"type":"uint64","name":"field9"},{"type":"uint256","name":"field10"},{"type":"ufixed32x8","name":"field11"},{"type":"ufixed256x16","name":"field12"},{"type":"bool","name":"field13"},{"type":"uint8[3]","name":"field14"},{"type":"uint16[]","name":"field15"},{"type":"(uint32,uint64,string)","name":"field16"}]}],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[1579,1599,1788,1808,1933,1982],"errorMessage":"application log value is not the result of an ABI return"},{"pc":[1855],"errorMessage":"max array length exceeded"},{"pc":[411,424,457,468,503,514,549,562,595,608,641,652,687,698,733,746,779,792,825,836,871,882,917,930,963,976,1009,1020,1055,1066,1101,1114,1147,1160,1193,1204,1239,1250,1285,1298,1331,1344,1377,1388,1423,1434,1469,1482,1509,1531,1617,1626,1650,1659,1679,1699,1707],"errorMessage":"overflow"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDggNjQgMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4MDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjYKICAgIC8vIGNsYXNzIEFyYzRQcmltaXRpdmVPcHNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANTcKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDk2ZjE0MTE2IDB4ZWQ2NjYwOTYgMHgyY2EwMzUyYiAweDg1OTA3ZDQwIDB4MmNiZWM0NWIgMHgwNzY2NmZkOSAweDM3MGJhYmQzIDB4MmI2YjNlZjAgMHgzMzlkYTk3YyAweDc4OThlZDk3IDB4MWYxMzBjZWMgMHhjNzQ4NjY0ZSAweDdhNDYwY2IxIDB4ZGNhYjFmMDEgMHg5N2Q5MDY0ZCAweGNlMDZjMmEwIDB4ZGNkYmNlZTAgMHg3N2E0YjY4ZCAweDRmNTQwNjI2IDB4MDk1YWVkNDEgMHhlM2I3ZTkxOCAweDU1MzM3MDA4IDB4OWJiMWNkNjYgMHg4MTQ4NGQ5ZCAweDlhMDNkZjEwIDB4ZDNmMGU0NGIgMHg5ODJkYjIzMyAweGFmZmJkZjBlIDB4Mjg4YWY3NmUgMHg4YmQ4NGEwNCAweDMwMmI4YTBhIDB4MzM3YWUyMGIgMHg2ZTI1OTI3MCAweDc5ZTM1Zjc3IDB4MGYxNTc0ZmUgMHhiMmNiMTNiZSAweGQwNTllZWE3IDB4NGNjNGMxNTcgMHgzZDE3YWM2ZSAweGY3ZjNkNWZjIDB4ZjhjOGY4ZDUgMHg0M2Y3MTYyYSAweDQyZTA5MDc1IDB4ZDk1NmY1NzUgMHg2YzAxNjBkZiAweGE4OTAxNTBiIDB4MGIyZjRjM2YgMHg5ZGI5ZDMyNyAweGU0ZDk1MGExIDB4YjYwNWU4MGMgLy8gbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5faW5pdChieXRlW10pdWludDMyIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5faW5pdChieXRlW10pdWludDI1NiIsIG1ldGhvZCAidmVyaWZ5X3VpbnRuX2Zyb21fYnl0ZXMoYnl0ZVtdKXVpbnQzMiIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRuX2Zyb21fYnl0ZXMoYnl0ZVtdKXVpbnQyNTYiLCBtZXRob2QgInZlcmlmeV91aW50bl9mcm9tX2xvZyhieXRlW10pdWludDMyIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fZnJvbV9sb2coYnl0ZVtdKXVpbnQyNTYiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl9hc191aW50NjQoYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRuX2FzX2JpZ3VpbnQoYnl0ZVtdKXVpbnQ1MTIiLCBtZXRob2QgInZlcmlmeV91aW50bjY0X2FzX3VpbnQ2NChieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludG42NF9hc19iaWd1aW50KGJ5dGVbXSl1aW50NTEyIiwgbWV0aG9kICJ2ZXJpZnlfdWZpeGVkbnhtX2J5dGVzKHVmaXhlZDMyeDgpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWZpeGVkbnhtX2J5dGVzKHVmaXhlZDI1NngxNilieXRlW10iLCBtZXRob2QgInZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlcyhieXRlW10pdWZpeGVkMzJ4OCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VmaXhlZG54bV9mcm9tX2J5dGVzKGJ5dGVbXSl1Zml4ZWQyNTZ4MTYiLCBtZXRob2QgInZlcmlmeV91Zml4ZWRueG1fZnJvbV9sb2coYnl0ZVtdKXVmaXhlZDMyeDgiLCBtZXRob2QgInZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9sb2coYnl0ZVtdKXVmaXhlZDI1NngxNiIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19pbml0KHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfYWRkKHN0cmluZyxzdHJpbmcpc3RyaW5nIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2VxKHN0cmluZyxzdHJpbmcpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19ieXRlcyhzdHJpbmcpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2Zyb21fYnl0ZXMoYnl0ZVtdKXN0cmluZyIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19mcm9tX2xvZyhieXRlW10pc3RyaW5nIiwgbWV0aG9kICJ2ZXJpZnlfYm9vbF9ieXRlcyhib29sKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Jvb2xfZnJvbV9ieXRlcyhieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2Jvb2xfZnJvbV9sb2coYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9lbWl0KHN0cmluZyx1aW50NTEyLHVpbnQ2NCxieXRlW10sdWludDY0LGJvb2wsYnl0ZVtdLHN0cmluZyx1aW50NjQsdWludDI1Nix1Zml4ZWQzMng4LHVmaXhlZDI1NngxNixib29sLGJ5dGVbXSxieXRlW10sYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfdWludG5fdWludG5fZXEgdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2VxIHZlcmlmeV91aW50bl9iaWd1aW50bl9lcSB2ZXJpZnlfYmlndWludG5fYmlndWludG5fZXEgdmVyaWZ5X3VpbnRuX3VpbnRuX25lIHZlcmlmeV9iaWd1aW50bl91aW50bl9uZSB2ZXJpZnlfdWludG5fYmlndWludG5fbmUgdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX25lIHZlcmlmeV91aW50bl91aW50bl9sdCB2ZXJpZnlfYmlndWludG5fdWludG5fbHQgdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX2x0IHZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9sdCB2ZXJpZnlfdWludG5fdWludG5fbGUgdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2xlIHZlcmlmeV91aW50bl9iaWd1aW50bl9sZSB2ZXJpZnlfYmlndWludG5fYmlndWludG5fbGUgdmVyaWZ5X3VpbnRuX3VpbnRuX2d0IHZlcmlmeV9iaWd1aW50bl91aW50bl9ndCB2ZXJpZnlfdWludG5fYmlndWludG5fZ3QgdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX2d0IHZlcmlmeV91aW50bl91aW50bl9nZSB2ZXJpZnlfYmlndWludG5fdWludG5fZ2UgdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX2dlIHZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9nZSB2ZXJpZnlfdWludG5faW5pdCB2ZXJpZnlfYmlndWludG5faW5pdCB2ZXJpZnlfdWludG5fZnJvbV9ieXRlcyB2ZXJpZnlfYmlndWludG5fZnJvbV9ieXRlcyB2ZXJpZnlfdWludG5fZnJvbV9sb2cgdmVyaWZ5X2JpZ3VpbnRuX2Zyb21fbG9nIHZlcmlmeV9iaWd1aW50bl9hc191aW50NjQgdmVyaWZ5X2JpZ3VpbnRuX2FzX2JpZ3VpbnQgdmVyaWZ5X3VpbnRuNjRfYXNfdWludDY0IHZlcmlmeV91aW50bjY0X2FzX2JpZ3VpbnQgdmVyaWZ5X3VmaXhlZG54bV9ieXRlcyB2ZXJpZnlfYmlndWZpeGVkbnhtX2J5dGVzIHZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlcyB2ZXJpZnlfYmlndWZpeGVkbnhtX2Zyb21fYnl0ZXMgdmVyaWZ5X3VmaXhlZG54bV9mcm9tX2xvZyB2ZXJpZnlfYmlndWZpeGVkbnhtX2Zyb21fbG9nIHZlcmlmeV9zdHJpbmdfaW5pdCB2ZXJpZnlfc3RyaW5nX2FkZCB2ZXJpZnlfc3RyaW5nX2VxIHZlcmlmeV9zdHJpbmdfYnl0ZXMgdmVyaWZ5X3N0cmluZ19mcm9tX2J5dGVzIHZlcmlmeV9zdHJpbmdfZnJvbV9sb2cgdmVyaWZ5X2Jvb2xfYnl0ZXMgdmVyaWZ5X2Jvb2xfZnJvbV9ieXRlcyB2ZXJpZnlfYm9vbF9mcm9tX2xvZyB2ZXJpZnlfZW1pdAogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU3OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX3VpbnRuX2VxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX3VpbnRuX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTEKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpID09IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl91aW50bl9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl91aW50bl9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID09IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPT0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOQogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID09IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSAhPSBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBifAogICAgZGlnIDIKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgIT0gYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSAhPSBhcmM0LlVJbnQ1MTIoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjUzCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgIT0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGIhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fbHQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpIDwgYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBjb3ZlciAyCiAgICBifAogICAgYjwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2x0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgPCBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9sdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9sdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPCBhcmM0LlVJbnQ1MTIoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiPAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fbHQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzcKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA8IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODMKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpIDw9IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fdWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fdWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA8PSBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fYmlndWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fYmlndWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpIDw9IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgPD0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fZ3Rbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPiBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBifAogICAgZGlnIDIKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2d0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2d0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTMKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA+IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9ndFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9ndDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTE5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSA+IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fZ3Rbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID4gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPj0gYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBjb3ZlciAyCiAgICBifAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fdWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fdWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID49IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fYmlndWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fYmlndWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPj0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID49IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPj0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX2luaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTU0CiAgICAvLyByZXR1cm4gYXJjNC5VSW50MzIoYV9iaWd1aW50KQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgcHVzaGludCA0CiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2luaXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5faW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQyNTYoYV9iaWd1aW50KQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHB1c2hpbnQgMzIKICAgIGJ6ZXJvCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fZnJvbV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9mcm9tX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2Zyb21fYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9mcm9tX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDMyLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl9mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl9mcm9tX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gcmV0dXJuIGFyYzQuVUludDI1Ni5mcm9tX2xvZyhhKQogICAgZHVwCiAgICBleHRyYWN0IDYgMAogICAgc3dhcAogICAgZXh0cmFjdCAyIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBsb2cgdmFsdWUgaXMgbm90IHRoZSByZXN1bHQgb2YgYW4gQUJJIHJldHVybgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYXNfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX2FzX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxODAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQyNTYoYV9iaWd1aW50KS5hc191aW50NjQoKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHB1c2hpbnQgMzIKICAgIGJ6ZXJvCiAgICBifAogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAtCiAgICBpbnRjXzEgLy8gOAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZXh0cmFjdDMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2FzX2JpZ3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYXNfYmlndWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxODUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQyNTYoYV9iaWd1aW50KS5hc19iaWd1aW50KCkKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBwdXNoaW50IDMyCiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIGJ8CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bjY0X2FzX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bjY0X2FzX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuNjRfYXNfYmlndWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bjY0X2FzX2JpZ3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KS5hc19iaWd1aW50KCkKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgYnwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VmaXhlZG54bV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91Zml4ZWRueG1fYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWZpeGVkbnhtX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VmaXhlZG54bV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91Zml4ZWRueG1fZnJvbV9sb2dbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWZpeGVkbnhtX2Zyb21fbG9nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI1CiAgICAvLyByZXR1cm4gYXJjNC5VRml4ZWROeE1bdHlwaW5nLkxpdGVyYWxbMzJdLCB0eXBpbmcuTGl0ZXJhbFs4XV0uZnJvbV9sb2coYSkKICAgIGR1cAogICAgZXh0cmFjdCA2IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMiA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gbG9nIHZhbHVlIGlzIG5vdCB0aGUgcmVzdWx0IG9mIGFuIEFCSSByZXR1cm4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VmaXhlZG54bV9mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzEKICAgIC8vIHJldHVybiBhcmM0LkJpZ1VGaXhlZE54TVt0eXBpbmcuTGl0ZXJhbFsyNTZdLCB0eXBpbmcuTGl0ZXJhbFsxNl1dLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjM1CiAgICAvLyByZXN1bHQgPSBhcmM0LlN0cmluZyhTdHJpbmcoIkhlbGxvLCAiKSArIGEpCiAgICBwdXNoYnl0ZXMgIkhlbGxvLCAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2FkZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfYWRkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0MAogICAgLy8gcmVzdWx0ID0gYSArIGIKICAgIGV4dHJhY3QgMiAwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfZXFbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQ1CiAgICAvLyByZXR1cm4gYSA9PSBiCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2Zyb21fYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2Zyb21fYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2Zyb21fbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N0cmluZ19mcm9tX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gcmV0dXJuIGFyYzQuU3RyaW5nLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ib29sX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jvb2xfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYm9vbF9mcm9tX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jvb2xfZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ib29sX2Zyb21fbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jvb2xfZnJvbV9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNzAKICAgIC8vIHJldHVybiBhcmM0LkJvb2wuZnJvbV9sb2coYSkKICAgIGR1cAogICAgZXh0cmFjdCA2IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMiA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gbG9nIHZhbHVlIGlzIG5vdCB0aGUgcmVzdWx0IG9mIGFuIEFCSSByZXR1cm4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2VtaXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZW1pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50MTYKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZHVwCiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk2CiAgICAvLyBhcmM0LmVtaXQoU3dhcHBlZEFyYzQobSwgbiwgbywgcCwgcSwgYXJjNF9yLCBhcmM0X3MsIGFyYzRfdCkpCiAgICBkaWcgNwogICAgZGlnIDcKICAgIGNvbmNhdAogICAgZGlnIDYKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDA1NAogICAgY29uY2F0CiAgICBkaWcgMgogICAgbGVuCiAgICBwdXNoaW50IDg0CiAgICBkaWcgMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHg2NmJiMDMzMyAvLyBtZXRob2QgIlN3YXBwZWRBcmM0KHVpbnQ2NCx1aW50MjU2LHVmaXhlZDMyeDgsdWZpeGVkMjU2eDE2LGJvb2wsdWludDhbM10sdWludDE2W10sKHVpbnQzMix1aW50NjQsc3RyaW5nKSkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk3LTMxNQogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgICJTd2FwcGVkIiwKICAgIC8vICAgICBhLAogICAgLy8gICAgIGIsCiAgICAvLyAgICAgYywKICAgIC8vICAgICBkLmNvcHkoKSwKICAgIC8vICAgICBlLAogICAgLy8gICAgIGYsCiAgICAvLyAgICAgZy5jb3B5KCksCiAgICAvLyAgICAgaCwKICAgIC8vICAgICBtLAogICAgLy8gICAgIG4sCiAgICAvLyAgICAgbywKICAgIC8vICAgICBwLAogICAgLy8gICAgIHEsCiAgICAvLyAgICAgYXJjNF9yLmNvcHkoKSwKICAgIC8vICAgICBhcmM0X3MuY29weSgpLAogICAgLy8gICAgIGFyYzRfdCwKICAgIC8vICkKICAgIGRpZyAxNgogICAgbGVuCiAgICBwdXNoaW50IDE3MwogICAgKwogICAgcHVzaGJ5dGVzIDB4MDBhZAogICAgdW5jb3ZlciAxNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDE2CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBkaWcgMTUKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDE0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIGRpZyAxMgogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMTEKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweGVjMzMxOWJiIC8vIG1ldGhvZCAiU3dhcHBlZChzdHJpbmcsdWludDUxMix1aW50NjQsYnl0ZVtdLHVpbnQ2NCxib29sLGJ5dGVbXSxzdHJpbmcsdWludDY0LHVpbnQyNTYsdWZpeGVkMzJ4OCx1Zml4ZWQyNTZ4MTYsYm9vbCx1aW50OFszXSx1aW50MTZbXSwodWludDMyLHVpbnQ2NCxzdHJpbmcpKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxNi0zMzQKICAgIC8vIGFyYzQuZW1pdCgKICAgIC8vICAgICAiU3dhcHBlZChzdHJpbmcsdWludDUxMix1aW50NjQsYnl0ZVtdLHVpbnQ2NCxib29sLGJ5dGVbXSxzdHJpbmcsdWludDY0LHVpbnQyNTYsdWZpeGVkMzJ4OCx1Zml4ZWQyNTZ4MTYsYm9vbCx1aW50OFszXSx1aW50MTZbXSwodWludDMyLHVpbnQ2NCxzdHJpbmcpKSIsCiAgICAvLyAgICAgYSwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGMsCiAgICAvLyAgICAgZC5jb3B5KCksCiAgICAvLyAgICAgZSwKICAgIC8vICAgICBmLAogICAgLy8gICAgIGcuY29weSgpLAogICAgLy8gICAgIGgsCiAgICAvLyAgICAgbSwKICAgIC8vICAgICBuLAogICAgLy8gICAgIG8sCiAgICAvLyAgICAgcCwKICAgIC8vICAgICBxLAogICAgLy8gICAgIGFyYzRfci5jb3B5KCksCiAgICAvLyAgICAgYXJjNF9zLmNvcHkoKSwKICAgIC8vICAgICBhcmM0X3QsCiAgICAvLyApCiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAQhAACYCBBUffHUBADEbQQFtMRkURDEYRIIyBJbxQRYE7WZglgQsoDUrBIWQfUAELL7EWwQHZm/ZBDcLq9MEK2s+8AQznal8BHiY7ZcEHxMM7ATHSGZOBHpGDLEE3KsfAQSX2QZNBM4GwqAE3NvO4AR3pLaNBE9UBiYECVrtQQTjt+kYBFUzcAgEm7HNZgSBSE2dBJoD3xAE0/DkSwSYLbIzBK/73w4EKIr3bgSL2EoEBDArigoEM3riCwRuJZJwBHnjX3cEDxV0/gSyyxO+BNBZ7qcETMTBVwQ9F6xuBPfz1fwE+Mj41QRD9xYqBELgkHUE2Vb1dQRsAWDfBKiQFQsECy9MPwSdudMnBOTZUKEEtgXoDDYaAI4yAAkANwBlAJMAwQDvAR0BSwF5AacB1QIDAjECXwKNArsC6QMXA0UDcwOhA88D/QQrBFkEbwSFBJEEnQSxBMUE5gUEBRgFNAVFBVYFYgVuBYIFlgW1BdAF4gXzBf8GEwYkBjAGRAAxGRQxGBQQQzYaAVcCADYaAlcCAEsBFSMORCOvTwJLAatLAhUjDkROAquoKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08Cq0sBFSMORCOvTwKrqCklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAqtLARUkDkQkr08Cq6gpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwJLAatLAhUkDkROAquoKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08CSwGrSwIVIw5ETgKrqSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAqtLARUjDkQjr08Cq6kpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwKrSwEVJA5EJK9PAqupKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08CSwGrSwIVJA5ETgKrqSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAksBq0sCFSMORE4Cq6QpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwKrSwEVIw5EI69PAqukKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08Cq0sBFSQORCSvTwKrpCklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAksBq0sCFSQORE4Cq6QpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwJLAatLAhUjDkROAqumKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08Cq0sBFSMORCOvTwKrpiklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAqtLARUkDkQkr08Cq6YpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwJLAatLAhUkDkROAqumKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08CSwGrSwIVIw5ETgKrpSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAqtLARUjDkQjr08Cq6UpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwKrSwEVJA5EJK9PAqulKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08CSwGrSwIVJA5ETgKrpSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAksBq0sCFSMORE4Cq6cpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwKrSwEVIw5EI69PAqunKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08Cq0sBFSQORCSvTwKrpyklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAksBq0sCFSQORE4Cq6cpJU8CVChMULAiQzYaAVcCAEkVgQQORIEEr6soTFCwIkM2GgFXAgBJFYEgDkSBIK+rKExQsCJDNhoBVwIAKExQsCJDNhoBVwIAKExQsCJDNhoBSVcGAExXAgQoEkQoTFCwIkM2GgFJVwYATFcCBCgSRChMULAiQzYaAVcCAEkVgSAORIEgr6tJkyQOREkVIwkjWChMULAiQzYaAVcCAEkVgSAORIEgr6tJFSQORCSvqyhMULAiQzYaAVcCAEkVIw5EI6+rKExQsCJDNhoBVwIASRUjDkQjr6tJFSQORCSvqyhMULAiQzYaAUkVFlcGAkxQKExQsCJDNhoBSRUWVwYCTFAoTFCwIkM2GgFXAgAoTFCwIkM2GgFXAgAoTFCwIkM2GgFJVwYATFcCBCgSRChMULAiQzYaAUlXBgBMVwIEKBJEKExQsCJDNhoBVwIAgAdIZWxsbywgTFBJFRZXBgJMUChMULAiQzYaATYaAlcCAFBJVwIAFRZXBgJcAChMULAiQzYaATYaAhIpJU8CVChMULAiQzYaAUkVFlcGAkxQKExQsCJDNhoBVwIAKExQsCJDNhoBSVcGAExXAgQoEkQoTFCwIkM2GgFJFRZXBgJMUChMULAiQzYaAVcCAChMULAiQzYaAUlXBgBMVwIEKBJEKExQsCJDNhoBNhoCNhoDNhoENhoFNhoGNhoHNhoINhoJNhoKNhoLNhoMNhoNNhoOVwIANhoPSSVZSwGBAllSVwIANhoPSYECWUsBFVJXAgBLB0sHUEsGUEsFUEsEUEsDUIACAFRQSwIVgVRLAQgWVwYCTwJMUEsDUEsCUIAEZrsDM0xQsEsQFYGtAQiAAgCtTxFQTxBQSwEWVwYCUEsPFU8CCExPDlBPDVBLARZXBgJQSwwVTwIISRZXBgJPAkxQSwsVTwIITE8KUE8JUE8IUE8HUE8GUE8FUEsBFlcGAlBMTwIIFlcGAlBPBlBPBVBPBFBPA1BPAlBMUIAE7DMZu0xQSbCwIkM=","clear":"C4EBQw=="},"events":[{"name":"SwappedArc4","args":[{"type":"uint64","name":"m"},{"type":"uint256","name":"n"},{"type":"ufixed32x8","name":"o"},{"type":"ufixed256x16","name":"p"},{"type":"bool","name":"q"},{"type":"uint8[3]","name":"r"},{"type":"uint16[]","name":"s"},{"type":"(uint32,uint64,string)","name":"t"}]},{"name":"Swapped","args":[{"type":"string","name":"field1"},{"type":"uint512","name":"field2"},{"type":"uint64","name":"field3"},{"type":"byte[]","name":"field4"},{"type":"uint64","name":"field5"},{"type":"bool","name":"field6"},{"type":"byte[]","name":"field7"},{"type":"string","name":"field8"},{"type":"uint64","name":"field9"},{"type":"uint256","name":"field10"},{"type":"ufixed32x8","name":"field11"},{"type":"ufixed256x16","name":"field12"},{"type":"bool","name":"field13"},{"type":"uint8[3]","name":"field14"},{"type":"uint16[]","name":"field15"},{"type":"(uint32,uint64,string)","name":"field16"}]}],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the Arc4PrimitiveOpsContract contract - */ -export type Arc4PrimitiveOpsContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify_uintn_uintn_eq(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_uintn_eq(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_biguintn_eq(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_biguintn_eq(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_uintn_ne(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_uintn_ne(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_biguintn_ne(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_biguintn_ne(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_uintn_lt(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_uintn_lt(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_biguintn_lt(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_biguintn_lt(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_uintn_le(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_uintn_le(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_biguintn_le(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_biguintn_le(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_uintn_gt(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_uintn_gt(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_biguintn_gt(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_biguintn_gt(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_uintn_ge(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_uintn_ge(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_biguintn_ge(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguintn_biguintn_ge(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_uintn_init(byte[])uint32': { - a: Uint8Array - } - 'verify_biguintn_init(byte[])uint256': { - a: Uint8Array - } - 'verify_uintn_from_bytes(byte[])uint32': { - a: Uint8Array - } - 'verify_biguintn_from_bytes(byte[])uint256': { - a: Uint8Array - } - 'verify_uintn_from_log(byte[])uint32': { - a: Uint8Array - } - 'verify_biguintn_from_log(byte[])uint256': { - a: Uint8Array - } - 'verify_biguintn_as_uint64(byte[])uint64': { - a: Uint8Array - } - 'verify_biguintn_as_biguint(byte[])uint512': { - a: Uint8Array - } - 'verify_uintn64_as_uint64(byte[])uint64': { - a: Uint8Array - } - 'verify_uintn64_as_biguint(byte[])uint512': { - a: Uint8Array - } - 'verify_ufixednxm_bytes(ufixed32x8)byte[]': { - a: number - } - 'verify_bigufixednxm_bytes(ufixed256x16)byte[]': { - a: number - } - 'verify_ufixednxm_from_bytes(byte[])ufixed32x8': { - a: Uint8Array - } - 'verify_bigufixednxm_from_bytes(byte[])ufixed256x16': { - a: Uint8Array - } - 'verify_ufixednxm_from_log(byte[])ufixed32x8': { - a: Uint8Array - } - 'verify_bigufixednxm_from_log(byte[])ufixed256x16': { - a: Uint8Array - } - 'verify_string_init(string)string': { - a: string - } - 'verify_string_add(string,string)string': { - a: string - b: string - } - 'verify_string_eq(string,string)bool': { - a: string - b: string - } - 'verify_string_bytes(string)byte[]': { - a: string - } - 'verify_string_from_bytes(byte[])string': { - a: Uint8Array - } - 'verify_string_from_log(byte[])string': { - a: Uint8Array - } - 'verify_bool_bytes(bool)byte[]': { - a: boolean - } - 'verify_bool_from_bytes(byte[])bool': { - a: Uint8Array - } - 'verify_bool_from_log(byte[])bool': { - a: Uint8Array - } - 'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void': { - a: string - b: bigint | number - c: bigint | number - d: Uint8Array - e: bigint | number - f: boolean - g: Uint8Array - h: string - m: bigint | number - n: bigint | number - o: number - p: number - q: boolean - r: Uint8Array - s: Uint8Array - t: Uint8Array - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify_uintn_uintn_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_uintn_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_biguintn_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_biguintn_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_uintn_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_uintn_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_biguintn_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_biguintn_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_uintn_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_uintn_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_biguintn_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_biguintn_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_uintn_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_uintn_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_biguintn_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_biguintn_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_uintn_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_uintn_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_biguintn_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_biguintn_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_uintn_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_uintn_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_biguintn_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguintn_biguintn_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_uintn_init(byte[])uint32': [a: Uint8Array] - 'verify_biguintn_init(byte[])uint256': [a: Uint8Array] - 'verify_uintn_from_bytes(byte[])uint32': [a: Uint8Array] - 'verify_biguintn_from_bytes(byte[])uint256': [a: Uint8Array] - 'verify_uintn_from_log(byte[])uint32': [a: Uint8Array] - 'verify_biguintn_from_log(byte[])uint256': [a: Uint8Array] - 'verify_biguintn_as_uint64(byte[])uint64': [a: Uint8Array] - 'verify_biguintn_as_biguint(byte[])uint512': [a: Uint8Array] - 'verify_uintn64_as_uint64(byte[])uint64': [a: Uint8Array] - 'verify_uintn64_as_biguint(byte[])uint512': [a: Uint8Array] - 'verify_ufixednxm_bytes(ufixed32x8)byte[]': [a: number] - 'verify_bigufixednxm_bytes(ufixed256x16)byte[]': [a: number] - 'verify_ufixednxm_from_bytes(byte[])ufixed32x8': [a: Uint8Array] - 'verify_bigufixednxm_from_bytes(byte[])ufixed256x16': [a: Uint8Array] - 'verify_ufixednxm_from_log(byte[])ufixed32x8': [a: Uint8Array] - 'verify_bigufixednxm_from_log(byte[])ufixed256x16': [a: Uint8Array] - 'verify_string_init(string)string': [a: string] - 'verify_string_add(string,string)string': [a: string, b: string] - 'verify_string_eq(string,string)bool': [a: string, b: string] - 'verify_string_bytes(string)byte[]': [a: string] - 'verify_string_from_bytes(byte[])string': [a: Uint8Array] - 'verify_string_from_log(byte[])string': [a: Uint8Array] - 'verify_bool_bytes(bool)byte[]': [a: boolean] - 'verify_bool_from_bytes(byte[])bool': [a: Uint8Array] - 'verify_bool_from_log(byte[])bool': [a: Uint8Array] - 'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void': [a: string, b: bigint | number, c: bigint | number, d: Uint8Array, e: bigint | number, f: boolean, g: Uint8Array, h: string, m: bigint | number, n: bigint | number, o: number, p: number, q: boolean, r: Uint8Array, s: Uint8Array, t: Uint8Array] - } -} - -/** - * The return type for each method - */ -export type Arc4PrimitiveOpsContractReturns = { - 'verify_uintn_uintn_eq(byte[],byte[])bool': boolean - 'verify_biguintn_uintn_eq(byte[],byte[])bool': boolean - 'verify_uintn_biguintn_eq(byte[],byte[])bool': boolean - 'verify_biguintn_biguintn_eq(byte[],byte[])bool': boolean - 'verify_uintn_uintn_ne(byte[],byte[])bool': boolean - 'verify_biguintn_uintn_ne(byte[],byte[])bool': boolean - 'verify_uintn_biguintn_ne(byte[],byte[])bool': boolean - 'verify_biguintn_biguintn_ne(byte[],byte[])bool': boolean - 'verify_uintn_uintn_lt(byte[],byte[])bool': boolean - 'verify_biguintn_uintn_lt(byte[],byte[])bool': boolean - 'verify_uintn_biguintn_lt(byte[],byte[])bool': boolean - 'verify_biguintn_biguintn_lt(byte[],byte[])bool': boolean - 'verify_uintn_uintn_le(byte[],byte[])bool': boolean - 'verify_biguintn_uintn_le(byte[],byte[])bool': boolean - 'verify_uintn_biguintn_le(byte[],byte[])bool': boolean - 'verify_biguintn_biguintn_le(byte[],byte[])bool': boolean - 'verify_uintn_uintn_gt(byte[],byte[])bool': boolean - 'verify_biguintn_uintn_gt(byte[],byte[])bool': boolean - 'verify_uintn_biguintn_gt(byte[],byte[])bool': boolean - 'verify_biguintn_biguintn_gt(byte[],byte[])bool': boolean - 'verify_uintn_uintn_ge(byte[],byte[])bool': boolean - 'verify_biguintn_uintn_ge(byte[],byte[])bool': boolean - 'verify_uintn_biguintn_ge(byte[],byte[])bool': boolean - 'verify_biguintn_biguintn_ge(byte[],byte[])bool': boolean - 'verify_uintn_init(byte[])uint32': number - 'verify_biguintn_init(byte[])uint256': bigint - 'verify_uintn_from_bytes(byte[])uint32': number - 'verify_biguintn_from_bytes(byte[])uint256': bigint - 'verify_uintn_from_log(byte[])uint32': number - 'verify_biguintn_from_log(byte[])uint256': bigint - 'verify_biguintn_as_uint64(byte[])uint64': bigint - 'verify_biguintn_as_biguint(byte[])uint512': bigint - 'verify_uintn64_as_uint64(byte[])uint64': bigint - 'verify_uintn64_as_biguint(byte[])uint512': bigint - 'verify_ufixednxm_bytes(ufixed32x8)byte[]': Uint8Array - 'verify_bigufixednxm_bytes(ufixed256x16)byte[]': Uint8Array - 'verify_ufixednxm_from_bytes(byte[])ufixed32x8': number - 'verify_bigufixednxm_from_bytes(byte[])ufixed256x16': number - 'verify_ufixednxm_from_log(byte[])ufixed32x8': number - 'verify_bigufixednxm_from_log(byte[])ufixed256x16': number - 'verify_string_init(string)string': string - 'verify_string_add(string,string)string': string - 'verify_string_eq(string,string)bool': boolean - 'verify_string_bytes(string)byte[]': Uint8Array - 'verify_string_from_bytes(byte[])string': string - 'verify_string_from_log(byte[])string': string - 'verify_bool_bytes(bool)byte[]': Uint8Array - 'verify_bool_from_bytes(byte[])bool': boolean - 'verify_bool_from_log(byte[])bool': boolean - 'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void': void -} - -/** - * Defines the types of available calls and state of the Arc4PrimitiveOpsContract smart contract. - */ -export type Arc4PrimitiveOpsContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify_uintn_uintn_eq(byte[],byte[])bool' | 'verify_uintn_uintn_eq', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_eq(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_eq(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_eq(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_uintn_eq(byte[],byte[])bool' | 'verify_biguintn_uintn_eq', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_eq(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_eq(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_eq(byte[],byte[])bool'] - }> - & Record<'verify_uintn_biguintn_eq(byte[],byte[])bool' | 'verify_uintn_biguintn_eq', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_eq(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_eq(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_eq(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_biguintn_eq(byte[],byte[])bool' | 'verify_biguintn_biguintn_eq', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_eq(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_eq(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_eq(byte[],byte[])bool'] - }> - & Record<'verify_uintn_uintn_ne(byte[],byte[])bool' | 'verify_uintn_uintn_ne', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_ne(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_ne(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ne(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_uintn_ne(byte[],byte[])bool' | 'verify_biguintn_uintn_ne', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_ne(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_ne(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ne(byte[],byte[])bool'] - }> - & Record<'verify_uintn_biguintn_ne(byte[],byte[])bool' | 'verify_uintn_biguintn_ne', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_ne(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_ne(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ne(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_biguintn_ne(byte[],byte[])bool' | 'verify_biguintn_biguintn_ne', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_ne(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_ne(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ne(byte[],byte[])bool'] - }> - & Record<'verify_uintn_uintn_lt(byte[],byte[])bool' | 'verify_uintn_uintn_lt', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_lt(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_lt(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_lt(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_uintn_lt(byte[],byte[])bool' | 'verify_biguintn_uintn_lt', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_lt(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_lt(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_lt(byte[],byte[])bool'] - }> - & Record<'verify_uintn_biguintn_lt(byte[],byte[])bool' | 'verify_uintn_biguintn_lt', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_lt(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_lt(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_lt(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_biguintn_lt(byte[],byte[])bool' | 'verify_biguintn_biguintn_lt', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_lt(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_lt(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_lt(byte[],byte[])bool'] - }> - & Record<'verify_uintn_uintn_le(byte[],byte[])bool' | 'verify_uintn_uintn_le', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_le(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_le(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_le(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_uintn_le(byte[],byte[])bool' | 'verify_biguintn_uintn_le', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_le(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_le(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_le(byte[],byte[])bool'] - }> - & Record<'verify_uintn_biguintn_le(byte[],byte[])bool' | 'verify_uintn_biguintn_le', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_le(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_le(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_le(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_biguintn_le(byte[],byte[])bool' | 'verify_biguintn_biguintn_le', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_le(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_le(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_le(byte[],byte[])bool'] - }> - & Record<'verify_uintn_uintn_gt(byte[],byte[])bool' | 'verify_uintn_uintn_gt', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_gt(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_gt(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_gt(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_uintn_gt(byte[],byte[])bool' | 'verify_biguintn_uintn_gt', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_gt(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_gt(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_gt(byte[],byte[])bool'] - }> - & Record<'verify_uintn_biguintn_gt(byte[],byte[])bool' | 'verify_uintn_biguintn_gt', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_gt(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_gt(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_gt(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_biguintn_gt(byte[],byte[])bool' | 'verify_biguintn_biguintn_gt', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_gt(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_gt(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_gt(byte[],byte[])bool'] - }> - & Record<'verify_uintn_uintn_ge(byte[],byte[])bool' | 'verify_uintn_uintn_ge', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_ge(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_ge(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ge(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_uintn_ge(byte[],byte[])bool' | 'verify_biguintn_uintn_ge', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_ge(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_ge(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ge(byte[],byte[])bool'] - }> - & Record<'verify_uintn_biguintn_ge(byte[],byte[])bool' | 'verify_uintn_biguintn_ge', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_ge(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_ge(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ge(byte[],byte[])bool'] - }> - & Record<'verify_biguintn_biguintn_ge(byte[],byte[])bool' | 'verify_biguintn_biguintn_ge', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_ge(byte[],byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_ge(byte[],byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ge(byte[],byte[])bool'] - }> - & Record<'verify_uintn_init(byte[])uint32' | 'verify_uintn_init', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_init(byte[])uint32'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_init(byte[])uint32'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_init(byte[])uint32'] - }> - & Record<'verify_biguintn_init(byte[])uint256' | 'verify_biguintn_init', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_init(byte[])uint256'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_init(byte[])uint256'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_init(byte[])uint256'] - }> - & Record<'verify_uintn_from_bytes(byte[])uint32' | 'verify_uintn_from_bytes', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_from_bytes(byte[])uint32'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_from_bytes(byte[])uint32'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_from_bytes(byte[])uint32'] - }> - & Record<'verify_biguintn_from_bytes(byte[])uint256' | 'verify_biguintn_from_bytes', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_from_bytes(byte[])uint256'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_from_bytes(byte[])uint256'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_from_bytes(byte[])uint256'] - }> - & Record<'verify_uintn_from_log(byte[])uint32' | 'verify_uintn_from_log', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_from_log(byte[])uint32'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_from_log(byte[])uint32'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn_from_log(byte[])uint32'] - }> - & Record<'verify_biguintn_from_log(byte[])uint256' | 'verify_biguintn_from_log', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_from_log(byte[])uint256'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_from_log(byte[])uint256'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_from_log(byte[])uint256'] - }> - & Record<'verify_biguintn_as_uint64(byte[])uint64' | 'verify_biguintn_as_uint64', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_as_uint64(byte[])uint64'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_as_uint64(byte[])uint64'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_as_uint64(byte[])uint64'] - }> - & Record<'verify_biguintn_as_biguint(byte[])uint512' | 'verify_biguintn_as_biguint', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_as_biguint(byte[])uint512'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_as_biguint(byte[])uint512'] - returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_as_biguint(byte[])uint512'] - }> - & Record<'verify_uintn64_as_uint64(byte[])uint64' | 'verify_uintn64_as_uint64', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn64_as_uint64(byte[])uint64'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn64_as_uint64(byte[])uint64'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn64_as_uint64(byte[])uint64'] - }> - & Record<'verify_uintn64_as_biguint(byte[])uint512' | 'verify_uintn64_as_biguint', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn64_as_biguint(byte[])uint512'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn64_as_biguint(byte[])uint512'] - returns: Arc4PrimitiveOpsContractReturns['verify_uintn64_as_biguint(byte[])uint512'] - }> - & Record<'verify_ufixednxm_bytes(ufixed32x8)byte[]' | 'verify_ufixednxm_bytes', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_ufixednxm_bytes(ufixed32x8)byte[]'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_ufixednxm_bytes(ufixed32x8)byte[]'] - returns: Arc4PrimitiveOpsContractReturns['verify_ufixednxm_bytes(ufixed32x8)byte[]'] - }> - & Record<'verify_bigufixednxm_bytes(ufixed256x16)byte[]' | 'verify_bigufixednxm_bytes', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bigufixednxm_bytes(ufixed256x16)byte[]'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bigufixednxm_bytes(ufixed256x16)byte[]'] - returns: Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_bytes(ufixed256x16)byte[]'] - }> - & Record<'verify_ufixednxm_from_bytes(byte[])ufixed32x8' | 'verify_ufixednxm_from_bytes', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_ufixednxm_from_bytes(byte[])ufixed32x8'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_ufixednxm_from_bytes(byte[])ufixed32x8'] - returns: Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_bytes(byte[])ufixed32x8'] - }> - & Record<'verify_bigufixednxm_from_bytes(byte[])ufixed256x16' | 'verify_bigufixednxm_from_bytes', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'] - returns: Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'] - }> - & Record<'verify_ufixednxm_from_log(byte[])ufixed32x8' | 'verify_ufixednxm_from_log', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_ufixednxm_from_log(byte[])ufixed32x8'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_ufixednxm_from_log(byte[])ufixed32x8'] - returns: Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_log(byte[])ufixed32x8'] - }> - & Record<'verify_bigufixednxm_from_log(byte[])ufixed256x16' | 'verify_bigufixednxm_from_log', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bigufixednxm_from_log(byte[])ufixed256x16'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bigufixednxm_from_log(byte[])ufixed256x16'] - returns: Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_log(byte[])ufixed256x16'] - }> - & Record<'verify_string_init(string)string' | 'verify_string_init', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_init(string)string'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_init(string)string'] - returns: Arc4PrimitiveOpsContractReturns['verify_string_init(string)string'] - }> - & Record<'verify_string_add(string,string)string' | 'verify_string_add', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_add(string,string)string'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_add(string,string)string'] - returns: Arc4PrimitiveOpsContractReturns['verify_string_add(string,string)string'] - }> - & Record<'verify_string_eq(string,string)bool' | 'verify_string_eq', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_eq(string,string)bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_eq(string,string)bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_string_eq(string,string)bool'] - }> - & Record<'verify_string_bytes(string)byte[]' | 'verify_string_bytes', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_bytes(string)byte[]'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_bytes(string)byte[]'] - returns: Arc4PrimitiveOpsContractReturns['verify_string_bytes(string)byte[]'] - }> - & Record<'verify_string_from_bytes(byte[])string' | 'verify_string_from_bytes', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_from_bytes(byte[])string'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_from_bytes(byte[])string'] - returns: Arc4PrimitiveOpsContractReturns['verify_string_from_bytes(byte[])string'] - }> - & Record<'verify_string_from_log(byte[])string' | 'verify_string_from_log', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_from_log(byte[])string'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_from_log(byte[])string'] - returns: Arc4PrimitiveOpsContractReturns['verify_string_from_log(byte[])string'] - }> - & Record<'verify_bool_bytes(bool)byte[]' | 'verify_bool_bytes', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bool_bytes(bool)byte[]'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bool_bytes(bool)byte[]'] - returns: Arc4PrimitiveOpsContractReturns['verify_bool_bytes(bool)byte[]'] - }> - & Record<'verify_bool_from_bytes(byte[])bool' | 'verify_bool_from_bytes', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bool_from_bytes(byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bool_from_bytes(byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_bool_from_bytes(byte[])bool'] - }> - & Record<'verify_bool_from_log(byte[])bool' | 'verify_bool_from_log', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bool_from_log(byte[])bool'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bool_from_log(byte[])bool'] - returns: Arc4PrimitiveOpsContractReturns['verify_bool_from_log(byte[])bool'] - }> - & Record<'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void' | 'verify_emit', { - argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'] - argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'] - returns: Arc4PrimitiveOpsContractReturns['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type Arc4PrimitiveOpsContractSignatures = keyof Arc4PrimitiveOpsContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type Arc4PrimitiveOpsContractNonVoidMethodSignatures = keyof Arc4PrimitiveOpsContractTypes['methods'] extends infer T ? T extends keyof Arc4PrimitiveOpsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the Arc4PrimitiveOpsContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = Arc4PrimitiveOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the Arc4PrimitiveOpsContract smart contract to the method's return type - */ -export type MethodReturn = Arc4PrimitiveOpsContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type Arc4PrimitiveOpsContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type Arc4PrimitiveOpsContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: Arc4PrimitiveOpsContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the Arc4PrimitiveOpsContract smart contract - */ -export abstract class Arc4PrimitiveOpsContractParamsFactory { - /** - * Constructs a no op call for the verify_uintn_uintn_eq(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnUintnEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_uintn_eq(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_uintn_eq(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnUintnEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_uintn_eq(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_biguintn_eq(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnBiguintnEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_biguintn_eq(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_biguintn_eq(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnBiguintnEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_biguintn_eq(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_uintn_ne(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnUintnNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_uintn_ne(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_uintn_ne(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnUintnNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_uintn_ne(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_biguintn_ne(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnBiguintnNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_biguintn_ne(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_biguintn_ne(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnBiguintnNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_biguintn_ne(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_uintn_lt(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnUintnLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_uintn_lt(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_uintn_lt(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnUintnLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_uintn_lt(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_biguintn_lt(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnBiguintnLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_biguintn_lt(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_biguintn_lt(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnBiguintnLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_biguintn_lt(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_uintn_le(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnUintnLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_uintn_le(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_uintn_le(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnUintnLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_uintn_le(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_biguintn_le(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnBiguintnLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_biguintn_le(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_biguintn_le(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnBiguintnLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_biguintn_le(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_uintn_gt(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnUintnGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_uintn_gt(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_uintn_gt(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnUintnGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_uintn_gt(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_biguintn_gt(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnBiguintnGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_biguintn_gt(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_biguintn_gt(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnBiguintnGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_biguintn_gt(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_uintn_ge(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnUintnGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_uintn_ge(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_uintn_ge(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnUintnGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_uintn_ge(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_biguintn_ge(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnBiguintnGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_biguintn_ge(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguintn_biguintn_ge(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnBiguintnGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_biguintn_ge(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uintn_init(byte[])uint32 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_init(byte[])uint32' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_biguintn_init(byte[])uint256 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_init(byte[])uint256' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_uintn_from_bytes(byte[])uint32 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_from_bytes(byte[])uint32' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_biguintn_from_bytes(byte[])uint256 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_from_bytes(byte[])uint256' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_uintn_from_log(byte[])uint32 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintnFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn_from_log(byte[])uint32' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_biguintn_from_log(byte[])uint256 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_from_log(byte[])uint256' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_biguintn_as_uint64(byte[])uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnAsUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_as_uint64(byte[])uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_biguintn_as_biguint(byte[])uint512 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintnAsBiguint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguintn_as_biguint(byte[])uint512' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_uintn64_as_uint64(byte[])uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintn64AsUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn64_as_uint64(byte[])uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_uintn64_as_biguint(byte[])uint512 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUintn64AsBiguint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uintn64_as_biguint(byte[])uint512' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_ufixednxm_bytes(ufixed32x8)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUfixednxmBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_ufixednxm_bytes(ufixed32x8)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_bigufixednxm_bytes(ufixed256x16)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBigufixednxmBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bigufixednxm_bytes(ufixed256x16)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_ufixednxm_from_bytes(byte[])ufixed32x8 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUfixednxmFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_ufixednxm_from_bytes(byte[])ufixed32x8' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_bigufixednxm_from_bytes(byte[])ufixed256x16 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBigufixednxmFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bigufixednxm_from_bytes(byte[])ufixed256x16' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_ufixednxm_from_log(byte[])ufixed32x8 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUfixednxmFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_ufixednxm_from_log(byte[])ufixed32x8' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_bigufixednxm_from_log(byte[])ufixed256x16 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBigufixednxmFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bigufixednxm_from_log(byte[])ufixed256x16' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_string_init(string)string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyStringInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_string_init(string)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_string_add(string,string)string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyStringAdd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_string_add(string,string)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_string_eq(string,string)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyStringEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_string_eq(string,string)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_string_bytes(string)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyStringBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_string_bytes(string)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_string_from_bytes(byte[])string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyStringFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_string_from_bytes(byte[])string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_string_from_log(byte[])string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyStringFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_string_from_log(byte[])string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_bool_bytes(bool)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBoolBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bool_bytes(bool)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_bool_from_bytes(byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBoolFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bool_from_bytes(byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_bool_from_log(byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBoolFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bool_from_log(byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyEmit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d, params.args.e, params.args.f, params.args.g, params.args.h, params.args.m, params.args.n, params.args.o, params.args.p, params.args.q, params.args.r, params.args.s, params.args.t], - } - } -} - -/** - * A factory to create and deploy one or more instance of the Arc4PrimitiveOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class Arc4PrimitiveOpsContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `Arc4PrimitiveOpsContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new Arc4PrimitiveOpsContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new Arc4PrimitiveOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the Arc4PrimitiveOpsContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: Arc4PrimitiveOpsContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new Arc4PrimitiveOpsContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Arc4PrimitiveOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Arc4PrimitiveOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Arc4PrimitiveOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new Arc4PrimitiveOpsContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the Arc4PrimitiveOpsContract smart contract - */ -export class Arc4PrimitiveOpsContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `Arc4PrimitiveOpsContractClient` - * - * @param appClient An `AppClient` instance which has been created with the Arc4PrimitiveOpsContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `Arc4PrimitiveOpsContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `Arc4PrimitiveOpsContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new Arc4PrimitiveOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `Arc4PrimitiveOpsContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new Arc4PrimitiveOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the Arc4PrimitiveOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnUintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnEq(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnUintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnEq(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnBiguintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnEq(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnBiguintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnEq(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnUintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnNe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnUintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnNe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnBiguintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnNe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnBiguintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnNe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnUintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnUintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnBiguintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnBiguintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnUintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnUintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnBiguintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnBiguintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnUintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnUintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnBiguintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnBiguintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnUintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnUintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnBiguintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnBiguintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_init(byte[])uint32` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnInit(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_init(byte[])uint256` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnInit(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_bytes(byte[])uint32` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_bytes(byte[])uint256` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_log(byte[])uint32` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintnFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_log(byte[])uint256` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_uint64(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnAsUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsUint64(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_biguint(byte[])uint512` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintnAsBiguint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsBiguint(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_uint64(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintn64AsUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsUint64(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_biguint(byte[])uint512` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUintn64AsBiguint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsBiguint(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_bytes(ufixed32x8)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUfixednxmBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_bytes(ufixed256x16)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBigufixednxmBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_bytes(byte[])ufixed32x8` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUfixednxmFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_bytes(byte[])ufixed256x16` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBigufixednxmFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_log(byte[])ufixed32x8` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUfixednxmFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_log(byte[])ufixed256x16` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBigufixednxmFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyStringInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringInit(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_add(string,string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyStringAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringAdd(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_eq(string,string)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyStringEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringEq(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_bytes(string)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyStringBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_bytes(byte[])string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyStringFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_log(byte[])string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyStringFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_bytes(bool)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBoolBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_bytes(byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBoolFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_log(byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBoolFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyEmit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyEmit(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the Arc4PrimitiveOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnUintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnEq(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnUintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnEq(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnBiguintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnEq(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnBiguintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnEq(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnUintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnNe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnUintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnNe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnBiguintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnNe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnBiguintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnNe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnUintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnUintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnBiguintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnBiguintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnUintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnUintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnBiguintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnBiguintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnUintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnUintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnBiguintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnBiguintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGt(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnUintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnUintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnBiguintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnBiguintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGe(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_init(byte[])uint32` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnInit(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_init(byte[])uint256` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnInit(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_bytes(byte[])uint32` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_bytes(byte[])uint256` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_log(byte[])uint32` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintnFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_log(byte[])uint256` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_uint64(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnAsUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsUint64(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_biguint(byte[])uint512` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintnAsBiguint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsBiguint(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_uint64(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintn64AsUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsUint64(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_biguint(byte[])uint512` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUintn64AsBiguint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsBiguint(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_bytes(ufixed32x8)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUfixednxmBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_bytes(ufixed256x16)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBigufixednxmBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_bytes(byte[])ufixed32x8` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUfixednxmFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_bytes(byte[])ufixed256x16` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBigufixednxmFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_log(byte[])ufixed32x8` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUfixednxmFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_log(byte[])ufixed256x16` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBigufixednxmFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyStringInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringInit(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_add(string,string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyStringAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringAdd(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_eq(string,string)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyStringEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringEq(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_bytes(string)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyStringBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_bytes(byte[])string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyStringFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_log(byte[])string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyStringFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_bytes(bool)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBoolBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_bytes(byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBoolFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromBytes(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_log(byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBoolFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromLog(params)) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyEmit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyEmit(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the Arc4PrimitiveOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnUintnEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnEq(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_eq(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnUintnEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnEq(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_eq(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnBiguintnEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnEq(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_eq(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnBiguintnEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnEq(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_eq(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnUintnNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnNe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ne(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnUintnNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnNe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ne(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnBiguintnNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnNe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ne(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnBiguintnNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnNe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ne(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnUintnLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLt(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_lt(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnUintnLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLt(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_lt(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnBiguintnLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLt(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_lt(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnBiguintnLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLt(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_lt(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnUintnLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_le(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnUintnLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_le(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnBiguintnLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_le(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnBiguintnLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_le(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnUintnGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGt(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_gt(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnUintnGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGt(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_gt(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnBiguintnGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGt(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_gt(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnBiguintnGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGt(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_gt(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnUintnGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ge(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnUintnGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ge(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnBiguintnGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ge(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnBiguintnGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGe(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ge(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_init(byte[])uint32` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnInit(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_init(byte[])uint32'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_init(byte[])uint256` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnInit(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_init(byte[])uint256'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_bytes(byte[])uint32` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromBytes(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_from_bytes(byte[])uint32'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_bytes(byte[])uint256` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromBytes(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_from_bytes(byte[])uint256'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_log(byte[])uint32` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintnFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromLog(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_from_log(byte[])uint32'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_log(byte[])uint256` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromLog(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_from_log(byte[])uint256'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_uint64(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnAsUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsUint64(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_as_uint64(byte[])uint64'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_biguint(byte[])uint512` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintnAsBiguint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsBiguint(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_as_biguint(byte[])uint512'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_uint64(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintn64AsUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsUint64(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn64_as_uint64(byte[])uint64'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_biguint(byte[])uint512` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUintn64AsBiguint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsBiguint(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn64_as_biguint(byte[])uint512'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_bytes(ufixed32x8)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUfixednxmBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmBytes(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_ufixednxm_bytes(ufixed32x8)byte[]'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_bytes(ufixed256x16)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBigufixednxmBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmBytes(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_bytes(ufixed256x16)byte[]'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_bytes(byte[])ufixed32x8` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUfixednxmFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromBytes(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_bytes(byte[])ufixed32x8'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_bytes(byte[])ufixed256x16` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBigufixednxmFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromBytes(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_log(byte[])ufixed32x8` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUfixednxmFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromLog(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_log(byte[])ufixed32x8'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_log(byte[])ufixed256x16` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBigufixednxmFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromLog(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_log(byte[])ufixed256x16'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyStringInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringInit(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_init(string)string'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_add(string,string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyStringAdd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringAdd(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_add(string,string)string'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_eq(string,string)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyStringEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringEq(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_eq(string,string)bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_bytes(string)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyStringBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringBytes(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_bytes(string)byte[]'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_bytes(byte[])string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyStringFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromBytes(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_from_bytes(byte[])string'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_log(byte[])string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyStringFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromLog(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_from_log(byte[])string'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_bytes(bool)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBoolBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolBytes(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bool_bytes(bool)byte[]'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_bytes(byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBoolFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromBytes(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bool_from_bytes(byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_log(byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBoolFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromLog(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bool_from_log(byte[])bool'])} - }, - - /** - * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyEmit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyEmit(params)) - return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new Arc4PrimitiveOpsContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current Arc4PrimitiveOpsContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): Arc4PrimitiveOpsContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_uintn_uintn_eq(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnUintnEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnEq(params))) - return this - }, - /** - * Add a verify_biguintn_uintn_eq(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnUintnEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnEq(params))) - return this - }, - /** - * Add a verify_uintn_biguintn_eq(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnBiguintnEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnEq(params))) - return this - }, - /** - * Add a verify_biguintn_biguintn_eq(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnBiguintnEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnEq(params))) - return this - }, - /** - * Add a verify_uintn_uintn_ne(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnUintnNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnNe(params))) - return this - }, - /** - * Add a verify_biguintn_uintn_ne(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnUintnNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnNe(params))) - return this - }, - /** - * Add a verify_uintn_biguintn_ne(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnBiguintnNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnNe(params))) - return this - }, - /** - * Add a verify_biguintn_biguintn_ne(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnBiguintnNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnNe(params))) - return this - }, - /** - * Add a verify_uintn_uintn_lt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnUintnLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnLt(params))) - return this - }, - /** - * Add a verify_biguintn_uintn_lt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnUintnLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnLt(params))) - return this - }, - /** - * Add a verify_uintn_biguintn_lt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnBiguintnLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnLt(params))) - return this - }, - /** - * Add a verify_biguintn_biguintn_lt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnBiguintnLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnLt(params))) - return this - }, - /** - * Add a verify_uintn_uintn_le(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnUintnLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnLe(params))) - return this - }, - /** - * Add a verify_biguintn_uintn_le(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnUintnLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnLe(params))) - return this - }, - /** - * Add a verify_uintn_biguintn_le(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnBiguintnLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnLe(params))) - return this - }, - /** - * Add a verify_biguintn_biguintn_le(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnBiguintnLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnLe(params))) - return this - }, - /** - * Add a verify_uintn_uintn_gt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnUintnGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnGt(params))) - return this - }, - /** - * Add a verify_biguintn_uintn_gt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnUintnGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnGt(params))) - return this - }, - /** - * Add a verify_uintn_biguintn_gt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnBiguintnGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnGt(params))) - return this - }, - /** - * Add a verify_biguintn_biguintn_gt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnBiguintnGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnGt(params))) - return this - }, - /** - * Add a verify_uintn_uintn_ge(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnUintnGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnGe(params))) - return this - }, - /** - * Add a verify_biguintn_uintn_ge(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnUintnGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnGe(params))) - return this - }, - /** - * Add a verify_uintn_biguintn_ge(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnBiguintnGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnGe(params))) - return this - }, - /** - * Add a verify_biguintn_biguintn_ge(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnBiguintnGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnGe(params))) - return this - }, - /** - * Add a verify_uintn_init(byte[])uint32 method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnInit(params))) - return this - }, - /** - * Add a verify_biguintn_init(byte[])uint256 method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnInit(params))) - return this - }, - /** - * Add a verify_uintn_from_bytes(byte[])uint32 method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnFromBytes(params))) - return this - }, - /** - * Add a verify_biguintn_from_bytes(byte[])uint256 method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnFromBytes(params))) - return this - }, - /** - * Add a verify_uintn_from_log(byte[])uint32 method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintnFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnFromLog(params))) - return this - }, - /** - * Add a verify_biguintn_from_log(byte[])uint256 method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnFromLog(params))) - return this - }, - /** - * Add a verify_biguintn_as_uint64(byte[])uint64 method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnAsUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnAsUint64(params))) - return this - }, - /** - * Add a verify_biguintn_as_biguint(byte[])uint512 method call against the Arc4PrimitiveOpsContract contract - */ - verifyBiguintnAsBiguint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnAsBiguint(params))) - return this - }, - /** - * Add a verify_uintn64_as_uint64(byte[])uint64 method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintn64AsUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintn64AsUint64(params))) - return this - }, - /** - * Add a verify_uintn64_as_biguint(byte[])uint512 method call against the Arc4PrimitiveOpsContract contract - */ - verifyUintn64AsBiguint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintn64AsBiguint(params))) - return this - }, - /** - * Add a verify_ufixednxm_bytes(ufixed32x8)byte[] method call against the Arc4PrimitiveOpsContract contract - */ - verifyUfixednxmBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUfixednxmBytes(params))) - return this - }, - /** - * Add a verify_bigufixednxm_bytes(ufixed256x16)byte[] method call against the Arc4PrimitiveOpsContract contract - */ - verifyBigufixednxmBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBigufixednxmBytes(params))) - return this - }, - /** - * Add a verify_ufixednxm_from_bytes(byte[])ufixed32x8 method call against the Arc4PrimitiveOpsContract contract - */ - verifyUfixednxmFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUfixednxmFromBytes(params))) - return this - }, - /** - * Add a verify_bigufixednxm_from_bytes(byte[])ufixed256x16 method call against the Arc4PrimitiveOpsContract contract - */ - verifyBigufixednxmFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBigufixednxmFromBytes(params))) - return this - }, - /** - * Add a verify_ufixednxm_from_log(byte[])ufixed32x8 method call against the Arc4PrimitiveOpsContract contract - */ - verifyUfixednxmFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUfixednxmFromLog(params))) - return this - }, - /** - * Add a verify_bigufixednxm_from_log(byte[])ufixed256x16 method call against the Arc4PrimitiveOpsContract contract - */ - verifyBigufixednxmFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBigufixednxmFromLog(params))) - return this - }, - /** - * Add a verify_string_init(string)string method call against the Arc4PrimitiveOpsContract contract - */ - verifyStringInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringInit(params))) - return this - }, - /** - * Add a verify_string_add(string,string)string method call against the Arc4PrimitiveOpsContract contract - */ - verifyStringAdd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringAdd(params))) - return this - }, - /** - * Add a verify_string_eq(string,string)bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyStringEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringEq(params))) - return this - }, - /** - * Add a verify_string_bytes(string)byte[] method call against the Arc4PrimitiveOpsContract contract - */ - verifyStringBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringBytes(params))) - return this - }, - /** - * Add a verify_string_from_bytes(byte[])string method call against the Arc4PrimitiveOpsContract contract - */ - verifyStringFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringFromBytes(params))) - return this - }, - /** - * Add a verify_string_from_log(byte[])string method call against the Arc4PrimitiveOpsContract contract - */ - verifyStringFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringFromLog(params))) - return this - }, - /** - * Add a verify_bool_bytes(bool)byte[] method call against the Arc4PrimitiveOpsContract contract - */ - verifyBoolBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBoolBytes(params))) - return this - }, - /** - * Add a verify_bool_from_bytes(byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBoolFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBoolFromBytes(params))) - return this - }, - /** - * Add a verify_bool_from_log(byte[])bool method call against the Arc4PrimitiveOpsContract contract - */ - verifyBoolFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBoolFromLog(params))) - return this - }, - /** - * Add a verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void method call against the Arc4PrimitiveOpsContract contract - */ - verifyEmit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEmit(params))) - return this - }, - /** - * Add a clear state call to the Arc4PrimitiveOpsContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as Arc4PrimitiveOpsContractComposer - } -} -export type Arc4PrimitiveOpsContractComposer = { - /** - * Calls the verify_uintn_uintn_eq(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnUintnEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_eq(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_uintn_eq(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnUintnEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_eq(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_biguintn_eq(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnBiguintnEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_eq(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_biguintn_eq(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnBiguintnEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_eq(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_uintn_ne(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnUintnNe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ne(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_uintn_ne(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnUintnNe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ne(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_biguintn_ne(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnBiguintnNe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ne(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_biguintn_ne(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnBiguintnNe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ne(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_uintn_lt(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnUintnLt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_lt(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_uintn_lt(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnUintnLt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_lt(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_biguintn_lt(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnBiguintnLt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_lt(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_biguintn_lt(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnBiguintnLt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_lt(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_uintn_le(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnUintnLe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_le(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_uintn_le(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnUintnLe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_le(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_biguintn_le(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnBiguintnLe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_le(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_biguintn_le(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnBiguintnLe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_le(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_uintn_gt(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnUintnGt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_gt(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_uintn_gt(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnUintnGt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_gt(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_biguintn_gt(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnBiguintnGt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_gt(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_biguintn_gt(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnBiguintnGt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_gt(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_uintn_ge(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnUintnGe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ge(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_uintn_ge(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnUintnGe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ge(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_biguintn_ge(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnBiguintnGe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ge(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguintn_biguintn_ge(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnBiguintnGe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ge(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_uintn_init(byte[])uint32 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnInit(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_init(byte[])uint32'] | undefined]> - - /** - * Calls the verify_biguintn_init(byte[])uint256 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnInit(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_init(byte[])uint256'] | undefined]> - - /** - * Calls the verify_uintn_from_bytes(byte[])uint32 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_from_bytes(byte[])uint32'] | undefined]> - - /** - * Calls the verify_biguintn_from_bytes(byte[])uint256 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_from_bytes(byte[])uint256'] | undefined]> - - /** - * Calls the verify_uintn_from_log(byte[])uint32 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintnFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_from_log(byte[])uint32'] | undefined]> - - /** - * Calls the verify_biguintn_from_log(byte[])uint256 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_from_log(byte[])uint256'] | undefined]> - - /** - * Calls the verify_biguintn_as_uint64(byte[])uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnAsUint64(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_as_uint64(byte[])uint64'] | undefined]> - - /** - * Calls the verify_biguintn_as_biguint(byte[])uint512 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintnAsBiguint(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_as_biguint(byte[])uint512'] | undefined]> - - /** - * Calls the verify_uintn64_as_uint64(byte[])uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintn64AsUint64(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn64_as_uint64(byte[])uint64'] | undefined]> - - /** - * Calls the verify_uintn64_as_biguint(byte[])uint512 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUintn64AsBiguint(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn64_as_biguint(byte[])uint512'] | undefined]> - - /** - * Calls the verify_ufixednxm_bytes(ufixed32x8)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUfixednxmBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_ufixednxm_bytes(ufixed32x8)byte[]'] | undefined]> - - /** - * Calls the verify_bigufixednxm_bytes(ufixed256x16)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBigufixednxmBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_bytes(ufixed256x16)byte[]'] | undefined]> - - /** - * Calls the verify_ufixednxm_from_bytes(byte[])ufixed32x8 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUfixednxmFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_bytes(byte[])ufixed32x8'] | undefined]> - - /** - * Calls the verify_bigufixednxm_from_bytes(byte[])ufixed256x16 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBigufixednxmFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'] | undefined]> - - /** - * Calls the verify_ufixednxm_from_log(byte[])ufixed32x8 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUfixednxmFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_log(byte[])ufixed32x8'] | undefined]> - - /** - * Calls the verify_bigufixednxm_from_log(byte[])ufixed256x16 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBigufixednxmFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_log(byte[])ufixed256x16'] | undefined]> - - /** - * Calls the verify_string_init(string)string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyStringInit(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_init(string)string'] | undefined]> - - /** - * Calls the verify_string_add(string,string)string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyStringAdd(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_add(string,string)string'] | undefined]> - - /** - * Calls the verify_string_eq(string,string)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyStringEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_eq(string,string)bool'] | undefined]> - - /** - * Calls the verify_string_bytes(string)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyStringBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_bytes(string)byte[]'] | undefined]> - - /** - * Calls the verify_string_from_bytes(byte[])string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyStringFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_from_bytes(byte[])string'] | undefined]> - - /** - * Calls the verify_string_from_log(byte[])string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyStringFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_from_log(byte[])string'] | undefined]> - - /** - * Calls the verify_bool_bytes(bool)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBoolBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bool_bytes(bool)byte[]'] | undefined]> - - /** - * Calls the verify_bool_from_bytes(byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBoolFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bool_from_bytes(byte[])bool'] | undefined]> - - /** - * Calls the verify_bool_from_log(byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBoolFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bool_from_log(byte[])bool'] | undefined]> - - /** - * Calls the verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyEmit(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the Arc4PrimitiveOpsContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): Arc4PrimitiveOpsContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type Arc4PrimitiveOpsContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/BoxContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/BoxContract.ts deleted file mode 100644 index 146a2d5..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/BoxContract.ts +++ /dev/null @@ -1,2352 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"BoxContract","structs":{"InnerStruct":[{"name":"c","type":"uint64"},{"name":"arrArr","type":"uint64[][]"},{"name":"d","type":"uint64"}],"LargeStruct":[{"name":"a","type":"byte[1024]"},{"name":"b","type":"byte[1024]"},{"name":"c","type":"byte[1024]"},{"name":"d","type":"byte[1024]"},{"name":"e","type":"uint64"},{"name":"f","type":"byte[1024]"},{"name":"g","type":"byte[1024]"},{"name":"h","type":"uint64"}],"NestedStruct":[{"name":"a","type":"uint64"},{"name":"inner","type":"InnerStruct"},{"name":"woah","type":"(uint64,uint64[][],uint64)[]"},{"name":"b","type":"uint64"}]},"methods":[{"name":"store_enums","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"read_enums","args":[],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_boxes","args":[{"type":"uint64","name":"a"},{"type":"byte[]","name":"b"},{"type":"string","name":"c"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"boxes_exist","args":[],"returns":{"type":"(bool,bool,bool,bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"check_keys","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"read_boxes","args":[],"returns":{"type":"(uint64,byte[],string,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"indirect_extract_and_replace","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"delete_boxes","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"slice_box","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"arc4_box","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"create_many_ints","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_many_ints","args":[{"type":"uint64","name":"index"},{"type":"uint64","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"sum_many_ints","args":[],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_box_ref","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_nested_struct","args":[{"type":"(uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64)","struct":"NestedStruct","name":"struct"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"nested_write","args":[{"type":"uint64","name":"index"},{"type":"uint64","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"nested_read","args":[{"type":"uint64","name":"i1"},{"type":"uint64","name":"i2"},{"type":"uint64","name":"i3"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"create_bools","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_bool","args":[{"type":"uint64","name":"index"},{"type":"bool","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"sum_bools","args":[{"type":"uint64","name":"stop_at_total"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_test","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_set","args":[{"type":"uint64","name":"key"},{"type":"string","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_get","args":[{"type":"uint64","name":"key"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_del","args":[{"type":"uint64","name":"key"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_exists","args":[{"type":"uint64","name":"key"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{"oca":{"keyType":"AVMString","valueType":"uint64","key":"b2Nh"},"txn":{"keyType":"AVMString","valueType":"uint64","key":"dHhu"},"box_a":{"keyType":"AVMString","valueType":"uint64","key":"Ym94X2E="},"box_b":{"keyType":"AVMString","valueType":"byte[]","key":"Yg=="},"box_c":{"keyType":"AVMBytes","valueType":"string","key":"Qk9YX0M="},"box_d":{"keyType":"AVMString","valueType":"AVMBytes","key":"Ym94X2Q="},"many_ints":{"keyType":"AVMString","valueType":"uint64[513]","key":"bWFueV9pbnRz"},"box_ref":{"keyType":"AVMString","valueType":"AVMBytes","key":"Ym94X3JlZg=="},"box_large":{"keyType":"AVMString","valueType":"LargeStruct","key":"Ym94X2xhcmdl"},"too_many_bools":{"keyType":"AVMString","valueType":"bool[33000]","key":"dG9vX21hbnlfYm9vbHM="}}},"maps":{"global":{},"local":{},"box":{"box_map":{"keyType":"uint64","valueType":"AVMString","prefix":""}}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[842],"errorMessage":"check Box exists"},{"pc":[486],"errorMessage":"check self.box_a exists"},{"pc":[851],"errorMessage":"check self.box_b exists"},{"pc":[514,857],"errorMessage":"check self.box_c exists"},{"pc":[1932],"errorMessage":"check self.box_map entry exists"},{"pc":[1178],"errorMessage":"check self.many_ints exists"},{"pc":[378],"errorMessage":"check self.oca exists"},{"pc":[1795],"errorMessage":"check self.too_many_bools exists"},{"pc":[390],"errorMessage":"check self.txn exists"},{"pc":[1773],"errorMessage":"index access is out of bounds"},{"pc":[1398,1425,1492,1517,1539,1587,1614,1660,1685,1710],"errorMessage":"index out of bounds"},{"pc":[1228],"errorMessage":"no data"},{"pc":[1329],"errorMessage":"struct.a is truthy"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDIgMCA4IDQwOTYgNDA5OCA0MTM4CiAgICBieXRlY2Jsb2NrICJib3giIDB4NDI0ZjU4NWY0MyAiYmxvYiIgImJveF9sYXJnZSIgMHgxNTFmN2M3NSAiYm94X2EiICJib3hfZCIgImIiICJ0b29fbWFueV9ib29scyIgIm1hbnlfaW50cyIgIjAiIDB4MDAwMjM0MzIgMHg2ODY1NmM2YzZmIDB4NmY2MzYxIDB4NzQ3ODZlIDB4MDY4MTAxICJib3hfcmVmIiAiZGVmYXVsdCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo1OQogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDM0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhmMjZjNmQ0MiAweGVmMTg2Y2Y3IDB4N2QzNzI5NmUgMHhmMTNkZDkzNyAweDMzMzI1ZDNkIDB4YTYxNzQ4MTIgMHhmYWJjYjg4NSAweGQ1NjZjNjMyIDB4MDRlZjQ5NzEgMHgyM2VjYjMyYyAweDAxOTk0MDhkIDB4NzcyMDU5Y2EgMHgwMTI2M2RmNiAweGVlZjc1ODE2IDB4OTk2NDk3YWUgMHg2Y2VjNzJmZiAweDZmOWQxMDc1IDB4NTllZjM3NjAgMHhhYTY2NmI5NiAweGRmYmRkNjM2IDB4YjUzMjkxM2EgMHhjMjlmMTY2OSAweDljODg4YzA5IDB4ZTZmNjg1MDYgMHg4ZWUyYzM2NCAvLyBtZXRob2QgInN0b3JlX2VudW1zKCl2b2lkIiwgbWV0aG9kICJyZWFkX2VudW1zKCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInNldF9ib3hlcyh1aW50NjQsYnl0ZVtdLHN0cmluZyl2b2lkIiwgbWV0aG9kICJib3hlc19leGlzdCgpKGJvb2wsYm9vbCxib29sLGJvb2wpIiwgbWV0aG9kICJjaGVja19rZXlzKCl2b2lkIiwgbWV0aG9kICJyZWFkX2JveGVzKCkodWludDY0LGJ5dGVbXSxzdHJpbmcsdWludDY0KSIsIG1ldGhvZCAiaW5kaXJlY3RfZXh0cmFjdF9hbmRfcmVwbGFjZSgpdm9pZCIsIG1ldGhvZCAiZGVsZXRlX2JveGVzKCl2b2lkIiwgbWV0aG9kICJzbGljZV9ib3goKXZvaWQiLCBtZXRob2QgImFyYzRfYm94KCl2b2lkIiwgbWV0aG9kICJjcmVhdGVfbWFueV9pbnRzKCl2b2lkIiwgbWV0aG9kICJzZXRfbWFueV9pbnRzKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAic3VtX21hbnlfaW50cygpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2JveF9yZWYoKXZvaWQiLCBtZXRob2QgInNldF9uZXN0ZWRfc3RydWN0KCh1aW50NjQsKHVpbnQ2NCx1aW50NjRbXVtdLHVpbnQ2NCksKHVpbnQ2NCx1aW50NjRbXVtdLHVpbnQ2NClbXSx1aW50NjQpKXZvaWQiLCBtZXRob2QgIm5lc3RlZF93cml0ZSh1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgIm5lc3RlZF9yZWFkKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiY3JlYXRlX2Jvb2xzKCl2b2lkIiwgbWV0aG9kICJzZXRfYm9vbCh1aW50NjQsYm9vbCl2b2lkIiwgbWV0aG9kICJzdW1fYm9vbHModWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiYm94X21hcF90ZXN0KCl2b2lkIiwgbWV0aG9kICJib3hfbWFwX3NldCh1aW50NjQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImJveF9tYXBfZ2V0KHVpbnQ2NClzdHJpbmciLCBtZXRob2QgImJveF9tYXBfZGVsKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJib3hfbWFwX2V4aXN0cyh1aW50NjQpYm9vbCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHN0b3JlX2VudW1zIHJlYWRfZW51bXMgc2V0X2JveGVzIGJveGVzX2V4aXN0IG1haW5fY2hlY2tfa2V5c19yb3V0ZUAxMCByZWFkX2JveGVzIGluZGlyZWN0X2V4dHJhY3RfYW5kX3JlcGxhY2UgZGVsZXRlX2JveGVzIHNsaWNlX2JveCBtYWluX2FyYzRfYm94X3JvdXRlQDE1IG1haW5fY3JlYXRlX21hbnlfaW50c19yb3V0ZUAxNiBzZXRfbWFueV9pbnRzIHN1bV9tYW55X2ludHMgdGVzdF9ib3hfcmVmIHNldF9uZXN0ZWRfc3RydWN0IG5lc3RlZF93cml0ZSBuZXN0ZWRfcmVhZCBtYWluX2NyZWF0ZV9ib29sc19yb3V0ZUAyMyBzZXRfYm9vbCBzdW1fYm9vbHMgYm94X21hcF90ZXN0IGJveF9tYXBfc2V0IGJveF9tYXBfZ2V0IGJveF9tYXBfZGVsIGJveF9tYXBfZXhpc3RzCiAgICBlcnIKCm1haW5fY3JlYXRlX2Jvb2xzX3JvdXRlQDIzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI4MQogICAgLy8gc2VsZi50b29fbWFueV9ib29scy5jcmVhdGUoKQogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICBwdXNoaW50IDQxMjUKICAgIGJveF9jcmVhdGUKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NyZWF0ZV9tYW55X2ludHNfcm91dGVAMTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTgxCiAgICAvLyBzZWxmLm1hbnlfaW50cy5jcmVhdGUoKQogICAgYnl0ZWMgOSAvLyAibWFueV9pbnRzIgogICAgcHVzaGludCA0MTA0CiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzRfYm94X3JvdXRlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE3MS0xNzIKICAgIC8vIGJveF9kID0gQm94KFN0YXRpY0ludHMsIGtleT1CeXRlcyhiImQiKSkKICAgIC8vIGJveF9kLnZhbHVlID0gU3RhdGljSW50cyhhcmM0LlVJbnQ4KDApLCBhcmM0LlVJbnQ4KDEpLCBhcmM0LlVJbnQ4KDIpLCBhcmM0LlVJbnQ4KDMpKQogICAgcHVzaGJ5dGVzcyAweDY0IDB4MDAwMTAyMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNzIKICAgIC8vIGJveF9kLnZhbHVlID0gU3RhdGljSW50cyhhcmM0LlVJbnQ4KDApLCBhcmM0LlVJbnQ4KDEpLCBhcmM0LlVJbnQ4KDIpLCBhcmM0LlVJbnQ4KDMpKQogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoZWNrX2tleXNfcm91dGVAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMzQ6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdG9yZV9lbnVtc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnN0b3JlX2VudW1zOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBzZWxmLm9jYS52YWx1ZSA9IE9uQ29tcGxldGVBY3Rpb24uT3B0SW4KICAgIGludGNfMCAvLyBPcHRJbgogICAgaXRvYgogICAgYnl0ZWMgMTMgLy8gIm9jYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3NgogICAgLy8gc2VsZi50eG4udmFsdWUgPSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXRvYgogICAgYnl0ZWMgMTQgLy8gInR4biIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QucmVhZF9lbnVtc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlYWRfZW51bXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODAKICAgIC8vIGFzc2VydCBvcC5Cb3guZ2V0KGIib2NhIilbMF0gPT0gb3AuaXRvYihzZWxmLm9jYS52YWx1ZSkKICAgIGJ5dGVjIDEzIC8vIDB4NmY2MzYxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vY2EgZXhpc3RzCiAgICBkdXAKICAgIGJ0b2kKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODEKICAgIC8vIGFzc2VydCBvcC5Cb3guZ2V0KGIidHhuIilbMF0gPT0gb3AuaXRvYihzZWxmLnR4bi52YWx1ZSkKICAgIGJ5dGVjIDE0IC8vIDB4NzQ3ODZlCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50eG4gZXhpc3RzCiAgICBkdXAKICAgIGJ0b2kKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODMKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKChhcmM0LlVJbnQ2NChzZWxmLm9jYS52YWx1ZSksIGFyYzQuVUludDY0KHNlbGYudHhuLnZhbHVlKSkpCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3Quc2V0X2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2JveGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4NwogICAgLy8gc2VsZi5ib3hfYS52YWx1ZSA9IGEKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgYnl0ZWMgNSAvLyAiYm94X2EiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODgKICAgIC8vIHNlbGYuYm94X2IudmFsdWUgPSBiLmNvcHkoKQogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODkKICAgIC8vIHNlbGYuYm94X2MudmFsdWUgPSBjCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5MAogICAgLy8gc2VsZi5ib3hfZC52YWx1ZSA9IGIubmF0aXZlCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyA2IC8vICJib3hfZCIKICAgIGRpZyAxCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6OTEKICAgIC8vIHNlbGYuYm94X2xhcmdlLmNyZWF0ZSgpCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBwdXNoaW50IDYxNjAKICAgIGJveF9jcmVhdGUKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjkyCiAgICAvLyBzZWxmLmJveF9sYXJnZS52YWx1ZS5lID0gVUludDY0KDQyKQogICAgcHVzaGludCA0MgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgaW50YyA0IC8vIDQwOTYKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5MwogICAgLy8gc2VsZi5ib3hfbGFyZ2UucmVwbGFjZShzaXplX29mKEJ5dGVzMTAyNCkgKiA0LCBhcmM0LlVJbnQ2NCg0MikuYnl0ZXMpCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBpbnRjIDQgLy8gNDA5NgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAyYQogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5OAogICAgLy8gc2VsZi5ib3hfYS52YWx1ZSArPSAzCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9hIGV4aXN0cwogICAgYnRvaQogICAgcHVzaGludCAzCiAgICArCiAgICBpdG9iCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMDAtMTAxCiAgICAvLyAjIHRlc3QgLmxlbmd0aAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2EubGVuZ3RoID09IDgKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2IubGVuZ3RoID09IGIuYnl0ZXMubGVuZ3RoCiAgICBieXRlYyA3IC8vICJiIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkaWcgMwogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTAzCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy5sZW5ndGggPT0gYy5ieXRlcy5sZW5ndGgKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYyBleGlzdHMKICAgIGRpZyAyCiAgICBsZW4KICAgIGR1cDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMDQKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLmxlbmd0aCA9PSBiLm5hdGl2ZS5sZW5ndGgKICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkaWcgMwogICAgbGVuCiAgICBkdXAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTA2LTEwNwogICAgLy8gIyB0ZXN0IC52YWx1ZS5ieXRlcwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbMF0gPT0gYy5ieXRlc1swXQogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGludGNfMiAvLyAwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyA2CiAgICBleHRyYWN0IDAgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwOAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbLTFdID09IGMuYnl0ZXNbLTFdCiAgICBkaWcgMwogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZGlnIDcKICAgIHN3YXAKICAgIGludGNfMCAvLyAxCiAgICBleHRyYWN0MwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbOi0xXSA9PSBjLmJ5dGVzWzotMV0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgNAogICAgPAogICAgZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDEKICAgIGRpZyA0CiAgICA+PQogICAgaW50Y18wIC8vIDEKICAgIGRpZyA1CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHN3YXAKICAgIC0KICAgIGRpZyA3CiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTEwCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy52YWx1ZS5ieXRlc1s6Ml0gPT0gYy5ieXRlc1s6Ml0KICAgIGludGNfMSAvLyAyCiAgICBkaWcgNAogICAgPAogICAgdW5jb3ZlciA0CiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18xIC8vIDIKICAgIGRpZyA0CiAgICA+PQogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgNQogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExMi0xMTMKICAgIC8vICMgdGVzdCAudmFsdWUgd2l0aCBCeXRlcyB0eXBlCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVswXSA9PSBiLm5hdGl2ZVswXQogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICB1bmNvdmVyIDQKICAgIGV4dHJhY3QgMiAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTE0CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVstMV0gPT0gYi5uYXRpdmVbLTFdCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgc3dhcAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGRpZyA0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgZXh0cmFjdDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMTUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWzotMV0gPT0gYi5uYXRpdmVbOi0xXQogICAgaW50Y18wIC8vIDEKICAgIGRpZyAyCiAgICA8CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMgogICAgc3dhcAogICAgLQogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDEKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18wIC8vIDEKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDIKICAgIHN3YXAKICAgIC0KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVs6NV0gPT0gYi5uYXRpdmVbOjVdCiAgICBwdXNoaW50IDUKICAgIGRpZyAyCiAgICA8CiAgICBkaWcgMgogICAgcHVzaGludCA1CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgcHVzaGludCA1CiAgICBkaWcgMgogICAgPj0KICAgIHB1c2hpbnQgNQogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgNAogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExNwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2QudmFsdWVbOiBVSW50NjQoMildID09IGIubmF0aXZlWzogVUludDY0KDIpXQogICAgaW50Y18xIC8vIDIKICAgIGRpZyAyCiAgICA8CiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18xIC8vIDIKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExOQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2xhcmdlLmxlbmd0aCA9PSBzaXplX29mKExhcmdlU3RydWN0KQogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgYm94X2xlbgogICAgcG9wCiAgICBwdXNoaW50IDYxNjAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmJveGVzX2V4aXN0W3JvdXRpbmddKCkgLT4gdm9pZDoKYm94ZXNfZXhpc3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTIzCiAgICAvLyByZXR1cm4gYm9vbChzZWxmLmJveF9hKSwgYm9vbChzZWxmLmJveF9iKSwgYm9vbChzZWxmLmJveF9jKSwgYm9vbChzZWxmLmJveF9sYXJnZSkKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieXRlYyA3IC8vICJiIgogICAgYm94X2xlbgogICAgY292ZXIgMgogICAgcG9wCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2xlbgogICAgY292ZXIgMwogICAgcG9wCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBib3hfbGVuCiAgICBjb3ZlciA0CiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMwogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QucmVhZF9ib3hlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlYWRfYm94ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM1CiAgICAvLyBnZXRfYm94X3ZhbHVlX3BsdXNfMShzZWxmLmJveF9hKSAtIDEsCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozNDUKICAgIC8vIHJldHVybiBib3gudmFsdWUgKyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMzUKICAgIC8vIGdldF9ib3hfdmFsdWVfcGx1c18xKHNlbGYuYm94X2EpIC0gMSwKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM2CiAgICAvLyBzZWxmLmJveF9iLnZhbHVlLm5hdGl2ZSwKICAgIGJ5dGVjIDcgLy8gImIiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYiBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM3CiAgICAvLyBzZWxmLmJveF9jLnZhbHVlLAogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9jIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEzOAogICAgLy8gc2VsZi5ib3hfbGFyZ2UudmFsdWUuZSwKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIGludGMgNCAvLyA0MDk2CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMTQKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCAyMAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmluZGlyZWN0X2V4dHJhY3RfYW5kX3JlcGxhY2Vbcm91dGluZ10oKSAtPiB2b2lkOgppbmRpcmVjdF9leHRyYWN0X2FuZF9yZXBsYWNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0MwogICAgLy8gbGFyZ2UgPSBzZWxmLmJveF9sYXJnZS52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyBsYXJnZSA9IHNlbGYuYm94X2xhcmdlLnZhbHVlLmNvcHkoKQogICAgLy8gbGFyZ2UuZSArPSAxCiAgICBpbnRjIDQgLy8gNDA5NgogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTQ0CiAgICAvLyBsYXJnZS5lICs9IDEKICAgIGJ0b2kKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTQ1CiAgICAvLyBzZWxmLmJveF9sYXJnZS52YWx1ZSA9IGxhcmdlLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0My0xNDUKICAgIC8vIGxhcmdlID0gc2VsZi5ib3hfbGFyZ2UudmFsdWUuY29weSgpCiAgICAvLyBsYXJnZS5lICs9IDEKICAgIC8vIHNlbGYuYm94X2xhcmdlLnZhbHVlID0gbGFyZ2UuY29weSgpCiAgICBpbnRjIDQgLy8gNDA5NgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuZGVsZXRlX2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZGVsZXRlX2JveGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0OQogICAgLy8gZGVsIHNlbGYuYm94X2EudmFsdWUKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTUwCiAgICAvLyBkZWwgc2VsZi5ib3hfYi52YWx1ZQogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE1MQogICAgLy8gZGVsIHNlbGYuYm94X2MudmFsdWUKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTIKICAgIC8vIGFzc2VydCBzZWxmLmJveF9hLmdldChkZWZhdWx0PVVJbnQ2NCg0MikpID09IDQyCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIHB1c2hpbnQgNDIKICAgIGRpZyAxCiAgICBkaWcgMwogICAgc2VsZWN0CiAgICBwdXNoaW50IDQyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTUzCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYi5nZXQoZGVmYXVsdD1hcmM0LkR5bmFtaWNCeXRlcyhiIjQyIikpLm5hdGl2ZSA9PSBiIjQyIgogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9nZXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMjM0MzIKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAweDM0MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTQKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLmdldChkZWZhdWx0PWFyYzQuU3RyaW5nKCI0MiIpKSA9PSAiNDIiCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2dldAogICAgYnl0ZWMgMTEgLy8gMHgwMDAyMzQzMgogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlYyAxMSAvLyAweDAwMDIzNDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTU2CiAgICAvLyBhc3NlcnQgbm90IGFfZXhpc3RzCiAgICBzd2FwCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTcKICAgIC8vIGFzc2VydCBhID09IDAKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE1OAogICAgLy8gZGVsIHNlbGYuYm94X2xhcmdlLnZhbHVlCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zbGljZV9ib3hbcm91dGluZ10oKSAtPiB2b2lkOgpzbGljZV9ib3g6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYyCiAgICAvLyBib3hfMCA9IEJveChCeXRlcywga2V5PVN0cmluZygiMCIpKQogICAgYnl0ZWMgMTAgLy8gIjAiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYzCiAgICAvLyBib3hfMC52YWx1ZSA9IEJ5dGVzKGIiVGVzdGluZyB0ZXN0aW5nIDEyMyIpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjIKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyAxMCAvLyAiMCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjMKICAgIC8vIGJveF8wLnZhbHVlID0gQnl0ZXMoYiJUZXN0aW5nIHRlc3RpbmcgMTIzIikKICAgIHB1c2hieXRlcyAweDU0NjU3Mzc0Njk2ZTY3MjA3NDY1NzM3NDY5NmU2NzIwMzEzMjMzCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYyCiAgICAvLyBib3hfMCA9IEJveChCeXRlcywga2V5PVN0cmluZygiMCIpKQogICAgYnl0ZWMgMTAgLy8gIjAiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTY0CiAgICAvLyBhc3NlcnQgYm94XzAudmFsdWVbMDo3XSA9PSBiIlRlc3RpbmciCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGR1cAogICAgaW50Y18yIC8vIDAKICAgIGRpZyAyCiAgICBzZWxlY3QKICAgIHB1c2hpbnQgNwogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDEKICAgIC0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjIKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyAxMCAvLyAiMCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjQKICAgIC8vIGFzc2VydCBib3hfMC52YWx1ZVswOjddID09IGIiVGVzdGluZyIKICAgIGNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBwdXNoYnl0ZXMgMHg1NDY1NzM3NDY5NmU2NwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2NgogICAgLy8gc2VsZi5ib3hfYy52YWx1ZSA9IGFyYzQuU3RyaW5nKCJIZWxsbyIpCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgcHVzaGJ5dGVzIDB4MDAwNTQ4NjU2YzZjNmYKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjcKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLnZhbHVlLmJ5dGVzWzI6MTBdID09IGIiSGVsbG8iCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzEgLy8gMgogICAgZGlnIDEKICAgIDwKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHB1c2hpbnQgMTAKICAgIGRpZyAyCiAgICA8CiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgMTAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMQogICAgLQogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBwdXNoYnl0ZXMgMHg0ODY1NmM2YzZmCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3Quc2V0X21hbnlfaW50c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9tYW55X2ludHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE4NQogICAgLy8gc2VsZi5tYW55X2ludHMudmFsdWVbaW5kZXhdID0gdmFsdWUKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBieXRlYyA5IC8vICJtYW55X2ludHMiCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdW1fbWFueV9pbnRzW3JvdXRpbmddKCkgLT4gdm9pZDoKc3VtX21hbnlfaW50czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCgpzdW1fbWFueV9pbnRzX3doaWxlX3RvcEA3OgogICAgcHVzaGludCAxMDUxMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogc3VtX21hbnlfaW50c19hZnRlcl93aGlsZUAxMgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDE1IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMTUgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGludGNfMiAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgc3VtX21hbnlfaW50c193aGlsZV90b3BANwoKc3VtX21hbnlfaW50c19hZnRlcl93aGlsZUAxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTAKICAgIC8vIHRvdGFsID0gVUludDY0KDApCiAgICBpbnRjXzIgLy8gMAogICAgYnVyeSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTkxCiAgICAvLyBmb3IgdmFsIGluIHNlbGYubWFueV9pbnRzLnZhbHVlOgogICAgYnl0ZWMgOSAvLyAibWFueV9pbnRzIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYW55X2ludHMgZXhpc3RzCiAgICBpbnRjXzIgLy8gMAogICAgYnVyeSAyCgpzdW1fbWFueV9pbnRzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTEKICAgIC8vIGZvciB2YWwgaW4gc2VsZi5tYW55X2ludHMudmFsdWU6CiAgICBkaWcgMQogICAgcHVzaGludCA1MTMKICAgIDwKICAgIGJ6IHN1bV9tYW55X2ludHNfYWZ0ZXJfZm9yQDUKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBieXRlYyA5IC8vICJtYW55X2ludHMiCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTIKICAgIC8vIHRvdGFsID0gdG90YWwgKyB2YWwKICAgIGRpZyAyCiAgICArCiAgICBidXJ5IDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDIKICAgIGIgc3VtX21hbnlfaW50c19mb3JfaGVhZGVyQDIKCnN1bV9tYW55X2ludHNfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnRlc3RfYm94X3JlZltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYm94X3JlZjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTctMTk4CiAgICAvLyAjIGluaXQgcmVmLCB3aXRoIHZhbGlkIGtleSB0eXBlcwogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PSJibG9iIikKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTk5CiAgICAvLyBhc3NlcnQgbm90IGJveF9yZWYsICJubyBkYXRhIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gbm8gZGF0YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDctMjA4CiAgICAvLyAjIGNyZWF0ZQogICAgLy8gYXNzZXJ0IGJveF9yZWYuY3JlYXRlKHNpemU9VUludDY0KDMyKSkKICAgIHB1c2hpbnQgMzIKICAgIGJveF9jcmVhdGUKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxMS0yMTIKICAgIC8vICMgbWFuaXB1bGF0ZSBkYXRhCiAgICAvLyBzZW5kZXJfYnl0ZXMgPSBUeG4uc2VuZGVyLmJ5dGVzCiAgICB0eG4gU2VuZGVyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjEzCiAgICAvLyBhcHBfYWRkcmVzcyA9IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MuYnl0ZXMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxNQogICAgLy8gYm94X3JlZi5yZXBsYWNlKDAsIHNlbmRlcl9ieXRlcykKICAgIGludGNfMiAvLyAwCiAgICBkaWcgMwogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE2CiAgICAvLyBib3hfcmVmLnJlc2l6ZSg4MDAwKQogICAgcHVzaGludCA4MDAwCiAgICBib3hfcmVzaXplCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxNwogICAgLy8gYm94X3JlZi5zcGxpY2UoMCwgMCwgYXBwX2FkZHJlc3MpCiAgICBpbnRjXzIgLy8gMAogICAgZHVwCiAgICBkaWcgMwogICAgYm94X3NwbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTgKICAgIC8vIGJveF9yZWYucmVwbGFjZSg2NCwgdmFsdWVfMykKICAgIHB1c2hpbnQgNjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTQKICAgIC8vIHZhbHVlXzMgPSBCeXRlcyhiImhlbGxvIikKICAgIGJ5dGVjIDEyIC8vIDB4Njg2NTZjNmM2ZgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxOAogICAgLy8gYm94X3JlZi5yZXBsYWNlKDY0LCB2YWx1ZV8zKQogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE5CiAgICAvLyBwcmVmaXggPSBib3hfcmVmLmV4dHJhY3QoMCwgMzIgKiAyICsgdmFsdWVfMy5sZW5ndGgpCiAgICBpbnRjXzIgLy8gMAogICAgcHVzaGludCA2OQogICAgYm94X2V4dHJhY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMjAKICAgIC8vIGFzc2VydCBwcmVmaXggPT0gYXBwX2FkZHJlc3MgKyBzZW5kZXJfYnl0ZXMgKyB2YWx1ZV8zCiAgICBkaWcgMQogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxNAogICAgLy8gdmFsdWVfMyA9IEJ5dGVzKGIiaGVsbG8iKQogICAgYnl0ZWMgMTIgLy8gMHg2ODY1NmM2YzZmCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjIwCiAgICAvLyBhc3NlcnQgcHJlZml4ID09IGFwcF9hZGRyZXNzICsgc2VuZGVyX2J5dGVzICsgdmFsdWVfMwogICAgY29uY2F0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyMi0yMjMKICAgIC8vICMgZGVsZXRlCiAgICAvLyBkZWwgYm94X3JlZi52YWx1ZQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyNi0yMjcKICAgIC8vICMgcXVlcnkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBib3hfcmVmLm1heWJlKCkKICAgIGJveF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMjgKICAgIC8vIGFzc2VydCBub3QgZXhpc3RzCiAgICBkdXAKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyOQogICAgLy8gYXNzZXJ0IHZhbHVlID09IGIiIgogICAgZGlnIDEKICAgIHB1c2hieXRlcyAweAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzMAogICAgLy8gYXNzZXJ0IGJveF9yZWYuZ2V0KGRlZmF1bHQ9c2VuZGVyX2J5dGVzKSA9PSBzZW5kZXJfYnl0ZXMKICAgIGRpZyAzCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjMyLTIzMwogICAgLy8gIyB1cGRhdGUKICAgIC8vIGJveF9yZWYudmFsdWUgPSBzZW5kZXJfYnl0ZXMgKyBhcHBfYWRkcmVzcwogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzMi0yMzMKICAgIC8vICMgdXBkYXRlCiAgICAvLyBib3hfcmVmLnZhbHVlID0gc2VuZGVyX2J5dGVzICsgYXBwX2FkZHJlc3MKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMzItMjMzCiAgICAvLyAjIHVwZGF0ZQogICAgLy8gYm94X3JlZi52YWx1ZSA9IHNlbmRlcl9ieXRlcyArIGFwcF9hZGRyZXNzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzNAogICAgLy8gYXNzZXJ0IGJveF9yZWYsICJCbG9iIGV4aXN0cyIKICAgIGJveF9sZW4KICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzNQogICAgLy8gYXNzZXJ0IGJveF9yZWYubGVuZ3RoID09IDY0CiAgICBwdXNoaW50IDY0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjM4LTIzOQogICAgLy8gIyBpbnN0YW5jZSBib3ggcmVmCiAgICAvLyBzZWxmLmJveF9yZWYuY3JlYXRlKHNpemU9VUludDY0KDMyKSkKICAgIGJ5dGVjIDE2IC8vICJib3hfcmVmIgogICAgcHVzaGludCAzMgogICAgYm94X2NyZWF0ZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQxCiAgICAvLyBkZWwgc2VsZi5ib3hfcmVmLnZhbHVlCiAgICBieXRlYyAxNiAvLyAiYm94X3JlZiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnNldF9uZXN0ZWRfc3RydWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X25lc3RlZF9zdHJ1Y3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0NgogICAgLy8gYXNzZXJ0IHN0cnVjdC5hLCAic3RydWN0LmEgaXMgdHJ1dGh5IgogICAgaW50Y18yIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBhc3NlcnQgLy8gc3RydWN0LmEgaXMgdHJ1dGh5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ3CiAgICAvLyBzdHJ1Y3RfYnl0ZXMgPSBUeG4uYXBwbGljYXRpb25fYXJncygxKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0OAogICAgLy8gc3RydWN0X3NpemUgPSBzdHJ1Y3RfYnl0ZXMubGVuZ3RoCiAgICBkdXAKICAgIGxlbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0OQogICAgLy8gdGFpbF9vZmZzZXQgPSBVSW50NjQoNDA5NiArIDIpCiAgICBpbnRjIDUgLy8gNDA5OAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1MC0yNTEKICAgIC8vICMgaW5pdGlhbGl6ZSBib3ggdG8gemVybwogICAgLy8gYm94LmNyZWF0ZShzaXplPXRhaWxfb2Zmc2V0ICsgc3RydWN0X3NpemUpCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ1CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTAtMjUxCiAgICAvLyAjIGluaXRpYWxpemUgYm94IHRvIHplcm8KICAgIC8vIGJveC5jcmVhdGUoc2l6ZT10YWlsX29mZnNldCArIHN0cnVjdF9zaXplKQogICAgc3dhcAogICAgYm94X2NyZWF0ZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ1CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTItMjUzCiAgICAvLyAjIHNldCBjb3JyZWN0IG9mZnNldCBmb3IgZHluYW1pYyBwb3J0aW9uCiAgICAvLyBib3gucmVwbGFjZSh0YWlsX29mZnNldCAtIDIsIGFyYzQuVUludDE2KHRhaWxfb2Zmc2V0KS5ieXRlcykKICAgIGludGMgNCAvLyA0MDk2CiAgICBwdXNoYnl0ZXMgMHgxMDAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0NQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ5CiAgICAvLyB0YWlsX29mZnNldCA9IFVJbnQ2NCg0MDk2ICsgMikKICAgIGludGMgNSAvLyA0MDk4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU0LTI1NQogICAgLy8gIyBzZXQgZHluYW1pYyBkYXRhCiAgICAvLyBib3gucmVwbGFjZSh0YWlsX29mZnNldCwgc3RydWN0X2J5dGVzKQogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QubmVzdGVkX3dyaXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKbmVzdGVkX3dyaXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYwCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmEgPSB2YWx1ZQogICAgaW50YyA1IC8vIDQwOTgKICAgIHVuY292ZXIgMwogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjEKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuYiA9IHZhbHVlICsgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYxCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmIgPSB2YWx1ZSArIDEKICAgIHB1c2hpbnQgNDExMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MgogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MgogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDIKICAgIHB1c2hpbnQgNDEzNgogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMwogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICBkaWcgMwogICAgKgogICAgaW50YyA2IC8vIDQxMzgKICAgIGRpZyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGMgNiAvLyA0MTM4CiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNQogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkaWcgNAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYzCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmlubmVyLmMgPSB2YWx1ZSArIDMKICAgIGRpZyAyCiAgICBwdXNoaW50IDMKICAgICsKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MwogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5jID0gdmFsdWUgKyAzCiAgICBwdXNoaW50IDQxMTgKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjQKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuZCA9IHZhbHVlICsgNAogICAgZGlnIDIKICAgIHB1c2hpbnQgNAogICAgKwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY0CiAgICAvLyBib3gudmFsdWUubmVzdGVkLmlubmVyLmQgPSB2YWx1ZSArIDQKICAgIHB1c2hpbnQgNDEyOAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA1CiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjUKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQud29haFtpbmRleF0uYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyA1CiAgICBwdXNoaW50IDQxMDgKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA1IC8vIDQwOTgKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyA1CiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGR1cAogICAgZGlnIDQKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgKwogICAgcHVzaGludCAxOAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDUKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZHVwCiAgICB1bmNvdmVyIDQKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgdW5jb3ZlciA0CiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgICsKICAgIHVuY292ZXIgMgogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QubmVzdGVkX3JlYWRbcm91dGluZ10oKSAtPiB2b2lkOgpuZXN0ZWRfcmVhZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzAKICAgIC8vIGEgPSBib3gudmFsdWUubmVzdGVkLmEKICAgIGludGMgNSAvLyA0MDk4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MQogICAgLy8gYiA9IGJveC52YWx1ZS5uZXN0ZWQuYgogICAgcHVzaGludCA0MTEwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBwdXNoaW50IDQxMzYKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDUKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgZGlnIDUKICAgICoKICAgIGludGMgNiAvLyA0MTM4CiAgICBkaWcgMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjcyCiAgICAvLyBhcnJfYXJyID0gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2kxXVtpMl0KICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA2IC8vIDQxMzgKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNgogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkaWcgNQogICAgaW50Y18zIC8vIDgKICAgICoKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MwogICAgLy8gYyA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYwogICAgcHVzaGludCA0MTE4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3NAogICAgLy8gZCA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuZAogICAgcHVzaGludCA0MTI4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3NQogICAgLy8gd29haF9hcnJfYXJyID0gYm94LnZhbHVlLm5lc3RlZC53b2FoW2kxXS5hcnJfYXJyW2kyXVtpM10KICAgIHB1c2hpbnQgNDEwOAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjIDUgLy8gNDA5OAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgdW5jb3ZlciAxMAogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkdXAKICAgIHVuY292ZXIgNQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICArCiAgICBwdXNoaW50IDE4CiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgOAogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciA4CiAgICAqCiAgICBkaWcgMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNwogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICB1bmNvdmVyIDYKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzcKICAgIC8vIHJldHVybiBhICsgYiArIGFycl9hcnIgKyBjICsgZCArIHdvYWhfYXJyX2FycgogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDUKICAgICsKICAgIHVuY292ZXIgNAogICAgKwogICAgdW5jb3ZlciAzCiAgICArCiAgICB1bmNvdmVyIDIKICAgICsKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnNldF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGludGNfMiAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyODUKICAgIC8vIHNlbGYudG9vX21hbnlfYm9vbHMudmFsdWVbaW5kZXhdID0gdmFsdWUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgJQogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICBkaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGJ5dGVjIDggLy8gInRvb19tYW55X2Jvb2xzIgogICAgY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdW1fYm9vbHNbcm91dGluZ10oKSAtPiB2b2lkOgpzdW1fYm9vbHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI4OQogICAgLy8gdG90YWwgPSBVSW50NjQoKQogICAgaW50Y18yIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyOTAKICAgIC8vIGZvciB2YWx1ZSBpbiBzZWxmLnRvb19tYW55X2Jvb2xzLnZhbHVlOgogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvb19tYW55X2Jvb2xzIGV4aXN0cwogICAgaW50Y18yIC8vIDAKCnN1bV9ib29sc19mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjkwCiAgICAvLyBmb3IgdmFsdWUgaW4gc2VsZi50b29fbWFueV9ib29scy52YWx1ZToKICAgIGR1cAogICAgcHVzaGludCAzMzAwMAogICAgPAogICAgYnogc3VtX2Jvb2xzX2FmdGVyX2ZvckA5CiAgICBkdXBuIDIKICAgIGludGNfMyAvLyA4CiAgICAvCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgJQogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgc3dhcAogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjkxCiAgICAvLyBpZiB2YWx1ZToKICAgIGJ6IHN1bV9ib29sc19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyOTIKICAgIC8vIHRvdGFsICs9IDEKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSAyCgpzdW1fYm9vbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI5MwogICAgLy8gaWYgdG90YWwgPT0gc3RvcF9hdF90b3RhbDoKICAgIGRpZyAxCiAgICBkaWcgMwogICAgPT0KICAgIGJueiBzdW1fYm9vbHNfYWZ0ZXJfZm9yQDkKICAgIGR1cAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBzdW1fYm9vbHNfZm9yX2hlYWRlckAyCgpzdW1fYm9vbHNfYWZ0ZXJfZm9yQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGl0b2IKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF90ZXN0W3JvdXRpbmddKCkgLT4gdm9pZDoKYm94X21hcF90ZXN0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI5OQogICAgLy8ga2V5XzAgPSBVSW50NjQoMCkKICAgIGludGNfMiAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAyCiAgICAvLyBzZWxmLmJveF9tYXBba2V5XzBdID0gdmFsdWUKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDEKICAgIC8vIHZhbHVlID0gU3RyaW5nKCJIbW1tbW0iKQogICAgcHVzaGJ5dGVzICJIbW1tbW0iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAyCiAgICAvLyBzZWxmLmJveF9tYXBba2V5XzBdID0gdmFsdWUKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9tYXBba2V5XzBdLmJ5dGVzLmxlbmd0aCA9PSB2YWx1ZS5ieXRlcy5sZW5ndGgKICAgIGJveF9sZW4KICAgIHBvcAogICAgcHVzaGludCA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAwCiAgICAvLyBrZXlfMSA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDkKICAgIC8vIGFzc2VydCBzZWxmLmJveF9tYXAuZ2V0KGtleV8xLCBkZWZhdWx0PVN0cmluZygiZGVmYXVsdCIpKSA9PSBTdHJpbmcoImRlZmF1bHQiKQogICAgaXRvYgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBieXRlYyAxNyAvLyAiZGVmYXVsdCIKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgMTcgLy8gImRlZmF1bHQiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzEwCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gc2VsZi5ib3hfbWFwLm1heWJlKGtleV8xKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMTEKICAgIC8vIGFzc2VydCBub3QgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMTcKICAgIC8vIHRtcF9ib3hfbWFwW2tleV8xXSA9IFN0cmluZygiaGVsbG8iKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGR1cAogICAgYnl0ZWMgMTIgLy8gImhlbGxvIgogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMxOQogICAgLy8gZGVsIHRtcF9ib3hfbWFwW2tleV8xXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9zZXRbcm91dGluZ10oKSAtPiB2b2lkOgpib3hfbWFwX3NldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjMKICAgIC8vIHNlbGYuYm94X21hcFtrZXldID0gdmFsdWUKICAgIHN3YXAKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9nZXRbcm91dGluZ10oKSAtPiB2b2lkOgpib3hfbWFwX2dldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyNwogICAgLy8gcmV0dXJuIHNlbGYuYm94X21hcFtrZXldCiAgICBpdG9iCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfbWFwIGVudHJ5IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX2RlbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJveF9tYXBfZGVsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzMxCiAgICAvLyBkZWwgc2VsZi5ib3hfbWFwW2tleV0KICAgIGl0b2IKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmJveF9tYXBfZXhpc3RzW3JvdXRpbmddKCkgLT4gdm9pZDoKYm94X21hcF9leGlzdHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMzUKICAgIC8vIHJldHVybiBrZXkgaW4gc2VsZi5ib3hfbWFwCiAgICBpdG9iCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAHAQIACIAggiCqICYSA2JveAVCT1hfQwRibG9iCWJveF9sYXJnZQQVH3x1BWJveF9hBWJveF9kAWIOdG9vX21hbnlfYm9vbHMJbWFueV9pbnRzATAEAAI0MgVoZWxsbwNvY2EDdHhuAwaBAQdib3hfcmVmB2RlZmF1bHQxG0EA3jEZFEQxGESCGQTybG1CBO8YbPcEfTcpbgTxPdk3BDMyXT0EphdIEgT6vLiFBNVmxjIEBO9JcQQj7LMsBAGZQI0EdyBZygQBJj32BO73WBYEmWSXrgRs7HL/BG+dEHUEWe83YASqZmuWBN+91jYEtTKROgTCnxZpBJyIjAkE5vaFBgSO4sNkNhoAjhkAKQA4AFgB2AAfAggCTgJfAqAAEwAKAx0DLwOIA+0EDwTRAAEFkwW6BgEGNAZHBl0GZgAnCIGdILlIIkMnCYGIILlIIkOCAgFkBAABAgO/IkMiQzEZFDEYFBBDIhYnDUy/gQYWJw5MvyJDJw2+REkXFkxLARJEJw6+REkXFkxLARJEUCcETFCwIkM2GgEXNhoCNhoDTwIWJwVMvycHvEgnB0sCvym8SClLAb9LAVcCACcGvEgnBksBvyuBkDC5SIEqFishBE8CuyshBIAIAAAAAAAAACq7JwW+RBeBAwgWJwVMvycFvUglEkQnB71ISwMVEkQpvURLAhVKEkQnBr1ISwMVShJEKSQiuksGVwABEkRLAyIJKUwiuksDIglLB0wiWBJEIksEDEsEIk8CTUsETAkpJE8CuiJLBA8iSwVPAk1LBEwJSwckTwJSEkQjSwQMTwQjTwJNKSRPArojSwQPI08FTwJNTwUkTwJSEkQnBiQiuk8EVwIBEkRLASIJJwZMIrpLASIJSwRMIlgSRCJLAgxLAiJPAk1LAkwJJwYkTwK6IksCDyJLA08CTUsCTAlLBCRPAlISRIEFSwIMSwKBBU8CTScGJE8CuoEFSwIPgQVLA08CTUsEJE8CUhJEI0sCDE8CI08CTScGJE8CuiNLAg8jTwNPAk1PAiRPAlISRCu9SIGQMBJEIkMnBb1FAScHvU4CSCm9TgNIK71OBEiAAQAkTwJUIk8CVCNPAlSBA08CVCcETFCwIkMnBb5EFyIIIgknB75EVwIAKb5EKyEEJboXTwMWSwMVFlcGAk8EUEyAAgAUUEsBFYEUCBZXBgJQTwIWUExQTFAnBExQsCJDKyEEJboXIggWKyEETwK7IkMnBbxIJwe8SCm8SCcFvkwXgSpLAUsDTYEqEkQnB74nC04CTVcCAIACNDISRCm+JwtOAk0nCxJETBREFEQrvEgiQycKvEgnCoATVGVzdGluZyB0ZXN0aW5nIDEyM78nCr1ISSRLAk2BB0sCDE8CgQdPAk1LAQknCk4CuoAHVGVzdGluZxJEKbxIKYAHAAVIZWxsb78pvUgjSwEMSwEjTwJNgQpLAgxPAoEKTwJNSwEJKU4CuoAFSGVsbG8SRCJDNhoBFzYaAkwlCycJTE8CuyJDgABJgY5SMgwNQQAYsYEGshCBBbIZJw+yHicPsh8ksgGzQv/fJEUBJwm9RQFEJEUCSwGBgQQMQQAXSwFJJQsnCUwluhdLAghFAiIIRQJC/+BJFicETFCwIkMqvUUBFEQqgSC5RDEAMgoqJEsDuyqBwD7TKiRJSwPSKoFAJwy7KiSBRbpLAUsDUCcMUBJEKrxIKr5JFERLAYAAEkRLA04CTUsCEkRQKrxIKky/Kr1IgUASRCcQgSC5SCcQvEgiQzYaASRbRDYaAUkVIQUIKEy5SCghBIACEAK7KCEFTwK7IkM2GgEXNhoCSRcoIQVPA7tJIggWKIGOIE8Cu0kjCBYogaggI7oXSwMNRCNLAwshBksBCChMI7oXIQYIKEsBI7oXSwUNRCMISwQlC0xLAQgoTE8Eu0sCgQMIFiiBliBPArtLAoEECBYogaAgTwK7TwKBBQgWKIGMICO6FyEFCChLASO6F0sFDUQjCElLBAgoTCO6FwiBEggoSwEjuhdLBQ1EIwhJTwQIKEwjuhcIKEsBI7oXTwQNRCMITwIIKExPArsiQzYaARc2GgIXNhoDFyghBSW6FyiBjiAluhcogaggI7oXSwUNRCNLBQshBksBCChMI7oXIQYIKEsBI7oXSwYNRCMISwUlCwgoTCW6FyiBliAluhcogaAgJboXKIGMICO6FyEFCChLASO6F08KDUQjCElPBQgoTCO6FwiBEggoSwEjuhdLCA1EIwgjTwgLSwEIKEwjuhcIKEsBI7oXSwcNRCMITwYlCwgoTCW6F08FTwUITwQITwMITwIICBYnBExQsCJDNhoBFzYaAiRTSwElCk8CJRgnCEsCIrpLASUMRExPA1QnCE4CuyJDNhoBFyQnCL1FAUQkSYHogQIMQQAoRwIlCkwlGCcITwIiukxTQQAGSwEiCEUCSwFLAxJAAAhJIghFAUL/z0sBFicETFCwIkMkFkm8SEmABkhtbW1tbb+9SIEGEkQiFkm+JxFOAk0nERJESb1FARRESbxISScMv7xIIkM2GgEXNhoCVwIATBZJvEhMvyJDNhoBFxa+REkVFlcGAkxQJwRMULAiQzYaARcWvEgiQzYaARcWvUUBgAEAJE8CVCcETFCwIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -// Type definitions for ARC-56 structs - -export type InnerStruct = { - c: bigint, - arrArr: bigint[][], - d: bigint -} - - -/** - * Converts the ABI tuple representation of a InnerStruct to the struct representation - */ -export function InnerStructFromTuple(abiTuple: [bigint, bigint[][], bigint]) { - const abiStructType = ABIStructType.fromStruct('InnerStruct', APP_SPEC.structs) - return getStructValueFromTupleValue(abiStructType, abiTuple) as InnerStruct -} - -export type LargeStruct = { - a: Uint8Array, - b: Uint8Array, - c: Uint8Array, - d: Uint8Array, - e: bigint, - f: Uint8Array, - g: Uint8Array, - h: bigint -} - - -/** - * Converts the ABI tuple representation of a LargeStruct to the struct representation - */ -export function LargeStructFromTuple(abiTuple: [Uint8Array, Uint8Array, Uint8Array, Uint8Array, bigint, Uint8Array, Uint8Array, bigint]) { - const abiStructType = ABIStructType.fromStruct('LargeStruct', APP_SPEC.structs) - return getStructValueFromTupleValue(abiStructType, abiTuple) as LargeStruct -} - -export type NestedStruct = { - a: bigint, - inner: InnerStruct, - woah: [bigint, bigint[][], bigint][], - b: bigint -} - - -/** - * Converts the ABI tuple representation of a NestedStruct to the struct representation - */ -export function NestedStructFromTuple(abiTuple: [bigint, InnerStruct, [bigint, bigint[][], bigint][], bigint]) { - const abiStructType = ABIStructType.fromStruct('NestedStruct', APP_SPEC.structs) - return getStructValueFromTupleValue(abiStructType, abiTuple) as NestedStruct -} - -/** - * The argument types for the BoxContract contract - */ -export type BoxContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'store_enums()void': Record - 'read_enums()(uint64,uint64)': Record - 'set_boxes(uint64,byte[],string)void': { - a: bigint | number - b: Uint8Array - c: string - } - 'boxes_exist()(bool,bool,bool,bool)': Record - 'check_keys()void': Record - 'read_boxes()(uint64,byte[],string,uint64)': Record - 'indirect_extract_and_replace()void': Record - 'delete_boxes()void': Record - 'slice_box()void': Record - 'arc4_box()void': Record - 'create_many_ints()void': Record - 'set_many_ints(uint64,uint64)void': { - index: bigint | number - value: bigint | number - } - 'sum_many_ints()uint64': Record - 'test_box_ref()void': Record - 'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void': { - struct: NestedStruct - } - 'nested_write(uint64,uint64)void': { - index: bigint | number - value: bigint | number - } - 'nested_read(uint64,uint64,uint64)uint64': { - i1: bigint | number - i2: bigint | number - i3: bigint | number - } - 'create_bools()void': Record - 'set_bool(uint64,bool)void': { - index: bigint | number - value: boolean - } - 'sum_bools(uint64)uint64': { - stopAtTotal: bigint | number - } - 'box_map_test()void': Record - 'box_map_set(uint64,string)void': { - key: bigint | number - value: string - } - 'box_map_get(uint64)string': { - key: bigint | number - } - 'box_map_del(uint64)void': { - key: bigint | number - } - 'box_map_exists(uint64)bool': { - key: bigint | number - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'store_enums()void': [] - 'read_enums()(uint64,uint64)': [] - 'set_boxes(uint64,byte[],string)void': [a: bigint | number, b: Uint8Array, c: string] - 'boxes_exist()(bool,bool,bool,bool)': [] - 'check_keys()void': [] - 'read_boxes()(uint64,byte[],string,uint64)': [] - 'indirect_extract_and_replace()void': [] - 'delete_boxes()void': [] - 'slice_box()void': [] - 'arc4_box()void': [] - 'create_many_ints()void': [] - 'set_many_ints(uint64,uint64)void': [index: bigint | number, value: bigint | number] - 'sum_many_ints()uint64': [] - 'test_box_ref()void': [] - 'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void': [struct: NestedStruct] - 'nested_write(uint64,uint64)void': [index: bigint | number, value: bigint | number] - 'nested_read(uint64,uint64,uint64)uint64': [i1: bigint | number, i2: bigint | number, i3: bigint | number] - 'create_bools()void': [] - 'set_bool(uint64,bool)void': [index: bigint | number, value: boolean] - 'sum_bools(uint64)uint64': [stopAtTotal: bigint | number] - 'box_map_test()void': [] - 'box_map_set(uint64,string)void': [key: bigint | number, value: string] - 'box_map_get(uint64)string': [key: bigint | number] - 'box_map_del(uint64)void': [key: bigint | number] - 'box_map_exists(uint64)bool': [key: bigint | number] - } -} - -/** - * The return type for each method - */ -export type BoxContractReturns = { - 'store_enums()void': void - 'read_enums()(uint64,uint64)': [bigint, bigint] - 'set_boxes(uint64,byte[],string)void': void - 'boxes_exist()(bool,bool,bool,bool)': [boolean, boolean, boolean, boolean] - 'check_keys()void': void - 'read_boxes()(uint64,byte[],string,uint64)': [bigint, Uint8Array, string, bigint] - 'indirect_extract_and_replace()void': void - 'delete_boxes()void': void - 'slice_box()void': void - 'arc4_box()void': void - 'create_many_ints()void': void - 'set_many_ints(uint64,uint64)void': void - 'sum_many_ints()uint64': bigint - 'test_box_ref()void': void - 'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void': void - 'nested_write(uint64,uint64)void': void - 'nested_read(uint64,uint64,uint64)uint64': bigint - 'create_bools()void': void - 'set_bool(uint64,bool)void': void - 'sum_bools(uint64)uint64': bigint - 'box_map_test()void': void - 'box_map_set(uint64,string)void': void - 'box_map_get(uint64)string': string - 'box_map_del(uint64)void': void - 'box_map_exists(uint64)bool': boolean -} - -/** - * Defines the types of available calls and state of the BoxContract smart contract. - */ -export type BoxContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'store_enums()void' | 'store_enums', { - argsObj: BoxContractArgs['obj']['store_enums()void'] - argsTuple: BoxContractArgs['tuple']['store_enums()void'] - returns: BoxContractReturns['store_enums()void'] - }> - & Record<'read_enums()(uint64,uint64)' | 'read_enums', { - argsObj: BoxContractArgs['obj']['read_enums()(uint64,uint64)'] - argsTuple: BoxContractArgs['tuple']['read_enums()(uint64,uint64)'] - returns: BoxContractReturns['read_enums()(uint64,uint64)'] - }> - & Record<'set_boxes(uint64,byte[],string)void' | 'set_boxes', { - argsObj: BoxContractArgs['obj']['set_boxes(uint64,byte[],string)void'] - argsTuple: BoxContractArgs['tuple']['set_boxes(uint64,byte[],string)void'] - returns: BoxContractReturns['set_boxes(uint64,byte[],string)void'] - }> - & Record<'boxes_exist()(bool,bool,bool,bool)' | 'boxes_exist', { - argsObj: BoxContractArgs['obj']['boxes_exist()(bool,bool,bool,bool)'] - argsTuple: BoxContractArgs['tuple']['boxes_exist()(bool,bool,bool,bool)'] - returns: BoxContractReturns['boxes_exist()(bool,bool,bool,bool)'] - }> - & Record<'check_keys()void' | 'check_keys', { - argsObj: BoxContractArgs['obj']['check_keys()void'] - argsTuple: BoxContractArgs['tuple']['check_keys()void'] - returns: BoxContractReturns['check_keys()void'] - }> - & Record<'read_boxes()(uint64,byte[],string,uint64)' | 'read_boxes', { - argsObj: BoxContractArgs['obj']['read_boxes()(uint64,byte[],string,uint64)'] - argsTuple: BoxContractArgs['tuple']['read_boxes()(uint64,byte[],string,uint64)'] - returns: BoxContractReturns['read_boxes()(uint64,byte[],string,uint64)'] - }> - & Record<'indirect_extract_and_replace()void' | 'indirect_extract_and_replace', { - argsObj: BoxContractArgs['obj']['indirect_extract_and_replace()void'] - argsTuple: BoxContractArgs['tuple']['indirect_extract_and_replace()void'] - returns: BoxContractReturns['indirect_extract_and_replace()void'] - }> - & Record<'delete_boxes()void' | 'delete_boxes', { - argsObj: BoxContractArgs['obj']['delete_boxes()void'] - argsTuple: BoxContractArgs['tuple']['delete_boxes()void'] - returns: BoxContractReturns['delete_boxes()void'] - }> - & Record<'slice_box()void' | 'slice_box', { - argsObj: BoxContractArgs['obj']['slice_box()void'] - argsTuple: BoxContractArgs['tuple']['slice_box()void'] - returns: BoxContractReturns['slice_box()void'] - }> - & Record<'arc4_box()void' | 'arc4_box', { - argsObj: BoxContractArgs['obj']['arc4_box()void'] - argsTuple: BoxContractArgs['tuple']['arc4_box()void'] - returns: BoxContractReturns['arc4_box()void'] - }> - & Record<'create_many_ints()void' | 'create_many_ints', { - argsObj: BoxContractArgs['obj']['create_many_ints()void'] - argsTuple: BoxContractArgs['tuple']['create_many_ints()void'] - returns: BoxContractReturns['create_many_ints()void'] - }> - & Record<'set_many_ints(uint64,uint64)void' | 'set_many_ints', { - argsObj: BoxContractArgs['obj']['set_many_ints(uint64,uint64)void'] - argsTuple: BoxContractArgs['tuple']['set_many_ints(uint64,uint64)void'] - returns: BoxContractReturns['set_many_ints(uint64,uint64)void'] - }> - & Record<'sum_many_ints()uint64' | 'sum_many_ints', { - argsObj: BoxContractArgs['obj']['sum_many_ints()uint64'] - argsTuple: BoxContractArgs['tuple']['sum_many_ints()uint64'] - returns: BoxContractReturns['sum_many_ints()uint64'] - }> - & Record<'test_box_ref()void' | 'test_box_ref', { - argsObj: BoxContractArgs['obj']['test_box_ref()void'] - argsTuple: BoxContractArgs['tuple']['test_box_ref()void'] - returns: BoxContractReturns['test_box_ref()void'] - }> - & Record<'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void' | 'set_nested_struct', { - argsObj: BoxContractArgs['obj']['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'] - argsTuple: BoxContractArgs['tuple']['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'] - returns: BoxContractReturns['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'] - }> - & Record<'nested_write(uint64,uint64)void' | 'nested_write', { - argsObj: BoxContractArgs['obj']['nested_write(uint64,uint64)void'] - argsTuple: BoxContractArgs['tuple']['nested_write(uint64,uint64)void'] - returns: BoxContractReturns['nested_write(uint64,uint64)void'] - }> - & Record<'nested_read(uint64,uint64,uint64)uint64' | 'nested_read', { - argsObj: BoxContractArgs['obj']['nested_read(uint64,uint64,uint64)uint64'] - argsTuple: BoxContractArgs['tuple']['nested_read(uint64,uint64,uint64)uint64'] - returns: BoxContractReturns['nested_read(uint64,uint64,uint64)uint64'] - }> - & Record<'create_bools()void' | 'create_bools', { - argsObj: BoxContractArgs['obj']['create_bools()void'] - argsTuple: BoxContractArgs['tuple']['create_bools()void'] - returns: BoxContractReturns['create_bools()void'] - }> - & Record<'set_bool(uint64,bool)void' | 'set_bool', { - argsObj: BoxContractArgs['obj']['set_bool(uint64,bool)void'] - argsTuple: BoxContractArgs['tuple']['set_bool(uint64,bool)void'] - returns: BoxContractReturns['set_bool(uint64,bool)void'] - }> - & Record<'sum_bools(uint64)uint64' | 'sum_bools', { - argsObj: BoxContractArgs['obj']['sum_bools(uint64)uint64'] - argsTuple: BoxContractArgs['tuple']['sum_bools(uint64)uint64'] - returns: BoxContractReturns['sum_bools(uint64)uint64'] - }> - & Record<'box_map_test()void' | 'box_map_test', { - argsObj: BoxContractArgs['obj']['box_map_test()void'] - argsTuple: BoxContractArgs['tuple']['box_map_test()void'] - returns: BoxContractReturns['box_map_test()void'] - }> - & Record<'box_map_set(uint64,string)void' | 'box_map_set', { - argsObj: BoxContractArgs['obj']['box_map_set(uint64,string)void'] - argsTuple: BoxContractArgs['tuple']['box_map_set(uint64,string)void'] - returns: BoxContractReturns['box_map_set(uint64,string)void'] - }> - & Record<'box_map_get(uint64)string' | 'box_map_get', { - argsObj: BoxContractArgs['obj']['box_map_get(uint64)string'] - argsTuple: BoxContractArgs['tuple']['box_map_get(uint64)string'] - returns: BoxContractReturns['box_map_get(uint64)string'] - }> - & Record<'box_map_del(uint64)void' | 'box_map_del', { - argsObj: BoxContractArgs['obj']['box_map_del(uint64)void'] - argsTuple: BoxContractArgs['tuple']['box_map_del(uint64)void'] - returns: BoxContractReturns['box_map_del(uint64)void'] - }> - & Record<'box_map_exists(uint64)bool' | 'box_map_exists', { - argsObj: BoxContractArgs['obj']['box_map_exists(uint64)bool'] - argsTuple: BoxContractArgs['tuple']['box_map_exists(uint64)bool'] - returns: BoxContractReturns['box_map_exists(uint64)bool'] - }> - /** - * Defines the shape of the state of the application. - */ - state: { - box: { - keys: { - oca: bigint - txn: bigint - boxA: bigint - boxB: Uint8Array - boxC: string - boxD: BinaryState - manyInts: [bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint] - boxRef: BinaryState - boxLarge: LargeStruct - tooManyBools: [boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean] - } - maps: { - boxMap: Map - } - } - } -} - -/** - * Defines the possible abi call signatures. - */ -export type BoxContractSignatures = keyof BoxContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type BoxContractNonVoidMethodSignatures = keyof BoxContractTypes['methods'] extends infer T ? T extends keyof BoxContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the BoxContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = BoxContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the BoxContract smart contract to the method's return type - */ -export type MethodReturn = BoxContractTypes['methods'][TSignature]['returns'] - -/** - * Defines the shape of the keyed box state of the application. - */ -export type BoxKeysState = BoxContractTypes['state']['box']['keys'] - - -/** - * Defines supported create method params for this smart contract - */ -export type BoxContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type BoxContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: BoxContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the BoxContract smart contract - */ -export abstract class BoxContractParamsFactory { - /** - * Constructs a no op call for the store_enums()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static storeEnums(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'store_enums()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the read_enums()(uint64,uint64) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static readEnums(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'read_enums()(uint64,uint64)' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the set_boxes(uint64,byte[],string)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_boxes(uint64,byte[],string)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the boxes_exist()(bool,bool,bool,bool) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static boxesExist(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'boxes_exist()(bool,bool,bool,bool)' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the check_keys()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static checkKeys(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'check_keys()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the read_boxes()(uint64,byte[],string,uint64) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static readBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'read_boxes()(uint64,byte[],string,uint64)' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the indirect_extract_and_replace()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static indirectExtractAndReplace(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'indirect_extract_and_replace()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the delete_boxes()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static deleteBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'delete_boxes()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the slice_box()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static sliceBox(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'slice_box()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the arc4_box()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static arc4Box(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'arc4_box()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the create_many_ints()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static createManyInts(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'create_many_ints()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the set_many_ints(uint64,uint64)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setManyInts(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_many_ints(uint64,uint64)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.index, params.args.value], - } - } - /** - * Constructs a no op call for the sum_many_ints()uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static sumManyInts(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'sum_many_ints()uint64' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_box_ref()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testBoxRef(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_box_ref()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setNestedStruct(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.struct], - } - } - /** - * Constructs a no op call for the nested_write(uint64,uint64)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static nestedWrite(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'nested_write(uint64,uint64)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.index, params.args.value], - } - } - /** - * Constructs a no op call for the nested_read(uint64,uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static nestedRead(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'nested_read(uint64,uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.i1, params.args.i2, params.args.i3], - } - } - /** - * Constructs a no op call for the create_bools()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static createBools(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'create_bools()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the set_bool(uint64,bool)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setBool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_bool(uint64,bool)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.index, params.args.value], - } - } - /** - * Constructs a no op call for the sum_bools(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static sumBools(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'sum_bools(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.stopAtTotal], - } - } - /** - * Constructs a no op call for the box_map_test()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static boxMapTest(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'box_map_test()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the box_map_set(uint64,string)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static boxMapSet(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'box_map_set(uint64,string)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.key, params.args.value], - } - } - /** - * Constructs a no op call for the box_map_get(uint64)string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static boxMapGet(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'box_map_get(uint64)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.key], - } - } - /** - * Constructs a no op call for the box_map_del(uint64)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static boxMapDel(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'box_map_del(uint64)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.key], - } - } - /** - * Constructs a no op call for the box_map_exists(uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static boxMapExists(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'box_map_exists(uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.key], - } - } -} - -/** - * A factory to create and deploy one or more instance of the BoxContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class BoxContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `BoxContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new BoxContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new BoxContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the BoxContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: BoxContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new BoxContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the BoxContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the BoxContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the BoxContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new BoxContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the BoxContract smart contract - */ -export class BoxContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `BoxContractClient` - * - * @param appClient An `AppClient` instance which has been created with the BoxContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `BoxContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `BoxContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new BoxContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `BoxContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new BoxContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the BoxContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the BoxContract smart contract using the `store_enums()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - storeEnums: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.storeEnums(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `read_enums()(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - readEnums: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.readEnums(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_boxes(uint64,byte[],string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(BoxContractParamsFactory.setBoxes(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `boxes_exist()(bool,bool,bool,bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - boxesExist: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.boxesExist(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `check_keys()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - checkKeys: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.checkKeys(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `read_boxes()(uint64,byte[],string,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - readBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.readBoxes(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `indirect_extract_and_replace()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - indirectExtractAndReplace: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.indirectExtractAndReplace(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `delete_boxes()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - deleteBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.deleteBoxes(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `slice_box()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - sliceBox: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.sliceBox(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `arc4_box()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - arc4Box: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.arc4Box(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `create_many_ints()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - createManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.createManyInts(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_many_ints(uint64,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(BoxContractParamsFactory.setManyInts(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `sum_many_ints()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - sumManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.sumManyInts(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `test_box_ref()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testBoxRef: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.testBoxRef(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setNestedStruct: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(BoxContractParamsFactory.setNestedStruct(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `nested_write(uint64,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - nestedWrite: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(BoxContractParamsFactory.nestedWrite(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `nested_read(uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - nestedRead: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(BoxContractParamsFactory.nestedRead(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `create_bools()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - createBools: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.createBools(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_bool(uint64,bool)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setBool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(BoxContractParamsFactory.setBool(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `sum_bools(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - sumBools: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(BoxContractParamsFactory.sumBools(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_test()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - boxMapTest: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(BoxContractParamsFactory.boxMapTest(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_set(uint64,string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - boxMapSet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(BoxContractParamsFactory.boxMapSet(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_get(uint64)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - boxMapGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(BoxContractParamsFactory.boxMapGet(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_del(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - boxMapDel: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(BoxContractParamsFactory.boxMapDel(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_exists(uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - boxMapExists: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(BoxContractParamsFactory.boxMapExists(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the BoxContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the BoxContract smart contract using the `store_enums()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - storeEnums: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.storeEnums(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `read_enums()(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - readEnums: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.readEnums(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_boxes(uint64,byte[],string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.setBoxes(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `boxes_exist()(bool,bool,bool,bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - boxesExist: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.boxesExist(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `check_keys()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - checkKeys: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.checkKeys(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `read_boxes()(uint64,byte[],string,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - readBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.readBoxes(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `indirect_extract_and_replace()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - indirectExtractAndReplace: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.indirectExtractAndReplace(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `delete_boxes()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - deleteBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.deleteBoxes(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `slice_box()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - sliceBox: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.sliceBox(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `arc4_box()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - arc4Box: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.arc4Box(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `create_many_ints()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - createManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.createManyInts(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_many_ints(uint64,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.setManyInts(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `sum_many_ints()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - sumManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.sumManyInts(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `test_box_ref()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testBoxRef: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.testBoxRef(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setNestedStruct: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.setNestedStruct(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `nested_write(uint64,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - nestedWrite: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.nestedWrite(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `nested_read(uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - nestedRead: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.nestedRead(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `create_bools()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - createBools: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.createBools(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_bool(uint64,bool)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setBool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.setBool(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `sum_bools(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - sumBools: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.sumBools(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_test()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - boxMapTest: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapTest(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_set(uint64,string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - boxMapSet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapSet(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_get(uint64)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - boxMapGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapGet(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_del(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - boxMapDel: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapDel(params)) - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_exists(uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - boxMapExists: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapExists(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the BoxContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the BoxContract smart contract using the `store_enums()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - storeEnums: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.storeEnums(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['store_enums()void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `read_enums()(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - readEnums: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.readEnums(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['read_enums()(uint64,uint64)'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_boxes(uint64,byte[],string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.setBoxes(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['set_boxes(uint64,byte[],string)void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `boxes_exist()(bool,bool,bool,bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - boxesExist: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.boxesExist(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['boxes_exist()(bool,bool,bool,bool)'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `check_keys()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - checkKeys: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.checkKeys(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['check_keys()void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `read_boxes()(uint64,byte[],string,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - readBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.readBoxes(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['read_boxes()(uint64,byte[],string,uint64)'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `indirect_extract_and_replace()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - indirectExtractAndReplace: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.indirectExtractAndReplace(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['indirect_extract_and_replace()void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `delete_boxes()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - deleteBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.deleteBoxes(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['delete_boxes()void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `slice_box()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - sliceBox: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.sliceBox(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['slice_box()void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `arc4_box()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - arc4Box: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.arc4Box(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['arc4_box()void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `create_many_ints()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - createManyInts: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.createManyInts(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['create_many_ints()void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_many_ints(uint64,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setManyInts: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.setManyInts(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['set_many_ints(uint64,uint64)void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `sum_many_ints()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - sumManyInts: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.sumManyInts(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['sum_many_ints()uint64'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `test_box_ref()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testBoxRef: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.testBoxRef(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['test_box_ref()void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setNestedStruct: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.setNestedStruct(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `nested_write(uint64,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - nestedWrite: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.nestedWrite(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['nested_write(uint64,uint64)void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `nested_read(uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - nestedRead: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.nestedRead(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['nested_read(uint64,uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `create_bools()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - createBools: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.createBools(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['create_bools()void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `set_bool(uint64,bool)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setBool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.setBool(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['set_bool(uint64,bool)void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `sum_bools(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - sumBools: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.sumBools(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['sum_bools(uint64)uint64'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_test()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - boxMapTest: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapTest(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_test()void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_set(uint64,string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - boxMapSet: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapSet(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_set(uint64,string)void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_get(uint64)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - boxMapGet: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapGet(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_get(uint64)string'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_del(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - boxMapDel: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapDel(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_del(uint64)void'])} - }, - - /** - * Makes a call to the BoxContract smart contract using the `box_map_exists(uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - boxMapExists: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapExists(params)) - return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_exists(uint64)bool'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new BoxContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current BoxContract app - */ - state = { - /** - * Methods to access box state for the current BoxContract app - */ - box: { - /** - * Get all current keyed values from box state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.box.getAll() - return { - oca: result.oca, - txn: result.txn, - boxA: result.box_a, - boxB: result.box_b, - boxC: result.box_c, - boxD: new BinaryStateValue(result.box_d), - manyInts: result.many_ints, - boxRef: new BinaryStateValue(result.box_ref), - boxLarge: result.box_large, - tooManyBools: result.too_many_bools, - } - }, - /** - * Get the current value of the oca key in box state - */ - oca: async (): Promise => { return (await this.appClient.state.box.getValue("oca")) as bigint | undefined }, - /** - * Get the current value of the txn key in box state - */ - txn: async (): Promise => { return (await this.appClient.state.box.getValue("txn")) as bigint | undefined }, - /** - * Get the current value of the box_a key in box state - */ - boxA: async (): Promise => { return (await this.appClient.state.box.getValue("box_a")) as bigint | undefined }, - /** - * Get the current value of the box_b key in box state - */ - boxB: async (): Promise => { return (await this.appClient.state.box.getValue("box_b")) as Uint8Array | undefined }, - /** - * Get the current value of the box_c key in box state - */ - boxC: async (): Promise => { return (await this.appClient.state.box.getValue("box_c")) as string | undefined }, - /** - * Get the current value of the box_d key in box state - */ - boxD: async (): Promise => { return new BinaryStateValue((await this.appClient.state.box.getValue("box_d")) as Uint8Array | undefined) }, - /** - * Get the current value of the many_ints key in box state - */ - manyInts: async (): Promise<[bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint] | undefined> => { return (await this.appClient.state.box.getValue("many_ints")) as [bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint] | undefined }, - /** - * Get the current value of the box_ref key in box state - */ - boxRef: async (): Promise => { return new BinaryStateValue((await this.appClient.state.box.getValue("box_ref")) as Uint8Array | undefined) }, - /** - * Get the current value of the box_large key in box state - */ - boxLarge: async (): Promise => { return (await this.appClient.state.box.getValue("box_large")) as LargeStruct | undefined }, - /** - * Get the current value of the too_many_bools key in box state - */ - tooManyBools: async (): Promise<[boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean] | undefined> => { return (await this.appClient.state.box.getValue("too_many_bools")) as [boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean] | undefined }, - /** - * Get values from the box_map map in box state - */ - boxMap: { - /** - * Get all current values of the box_map map in box state - */ - getMap: async (): Promise> => { return (await this.appClient.state.box.getMap("box_map")) as Map }, - /** - * Get a current value of the box_map map by key from box state - */ - value: async (key: bigint | number): Promise => { return await this.appClient.state.box.getMapValue("box_map", key) as string | undefined }, - }, - }, - } - - public newGroup(composerConfig?: TransactionComposerConfig): BoxContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a store_enums()void method call against the BoxContract contract - */ - storeEnums(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.storeEnums(params))) - return this - }, - /** - * Add a read_enums()(uint64,uint64) method call against the BoxContract contract - */ - readEnums(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.readEnums(params))) - return this - }, - /** - * Add a set_boxes(uint64,byte[],string)void method call against the BoxContract contract - */ - setBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setBoxes(params))) - return this - }, - /** - * Add a boxes_exist()(bool,bool,bool,bool) method call against the BoxContract contract - */ - boxesExist(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxesExist(params))) - return this - }, - /** - * Add a check_keys()void method call against the BoxContract contract - */ - checkKeys(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.checkKeys(params))) - return this - }, - /** - * Add a read_boxes()(uint64,byte[],string,uint64) method call against the BoxContract contract - */ - readBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.readBoxes(params))) - return this - }, - /** - * Add a indirect_extract_and_replace()void method call against the BoxContract contract - */ - indirectExtractAndReplace(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.indirectExtractAndReplace(params))) - return this - }, - /** - * Add a delete_boxes()void method call against the BoxContract contract - */ - deleteBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deleteBoxes(params))) - return this - }, - /** - * Add a slice_box()void method call against the BoxContract contract - */ - sliceBox(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sliceBox(params))) - return this - }, - /** - * Add a arc4_box()void method call against the BoxContract contract - */ - arc4Box(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.arc4Box(params))) - return this - }, - /** - * Add a create_many_ints()void method call against the BoxContract contract - */ - createManyInts(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createManyInts(params))) - return this - }, - /** - * Add a set_many_ints(uint64,uint64)void method call against the BoxContract contract - */ - setManyInts(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setManyInts(params))) - return this - }, - /** - * Add a sum_many_ints()uint64 method call against the BoxContract contract - */ - sumManyInts(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sumManyInts(params))) - return this - }, - /** - * Add a test_box_ref()void method call against the BoxContract contract - */ - testBoxRef(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBoxRef(params))) - return this - }, - /** - * Add a set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void method call against the BoxContract contract - */ - setNestedStruct(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setNestedStruct(params))) - return this - }, - /** - * Add a nested_write(uint64,uint64)void method call against the BoxContract contract - */ - nestedWrite(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.nestedWrite(params))) - return this - }, - /** - * Add a nested_read(uint64,uint64,uint64)uint64 method call against the BoxContract contract - */ - nestedRead(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.nestedRead(params))) - return this - }, - /** - * Add a create_bools()void method call against the BoxContract contract - */ - createBools(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createBools(params))) - return this - }, - /** - * Add a set_bool(uint64,bool)void method call against the BoxContract contract - */ - setBool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setBool(params))) - return this - }, - /** - * Add a sum_bools(uint64)uint64 method call against the BoxContract contract - */ - sumBools(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sumBools(params))) - return this - }, - /** - * Add a box_map_test()void method call against the BoxContract contract - */ - boxMapTest(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapTest(params))) - return this - }, - /** - * Add a box_map_set(uint64,string)void method call against the BoxContract contract - */ - boxMapSet(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapSet(params))) - return this - }, - /** - * Add a box_map_get(uint64)string method call against the BoxContract contract - */ - boxMapGet(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapGet(params))) - return this - }, - /** - * Add a box_map_del(uint64)void method call against the BoxContract contract - */ - boxMapDel(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapDel(params))) - return this - }, - /** - * Add a box_map_exists(uint64)bool method call against the BoxContract contract - */ - boxMapExists(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapExists(params))) - return this - }, - /** - * Add a clear state call to the BoxContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as BoxContractComposer - } -} -export type BoxContractComposer = { - /** - * Calls the store_enums()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - storeEnums(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['store_enums()void'] | undefined]> - - /** - * Calls the read_enums()(uint64,uint64) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - readEnums(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['read_enums()(uint64,uint64)'] | undefined]> - - /** - * Calls the set_boxes(uint64,byte[],string)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setBoxes(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['set_boxes(uint64,byte[],string)void'] | undefined]> - - /** - * Calls the boxes_exist()(bool,bool,bool,bool) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - boxesExist(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['boxes_exist()(bool,bool,bool,bool)'] | undefined]> - - /** - * Calls the check_keys()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - checkKeys(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['check_keys()void'] | undefined]> - - /** - * Calls the read_boxes()(uint64,byte[],string,uint64) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - readBoxes(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['read_boxes()(uint64,byte[],string,uint64)'] | undefined]> - - /** - * Calls the indirect_extract_and_replace()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - indirectExtractAndReplace(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['indirect_extract_and_replace()void'] | undefined]> - - /** - * Calls the delete_boxes()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - deleteBoxes(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['delete_boxes()void'] | undefined]> - - /** - * Calls the slice_box()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - sliceBox(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['slice_box()void'] | undefined]> - - /** - * Calls the arc4_box()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - arc4Box(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['arc4_box()void'] | undefined]> - - /** - * Calls the create_many_ints()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - createManyInts(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['create_many_ints()void'] | undefined]> - - /** - * Calls the set_many_ints(uint64,uint64)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setManyInts(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['set_many_ints(uint64,uint64)void'] | undefined]> - - /** - * Calls the sum_many_ints()uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - sumManyInts(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['sum_many_ints()uint64'] | undefined]> - - /** - * Calls the test_box_ref()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testBoxRef(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['test_box_ref()void'] | undefined]> - - /** - * Calls the set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setNestedStruct(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'] | undefined]> - - /** - * Calls the nested_write(uint64,uint64)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - nestedWrite(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['nested_write(uint64,uint64)void'] | undefined]> - - /** - * Calls the nested_read(uint64,uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - nestedRead(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['nested_read(uint64,uint64,uint64)uint64'] | undefined]> - - /** - * Calls the create_bools()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - createBools(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['create_bools()void'] | undefined]> - - /** - * Calls the set_bool(uint64,bool)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setBool(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['set_bool(uint64,bool)void'] | undefined]> - - /** - * Calls the sum_bools(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - sumBools(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['sum_bools(uint64)uint64'] | undefined]> - - /** - * Calls the box_map_test()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - boxMapTest(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_test()void'] | undefined]> - - /** - * Calls the box_map_set(uint64,string)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - boxMapSet(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_set(uint64,string)void'] | undefined]> - - /** - * Calls the box_map_get(uint64)string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - boxMapGet(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_get(uint64)string'] | undefined]> - - /** - * Calls the box_map_del(uint64)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - boxMapDel(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_del(uint64)void'] | undefined]> - - /** - * Calls the box_map_exists(uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - boxMapExists(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_exists(uint64)bool'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the BoxContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): BoxContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): BoxContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type BoxContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/Contract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/Contract.ts deleted file mode 100644 index aa62d61..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/Contract.ts +++ /dev/null @@ -1,621 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"Contract","structs":{},"methods":[{"name":"test_falcon_verify","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reject_version","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[138,226],"errorMessage":"application exists"},{"pc":[140],"errorMessage":"should be version 0"},{"pc":[229],"errorMessage":"should be version 1"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYgMAogICAgYnl0ZWNibG9jayBiYXNlNjQoRElFQlF3PT0pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQ29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMik6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhiZTU2NDk5YyAweGFjOGFhYjQyIC8vIG1ldGhvZCAidGVzdF9mYWxjb25fdmVyaWZ5KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X3JlamVjdF92ZXJzaW9uKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF9mYWxjb25fdmVyaWZ5IHRlc3RfcmVqZWN0X3ZlcnNpb24KICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQVZNMTIuY29udHJhY3QuQ29udHJhY3QudGVzdF9mYWxjb25fdmVyaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9mYWxjb25fdmVyaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjcKICAgIC8vIGFzc2VydCBub3Qgb3AuZmFsY29uX3ZlcmlmeShiIiIsIGIiIiwgb3AuYnplcm8oMTc5MykpCiAgICBwdXNoaW50IDE3OTMKICAgIGJ6ZXJvCiAgICBwdXNoYnl0ZXMgMHgKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBmYWxjb25fdmVyaWZ5CiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQVZNMTIuY29udHJhY3QuQ29udHJhY3QudGVzdF9yZWplY3RfdmVyc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfcmVqZWN0X3ZlcnNpb246CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTEKICAgIC8vIGFwcF92MF90eG4gPSBhcmM0LmFyYzRfY3JlYXRlKENvbnRyYWN0VjApCiAgICBpdHhuX2JlZ2luCiAgICBieXRlY18wIC8vIGJhc2U2NChESUVCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgcHVzaGJ5dGVzIGJhc2U2NChEREViUVFBYWdBU2c2Qmh5TmhvQWpnRUFBUUF4R1lFRUVqRVlFRVJDQUFneEdSUXhHQlFRUXpGRWdRRVNSSUVCUXc9PSkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTMKICAgIC8vIGFzc2VydCBhcHAudmVyc2lvbiA9PSAwLCAic2hvdWxkIGJlIHZlcnNpb24gMCIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwVmVyc2lvbgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIHNob3VsZCBiZSB2ZXJzaW9uIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToxNS0xNwogICAgLy8gYXJjNC5hcmM0X3VwZGF0ZSgKICAgIC8vICAgICBDb250cmFjdFYwLnVwZGF0ZSwgYXBwX2lkPWFwcCwgcmVqZWN0X3ZlcnNpb249MSwgY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdChDb250cmFjdFYxKQogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBDb250cmFjdFYwLnVwZGF0ZSwgYXBwX2lkPWFwcCwgcmVqZWN0X3ZlcnNpb249MSwgY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdChDb250cmFjdFYxKQogICAgYnl0ZWNfMCAvLyBiYXNlNjQoRElFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIHB1c2hieXRlcyBiYXNlNjQoRERFYlFRQWFnQVFrTjQwOE5ob0FqZ0VBQVFBeEdZRUZFakVZRUVSQ0FBZ3hHUlF4R0JRUVF6RkVnUUlTUklFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTUtMTcKICAgIC8vIGFyYzQuYXJjNF91cGRhdGUoCiAgICAvLyAgICAgQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIC8vICkKICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToxNgogICAgLy8gQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIGludGNfMCAvLyAxCiAgICBpdHhuX2ZpZWxkIFJlamVjdFZlcnNpb24KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTUtMTcKICAgIC8vIGFyYzQuYXJjNF91cGRhdGUoCiAgICAvLyAgICAgQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweGEwZTgxODcyIC8vIG1ldGhvZCAidXBkYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTgKICAgIC8vIGFzc2VydCBhcHAudmVyc2lvbiA9PSAxLCAic2hvdWxkIGJlIHZlcnNpb24gMSIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwVmVyc2lvbgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gc2hvdWxkIGJlIHZlcnNpb24gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjIwLTI5CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oCiAgICAvLyAgICAgICAgIGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgICAgICAgICBDb250cmFjdFYxLmRlbGV0ZSwKICAgIC8vICAgICAgICAgKSwKICAgIC8vICAgICApLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gICAgIHJlamVjdF92ZXJzaW9uPTIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjgKICAgIC8vIHJlamVjdF92ZXJzaW9uPTIsCiAgICBwdXNoaW50IDIKICAgIGl0eG5fZmllbGQgUmVqZWN0VmVyc2lvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjYKICAgIC8vIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToyMi0yNAogICAgLy8gYXJjNC5hcmM0X3NpZ25hdHVyZSgKICAgIC8vICAgICBDb250cmFjdFYxLmRlbGV0ZSwKICAgIC8vICksCiAgICBwdXNoYnl0ZXMgMHgyNDM3OGQzYyAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMiAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjIwLTI5CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oCiAgICAvLyAgICAgICAgIGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgICAgICAgICBDb250cmFjdFYxLmRlbGV0ZSwKICAgIC8vICAgICAgICAgKSwKICAgIC8vICAgICApLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gICAgIHJlamVjdF92ZXJzaW9uPTIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"DCADAQYAJgEEDIEBQzEbQQAdMRkURDEYRIICBL5WSZwErIqrQjYaAI4CAAkAFwAxGRQxGBQQQ4GBDq+AAElPAoUURCJDsSiyQoAxDDEbQQAagASg6BhyNhoAjgEAAQAxGYEEEjEYEERCAAgxGRQxGBQQQzFEgQESRIEBQ7JAI7IQJLIBs7Q9SXIJRBREsSiyQoAxDDEbQQAagAQkN408NhoAjgEAAQAxGYEFEjEYEERCAAgxGRQxGBQQQzFEgQISRIEBQ7JAgQSyGSKyREmyGIAEoOgYcrIaI7IQJLIBs0lyCUQiEkSxgQKyRLIYgQWyGYAEJDeNPLIaI7IQJLIBsyJD","clear":"DIEBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the Contract contract - */ -export type ContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'test_falcon_verify()void': Record - 'test_reject_version()void': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'test_falcon_verify()void': [] - 'test_reject_version()void': [] - } -} - -/** - * The return type for each method - */ -export type ContractReturns = { - 'test_falcon_verify()void': void - 'test_reject_version()void': void -} - -/** - * Defines the types of available calls and state of the Contract smart contract. - */ -export type ContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'test_falcon_verify()void' | 'test_falcon_verify', { - argsObj: ContractArgs['obj']['test_falcon_verify()void'] - argsTuple: ContractArgs['tuple']['test_falcon_verify()void'] - returns: ContractReturns['test_falcon_verify()void'] - }> - & Record<'test_reject_version()void' | 'test_reject_version', { - argsObj: ContractArgs['obj']['test_reject_version()void'] - argsTuple: ContractArgs['tuple']['test_reject_version()void'] - returns: ContractReturns['test_reject_version()void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type ContractSignatures = keyof ContractTypes['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the Contract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = ContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the Contract smart contract to the method's return type - */ -export type MethodReturn = ContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type ContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type ContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: ContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the Contract smart contract - */ -export abstract class ContractParamsFactory { - /** - * Constructs a no op call for the test_falcon_verify()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testFalconVerify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_falcon_verify()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_reject_version()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testRejectVersion(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_reject_version()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } -} - -/** - * A factory to create and deploy one or more instance of the Contract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class ContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `ContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new ContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new ContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the Contract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: ContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new ContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Contract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Contract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the Contract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new ContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the Contract smart contract - */ -export class ContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `ContractClient` - * - * @param appClient An `AppClient` instance which has been created with the Contract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `ContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `ContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new ContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `ContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new ContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the Contract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the Contract smart contract using the `test_falcon_verify()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testFalconVerify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ContractParamsFactory.testFalconVerify(params)) - }, - - /** - * Makes a call to the Contract smart contract using the `test_reject_version()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testRejectVersion: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ContractParamsFactory.testRejectVersion(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the Contract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the Contract smart contract using the `test_falcon_verify()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testFalconVerify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ContractParamsFactory.testFalconVerify(params)) - }, - - /** - * Makes a call to the Contract smart contract using the `test_reject_version()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testRejectVersion: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ContractParamsFactory.testRejectVersion(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the Contract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the Contract smart contract using the `test_falcon_verify()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testFalconVerify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ContractParamsFactory.testFalconVerify(params)) - return {...result, return: result.return as unknown as (undefined | ContractReturns['test_falcon_verify()void'])} - }, - - /** - * Makes a call to the Contract smart contract using the `test_reject_version()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testRejectVersion: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ContractParamsFactory.testRejectVersion(params)) - return {...result, return: result.return as unknown as (undefined | ContractReturns['test_reject_version()void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new ContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current Contract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): ContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a test_falcon_verify()void method call against the Contract contract - */ - testFalconVerify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testFalconVerify(params))) - return this - }, - /** - * Add a test_reject_version()void method call against the Contract contract - */ - testRejectVersion(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testRejectVersion(params))) - return this - }, - /** - * Add a clear state call to the Contract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as ContractComposer - } -} -export type ContractComposer = { - /** - * Calls the test_falcon_verify()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testFalconVerify(params?: CallParams): ContractComposer<[...TReturns, ContractReturns['test_falcon_verify()void'] | undefined]> - - /** - * Calls the test_reject_version()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testRejectVersion(params?: CallParams): ContractComposer<[...TReturns, ContractReturns['test_reject_version()void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the Contract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): ContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): ContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type ContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ContractV0.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ContractV0.ts deleted file mode 100644 index 4c42a4d..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/ContractV0.ts +++ /dev/null @@ -1,621 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"ContractV0","structs":{},"methods":[{"name":"update","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["UpdateApplication"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[45],"errorMessage":"can only update if caller expects this to be currently be v0"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTozMgogICAgLy8gY2xhc3MgQ29udHJhY3RWMChBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTEyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweGEwZTgxODcyIC8vIG1ldGhvZCAidXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl91cGRhdGVfcm91dGVAMwogICAgZXJyCgptYWluX3VwZGF0ZV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz0oIlVwZGF0ZUFwcGxpY2F0aW9uIiwpKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgdXBkYXRlCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BVk0xMi5jb250cmFjdC5Db250cmFjdFYwLnVwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTozNgogICAgLy8gVHhuLnJlamVjdF92ZXJzaW9uID09IDEKICAgIHR4biBSZWplY3RWZXJzaW9uCiAgICBwdXNoaW50IDEKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MzUtMzcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnJlamVjdF92ZXJzaW9uID09IDEKICAgIC8vICksICJjYW4gb25seSB1cGRhdGUgaWYgY2FsbGVyIGV4cGVjdHMgdGhpcyB0byBiZSBjdXJyZW50bHkgYmUgdjAiCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgdXBkYXRlIGlmIGNhbGxlciBleHBlY3RzIHRoaXMgdG8gYmUgY3VycmVudGx5IGJlIHYwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPSgiVXBkYXRlQXBwbGljYXRpb24iLCkpCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"DDEbQQAagASg6BhyNhoAjgEAAQAxGYEEEjEYEERCAAgxGRQxGBQQQzFEgQESRIEBQw==","clear":"DIEBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the ContractV0 contract - */ -export type ContractV0Args = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'update()void': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'update()void': [] - } -} - -/** - * The return type for each method - */ -export type ContractV0Returns = { - 'update()void': void -} - -/** - * Defines the types of available calls and state of the ContractV0 smart contract. - */ -export type ContractV0Types = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'update()void' | 'update', { - argsObj: ContractV0Args['obj']['update()void'] - argsTuple: ContractV0Args['tuple']['update()void'] - returns: ContractV0Returns['update()void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type ContractV0Signatures = keyof ContractV0Types['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the ContractV0 smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = ContractV0Types['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the ContractV0 smart contract to the method's return type - */ -export type MethodReturn = ContractV0Types['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type ContractV0CreateCallParams = - | Expand -/** - * Defines supported update method params for this smart contract - */ -export type ContractV0UpdateCallParams = - | Expand & {method: 'update'}> - | Expand & {method: 'update()void'}> -/** - * Defines arguments required for the deploy method. - */ -export type ContractV0DeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: ContractV0CreateCallParams - /** - * Update transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - updateParams?: ContractV0UpdateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the ContractV0 smart contract - */ -export abstract class ContractV0ParamsFactory { - /** - * Gets available update ABI call param factories - */ - static get update() { - return { - _resolveByMethod(params: TParams) { - switch(params.method) { - case 'update': - case 'update()void': - return ContractV0ParamsFactory.update.update(params) - } - throw new Error(`Unknown ' + verb + ' method`) - }, - - /** - * Constructs update ABI call params for the ContractV0 smart contract using the update()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - update(params: CallParams & AppClientCompilationParams): AppClientMethodCallParams & AppClientCompilationParams { - return { - ...params, - method: 'update()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - }, - } - } - -} - -/** - * A factory to create and deploy one or more instance of the ContractV0 smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class ContractV0Factory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `ContractV0Factory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new ContractV0Client(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new ContractV0Client(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the ContractV0 smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: ContractV0DeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - updateParams: params.updateParams?.method ? ContractV0ParamsFactory.update._resolveByMethod(params.updateParams) : params.updateParams ? params.updateParams as (ContractV0UpdateCallParams & { args: Uint8Array[] }) : undefined, - }) - return { result: result.result, appClient: new ContractV0Client(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ContractV0 smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - /** - * Gets available deployUpdate methods - */ - deployUpdate: { - /** - * Updates an existing instance of the ContractV0 smart contract using the update()void ABI method. - * - * @param params The params for the smart contract call - * @returns The deployUpdate params - */ - update: (params: CallParams & AppClientCompilationParams = {args: []}) => { - return this.appFactory.params.deployUpdate(ContractV0ParamsFactory.update.update(params)) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ContractV0 smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ContractV0 smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new ContractV0Client(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the ContractV0 smart contract - */ -export class ContractV0Client { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `ContractV0Client` - * - * @param appClient An `AppClient` instance which has been created with the ContractV0 app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `ContractV0Client` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `ContractV0Client` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new ContractV0Client(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `ContractV0Client` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new ContractV0Client(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available update methods - */ - update: { - /** - * Updates an existing instance of the ContractV0 smart contract using the `update()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The update params - */ - update: (params: CallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.UpdateApplication } = {args: []}) => { - return this.appClient.params.update(ContractV0ParamsFactory.update.update(params)) - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the ContractV0 smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available update methods - */ - update: { - /** - * Updates an existing instance of the ContractV0 smart contract using the `update()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The update transaction - */ - update: (params: CallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.UpdateApplication } = {args: []}) => { - return this.appClient.createTransaction.update(ContractV0ParamsFactory.update.update(params)) - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the ContractV0 smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available update methods - */ - update: { - /** - * Updates an existing instance of the ContractV0 smart contract using the `update()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The update result - */ - update: async (params: CallParams & AppClientCompilationParams & SendParams & { onComplete?: OnApplicationComplete.UpdateApplication } = {args: []}) => { - const result = await this.appClient.send.update(ContractV0ParamsFactory.update.update(params)) - return {...result, return: result.return as unknown as (undefined | ContractV0Returns['update()void'])} - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the ContractV0 smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new ContractV0Client(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current ContractV0 app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): ContractV0Composer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - get update() { - return { - update: (params: CallParams & AppClientCompilationParams) => { - promiseChain = promiseChain.then(async () => composer.addAppUpdateMethodCall(await client.params.update.update(params))) - return this - }, - } - }, - /** - * Add a clear state call to the ContractV0 contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as ContractV0Composer - } -} -export type ContractV0Composer = { - /** - * Gets available update methods - */ - readonly update: { - /** - * Updates an existing instance of the ContractV0 smart contract using the update()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - update(params?: CallParams): ContractV0Composer<[...TReturns, ContractV0Returns['update()void'] | undefined]> - } - - /** - * Makes a clear_state call to an existing instance of the ContractV0 smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): ContractV0Composer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): ContractV0Composer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type ContractV0ComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ContractV1.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ContractV1.ts deleted file mode 100644 index 7f5e963..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/ContractV1.ts +++ /dev/null @@ -1,621 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"ContractV1","structs":{},"methods":[{"name":"delete","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["DeleteApplication"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[45],"errorMessage":"can only update if caller expects this to be currently be v1"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo0MAogICAgLy8gY2xhc3MgQ29udHJhY3RWMShBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTEyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweDI0Mzc4ZDNjIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9kZWxldGVfcm91dGVAMwogICAgZXJyCgptYWluX2RlbGV0ZV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz0oIkRlbGV0ZUFwcGxpY2F0aW9uIiwpKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgZGVsZXRlCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BVk0xMi5jb250cmFjdC5Db250cmFjdFYxLmRlbGV0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlbGV0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo0NAogICAgLy8gVHhuLnJlamVjdF92ZXJzaW9uID09IDIKICAgIHR4biBSZWplY3RWZXJzaW9uCiAgICBwdXNoaW50IDIKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NDMtNDUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnJlamVjdF92ZXJzaW9uID09IDIKICAgIC8vICksICJjYW4gb25seSB1cGRhdGUgaWYgY2FsbGVyIGV4cGVjdHMgdGhpcyB0byBiZSBjdXJyZW50bHkgYmUgdjEiCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgdXBkYXRlIGlmIGNhbGxlciBleHBlY3RzIHRoaXMgdG8gYmUgY3VycmVudGx5IGJlIHYxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPSgiRGVsZXRlQXBwbGljYXRpb24iLCkpCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"DDEbQQAagAQkN408NhoAjgEAAQAxGYEFEjEYEERCAAgxGRQxGBQQQzFEgQISRIEBQw==","clear":"DIEBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the ContractV1 contract - */ -export type ContractV1Args = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'delete()void': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'delete()void': [] - } -} - -/** - * The return type for each method - */ -export type ContractV1Returns = { - 'delete()void': void -} - -/** - * Defines the types of available calls and state of the ContractV1 smart contract. - */ -export type ContractV1Types = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'delete()void' | 'delete', { - argsObj: ContractV1Args['obj']['delete()void'] - argsTuple: ContractV1Args['tuple']['delete()void'] - returns: ContractV1Returns['delete()void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type ContractV1Signatures = keyof ContractV1Types['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the ContractV1 smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = ContractV1Types['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the ContractV1 smart contract to the method's return type - */ -export type MethodReturn = ContractV1Types['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type ContractV1CreateCallParams = - | Expand -/** - * Defines supported delete method params for this smart contract - */ -export type ContractV1DeleteCallParams = - | Expand & {method: 'delete'}> - | Expand & {method: 'delete()void'}> -/** - * Defines arguments required for the deploy method. - */ -export type ContractV1DeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: ContractV1CreateCallParams - /** - * Delete transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - deleteParams?: ContractV1DeleteCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the ContractV1 smart contract - */ -export abstract class ContractV1ParamsFactory { - /** - * Gets available delete ABI call param factories - */ - static get delete() { - return { - _resolveByMethod(params: TParams) { - switch(params.method) { - case 'delete': - case 'delete()void': - return ContractV1ParamsFactory.delete.delete(params) - } - throw new Error(`Unknown ' + verb + ' method`) - }, - - /** - * Constructs delete ABI call params for the ContractV1 smart contract using the delete()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - delete(params: CallParams): AppClientMethodCallParams { - return { - ...params, - method: 'delete()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - }, - } - } - -} - -/** - * A factory to create and deploy one or more instance of the ContractV1 smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class ContractV1Factory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `ContractV1Factory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new ContractV1Client(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new ContractV1Client(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the ContractV1 smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: ContractV1DeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - deleteParams: params.deleteParams?.method ? ContractV1ParamsFactory.delete._resolveByMethod(params.deleteParams) : params.deleteParams ? params.deleteParams as (ContractV1DeleteCallParams & { args: Uint8Array[] }) : undefined, - }) - return { result: result.result, appClient: new ContractV1Client(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ContractV1 smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - /** - * Gets available deployDelete methods - */ - deployDelete: { - /** - * Deletes an existing instance of the ContractV1 smart contract using the delete()void ABI method. - * - * @param params The params for the smart contract call - * @returns The deployDelete params - */ - delete: (params: CallParams = {args: []}) => { - return this.appFactory.params.deployDelete(ContractV1ParamsFactory.delete.delete(params)) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ContractV1 smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ContractV1 smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new ContractV1Client(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the ContractV1 smart contract - */ -export class ContractV1Client { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `ContractV1Client` - * - * @param appClient An `AppClient` instance which has been created with the ContractV1 app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `ContractV1Client` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `ContractV1Client` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new ContractV1Client(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `ContractV1Client` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new ContractV1Client(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available delete methods - */ - delete: { - /** - * Deletes an existing instance of the ContractV1 smart contract using the `delete()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The delete params - */ - delete: (params: CallParams & { onComplete?: OnApplicationComplete.DeleteApplication } = {args: []}) => { - return this.appClient.params.delete(ContractV1ParamsFactory.delete.delete(params)) - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the ContractV1 smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available delete methods - */ - delete: { - /** - * Deletes an existing instance of the ContractV1 smart contract using the `delete()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The delete transaction - */ - delete: (params: CallParams & { onComplete?: OnApplicationComplete.DeleteApplication } = {args: []}) => { - return this.appClient.createTransaction.delete(ContractV1ParamsFactory.delete.delete(params)) - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the ContractV1 smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available delete methods - */ - delete: { - /** - * Deletes an existing instance of the ContractV1 smart contract using the `delete()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The delete result - */ - delete: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.DeleteApplication } = {args: []}) => { - const result = await this.appClient.send.delete(ContractV1ParamsFactory.delete.delete(params)) - return {...result, return: result.return as unknown as (undefined | ContractV1Returns['delete()void'])} - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the ContractV1 smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new ContractV1Client(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current ContractV1 app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): ContractV1Composer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - get delete() { - return { - delete: (params: CallParams) => { - promiseChain = promiseChain.then(async () => composer.addAppDeleteMethodCall(await client.params.delete.delete(params))) - return this - }, - } - }, - /** - * Add a clear state call to the ContractV1 contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as ContractV1Composer - } -} -export type ContractV1Composer = { - /** - * Gets available delete methods - */ - readonly delete: { - /** - * Deletes an existing instance of the ContractV1 smart contract using the delete()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - delete(params?: CallParams): ContractV1Composer<[...TReturns, ContractV1Returns['delete()void'] | undefined]> - } - - /** - * Makes a clear_state call to an existing instance of the ContractV1 smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): ContractV1Composer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): ContractV1Composer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type ContractV1ComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/CryptoOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/CryptoOpsContract.ts deleted file mode 100644 index d63f44a..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/CryptoOpsContract.ts +++ /dev/null @@ -1,1422 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"CryptoOpsContract","structs":{},"methods":[{"name":"verify_sha256","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_sha3_256","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_keccak_256","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_sha512_256","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ed25519verify","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ed25519verify_bare","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_verify_k1","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"},{"type":"byte[]","name":"e"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_verify_r1","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"},{"type":"byte[]","name":"e"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_recover_k1","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"}],"returns":{"type":"(byte[],byte[])"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_recover_r1","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"}],"returns":{"type":"(byte[],byte[])"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"desc":"Must fail, AVM does not support Secp256r1 for recover","events":[],"recommendations":{}},{"name":"verify_ecdsa_decompress_k1","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"(byte[],byte[])"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_decompress_r1","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"(byte[],byte[])"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_vrf_verify","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"(byte[],bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMzAwMCA0CiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHgwMCAweDE1MWY3Yzc1MDAyMCAweDAwMDQgMHgwNjgxMDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQ3J5cHRvT3BzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDIwCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHgzNDU2YzRjMyAweGU4NDQyYjg0IDB4NjVmNTY3YWEgMHgyNTg0NTViMSAweDM1YWYwZjM4IDB4NjU4MmM5OTcgMHg2Mjk4ZmZiYiAweDM4ODViNTRmIDB4MjE2NGUwYmYgMHg3NTViNzlhNSAweGYwNmJiMDc3IDB4MTMzZjhjY2MgMHgyZjdjNjhhOSAvLyBtZXRob2QgInZlcmlmeV9zaGEyNTYoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9zaGEzXzI1NihieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2tlY2Nha18yNTYoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9zaGE1MTJfMjU2KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZWQyNTUxOXZlcmlmeShieXRlW10sYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfZWQyNTUxOXZlcmlmeV9iYXJlKGJ5dGVbXSxieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9lY2RzYV92ZXJpZnlfazEoYnl0ZVtdLGJ5dGVbXSxieXRlW10sYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfZWNkc2FfdmVyaWZ5X3IxKGJ5dGVbXSxieXRlW10sYnl0ZVtdLGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX3JlY292ZXJfazEoYnl0ZVtdLHVpbnQ2NCxieXRlW10sYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX3JlY292ZXJfcjEoYnl0ZVtdLHVpbnQ2NCxieXRlW10sYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX2RlY29tcHJlc3NfazEoYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX2RlY29tcHJlc3NfcjEoYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X3ZyZl92ZXJpZnkoYnl0ZVtdLGJ5dGVbXSxieXRlW10pKGJ5dGVbXSxib29sKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9zaGEyNTYgdmVyaWZ5X3NoYTNfMjU2IHZlcmlmeV9rZWNjYWtfMjU2IHZlcmlmeV9zaGE1MTJfMjU2IHZlcmlmeV9lZDI1NTE5dmVyaWZ5IHZlcmlmeV9lZDI1NTE5dmVyaWZ5X2JhcmUgdmVyaWZ5X2VjZHNhX3ZlcmlmeV9rMSB2ZXJpZnlfZWNkc2FfdmVyaWZ5X3IxIHZlcmlmeV9lY2RzYV9yZWNvdmVyX2sxIHZlcmlmeV9lY2RzYV9yZWNvdmVyX3IxIHZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX2sxIHZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX3IxIHZlcmlmeV92cmZfdmVyaWZ5CiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMjA6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyA0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3aXRjaCBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMyBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANAoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICBpdHhuX3N1Ym1pdAogICAgYiBlbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxCgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANDoKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMzoKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2OgogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfc2hhMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NoYTI1NjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjcKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjgKICAgIC8vIHJlc3VsdCA9IG9wLnNoYTI1NihhKQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUwMDIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcnlwdG9PcHMuY29udHJhY3QuQ3J5cHRvT3BzQ29udHJhY3QudmVyaWZ5X3NoYTNfMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NoYTNfMjU2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBhID0gb3AuYnplcm8ocGFkX3NpemUpICsgYQogICAgYnplcm8KICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxNAogICAgLy8gcmVzdWx0ID0gb3Auc2hhM18yNTYoYSkKICAgIHNoYTNfMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3J5cHRvT3BzLmNvbnRyYWN0LkNyeXB0b09wc0NvbnRyYWN0LnZlcmlmeV9rZWNjYWtfMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2tlY2Nha18yNTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MTkKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyByZXN1bHQgPSBvcC5rZWNjYWsyNTYoYSkKICAgIGtlY2NhazI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfc2hhNTEyXzI1Nltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zaGE1MTJfMjU2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhID0gb3AuYnplcm8ocGFkX3NpemUpICsgYQogICAgYnplcm8KICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyNgogICAgLy8gcmVzdWx0ID0gb3Auc2hhNTEyXzI1NihhKQogICAgc2hhNTEyXzI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWQyNTUxOXZlcmlmeVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lZDI1NTE5dmVyaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzEKICAgIC8vIGVuc3VyZV9idWRnZXQoMTkwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgMTkwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozMgogICAgLy8gcmVzdWx0ID0gb3AuZWQyNTUxOXZlcmlmeShhLCBiLCBjKQogICAgZWQyNTUxOXZlcmlmeQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozMwogICAgLy8gcmV0dXJuIGFyYzQuQm9vbChyZXN1bHQpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3J5cHRvT3BzLmNvbnRyYWN0LkNyeXB0b09wc0NvbnRyYWN0LnZlcmlmeV9lZDI1NTE5dmVyaWZ5X2JhcmVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZWQyNTUxOXZlcmlmeV9iYXJlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzcKICAgIC8vIGVuc3VyZV9idWRnZXQoMTkwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgMTkwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozOAogICAgLy8gcmVzdWx0ID0gb3AuZWQyNTUxOXZlcmlmeV9iYXJlKGEsIGIsIGMpCiAgICBlZDI1NTE5dmVyaWZ5X2JhcmUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzkKICAgIC8vIHJldHVybiBhcmM0LkJvb2wocmVzdWx0KQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfdmVyaWZ5X2sxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2VjZHNhX3ZlcmlmeV9rMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDMKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyByZXN1bHRfazEgPSBvcC5lY2RzYV92ZXJpZnkob3AuRUNEU0EuU2VjcDI1NmsxLCBhLCBiLCBjLCBkLCBlKQogICAgZWNkc2FfdmVyaWZ5IFNlY3AyNTZrMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfdmVyaWZ5X3IxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2VjZHNhX3ZlcmlmeV9yMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDkKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjUwCiAgICAvLyByZXN1bHRfcjEgPSBvcC5lY2RzYV92ZXJpZnkob3AuRUNEU0EuU2VjcDI1NnIxLCBhLCBiLCBjLCBkLCBlKQogICAgZWNkc2FfdmVyaWZ5IFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfcmVjb3Zlcl9rMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9yZWNvdmVyX2sxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NTcKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjU4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfcmVjb3ZlcihvcC5FQ0RTQS5TZWNwMjU2azEsIGEsIGIsIGMsIGQpCiAgICBlY2RzYV9wa19yZWNvdmVyIFNlY3AyNTZrMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfcmVjb3Zlcl9yMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9yZWNvdmVyX3IxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NjcKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjY4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfcmVjb3ZlcihvcC5FQ0RTQS5TZWNwMjU2cjEsIGEsIGIsIGMsIGQpCiAgICBlY2RzYV9wa19yZWNvdmVyIFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19rMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX2sxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmVfYnVkZ2V0KDcwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNzAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjczCiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfZGVjb21wcmVzcyhvcC5FQ0RTQS5TZWNwMjU2azEsIGEpCiAgICBlY2RzYV9wa19kZWNvbXByZXNzIFNlY3AyNTZrMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19yMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX3IxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBlbnN1cmVfYnVkZ2V0KDcwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNzAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfZGVjb21wcmVzcyhvcC5FQ0RTQS5TZWNwMjU2cjEsIGEpCiAgICBlY2RzYV9wa19kZWNvbXByZXNzIFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfdnJmX3ZlcmlmeVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV92cmZfdmVyaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6ODIKICAgIC8vIGVuc3VyZV9idWRnZXQoNTcwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNTcwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo4MwogICAgLy8gcmVzdWx0ID0gb3AudnJmX3ZlcmlmeShvcC5WcmZWZXJpZnkuVnJmQWxnb3JhbmQsIGEsIGIsIGMpCiAgICB2cmZfdmVyaWZ5IFZyZkFsZ29yYW5kCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAAG4FwQmBQQVH3x1AQAGFR98dQAgAgAEAwaBATEbQQBqMRkURDEYRIINBDRWxMME6EQrhARl9WeqBCWEVbEENa8POARlgsmXBGKY/7sEOIW1TwQhZOC/BHVbeaUE8GuwdwQTP4zMBC98aKk2GgCODQBEAFgAbACAAJQAuQDeAQ4BPgGGAc4CCAJCADEZFDEYFBBDigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScEsh4nBLIfi/+NAgALAASzQv/bMgCyAUL/9SKyAUL/74k2GgFXAgA2GgIXr0xQASpMULAjQzYaAVcCADYaAhevTFCYKkxQsCNDNhoBVwIANhoCF69MUAIqTFCwI0M2GgFXAgA2GgIXr0xQAypMULAjQzYaAVcCADYaAlcCADYaA1cCAIHsDiKI/1wEKSJPAlQoTFCwI0M2GgFXAgA2GgJXAgA2GgNXAgCB7A4iiP83hCkiTwJUKExQsCNDNhoBVwIANhoCVwIANhoDVwIANhoEVwIANhoFVwIAJCKI/wgFACkiTwJUKExQsCNDNhoBVwIANhoCVwIANhoDVwIANhoEVwIANhoFVwIAJCKI/tgFASkiTwJUKExQsCNDNhoBVwIANhoCFzYaA1cCADYaBFcCACQiiP6wBwBLARUWVwYCTwJQSRUlCEsCFRZXBgJPA1BMFlcGAitMUE8CUExQKExQsCNDNhoBVwIANhoCFzYaA1cCADYaBFcCACQiiP5oBwFLARUWVwYCTwJQSRUlCEsCFRZXBgJPA1BMFlcGAitMUE8CUExQKExQsCNDNhoBVwIAgbwFIoj+LgYASwEVFlcGAk8CUEkVJQhLAhUWVwYCTwNQTBZXBgIrTFBPAlBMUChMULAjQzYaAVcCAIG8BSKI/fQGAUsBFRZXBgJPAlBJFSUISwIVFlcGAk8DUEwWVwYCK0xQTwJQTFAoTFCwI0M2GgFXAgA2GgJXAgA2GgNXAgCBxCwiiP2u0ABLARUWVwYCTwJQKSJPA1SAAgADTFBMUChMULAjQw==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the CryptoOpsContract contract - */ -export type CryptoOpsContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify_sha256(byte[],uint64)byte[]': { - a: Uint8Array - padSize: bigint | number - } - 'verify_sha3_256(byte[],uint64)byte[]': { - a: Uint8Array - padSize: bigint | number - } - 'verify_keccak_256(byte[],uint64)byte[]': { - a: Uint8Array - padSize: bigint | number - } - 'verify_sha512_256(byte[],uint64)byte[]': { - a: Uint8Array - padSize: bigint | number - } - 'verify_ed25519verify(byte[],byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - c: Uint8Array - } - 'verify_ed25519verify_bare(byte[],byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - c: Uint8Array - } - 'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - c: Uint8Array - d: Uint8Array - e: Uint8Array - } - 'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - c: Uint8Array - d: Uint8Array - e: Uint8Array - } - 'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])': { - a: Uint8Array - b: bigint | number - c: Uint8Array - d: Uint8Array - } - 'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])': { - a: Uint8Array - b: bigint | number - c: Uint8Array - d: Uint8Array - } - 'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])': { - a: Uint8Array - } - 'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])': { - a: Uint8Array - } - 'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)': { - a: Uint8Array - b: Uint8Array - c: Uint8Array - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify_sha256(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] - 'verify_sha3_256(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] - 'verify_keccak_256(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] - 'verify_sha512_256(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] - 'verify_ed25519verify(byte[],byte[],byte[])bool': [a: Uint8Array, b: Uint8Array, c: Uint8Array] - 'verify_ed25519verify_bare(byte[],byte[],byte[])bool': [a: Uint8Array, b: Uint8Array, c: Uint8Array] - 'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool': [a: Uint8Array, b: Uint8Array, c: Uint8Array, d: Uint8Array, e: Uint8Array] - 'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool': [a: Uint8Array, b: Uint8Array, c: Uint8Array, d: Uint8Array, e: Uint8Array] - 'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])': [a: Uint8Array, b: bigint | number, c: Uint8Array, d: Uint8Array] - 'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])': [a: Uint8Array, b: bigint | number, c: Uint8Array, d: Uint8Array] - 'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])': [a: Uint8Array] - 'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])': [a: Uint8Array] - 'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)': [a: Uint8Array, b: Uint8Array, c: Uint8Array] - } -} - -/** - * The return type for each method - */ -export type CryptoOpsContractReturns = { - 'verify_sha256(byte[],uint64)byte[]': Uint8Array - 'verify_sha3_256(byte[],uint64)byte[]': Uint8Array - 'verify_keccak_256(byte[],uint64)byte[]': Uint8Array - 'verify_sha512_256(byte[],uint64)byte[]': Uint8Array - 'verify_ed25519verify(byte[],byte[],byte[])bool': boolean - 'verify_ed25519verify_bare(byte[],byte[],byte[])bool': boolean - 'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool': boolean - 'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool': boolean - 'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])': [Uint8Array, Uint8Array] - 'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])': [Uint8Array, Uint8Array] - 'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])': [Uint8Array, Uint8Array] - 'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])': [Uint8Array, Uint8Array] - 'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)': [Uint8Array, boolean] -} - -/** - * Defines the types of available calls and state of the CryptoOpsContract smart contract. - */ -export type CryptoOpsContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify_sha256(byte[],uint64)byte[]' | 'verify_sha256', { - argsObj: CryptoOpsContractArgs['obj']['verify_sha256(byte[],uint64)byte[]'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_sha256(byte[],uint64)byte[]'] - returns: CryptoOpsContractReturns['verify_sha256(byte[],uint64)byte[]'] - }> - & Record<'verify_sha3_256(byte[],uint64)byte[]' | 'verify_sha3_256', { - argsObj: CryptoOpsContractArgs['obj']['verify_sha3_256(byte[],uint64)byte[]'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_sha3_256(byte[],uint64)byte[]'] - returns: CryptoOpsContractReturns['verify_sha3_256(byte[],uint64)byte[]'] - }> - & Record<'verify_keccak_256(byte[],uint64)byte[]' | 'verify_keccak_256', { - argsObj: CryptoOpsContractArgs['obj']['verify_keccak_256(byte[],uint64)byte[]'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_keccak_256(byte[],uint64)byte[]'] - returns: CryptoOpsContractReturns['verify_keccak_256(byte[],uint64)byte[]'] - }> - & Record<'verify_sha512_256(byte[],uint64)byte[]' | 'verify_sha512_256', { - argsObj: CryptoOpsContractArgs['obj']['verify_sha512_256(byte[],uint64)byte[]'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_sha512_256(byte[],uint64)byte[]'] - returns: CryptoOpsContractReturns['verify_sha512_256(byte[],uint64)byte[]'] - }> - & Record<'verify_ed25519verify(byte[],byte[],byte[])bool' | 'verify_ed25519verify', { - argsObj: CryptoOpsContractArgs['obj']['verify_ed25519verify(byte[],byte[],byte[])bool'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_ed25519verify(byte[],byte[],byte[])bool'] - returns: CryptoOpsContractReturns['verify_ed25519verify(byte[],byte[],byte[])bool'] - }> - & Record<'verify_ed25519verify_bare(byte[],byte[],byte[])bool' | 'verify_ed25519verify_bare', { - argsObj: CryptoOpsContractArgs['obj']['verify_ed25519verify_bare(byte[],byte[],byte[])bool'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_ed25519verify_bare(byte[],byte[],byte[])bool'] - returns: CryptoOpsContractReturns['verify_ed25519verify_bare(byte[],byte[],byte[])bool'] - }> - & Record<'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool' | 'verify_ecdsa_verify_k1', { - argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'] - returns: CryptoOpsContractReturns['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'] - }> - & Record<'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool' | 'verify_ecdsa_verify_r1', { - argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'] - returns: CryptoOpsContractReturns['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'] - }> - & Record<'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])' | 'verify_ecdsa_recover_k1', { - argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'] - returns: CryptoOpsContractReturns['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'] - }> - & Record<'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])' | 'verify_ecdsa_recover_r1', { - argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'] - returns: CryptoOpsContractReturns['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'] - }> - & Record<'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])' | 'verify_ecdsa_decompress_k1', { - argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'] - returns: CryptoOpsContractReturns['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'] - }> - & Record<'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])' | 'verify_ecdsa_decompress_r1', { - argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'] - returns: CryptoOpsContractReturns['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'] - }> - & Record<'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)' | 'verify_vrf_verify', { - argsObj: CryptoOpsContractArgs['obj']['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'] - argsTuple: CryptoOpsContractArgs['tuple']['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'] - returns: CryptoOpsContractReturns['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type CryptoOpsContractSignatures = keyof CryptoOpsContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type CryptoOpsContractNonVoidMethodSignatures = keyof CryptoOpsContractTypes['methods'] extends infer T ? T extends keyof CryptoOpsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the CryptoOpsContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = CryptoOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the CryptoOpsContract smart contract to the method's return type - */ -export type MethodReturn = CryptoOpsContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type CryptoOpsContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type CryptoOpsContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: CryptoOpsContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the CryptoOpsContract smart contract - */ -export abstract class CryptoOpsContractParamsFactory { - /** - * Constructs a no op call for the verify_sha256(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifySha256(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_sha256(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], - } - } - /** - * Constructs a no op call for the verify_sha3_256(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifySha3_256(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_sha3_256(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], - } - } - /** - * Constructs a no op call for the verify_keccak_256(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyKeccak_256(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_keccak_256(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], - } - } - /** - * Constructs a no op call for the verify_sha512_256(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifySha512_256(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_sha512_256(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], - } - } - /** - * Constructs a no op call for the verify_ed25519verify(byte[],byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyEd25519verify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_ed25519verify(byte[],byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_ed25519verify_bare(byte[],byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyEd25519verifyBare(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_ed25519verify_bare(byte[],byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyEcdsaVerifyK1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d, params.args.e], - } - } - /** - * Constructs a no op call for the verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyEcdsaVerifyR1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d, params.args.e], - } - } - /** - * Constructs a no op call for the verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[]) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyEcdsaRecoverK1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d], - } - } - /** - * Constructs a no op call for the verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[]) ABI method - * - * Must fail, AVM does not support Secp256r1 for recover - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyEcdsaRecoverR1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d], - } - } - /** - * Constructs a no op call for the verify_ecdsa_decompress_k1(byte[])(byte[],byte[]) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyEcdsaDecompressK1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_ecdsa_decompress_r1(byte[])(byte[],byte[]) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyEcdsaDecompressR1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_vrf_verify(byte[],byte[],byte[])(byte[],bool) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyVrfVerify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } -} - -/** - * A factory to create and deploy one or more instance of the CryptoOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class CryptoOpsContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `CryptoOpsContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new CryptoOpsContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new CryptoOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the CryptoOpsContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: CryptoOpsContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new CryptoOpsContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the CryptoOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the CryptoOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the CryptoOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new CryptoOpsContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the CryptoOpsContract smart contract - */ -export class CryptoOpsContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `CryptoOpsContractClient` - * - * @param appClient An `AppClient` instance which has been created with the CryptoOpsContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `CryptoOpsContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `CryptoOpsContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new CryptoOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `CryptoOpsContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new CryptoOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the CryptoOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_sha256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifySha256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifySha256(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_sha3_256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifySha3_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifySha3_256(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_keccak_256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyKeccak_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyKeccak_256(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_sha512_256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifySha512_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifySha512_256(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify(byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyEd25519verify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEd25519verify(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify_bare(byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyEd25519verifyBare: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEd25519verifyBare(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyEcdsaVerifyK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyK1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyEcdsaVerifyR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyR1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyEcdsaRecoverK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverK1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. - * - * Must fail, AVM does not support Secp256r1 for recover - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyEcdsaRecoverR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverR1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_k1(byte[])(byte[],byte[])` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyEcdsaDecompressK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressK1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_r1(byte[])(byte[],byte[])` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyEcdsaDecompressR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressR1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyVrfVerify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyVrfVerify(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the CryptoOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_sha256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifySha256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifySha256(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_sha3_256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifySha3_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifySha3_256(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_keccak_256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyKeccak_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyKeccak_256(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_sha512_256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifySha512_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifySha512_256(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify(byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyEd25519verify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEd25519verify(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify_bare(byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyEd25519verifyBare: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEd25519verifyBare(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyEcdsaVerifyK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyK1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyEcdsaVerifyR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyR1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyEcdsaRecoverK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverK1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. - * - * Must fail, AVM does not support Secp256r1 for recover - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyEcdsaRecoverR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverR1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_k1(byte[])(byte[],byte[])` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyEcdsaDecompressK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressK1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_r1(byte[])(byte[],byte[])` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyEcdsaDecompressR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressR1(params)) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyVrfVerify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyVrfVerify(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the CryptoOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_sha256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifySha256: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifySha256(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_sha256(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_sha3_256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifySha3_256: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifySha3_256(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_sha3_256(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_keccak_256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyKeccak_256: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyKeccak_256(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_keccak_256(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_sha512_256(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifySha512_256: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifySha512_256(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_sha512_256(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify(byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyEd25519verify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEd25519verify(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ed25519verify(byte[],byte[],byte[])bool'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify_bare(byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyEd25519verifyBare: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEd25519verifyBare(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ed25519verify_bare(byte[],byte[],byte[])bool'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyEcdsaVerifyK1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyK1(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyEcdsaVerifyR1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyR1(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyEcdsaRecoverK1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverK1(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. - * - * Must fail, AVM does not support Secp256r1 for recover - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyEcdsaRecoverR1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverR1(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_k1(byte[])(byte[],byte[])` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyEcdsaDecompressK1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressK1(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_r1(byte[])(byte[],byte[])` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyEcdsaDecompressR1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressR1(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'])} - }, - - /** - * Makes a call to the CryptoOpsContract smart contract using the `verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyVrfVerify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyVrfVerify(params)) - return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new CryptoOpsContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current CryptoOpsContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): CryptoOpsContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_sha256(byte[],uint64)byte[] method call against the CryptoOpsContract contract - */ - verifySha256(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySha256(params))) - return this - }, - /** - * Add a verify_sha3_256(byte[],uint64)byte[] method call against the CryptoOpsContract contract - */ - verifySha3_256(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySha3_256(params))) - return this - }, - /** - * Add a verify_keccak_256(byte[],uint64)byte[] method call against the CryptoOpsContract contract - */ - verifyKeccak_256(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyKeccak_256(params))) - return this - }, - /** - * Add a verify_sha512_256(byte[],uint64)byte[] method call against the CryptoOpsContract contract - */ - verifySha512_256(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySha512_256(params))) - return this - }, - /** - * Add a verify_ed25519verify(byte[],byte[],byte[])bool method call against the CryptoOpsContract contract - */ - verifyEd25519verify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEd25519verify(params))) - return this - }, - /** - * Add a verify_ed25519verify_bare(byte[],byte[],byte[])bool method call against the CryptoOpsContract contract - */ - verifyEd25519verifyBare(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEd25519verifyBare(params))) - return this - }, - /** - * Add a verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool method call against the CryptoOpsContract contract - */ - verifyEcdsaVerifyK1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaVerifyK1(params))) - return this - }, - /** - * Add a verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool method call against the CryptoOpsContract contract - */ - verifyEcdsaVerifyR1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaVerifyR1(params))) - return this - }, - /** - * Add a verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[]) method call against the CryptoOpsContract contract - */ - verifyEcdsaRecoverK1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaRecoverK1(params))) - return this - }, - /** - * Add a verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[]) method call against the CryptoOpsContract contract - */ - verifyEcdsaRecoverR1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaRecoverR1(params))) - return this - }, - /** - * Add a verify_ecdsa_decompress_k1(byte[])(byte[],byte[]) method call against the CryptoOpsContract contract - */ - verifyEcdsaDecompressK1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaDecompressK1(params))) - return this - }, - /** - * Add a verify_ecdsa_decompress_r1(byte[])(byte[],byte[]) method call against the CryptoOpsContract contract - */ - verifyEcdsaDecompressR1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaDecompressR1(params))) - return this - }, - /** - * Add a verify_vrf_verify(byte[],byte[],byte[])(byte[],bool) method call against the CryptoOpsContract contract - */ - verifyVrfVerify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyVrfVerify(params))) - return this - }, - /** - * Add a clear state call to the CryptoOpsContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as CryptoOpsContractComposer - } -} -export type CryptoOpsContractComposer = { - /** - * Calls the verify_sha256(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifySha256(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_sha256(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_sha3_256(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifySha3_256(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_sha3_256(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_keccak_256(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyKeccak_256(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_keccak_256(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_sha512_256(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifySha512_256(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_sha512_256(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_ed25519verify(byte[],byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyEd25519verify(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ed25519verify(byte[],byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_ed25519verify_bare(byte[],byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyEd25519verifyBare(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ed25519verify_bare(byte[],byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyEcdsaVerifyK1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyEcdsaVerifyR1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[]) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyEcdsaRecoverK1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'] | undefined]> - - /** - * Calls the verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[]) ABI method. - * - * Must fail, AVM does not support Secp256r1 for recover - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyEcdsaRecoverR1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'] | undefined]> - - /** - * Calls the verify_ecdsa_decompress_k1(byte[])(byte[],byte[]) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyEcdsaDecompressK1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'] | undefined]> - - /** - * Calls the verify_ecdsa_decompress_r1(byte[])(byte[],byte[]) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyEcdsaDecompressR1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'] | undefined]> - - /** - * Calls the verify_vrf_verify(byte[],byte[],byte[])(byte[],bool) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyVrfVerify(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the CryptoOpsContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): CryptoOpsContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): CryptoOpsContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type CryptoOpsContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/DynamicArrayInitContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/DynamicArrayInitContract.ts deleted file mode 100644 index 3ed4087..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/DynamicArrayInitContract.ts +++ /dev/null @@ -1,755 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"DynamicArrayInitContract","structs":{},"methods":[{"name":"test_immutable_array_init","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_immutable_array_init_without_type_generic","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reference_array_init","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reference_array_init_without_type_generic","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDggMyAwCiAgICBieXRlY2Jsb2NrIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0ODAKICAgIC8vIGNsYXNzIER5bmFtaWNBcnJheUluaXRDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4ODQzNGJhMmEgMHg2M2FhYmJhMCAweGRiYWYwMzRlIDB4YTlkMTQ1NTQgLy8gbWV0aG9kICJ0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdCB0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljIHRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXQgdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDExOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5EeW5hbWljQXJyYXlJbml0Q29udHJhY3QudGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0ODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuRHluYW1pY0FycmF5SW5pdENvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkR5bmFtaWNBcnJheUluaXRDb250cmFjdC50ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNwogICAgLy8gYTEgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzMAogICAgLy8gYXNzZXJ0IGExLmxlbmd0aCA9PSBhMi5sZW5ndGgKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgLwogICAgaW50Y18yIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzMQogICAgLy8gYXNzZXJ0IGExWzBdID09IGEyWzBdCiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzMgogICAgLy8gYXNzZXJ0IGExWzFdID09IGEyWzFdCiAgICBkdXAKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzMKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhMlsyXQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzNwogICAgLy8gYXNzZXJ0IGExWzBdID09IGEzWzBdCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzgKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhM1sxXQogICAgZHVwCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTM5CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTNbMl0KICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQyCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGE0Lmxlbmd0aAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQzCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTRbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ0CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTRbMV0KICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0NQogICAgLy8gYXNzZXJ0IGExWzJdID09IGE0WzJdCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5EeW5hbWljQXJyYXlJbml0Q29udHJhY3QudGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpY1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NDkKICAgIC8vIGExID0gUmVmZXJlbmNlQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUyCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGEyLmxlbmd0aAogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUzCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTJbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU0CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTJbMV0KICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1NQogICAgLy8gYXNzZXJ0IGExWzJdID09IGEyWzJdCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU5CiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTNbMF0KICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU2MAogICAgLy8gYXNzZXJ0IGExWzFdID09IGEzWzFdCiAgICBkdXAKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjEKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhM1syXQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjQKICAgIC8vIGFzc2VydCBhMS5sZW5ndGggPT0gYTQubGVuZ3RoCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIGludGNfMiAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjUKICAgIC8vIGFzc2VydCBhMVswXSA9PSBhNFswXQogICAgZHVwCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjYKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhNFsxXQogICAgZHVwCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY3CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTRbMl0KICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAQgDACYBGAAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAzEbQQArMRkURDEYRIIEBIQ0uioEY6q7oATbrwNOBKnRRVQ2GgCOBAAJAAsADQBZADEZFDEYFBBDIkMiQyhHAhUjCiQSREklWyISREkjW4ECEkSBEFskEkRHAiVbIhJESSNbgQISRIEQWyQSREkVIwokEkRJJVsiEkRJI1uBAhJEgRBbJBJEIkMoRwIVIwokEkRJJVsiEkRJI1uBAhJEgRBbJBJERwIlWyISREkjW4ECEkSBEFskEkRJFSMKJBJESSVbIhJESSNbgQISRIEQWyQSRCJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the DynamicArrayInitContract contract - */ -export type DynamicArrayInitContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'test_immutable_array_init()void': Record - 'test_immutable_array_init_without_type_generic()void': Record - 'test_reference_array_init()void': Record - 'test_reference_array_init_without_type_generic()void': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'test_immutable_array_init()void': [] - 'test_immutable_array_init_without_type_generic()void': [] - 'test_reference_array_init()void': [] - 'test_reference_array_init_without_type_generic()void': [] - } -} - -/** - * The return type for each method - */ -export type DynamicArrayInitContractReturns = { - 'test_immutable_array_init()void': void - 'test_immutable_array_init_without_type_generic()void': void - 'test_reference_array_init()void': void - 'test_reference_array_init_without_type_generic()void': void -} - -/** - * Defines the types of available calls and state of the DynamicArrayInitContract smart contract. - */ -export type DynamicArrayInitContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'test_immutable_array_init()void' | 'test_immutable_array_init', { - argsObj: DynamicArrayInitContractArgs['obj']['test_immutable_array_init()void'] - argsTuple: DynamicArrayInitContractArgs['tuple']['test_immutable_array_init()void'] - returns: DynamicArrayInitContractReturns['test_immutable_array_init()void'] - }> - & Record<'test_immutable_array_init_without_type_generic()void' | 'test_immutable_array_init_without_type_generic', { - argsObj: DynamicArrayInitContractArgs['obj']['test_immutable_array_init_without_type_generic()void'] - argsTuple: DynamicArrayInitContractArgs['tuple']['test_immutable_array_init_without_type_generic()void'] - returns: DynamicArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'] - }> - & Record<'test_reference_array_init()void' | 'test_reference_array_init', { - argsObj: DynamicArrayInitContractArgs['obj']['test_reference_array_init()void'] - argsTuple: DynamicArrayInitContractArgs['tuple']['test_reference_array_init()void'] - returns: DynamicArrayInitContractReturns['test_reference_array_init()void'] - }> - & Record<'test_reference_array_init_without_type_generic()void' | 'test_reference_array_init_without_type_generic', { - argsObj: DynamicArrayInitContractArgs['obj']['test_reference_array_init_without_type_generic()void'] - argsTuple: DynamicArrayInitContractArgs['tuple']['test_reference_array_init_without_type_generic()void'] - returns: DynamicArrayInitContractReturns['test_reference_array_init_without_type_generic()void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type DynamicArrayInitContractSignatures = keyof DynamicArrayInitContractTypes['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the DynamicArrayInitContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = DynamicArrayInitContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the DynamicArrayInitContract smart contract to the method's return type - */ -export type MethodReturn = DynamicArrayInitContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type DynamicArrayInitContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type DynamicArrayInitContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: DynamicArrayInitContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the DynamicArrayInitContract smart contract - */ -export abstract class DynamicArrayInitContractParamsFactory { - /** - * Constructs a no op call for the test_immutable_array_init()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testImmutableArrayInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_immutable_array_init()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_immutable_array_init_without_type_generic()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testImmutableArrayInitWithoutTypeGeneric(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_immutable_array_init_without_type_generic()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_reference_array_init()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testReferenceArrayInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_reference_array_init()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_reference_array_init_without_type_generic()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testReferenceArrayInitWithoutTypeGeneric(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_reference_array_init_without_type_generic()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } -} - -/** - * A factory to create and deploy one or more instance of the DynamicArrayInitContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class DynamicArrayInitContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `DynamicArrayInitContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new DynamicArrayInitContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new DynamicArrayInitContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the DynamicArrayInitContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: DynamicArrayInitContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new DynamicArrayInitContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the DynamicArrayInitContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the DynamicArrayInitContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the DynamicArrayInitContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new DynamicArrayInitContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the DynamicArrayInitContract smart contract - */ -export class DynamicArrayInitContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `DynamicArrayInitContractClient` - * - * @param appClient An `AppClient` instance which has been created with the DynamicArrayInitContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `DynamicArrayInitContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `DynamicArrayInitContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new DynamicArrayInitContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `DynamicArrayInitContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new DynamicArrayInitContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the DynamicArrayInitContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testImmutableArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInit(params)) - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testImmutableArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testReferenceArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInit(params)) - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testReferenceArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the DynamicArrayInitContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testImmutableArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInit(params)) - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testImmutableArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testReferenceArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInit(params)) - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testReferenceArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the DynamicArrayInitContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testImmutableArrayInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInit(params)) - return {...result, return: result.return as unknown as (undefined | DynamicArrayInitContractReturns['test_immutable_array_init()void'])} - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testImmutableArrayInitWithoutTypeGeneric: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) - return {...result, return: result.return as unknown as (undefined | DynamicArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'])} - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testReferenceArrayInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInit(params)) - return {...result, return: result.return as unknown as (undefined | DynamicArrayInitContractReturns['test_reference_array_init()void'])} - }, - - /** - * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testReferenceArrayInitWithoutTypeGeneric: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) - return {...result, return: result.return as unknown as (undefined | DynamicArrayInitContractReturns['test_reference_array_init_without_type_generic()void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new DynamicArrayInitContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current DynamicArrayInitContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): DynamicArrayInitContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a test_immutable_array_init()void method call against the DynamicArrayInitContract contract - */ - testImmutableArrayInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArrayInit(params))) - return this - }, - /** - * Add a test_immutable_array_init_without_type_generic()void method call against the DynamicArrayInitContract contract - */ - testImmutableArrayInitWithoutTypeGeneric(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArrayInitWithoutTypeGeneric(params))) - return this - }, - /** - * Add a test_reference_array_init()void method call against the DynamicArrayInitContract contract - */ - testReferenceArrayInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testReferenceArrayInit(params))) - return this - }, - /** - * Add a test_reference_array_init_without_type_generic()void method call against the DynamicArrayInitContract contract - */ - testReferenceArrayInitWithoutTypeGeneric(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testReferenceArrayInitWithoutTypeGeneric(params))) - return this - }, - /** - * Add a clear state call to the DynamicArrayInitContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as DynamicArrayInitContractComposer - } -} -export type DynamicArrayInitContractComposer = { - /** - * Calls the test_immutable_array_init()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testImmutableArrayInit(params?: CallParams): DynamicArrayInitContractComposer<[...TReturns, DynamicArrayInitContractReturns['test_immutable_array_init()void'] | undefined]> - - /** - * Calls the test_immutable_array_init_without_type_generic()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testImmutableArrayInitWithoutTypeGeneric(params?: CallParams): DynamicArrayInitContractComposer<[...TReturns, DynamicArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'] | undefined]> - - /** - * Calls the test_reference_array_init()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testReferenceArrayInit(params?: CallParams): DynamicArrayInitContractComposer<[...TReturns, DynamicArrayInitContractReturns['test_reference_array_init()void'] | undefined]> - - /** - * Calls the test_reference_array_init_without_type_generic()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testReferenceArrayInitWithoutTypeGeneric(params?: CallParams): DynamicArrayInitContractComposer<[...TReturns, DynamicArrayInitContractReturns['test_reference_array_init_without_type_generic()void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the DynamicArrayInitContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): DynamicArrayInitContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): DynamicArrayInitContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type DynamicArrayInitContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/DynamicItxnGroup.ts b/examples/p-py/projects/p-py-frontend/src/contracts/DynamicItxnGroup.ts deleted file mode 100644 index 8c63c52..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/DynamicItxnGroup.ts +++ /dev/null @@ -1,629 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"DynamicItxnGroup","structs":{},"methods":[{"name":"test_firstly","args":[{"type":"address[]","name":"addresses"},{"type":"pay","name":"funds"},{"type":"uint64","name":"verifier"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_looply","args":[{"type":"address[]","name":"addresses"},{"type":"pay","name":"funds"},{"type":"uint64","name":"verifier"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[85,217],"errorMessage":"Funds must be sent to app"},{"pc":[141,250],"errorMessage":"index access is out of bounds"},{"pc":[89,220],"errorMessage":"invalid array length header"},{"pc":[94,225],"errorMessage":"must provide some accounts"},{"pc":[72,204],"errorMessage":"transaction type is pay"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgNgogICAgYnl0ZWNibG9jayAweDY1YTlhZWNjICJhYmMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBjbGFzcyBEeW5hbWljSXR4bkdyb3VwKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHgxNzM5MTc4NCAweDNmMTBhZWE3IC8vIG1ldGhvZCAidGVzdF9maXJzdGx5KGFkZHJlc3NbXSxwYXksdWludDY0KXZvaWQiLCBtZXRob2QgInRlc3RfbG9vcGx5KGFkZHJlc3NbXSxwYXksdWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB0ZXN0X2ZpcnN0bHkgdGVzdF9sb29wbHkKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuZHluYW1pY19pdHhuX2dyb3VwLmNvbnRyYWN0LkR5bmFtaWNJdHhuR3JvdXAudGVzdF9maXJzdGx5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9maXJzdGx5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MTgKICAgIC8vIGFzc2VydCBmdW5kcy5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLCAiRnVuZHMgbXVzdCBiZSBzZW50IHRvIGFwcCIKICAgIGR1cAogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEZ1bmRzIG11c3QgYmUgc2VudCB0byBhcHAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MjAKICAgIC8vIGFzc2VydCBhZGRyZXNzZXMubGVuZ3RoLCAibXVzdCBwcm92aWRlIHNvbWUgYWNjb3VudHMiCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBhc3NlcnQgLy8gbXVzdCBwcm92aWRlIHNvbWUgYWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MjIKICAgIC8vIHNoYXJlID0gZnVuZHMuYW1vdW50IC8vIGFkZHJlc3Nlcy5sZW5ndGgKICAgIHN3YXAKICAgIGd0eG5zIEFtb3VudAogICAgc3dhcAogICAgLwogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBpdHhuLlBheW1lbnQoYW1vdW50PXNoYXJlLCByZWNlaXZlcj1hZGRyZXNzZXNbMF0ubmF0aXZlKS5zdGFnZShiZWdpbl9ncm91cD1UcnVlKQogICAgaXR4bl9iZWdpbgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBleHRyYWN0IDIgMzIKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpbnRjXzAgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MjYKICAgIC8vIGZvciBpIGluIHVyYW5nZSgxLCBhZGRyZXNzZXMubGVuZ3RoKToKICAgIGludGNfMCAvLyAxCgp0ZXN0X2ZpcnN0bHlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weToyNgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGFkZHJlc3Nlcy5sZW5ndGgpOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogdGVzdF9maXJzdGx5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBhZGRyID0gYWRkcmVzc2VzW2ldCiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAzMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBpdHhuLlBheW1lbnQoYW1vdW50PXNoYXJlLCByZWNlaXZlcj1hZGRyLm5hdGl2ZSkuc3RhZ2UoKQogICAgaXR4bl9uZXh0CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBkaWcgMwogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGludGNfMCAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weToyNgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGFkZHJlc3Nlcy5sZW5ndGgpOgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2ZpcnN0bHlfZm9yX2hlYWRlckAyCgp0ZXN0X2ZpcnN0bHlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjMwLTMyCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9dmVyaWZpZXIuaWQsIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJ2ZXJpZnkoKXZvaWQiKSwpCiAgICAvLyApLnN0YWdlKCkKICAgIGl0eG5fbmV4dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTozMQogICAgLy8gYXBwX2lkPXZlcmlmaWVyLmlkLCBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgidmVyaWZ5KCl2b2lkIiksKQogICAgYnl0ZWNfMCAvLyBtZXRob2QgInZlcmlmeSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MzQKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoYXNzZXRfbmFtZT0iYWJjIikuc3RhZ2UoKQogICAgaXR4bl9uZXh0CiAgICBieXRlY18xIC8vICJhYmMiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TmFtZQogICAgcHVzaGludCAzIC8vIGFjZmcKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTozNgogICAgLy8gaXR4bi5zdWJtaXRfc3RhZ2VkKCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuZHluYW1pY19pdHhuX2dyb3VwLmNvbnRyYWN0LkR5bmFtaWNJdHhuR3JvdXAudGVzdF9sb29wbHlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2xvb3BseToKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBhc3NlcnQgZnVuZHMucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywgIkZ1bmRzIG11c3QgYmUgc2VudCB0byBhcHAiCiAgICBkdXAKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBGdW5kcyBtdXN0IGJlIHNlbnQgdG8gYXBwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBhc3NlcnQgYWRkcmVzc2VzLmxlbmd0aCwgIm11c3QgcHJvdmlkZSBzb21lIGFjY291bnRzIgogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBhc3NlcnQgLy8gbXVzdCBwcm92aWRlIHNvbWUgYWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NDkKICAgIC8vIHNoYXJlID0gZnVuZHMuYW1vdW50IC8vIGFkZHJlc3Nlcy5sZW5ndGgKICAgIHN3YXAKICAgIGd0eG5zIEFtb3VudAogICAgc3dhcAogICAgLwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTo1MQogICAgLy8gaXNfZmlyc3QgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgaW50Y18xIC8vIDAKCnRlc3RfbG9vcGx5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NTIKICAgIC8vIGZvciBhZGRyIGluIGFkZHJlc3NlczoKICAgIGR1cAogICAgZGlnIDQKICAgIDwKICAgIGJ6IHRlc3RfbG9vcGx5X2FmdGVyX2ZvckA4CiAgICBkaWcgNQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMzIKICAgICoKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidXJ5IDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NTQKICAgIC8vIG15X3R4bi5zdGFnZShiZWdpbl9ncm91cD1pc19maXJzdCkKICAgIGRpZyAxCiAgICBieiB0ZXN0X2xvb3BseV9pdHhuX25leHRANQogICAgaXR4bl9iZWdpbgoKdGVzdF9sb29wbHlfYWZ0ZXJfaXR4bl9iZWdpbl9uZXh0QDY6CiAgICBkaWcgNgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZGlnIDIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBteV90eG4gPSBpdHhuLlBheW1lbnQoYW1vdW50PXNoYXJlLCByZWNlaXZlcj1hZGRyLm5hdGl2ZSkKICAgIGludGNfMCAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTo1NQogICAgLy8gaXNfZmlyc3QgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGJ1cnkgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfbG9vcGx5X2Zvcl9oZWFkZXJAMgoKdGVzdF9sb29wbHlfaXR4bl9uZXh0QDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBteV90eG4uc3RhZ2UoYmVnaW5fZ3JvdXA9aXNfZmlyc3QpCiAgICBpdHhuX25leHQKICAgIGIgdGVzdF9sb29wbHlfYWZ0ZXJfaXR4bl9iZWdpbl9uZXh0QDYKCnRlc3RfbG9vcGx5X2FmdGVyX2ZvckA4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTo1Ny01OQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPXZlcmlmaWVyLmlkLCBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgidmVyaWZ5KCl2b2lkIiksKQogICAgLy8gKS5zdGFnZSgpCiAgICBpdHhuX25leHQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NTgKICAgIC8vIGFwcF9pZD12ZXJpZmllci5pZCwgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoInZlcmlmeSgpdm9pZCIpLCkKICAgIGJ5dGVjXzAgLy8gbWV0aG9kICJ2ZXJpZnkoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTo1NwogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKGFzc2V0X25hbWU9ImFiYyIpLnN0YWdlKCkKICAgIGl0eG5fbmV4dAogICAgYnl0ZWNfMSAvLyAiYWJjIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIHB1c2hpbnQgMyAvLyBhY2ZnCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NjMKICAgIC8vIGl0eG4uc3VibWl0X3N0YWdlZCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTozOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAQAgBiYCBGWprswDYWJjMRtBAB0xGRREMRhEggIEFzkXhAQ/EK6nNhoAjgIACQCLADEZFDEYFBBDNhoBMRYiCUk4ECISRDYaAhdOAkk4BzIKEkRLASNZSU4DSURMOAhMCklOArFLAVcCAE4CTFcCILIHsggishAjsgEiSUsEDEEAHUcCJAtLA0wkWLayB0sDsggishAjsgEiCEUBQv/ctiiyGksEshglshAjsgG2KbImgQOyECOyAbMiQyM2GgFJMRYiCUk4ECISRDYaAhdOAkk4BzIKEkRMI1lJTgJJREw4CEwKIiNJSwQMQQAwSwVXAgBLASQLJFhFB0sBQQAasUsGsgdLArIIIrIQI7IBI0UCSSIIRQFC/822Qv/jtiiyGksEshglshAjsgG2KbImgQOyECOyAbMiQw==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the DynamicItxnGroup contract - */ -export type DynamicItxnGroupArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'test_firstly(address[],pay,uint64)void': { - addresses: string[] - funds: AppMethodCallTransactionArgument - verifier: bigint | number - } - 'test_looply(address[],pay,uint64)void': { - addresses: string[] - funds: AppMethodCallTransactionArgument - verifier: bigint | number - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'test_firstly(address[],pay,uint64)void': [addresses: string[], funds: AppMethodCallTransactionArgument, verifier: bigint | number] - 'test_looply(address[],pay,uint64)void': [addresses: string[], funds: AppMethodCallTransactionArgument, verifier: bigint | number] - } -} - -/** - * The return type for each method - */ -export type DynamicItxnGroupReturns = { - 'test_firstly(address[],pay,uint64)void': void - 'test_looply(address[],pay,uint64)void': void -} - -/** - * Defines the types of available calls and state of the DynamicItxnGroup smart contract. - */ -export type DynamicItxnGroupTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'test_firstly(address[],pay,uint64)void' | 'test_firstly', { - argsObj: DynamicItxnGroupArgs['obj']['test_firstly(address[],pay,uint64)void'] - argsTuple: DynamicItxnGroupArgs['tuple']['test_firstly(address[],pay,uint64)void'] - returns: DynamicItxnGroupReturns['test_firstly(address[],pay,uint64)void'] - }> - & Record<'test_looply(address[],pay,uint64)void' | 'test_looply', { - argsObj: DynamicItxnGroupArgs['obj']['test_looply(address[],pay,uint64)void'] - argsTuple: DynamicItxnGroupArgs['tuple']['test_looply(address[],pay,uint64)void'] - returns: DynamicItxnGroupReturns['test_looply(address[],pay,uint64)void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type DynamicItxnGroupSignatures = keyof DynamicItxnGroupTypes['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the DynamicItxnGroup smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = DynamicItxnGroupTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the DynamicItxnGroup smart contract to the method's return type - */ -export type MethodReturn = DynamicItxnGroupTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type DynamicItxnGroupCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type DynamicItxnGroupDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: DynamicItxnGroupCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the DynamicItxnGroup smart contract - */ -export abstract class DynamicItxnGroupParamsFactory { - /** - * Constructs a no op call for the test_firstly(address[],pay,uint64)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testFirstly(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_firstly(address[],pay,uint64)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.addresses, params.args.funds, params.args.verifier], - } - } - /** - * Constructs a no op call for the test_looply(address[],pay,uint64)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testLooply(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_looply(address[],pay,uint64)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.addresses, params.args.funds, params.args.verifier], - } - } -} - -/** - * A factory to create and deploy one or more instance of the DynamicItxnGroup smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class DynamicItxnGroupFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `DynamicItxnGroupFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new DynamicItxnGroupClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new DynamicItxnGroupClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the DynamicItxnGroup smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: DynamicItxnGroupDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new DynamicItxnGroupClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the DynamicItxnGroup smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the DynamicItxnGroup smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the DynamicItxnGroup smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new DynamicItxnGroupClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the DynamicItxnGroup smart contract - */ -export class DynamicItxnGroupClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `DynamicItxnGroupClient` - * - * @param appClient An `AppClient` instance which has been created with the DynamicItxnGroup app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `DynamicItxnGroupClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `DynamicItxnGroupClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new DynamicItxnGroupClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `DynamicItxnGroupClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new DynamicItxnGroupClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the DynamicItxnGroup smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the DynamicItxnGroup smart contract using the `test_firstly(address[],pay,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testFirstly: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(DynamicItxnGroupParamsFactory.testFirstly(params)) - }, - - /** - * Makes a call to the DynamicItxnGroup smart contract using the `test_looply(address[],pay,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testLooply: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(DynamicItxnGroupParamsFactory.testLooply(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the DynamicItxnGroup smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the DynamicItxnGroup smart contract using the `test_firstly(address[],pay,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testFirstly: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(DynamicItxnGroupParamsFactory.testFirstly(params)) - }, - - /** - * Makes a call to the DynamicItxnGroup smart contract using the `test_looply(address[],pay,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testLooply: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(DynamicItxnGroupParamsFactory.testLooply(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the DynamicItxnGroup smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the DynamicItxnGroup smart contract using the `test_firstly(address[],pay,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testFirstly: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(DynamicItxnGroupParamsFactory.testFirstly(params)) - return {...result, return: result.return as unknown as (undefined | DynamicItxnGroupReturns['test_firstly(address[],pay,uint64)void'])} - }, - - /** - * Makes a call to the DynamicItxnGroup smart contract using the `test_looply(address[],pay,uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testLooply: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(DynamicItxnGroupParamsFactory.testLooply(params)) - return {...result, return: result.return as unknown as (undefined | DynamicItxnGroupReturns['test_looply(address[],pay,uint64)void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new DynamicItxnGroupClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current DynamicItxnGroup app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): DynamicItxnGroupComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a test_firstly(address[],pay,uint64)void method call against the DynamicItxnGroup contract - */ - testFirstly(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testFirstly(params))) - return this - }, - /** - * Add a test_looply(address[],pay,uint64)void method call against the DynamicItxnGroup contract - */ - testLooply(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testLooply(params))) - return this - }, - /** - * Add a clear state call to the DynamicItxnGroup contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as DynamicItxnGroupComposer - } -} -export type DynamicItxnGroupComposer = { - /** - * Calls the test_firstly(address[],pay,uint64)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testFirstly(params?: CallParams): DynamicItxnGroupComposer<[...TReturns, DynamicItxnGroupReturns['test_firstly(address[],pay,uint64)void'] | undefined]> - - /** - * Calls the test_looply(address[],pay,uint64)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testLooply(params?: CallParams): DynamicItxnGroupComposer<[...TReturns, DynamicItxnGroupReturns['test_looply(address[],pay,uint64)void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the DynamicItxnGroup smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): DynamicItxnGroupComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): DynamicItxnGroupComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type DynamicItxnGroupComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateContract.ts deleted file mode 100644 index 0d69d22..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateContract.ts +++ /dev/null @@ -1,2649 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"GlobalStateContract","structs":{},"methods":[{"name":"get_implicit_key_arc4_uint","args":[],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_string","args":[],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_byte","args":[],"returns":{"type":"byte"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_bool","args":[],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_address","args":[],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_uint128","args":[],"returns":{"type":"uint128"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_dynamic_bytes","args":[],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_tuple","args":[],"returns":{"type":"(uint64,byte[],bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_uint","args":[],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_string","args":[],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_byte","args":[],"returns":{"type":"byte"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_bool","args":[],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_address","args":[],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_uint128","args":[],"returns":{"type":"uint128"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_dynamic_bytes","args":[],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_uint","args":[{"type":"uint64","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_string","args":[{"type":"string","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_byte","args":[{"type":"byte","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_bool","args":[{"type":"bool","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_address","args":[{"type":"address","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_uint128","args":[{"type":"uint128","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_dynamic_bytes","args":[{"type":"byte[]","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_tuple","args":[{"type":"(uint64,byte[],bool)","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_uint","args":[{"type":"uint64","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_string","args":[{"type":"string","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_byte","args":[{"type":"byte","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_bool","args":[{"type":"bool","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_address","args":[{"type":"address","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_uint128","args":[{"type":"uint128","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_dynamic_bytes","args":[{"type":"byte[]","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":15},"local":{"ints":0,"bytes":0}},"keys":{"global":{"implicit_key_arc4_uint":{"keyType":"AVMString","valueType":"uint64","key":"aW1wbGljaXRfa2V5X2FyYzRfdWludA=="},"implicit_key_arc4_string":{"keyType":"AVMString","valueType":"string","key":"aW1wbGljaXRfa2V5X2FyYzRfc3RyaW5n"},"implicit_key_arc4_byte":{"keyType":"AVMString","valueType":"byte","key":"aW1wbGljaXRfa2V5X2FyYzRfYnl0ZQ=="},"implicit_key_arc4_bool":{"keyType":"AVMString","valueType":"bool","key":"aW1wbGljaXRfa2V5X2FyYzRfYm9vbA=="},"implicit_key_arc4_address":{"keyType":"AVMString","valueType":"address","key":"aW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcw=="},"implicit_key_arc4_uint128":{"keyType":"AVMString","valueType":"uint128","key":"aW1wbGljaXRfa2V5X2FyYzRfdWludDEyOA=="},"implicit_key_arc4_dynamic_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"aW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcw=="},"implicit_key_tuple":{"keyType":"AVMString","valueType":"(uint64,byte[],bool)","key":"aW1wbGljaXRfa2V5X3R1cGxl"},"arc4_uint":{"keyType":"AVMString","valueType":"uint64","key":"ZXhwbGljaXRfa2V5X2FyYzRfdWludA=="},"arc4_string":{"keyType":"AVMString","valueType":"string","key":"ZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5n"},"arc4_byte":{"keyType":"AVMString","valueType":"byte","key":"ZXhwbGljaXRfa2V5X2FyYzRfYnl0ZQ=="},"arc4_bool":{"keyType":"AVMString","valueType":"bool","key":"ZXhwbGljaXRfa2V5X2FyYzRfYm9vbA=="},"arc4_address":{"keyType":"AVMString","valueType":"address","key":"ZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcw=="},"arc4_uint128":{"keyType":"AVMString","valueType":"uint128","key":"ZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOA=="},"arc4_dynamic_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"ZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcw=="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[906],"errorMessage":"check self.arc4_address exists"},{"pc":[895],"errorMessage":"check self.arc4_bool exists"},{"pc":[884],"errorMessage":"check self.arc4_byte exists"},{"pc":[928],"errorMessage":"check self.arc4_dynamic_bytes exists"},{"pc":[873],"errorMessage":"check self.arc4_string exists"},{"pc":[862],"errorMessage":"check self.arc4_uint exists"},{"pc":[917],"errorMessage":"check self.arc4_uint128 exists"},{"pc":[818],"errorMessage":"check self.implicit_key_arc4_address exists"},{"pc":[807],"errorMessage":"check self.implicit_key_arc4_bool exists"},{"pc":[796],"errorMessage":"check self.implicit_key_arc4_byte exists"},{"pc":[840],"errorMessage":"check self.implicit_key_arc4_dynamic_bytes exists"},{"pc":[786],"errorMessage":"check self.implicit_key_arc4_string exists"},{"pc":[776],"errorMessage":"check self.implicit_key_arc4_uint exists"},{"pc":[829],"errorMessage":"check self.implicit_key_arc4_uint128 exists"},{"pc":[851],"errorMessage":"check self.implicit_key_tuple exists"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIgImltcGxpY2l0X2tleV9hcmM0X3N0cmluZyIgImltcGxpY2l0X2tleV9hcmM0X2J5dGUiICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIiAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAiaW1wbGljaXRfa2V5X3R1cGxlIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIgImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIgImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIiAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAweDAwMDAwMDAwMDAwMDA1MzkgMHgwMDA1NDg2NTZjNmM2ZiAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE1LTUxNgogICAgLy8gIyBJbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQgPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQ2NCgxMzM3KSkKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlYyAxNiAvLyAweDAwMDAwMDAwMDAwMDA1MzkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE3CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyA9IEdsb2JhbFN0YXRlKGFyYzQuU3RyaW5nKCJIZWxsbyIpKQogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYnl0ZWMgMTcgLy8gMHgwMDA1NDg2NTZjNmM2ZgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSA9IEdsb2JhbFN0YXRlKGFyYzQuQnl0ZSgwKSkKICAgIGJ5dGVjXzMgLy8gImltcGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTkKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbCA9IEdsb2JhbFN0YXRlKGFyYzQuQm9vbChUcnVlKSkKICAgIGJ5dGVjIDQgLy8gImltcGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjAKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyA9IEdsb2JhbFN0YXRlKGFyYzQuQWRkcmVzcyhHbG9iYWwuY3JlYXRvcl9hZGRyZXNzKSkKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTIxCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQxMjgoMioqMTAwKSkKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBieXRlYyAxOCAvLyAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyMgogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzID0gR2xvYmFsU3RhdGUoYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikpCiAgICBieXRlYyA3IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYnl0ZWMgMTkgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV90dXBsZSA9IEdsb2JhbFN0YXRlKChVSW50NjQoMTApLCBCeXRlcyhiInRlc3QiKSwgRmFsc2UpKQogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwYTAwMGIwMDAwMDQ3NDY1NzM3NAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjUtNTI2CiAgICAvLyAjIEV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIHNlbGYuYXJjNF91aW50ID0gR2xvYmFsU3RhdGUoYXJjNC5VSW50NjQoMTMzNyksIGtleT0iZXhwbGljaXRfa2V5X2FyYzRfdWludCIpCiAgICBieXRlYyA5IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYnl0ZWMgMTYgLy8gMHgwMDAwMDAwMDAwMDAwNTM5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyNwogICAgLy8gc2VsZi5hcmM0X3N0cmluZyA9IEdsb2JhbFN0YXRlKGFyYzQuU3RyaW5nKCJIZWxsbyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIpCiAgICBieXRlYyAxMCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUxNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcgPSBHbG9iYWxTdGF0ZShhcmM0LlN0cmluZygiSGVsbG8iKSkKICAgIGJ5dGVjIDE3IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjcKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmcgPSBHbG9iYWxTdGF0ZShhcmM0LlN0cmluZygiSGVsbG8iKSwga2V5PSJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjgKICAgIC8vIHNlbGYuYXJjNF9ieXRlID0gR2xvYmFsU3RhdGUoYXJjNC5CeXRlKDApLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiKQogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjkKICAgIC8vIHNlbGYuYXJjNF9ib29sID0gR2xvYmFsU3RhdGUoYXJjNC5Cb29sKFRydWUpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiKQogICAgYnl0ZWMgMTIgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2wgPSBHbG9iYWxTdGF0ZShhcmM0LkJvb2woVHJ1ZSkpCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyOQogICAgLy8gc2VsZi5hcmM0X2Jvb2wgPSBHbG9iYWxTdGF0ZShhcmM0LkJvb2woVHJ1ZSksIGtleT0iZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIpCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMQogICAgLy8gYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMC01MzIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMwogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjggPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQxMjgoMioqMTAwKSwga2V5PSJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IikKICAgIGJ5dGVjIDE0IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYnl0ZWMgMTggLy8gMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzUKICAgIC8vIGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICBieXRlYyAxNSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjIKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyA9IEdsb2JhbFN0YXRlKGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpKQogICAgYnl0ZWMgMTkgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzQtNTM2CiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyA9IEdsb2JhbFN0YXRlKAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTEzCiAgICAvLyBjbGFzcyBHbG9iYWxTdGF0ZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzOQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4MWNjOTY2ZWUgMHgyMzY3Y2Q0YiAweDY5MTI4ZTkwIDB4NjhkNTkwZTIgMHg0NGVmMDY4MSAweDFjZDI5NGVjIDB4YWFjOGVjYjEgMHgxNjZjNmFmZCAweDNjYzNiYjdiIDB4OWE2OTQ2YWQgMHhkZWQ3NTAzMyAweDY2Mjc5ZTkzIDB4MDk2ZTkyN2IgMHg5NzUzMWZiYyAweDZlYTNmOTk2IDB4YTdmNGY0MDIgMHhhYWRkY2M0YyAweDVlYzMxMTZkIDB4MjBmNTZlZWUgMHgxYzE0OWE0MyAweGE1NzVhYzdkIDB4ODdmMDg2OWIgMHg0NjFhZmM2ZCAweDA0ODExNmVhIDB4MzBlMzRhOTMgMHhkMmU2NDZlZiAweGU2NzRhMjcwIDB4YTg3ZTU0MGQgMHg3MjBhM2NhMCAweDI1NzcwOGY3IC8vIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQoKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZygpc3RyaW5nIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSgpYnl0ZSIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woKWJvb2wiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKClhZGRyZXNzIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCgpdWludDEyOCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMoKWJ5dGVbXSIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV90dXBsZSgpKHVpbnQ2NCxieXRlW10sYm9vbCkiLCBtZXRob2QgImdldF9hcmM0X3VpbnQoKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2FyYzRfc3RyaW5nKClzdHJpbmciLCBtZXRob2QgImdldF9hcmM0X2J5dGUoKWJ5dGUiLCBtZXRob2QgImdldF9hcmM0X2Jvb2woKWJvb2wiLCBtZXRob2QgImdldF9hcmM0X2FkZHJlc3MoKWFkZHJlc3MiLCBtZXRob2QgImdldF9hcmM0X3VpbnQxMjgoKXVpbnQxMjgiLCBtZXRob2QgImdldF9hcmM0X2R5bmFtaWNfYnl0ZXMoKWJ5dGVbXSIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQodWludDY0KXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcoc3RyaW5nKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKGJ5dGUpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woYm9vbCl2b2lkIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyhhZGRyZXNzKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4KHVpbnQxMjgpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMoYnl0ZVtdKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfdHVwbGUoKHVpbnQ2NCxieXRlW10sYm9vbCkpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfdWludCh1aW50NjQpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfc3RyaW5nKHN0cmluZyl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9ieXRlKGJ5dGUpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfYm9vbChib29sKXZvaWQiLCBtZXRob2QgInNldF9hcmM0X2FkZHJlc3MoYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF91aW50MTI4KHVpbnQxMjgpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfZHluYW1pY19ieXRlcyhieXRlW10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50IGdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGUgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2wgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMgZ2V0X2ltcGxpY2l0X2tleV90dXBsZSBnZXRfYXJjNF91aW50IGdldF9hcmM0X3N0cmluZyBnZXRfYXJjNF9ieXRlIGdldF9hcmM0X2Jvb2wgZ2V0X2FyYzRfYWRkcmVzcyBnZXRfYXJjNF91aW50MTI4IGdldF9hcmM0X2R5bmFtaWNfYnl0ZXMgc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQgc2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBzZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSBzZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCBzZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCBzZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBzZXRfaW1wbGljaXRfa2V5X3R1cGxlIHNldF9hcmM0X3VpbnQgc2V0X2FyYzRfc3RyaW5nIHNldF9hcmM0X2J5dGUgc2V0X2FyYzRfYm9vbCBzZXRfYXJjNF9hZGRyZXNzIHNldF9hcmM0X3VpbnQxMjggc2V0X2FyYzRfZHluYW1pY19ieXRlcwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDM5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0MQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludCBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzgtNTM5CiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0NQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NDkKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTUzCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1NwogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NjEKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTY1CiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NjkKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV90dXBsZS52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDggLy8gImltcGxpY2l0X2tleV90dXBsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGUgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU3NAogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50LnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X3VpbnQgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTcxLTU3MgogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgZXhwbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTc4CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3N0cmluZy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9zdHJpbmcgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4MgogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9ieXRlLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ieXRlIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1ODYKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYm9vbC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfYm9vbCBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTkwCiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2FkZHJlc3MudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X2FkZHJlc3MgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5NAogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50MTI4LnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF91aW50MTI4IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OTgKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfZHluYW1pY19ieXRlcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDMKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludC52YWx1ZSA9IHZhbHVlCiAgICBieXRlY18xIC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwMC02MDEKICAgIC8vICMgU2V0dGVyIG1ldGhvZHMgZm9yIGltcGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjAzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDAtNjAxCiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDcKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjExCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWNfMyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjExCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTUKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyA0IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTUKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxOQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxOQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4W3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgNiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjcKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcy52YWx1ZSA9IHZhbHVlLmNvcHkoKQogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI3CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMudmFsdWUgPSB2YWx1ZS5jb3B5KCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfdHVwbGVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzMQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzEKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gc2VsZi5hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzMtNjM0CiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gc2VsZi5hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzMtNjM0CiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X3N0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDAKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmcudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTAgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQwCiAgICAvLyBzZWxmLmFyYzRfc3RyaW5nLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NAogICAgLy8gc2VsZi5hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NAogICAgLy8gc2VsZi5hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfYm9vbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ4CiAgICAvLyBzZWxmLmFyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyAxMiAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ4CiAgICAvLyBzZWxmLmFyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2FyYzRfYWRkcmVzczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjIDEzIC8vICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfZHluYW1pY19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjYwCiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlcy52YWx1ZSA9IHZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMTUgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY2MAogICAgLy8gc2VsZi5hcmM0X2R5bmFtaWNfYnl0ZXMudmFsdWUgPSB2YWx1ZS5jb3B5KCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmFAQVH3x1FmltcGxpY2l0X2tleV9hcmM0X3VpbnQYaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nFmltcGxpY2l0X2tleV9hcmM0X2J5dGUWaW1wbGljaXRfa2V5X2FyYzRfYm9vbBlpbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzGWltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcxJpbXBsaWNpdF9rZXlfdHVwbGUWZXhwbGljaXRfa2V5X2FyYzRfdWludBhleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmcWZXhwbGljaXRfa2V5X2FyYzRfYnl0ZRZleHBsaWNpdF9rZXlfYXJjNF9ib29sGWV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MZZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOB9leHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzCAAAAAAAAAU5BwAFSGVsbG8QAAAAEAAAAAAAAAAAAAAAAA8ADWR5bmFtaWMgYnl0ZXMxGEAAXSknEGcqJxFnK4ABAGcnBIABgGcnBTIJZycGJxJnJwcnE2cnCIARAAAAAAAAAAoACwAABHRlc3RnJwknEGcnCicRZycLgAEAZycMgAGAZycNMglnJw4nEmcnDycTZzEbQQDhMRkURDEYRIIeBBzJZu4EI2fNSwRpEo6QBGjVkOIERO8GgQQc0pTsBKrI7LEEFmxq/QQ8w7t7BJppRq0E3tdQMwRmJ56TBAluknsEl1MfvARuo/mWBKf09AIEqt3MTARewxFtBCD1bu4EHBSaQwSldax9BIfwhpsERhr8bQQEgRbqBDDjSpME0uZG7wTmdKJwBKh+VA0Ecgo8oAQldwj3NhoAjh4ACQATAB0AJwAyAD0ASABTAF4AaQB0AH8AigCVAKAAqwCyALkAwADIANAA2ADgAOgA8AD4AQABCAEQARgAMRkUMRgUEEMjKWVEKExQsCJDIyplRChMULAiQyMrZUQoTFCwIkMjJwRlRChMULAiQyMnBWVEKExQsCJDIycGZUQoTFCwIkMjJwdlRChMULAiQyMnCGVEKExQsCJDIycJZUQoTFCwIkMjJwplRChMULAiQyMnC2VEKExQsCJDIycMZUQoTFCwIkMjJw1lRChMULAiQyMnDmVEKExQsCJDIycPZUQoTFCwIkMpNhoBZyJDKjYaAWciQys2GgFnIkMnBDYaAWciQycFNhoBZyJDJwY2GgFnIkMnBzYaAWciQycINhoBZyJDJwk2GgFnIkMnCjYaAWciQycLNhoBZyJDJww2GgFnIkMnDTYaAWciQycONhoBZyJDJw82GgFnIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the GlobalStateContract contract - */ -export type GlobalStateContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'get_implicit_key_arc4_uint()uint64': Record - 'get_implicit_key_arc4_string()string': Record - 'get_implicit_key_arc4_byte()byte': Record - 'get_implicit_key_arc4_bool()bool': Record - 'get_implicit_key_arc4_address()address': Record - 'get_implicit_key_arc4_uint128()uint128': Record - 'get_implicit_key_arc4_dynamic_bytes()byte[]': Record - 'get_implicit_key_tuple()(uint64,byte[],bool)': Record - 'get_arc4_uint()uint64': Record - 'get_arc4_string()string': Record - 'get_arc4_byte()byte': Record - 'get_arc4_bool()bool': Record - 'get_arc4_address()address': Record - 'get_arc4_uint128()uint128': Record - 'get_arc4_dynamic_bytes()byte[]': Record - 'set_implicit_key_arc4_uint(uint64)void': { - value: bigint | number - } - 'set_implicit_key_arc4_string(string)void': { - value: string - } - 'set_implicit_key_arc4_byte(byte)void': { - value: number - } - 'set_implicit_key_arc4_bool(bool)void': { - value: boolean - } - 'set_implicit_key_arc4_address(address)void': { - value: string - } - 'set_implicit_key_arc4_uint128(uint128)void': { - value: bigint | number - } - 'set_implicit_key_arc4_dynamic_bytes(byte[])void': { - value: Uint8Array - } - 'set_implicit_key_tuple((uint64,byte[],bool))void': { - value: [bigint | number, Uint8Array, boolean] - } - 'set_arc4_uint(uint64)void': { - value: bigint | number - } - 'set_arc4_string(string)void': { - value: string - } - 'set_arc4_byte(byte)void': { - value: number - } - 'set_arc4_bool(bool)void': { - value: boolean - } - 'set_arc4_address(address)void': { - value: string - } - 'set_arc4_uint128(uint128)void': { - value: bigint | number - } - 'set_arc4_dynamic_bytes(byte[])void': { - value: Uint8Array - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'get_implicit_key_arc4_uint()uint64': [] - 'get_implicit_key_arc4_string()string': [] - 'get_implicit_key_arc4_byte()byte': [] - 'get_implicit_key_arc4_bool()bool': [] - 'get_implicit_key_arc4_address()address': [] - 'get_implicit_key_arc4_uint128()uint128': [] - 'get_implicit_key_arc4_dynamic_bytes()byte[]': [] - 'get_implicit_key_tuple()(uint64,byte[],bool)': [] - 'get_arc4_uint()uint64': [] - 'get_arc4_string()string': [] - 'get_arc4_byte()byte': [] - 'get_arc4_bool()bool': [] - 'get_arc4_address()address': [] - 'get_arc4_uint128()uint128': [] - 'get_arc4_dynamic_bytes()byte[]': [] - 'set_implicit_key_arc4_uint(uint64)void': [value: bigint | number] - 'set_implicit_key_arc4_string(string)void': [value: string] - 'set_implicit_key_arc4_byte(byte)void': [value: number] - 'set_implicit_key_arc4_bool(bool)void': [value: boolean] - 'set_implicit_key_arc4_address(address)void': [value: string] - 'set_implicit_key_arc4_uint128(uint128)void': [value: bigint | number] - 'set_implicit_key_arc4_dynamic_bytes(byte[])void': [value: Uint8Array] - 'set_implicit_key_tuple((uint64,byte[],bool))void': [value: [bigint | number, Uint8Array, boolean]] - 'set_arc4_uint(uint64)void': [value: bigint | number] - 'set_arc4_string(string)void': [value: string] - 'set_arc4_byte(byte)void': [value: number] - 'set_arc4_bool(bool)void': [value: boolean] - 'set_arc4_address(address)void': [value: string] - 'set_arc4_uint128(uint128)void': [value: bigint | number] - 'set_arc4_dynamic_bytes(byte[])void': [value: Uint8Array] - } -} - -/** - * The return type for each method - */ -export type GlobalStateContractReturns = { - 'get_implicit_key_arc4_uint()uint64': bigint - 'get_implicit_key_arc4_string()string': string - 'get_implicit_key_arc4_byte()byte': number - 'get_implicit_key_arc4_bool()bool': boolean - 'get_implicit_key_arc4_address()address': string - 'get_implicit_key_arc4_uint128()uint128': bigint - 'get_implicit_key_arc4_dynamic_bytes()byte[]': Uint8Array - 'get_implicit_key_tuple()(uint64,byte[],bool)': [bigint, Uint8Array, boolean] - 'get_arc4_uint()uint64': bigint - 'get_arc4_string()string': string - 'get_arc4_byte()byte': number - 'get_arc4_bool()bool': boolean - 'get_arc4_address()address': string - 'get_arc4_uint128()uint128': bigint - 'get_arc4_dynamic_bytes()byte[]': Uint8Array - 'set_implicit_key_arc4_uint(uint64)void': void - 'set_implicit_key_arc4_string(string)void': void - 'set_implicit_key_arc4_byte(byte)void': void - 'set_implicit_key_arc4_bool(bool)void': void - 'set_implicit_key_arc4_address(address)void': void - 'set_implicit_key_arc4_uint128(uint128)void': void - 'set_implicit_key_arc4_dynamic_bytes(byte[])void': void - 'set_implicit_key_tuple((uint64,byte[],bool))void': void - 'set_arc4_uint(uint64)void': void - 'set_arc4_string(string)void': void - 'set_arc4_byte(byte)void': void - 'set_arc4_bool(bool)void': void - 'set_arc4_address(address)void': void - 'set_arc4_uint128(uint128)void': void - 'set_arc4_dynamic_bytes(byte[])void': void -} - -/** - * Defines the types of available calls and state of the GlobalStateContract smart contract. - */ -export type GlobalStateContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'get_implicit_key_arc4_uint()uint64' | 'get_implicit_key_arc4_uint', { - argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_uint()uint64'] - argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_uint()uint64'] - returns: GlobalStateContractReturns['get_implicit_key_arc4_uint()uint64'] - }> - & Record<'get_implicit_key_arc4_string()string' | 'get_implicit_key_arc4_string', { - argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_string()string'] - argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_string()string'] - returns: GlobalStateContractReturns['get_implicit_key_arc4_string()string'] - }> - & Record<'get_implicit_key_arc4_byte()byte' | 'get_implicit_key_arc4_byte', { - argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_byte()byte'] - argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_byte()byte'] - returns: GlobalStateContractReturns['get_implicit_key_arc4_byte()byte'] - }> - & Record<'get_implicit_key_arc4_bool()bool' | 'get_implicit_key_arc4_bool', { - argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_bool()bool'] - argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_bool()bool'] - returns: GlobalStateContractReturns['get_implicit_key_arc4_bool()bool'] - }> - & Record<'get_implicit_key_arc4_address()address' | 'get_implicit_key_arc4_address', { - argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_address()address'] - argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_address()address'] - returns: GlobalStateContractReturns['get_implicit_key_arc4_address()address'] - }> - & Record<'get_implicit_key_arc4_uint128()uint128' | 'get_implicit_key_arc4_uint128', { - argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_uint128()uint128'] - argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_uint128()uint128'] - returns: GlobalStateContractReturns['get_implicit_key_arc4_uint128()uint128'] - }> - & Record<'get_implicit_key_arc4_dynamic_bytes()byte[]' | 'get_implicit_key_arc4_dynamic_bytes', { - argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_dynamic_bytes()byte[]'] - argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_dynamic_bytes()byte[]'] - returns: GlobalStateContractReturns['get_implicit_key_arc4_dynamic_bytes()byte[]'] - }> - & Record<'get_implicit_key_tuple()(uint64,byte[],bool)' | 'get_implicit_key_tuple', { - argsObj: GlobalStateContractArgs['obj']['get_implicit_key_tuple()(uint64,byte[],bool)'] - argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_tuple()(uint64,byte[],bool)'] - returns: GlobalStateContractReturns['get_implicit_key_tuple()(uint64,byte[],bool)'] - }> - & Record<'get_arc4_uint()uint64' | 'get_arc4_uint', { - argsObj: GlobalStateContractArgs['obj']['get_arc4_uint()uint64'] - argsTuple: GlobalStateContractArgs['tuple']['get_arc4_uint()uint64'] - returns: GlobalStateContractReturns['get_arc4_uint()uint64'] - }> - & Record<'get_arc4_string()string' | 'get_arc4_string', { - argsObj: GlobalStateContractArgs['obj']['get_arc4_string()string'] - argsTuple: GlobalStateContractArgs['tuple']['get_arc4_string()string'] - returns: GlobalStateContractReturns['get_arc4_string()string'] - }> - & Record<'get_arc4_byte()byte' | 'get_arc4_byte', { - argsObj: GlobalStateContractArgs['obj']['get_arc4_byte()byte'] - argsTuple: GlobalStateContractArgs['tuple']['get_arc4_byte()byte'] - returns: GlobalStateContractReturns['get_arc4_byte()byte'] - }> - & Record<'get_arc4_bool()bool' | 'get_arc4_bool', { - argsObj: GlobalStateContractArgs['obj']['get_arc4_bool()bool'] - argsTuple: GlobalStateContractArgs['tuple']['get_arc4_bool()bool'] - returns: GlobalStateContractReturns['get_arc4_bool()bool'] - }> - & Record<'get_arc4_address()address' | 'get_arc4_address', { - argsObj: GlobalStateContractArgs['obj']['get_arc4_address()address'] - argsTuple: GlobalStateContractArgs['tuple']['get_arc4_address()address'] - returns: GlobalStateContractReturns['get_arc4_address()address'] - }> - & Record<'get_arc4_uint128()uint128' | 'get_arc4_uint128', { - argsObj: GlobalStateContractArgs['obj']['get_arc4_uint128()uint128'] - argsTuple: GlobalStateContractArgs['tuple']['get_arc4_uint128()uint128'] - returns: GlobalStateContractReturns['get_arc4_uint128()uint128'] - }> - & Record<'get_arc4_dynamic_bytes()byte[]' | 'get_arc4_dynamic_bytes', { - argsObj: GlobalStateContractArgs['obj']['get_arc4_dynamic_bytes()byte[]'] - argsTuple: GlobalStateContractArgs['tuple']['get_arc4_dynamic_bytes()byte[]'] - returns: GlobalStateContractReturns['get_arc4_dynamic_bytes()byte[]'] - }> - & Record<'set_implicit_key_arc4_uint(uint64)void' | 'set_implicit_key_arc4_uint', { - argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_uint(uint64)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_uint(uint64)void'] - returns: GlobalStateContractReturns['set_implicit_key_arc4_uint(uint64)void'] - }> - & Record<'set_implicit_key_arc4_string(string)void' | 'set_implicit_key_arc4_string', { - argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_string(string)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_string(string)void'] - returns: GlobalStateContractReturns['set_implicit_key_arc4_string(string)void'] - }> - & Record<'set_implicit_key_arc4_byte(byte)void' | 'set_implicit_key_arc4_byte', { - argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_byte(byte)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_byte(byte)void'] - returns: GlobalStateContractReturns['set_implicit_key_arc4_byte(byte)void'] - }> - & Record<'set_implicit_key_arc4_bool(bool)void' | 'set_implicit_key_arc4_bool', { - argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_bool(bool)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_bool(bool)void'] - returns: GlobalStateContractReturns['set_implicit_key_arc4_bool(bool)void'] - }> - & Record<'set_implicit_key_arc4_address(address)void' | 'set_implicit_key_arc4_address', { - argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_address(address)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_address(address)void'] - returns: GlobalStateContractReturns['set_implicit_key_arc4_address(address)void'] - }> - & Record<'set_implicit_key_arc4_uint128(uint128)void' | 'set_implicit_key_arc4_uint128', { - argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_uint128(uint128)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_uint128(uint128)void'] - returns: GlobalStateContractReturns['set_implicit_key_arc4_uint128(uint128)void'] - }> - & Record<'set_implicit_key_arc4_dynamic_bytes(byte[])void' | 'set_implicit_key_arc4_dynamic_bytes', { - argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_dynamic_bytes(byte[])void'] - argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_dynamic_bytes(byte[])void'] - returns: GlobalStateContractReturns['set_implicit_key_arc4_dynamic_bytes(byte[])void'] - }> - & Record<'set_implicit_key_tuple((uint64,byte[],bool))void' | 'set_implicit_key_tuple', { - argsObj: GlobalStateContractArgs['obj']['set_implicit_key_tuple((uint64,byte[],bool))void'] - argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_tuple((uint64,byte[],bool))void'] - returns: GlobalStateContractReturns['set_implicit_key_tuple((uint64,byte[],bool))void'] - }> - & Record<'set_arc4_uint(uint64)void' | 'set_arc4_uint', { - argsObj: GlobalStateContractArgs['obj']['set_arc4_uint(uint64)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_arc4_uint(uint64)void'] - returns: GlobalStateContractReturns['set_arc4_uint(uint64)void'] - }> - & Record<'set_arc4_string(string)void' | 'set_arc4_string', { - argsObj: GlobalStateContractArgs['obj']['set_arc4_string(string)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_arc4_string(string)void'] - returns: GlobalStateContractReturns['set_arc4_string(string)void'] - }> - & Record<'set_arc4_byte(byte)void' | 'set_arc4_byte', { - argsObj: GlobalStateContractArgs['obj']['set_arc4_byte(byte)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_arc4_byte(byte)void'] - returns: GlobalStateContractReturns['set_arc4_byte(byte)void'] - }> - & Record<'set_arc4_bool(bool)void' | 'set_arc4_bool', { - argsObj: GlobalStateContractArgs['obj']['set_arc4_bool(bool)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_arc4_bool(bool)void'] - returns: GlobalStateContractReturns['set_arc4_bool(bool)void'] - }> - & Record<'set_arc4_address(address)void' | 'set_arc4_address', { - argsObj: GlobalStateContractArgs['obj']['set_arc4_address(address)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_arc4_address(address)void'] - returns: GlobalStateContractReturns['set_arc4_address(address)void'] - }> - & Record<'set_arc4_uint128(uint128)void' | 'set_arc4_uint128', { - argsObj: GlobalStateContractArgs['obj']['set_arc4_uint128(uint128)void'] - argsTuple: GlobalStateContractArgs['tuple']['set_arc4_uint128(uint128)void'] - returns: GlobalStateContractReturns['set_arc4_uint128(uint128)void'] - }> - & Record<'set_arc4_dynamic_bytes(byte[])void' | 'set_arc4_dynamic_bytes', { - argsObj: GlobalStateContractArgs['obj']['set_arc4_dynamic_bytes(byte[])void'] - argsTuple: GlobalStateContractArgs['tuple']['set_arc4_dynamic_bytes(byte[])void'] - returns: GlobalStateContractReturns['set_arc4_dynamic_bytes(byte[])void'] - }> - /** - * Defines the shape of the state of the application. - */ - state: { - global: { - keys: { - implicitKeyArc4Uint: bigint - implicitKeyArc4String: string - implicitKeyArc4Byte: number - implicitKeyArc4Bool: boolean - implicitKeyArc4Address: string - implicitKeyArc4Uint128: bigint - implicitKeyArc4DynamicBytes: Uint8Array - implicitKeyTuple: [bigint, Uint8Array, boolean] - arc4Uint: bigint - arc4String: string - arc4Byte: number - arc4Bool: boolean - arc4Address: string - arc4Uint128: bigint - arc4DynamicBytes: Uint8Array - } - maps: {} - } - } -} - -/** - * Defines the possible abi call signatures. - */ -export type GlobalStateContractSignatures = keyof GlobalStateContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type GlobalStateContractNonVoidMethodSignatures = keyof GlobalStateContractTypes['methods'] extends infer T ? T extends keyof GlobalStateContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the GlobalStateContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = GlobalStateContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the GlobalStateContract smart contract to the method's return type - */ -export type MethodReturn = GlobalStateContractTypes['methods'][TSignature]['returns'] - -/** - * Defines the shape of the keyed global state of the application. - */ -export type GlobalKeysState = GlobalStateContractTypes['state']['global']['keys'] - - -/** - * Defines supported create method params for this smart contract - */ -export type GlobalStateContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type GlobalStateContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: GlobalStateContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the GlobalStateContract smart contract - */ -export abstract class GlobalStateContractParamsFactory { - /** - * Constructs a no op call for the get_implicit_key_arc4_uint()uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_uint()uint64' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_string()string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_string()string' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_byte()byte ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_byte()byte' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_bool()bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_bool()bool' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_address()address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_address()address' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_uint128()uint128 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_uint128()uint128' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_dynamic_bytes()byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_dynamic_bytes()byte[]' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_implicit_key_tuple()(uint64,byte[],bool) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_tuple()(uint64,byte[],bool)' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_arc4_uint()uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_uint()uint64' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_arc4_string()string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_string()string' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_arc4_byte()byte ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_byte()byte' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_arc4_bool()bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_bool()bool' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_arc4_address()address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_address()address' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_arc4_uint128()uint128 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_uint128()uint128' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get_arc4_dynamic_bytes()byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_dynamic_bytes()byte[]' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the set_implicit_key_arc4_uint(uint64)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setImplicitKeyArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_implicit_key_arc4_uint(uint64)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_implicit_key_arc4_string(string)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setImplicitKeyArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_implicit_key_arc4_string(string)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_implicit_key_arc4_byte(byte)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setImplicitKeyArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_implicit_key_arc4_byte(byte)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_implicit_key_arc4_bool(bool)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setImplicitKeyArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_implicit_key_arc4_bool(bool)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_implicit_key_arc4_address(address)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setImplicitKeyArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_implicit_key_arc4_address(address)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_implicit_key_arc4_uint128(uint128)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setImplicitKeyArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_implicit_key_arc4_uint128(uint128)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_implicit_key_arc4_dynamic_bytes(byte[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setImplicitKeyArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_implicit_key_arc4_dynamic_bytes(byte[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_implicit_key_tuple((uint64,byte[],bool))void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setImplicitKeyTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_implicit_key_tuple((uint64,byte[],bool))void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_arc4_uint(uint64)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_arc4_uint(uint64)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_arc4_string(string)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_arc4_string(string)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_arc4_byte(byte)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_arc4_byte(byte)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_arc4_bool(bool)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_arc4_bool(bool)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_arc4_address(address)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_arc4_address(address)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_arc4_uint128(uint128)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_arc4_uint128(uint128)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } - /** - * Constructs a no op call for the set_arc4_dynamic_bytes(byte[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static setArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'set_arc4_dynamic_bytes(byte[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value], - } - } -} - -/** - * A factory to create and deploy one or more instance of the GlobalStateContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class GlobalStateContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `GlobalStateContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new GlobalStateContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new GlobalStateContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the GlobalStateContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: GlobalStateContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new GlobalStateContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the GlobalStateContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the GlobalStateContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the GlobalStateContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new GlobalStateContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the GlobalStateContract smart contract - */ -export class GlobalStateContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `GlobalStateContractClient` - * - * @param appClient An `AppClient` instance which has been created with the GlobalStateContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `GlobalStateContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `GlobalStateContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new GlobalStateContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `GlobalStateContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new GlobalStateContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the GlobalStateContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_string()string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4String(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_byte()byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_bool()bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_address()address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Address(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint128()uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes()byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_tuple()(uint64,byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyTuple(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Uint(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_string()string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4String(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_byte()byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Byte(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_bool()bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Bool(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_address()address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Address(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint128()uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Uint128(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_dynamic_bytes()byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4DynamicBytes(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_string(string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4String(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_byte(byte)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Byte(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_bool(bool)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Bool(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_address(address)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Address(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint128(uint128)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint128(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_dynamic_bytes(byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4DynamicBytes(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_tuple((uint64,byte[],bool))void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyTuple(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Uint(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_string(string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4String(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_byte(byte)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Byte(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_bool(bool)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Bool(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_address(address)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Address(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint128(uint128)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Uint128(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_dynamic_bytes(byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - setArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4DynamicBytes(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the GlobalStateContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_string()string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4String(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_byte()byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_bool()bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_address()address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Address(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint128()uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes()byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_tuple()(uint64,byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyTuple(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Uint(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_string()string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4String(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_byte()byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Byte(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_bool()bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Bool(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_address()address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Address(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint128()uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Uint128(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_dynamic_bytes()byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4DynamicBytes(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_string(string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4String(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_byte(byte)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Byte(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_bool(bool)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Bool(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_address(address)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Address(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint128(uint128)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint128(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_dynamic_bytes(byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4DynamicBytes(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_tuple((uint64,byte[],bool))void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyTuple(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Uint(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_string(string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4String(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_byte(byte)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Byte(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_bool(bool)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Bool(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_address(address)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Address(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint128(uint128)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Uint128(params)) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_dynamic_bytes(byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - setArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4DynamicBytes(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the GlobalStateContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_uint()uint64'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_string()string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4String(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_string()string'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_byte()byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_byte()byte'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_bool()bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_bool()bool'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_address()address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Address(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_address()address'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint128()uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_uint128()uint128'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes()byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_dynamic_bytes()byte[]'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_tuple()(uint64,byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyTuple(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_tuple()(uint64,byte[],bool)'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint()uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Uint(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_uint()uint64'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_string()string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4String(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_string()string'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_byte()byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Byte(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_byte()byte'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_bool()bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Bool(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_bool()bool'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_address()address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Address(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_address()address'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint128()uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Uint128(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_uint128()uint128'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `get_arc4_dynamic_bytes()byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4DynamicBytes(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_dynamic_bytes()byte[]'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setImplicitKeyArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_uint(uint64)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_string(string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setImplicitKeyArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4String(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_string(string)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_byte(byte)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setImplicitKeyArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Byte(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_byte(byte)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_bool(bool)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setImplicitKeyArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Bool(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_bool(bool)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_address(address)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setImplicitKeyArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Address(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_address(address)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint128(uint128)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setImplicitKeyArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint128(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_uint128(uint128)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_dynamic_bytes(byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setImplicitKeyArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4DynamicBytes(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_dynamic_bytes(byte[])void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_tuple((uint64,byte[],bool))void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setImplicitKeyTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyTuple(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_tuple((uint64,byte[],bool))void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Uint(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_uint(uint64)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_string(string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4String(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_string(string)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_byte(byte)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Byte(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_byte(byte)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_bool(bool)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Bool(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_bool(bool)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_address(address)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Address(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_address(address)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint128(uint128)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Uint128(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_uint128(uint128)void'])} - }, - - /** - * Makes a call to the GlobalStateContract smart contract using the `set_arc4_dynamic_bytes(byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - setArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4DynamicBytes(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_dynamic_bytes(byte[])void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new GlobalStateContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current GlobalStateContract app - */ - state = { - /** - * Methods to access global state for the current GlobalStateContract app - */ - global: { - /** - * Get all current keyed values from global state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.global.getAll() - return { - implicitKeyArc4Uint: result.implicit_key_arc4_uint, - implicitKeyArc4String: result.implicit_key_arc4_string, - implicitKeyArc4Byte: result.implicit_key_arc4_byte, - implicitKeyArc4Bool: result.implicit_key_arc4_bool, - implicitKeyArc4Address: result.implicit_key_arc4_address, - implicitKeyArc4Uint128: result.implicit_key_arc4_uint128, - implicitKeyArc4DynamicBytes: result.implicit_key_arc4_dynamic_bytes, - implicitKeyTuple: result.implicit_key_tuple, - arc4Uint: result.arc4_uint, - arc4String: result.arc4_string, - arc4Byte: result.arc4_byte, - arc4Bool: result.arc4_bool, - arc4Address: result.arc4_address, - arc4Uint128: result.arc4_uint128, - arc4DynamicBytes: result.arc4_dynamic_bytes, - } - }, - /** - * Get the current value of the implicit_key_arc4_uint key in global state - */ - implicitKeyArc4Uint: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_uint")) as bigint | undefined }, - /** - * Get the current value of the implicit_key_arc4_string key in global state - */ - implicitKeyArc4String: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_string")) as string | undefined }, - /** - * Get the current value of the implicit_key_arc4_byte key in global state - */ - implicitKeyArc4Byte: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_byte")) as number | undefined }, - /** - * Get the current value of the implicit_key_arc4_bool key in global state - */ - implicitKeyArc4Bool: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_bool")) as boolean | undefined }, - /** - * Get the current value of the implicit_key_arc4_address key in global state - */ - implicitKeyArc4Address: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_address")) as string | undefined }, - /** - * Get the current value of the implicit_key_arc4_uint128 key in global state - */ - implicitKeyArc4Uint128: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_uint128")) as bigint | undefined }, - /** - * Get the current value of the implicit_key_arc4_dynamic_bytes key in global state - */ - implicitKeyArc4DynamicBytes: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_dynamic_bytes")) as Uint8Array | undefined }, - /** - * Get the current value of the implicit_key_tuple key in global state - */ - implicitKeyTuple: async (): Promise<[bigint, Uint8Array, boolean] | undefined> => { return (await this.appClient.state.global.getValue("implicit_key_tuple")) as [bigint, Uint8Array, boolean] | undefined }, - /** - * Get the current value of the arc4_uint key in global state - */ - arc4Uint: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_uint")) as bigint | undefined }, - /** - * Get the current value of the arc4_string key in global state - */ - arc4String: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_string")) as string | undefined }, - /** - * Get the current value of the arc4_byte key in global state - */ - arc4Byte: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_byte")) as number | undefined }, - /** - * Get the current value of the arc4_bool key in global state - */ - arc4Bool: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_bool")) as boolean | undefined }, - /** - * Get the current value of the arc4_address key in global state - */ - arc4Address: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_address")) as string | undefined }, - /** - * Get the current value of the arc4_uint128 key in global state - */ - arc4Uint128: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_uint128")) as bigint | undefined }, - /** - * Get the current value of the arc4_dynamic_bytes key in global state - */ - arc4DynamicBytes: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_dynamic_bytes")) as Uint8Array | undefined }, - }, - } - - public newGroup(composerConfig?: TransactionComposerConfig): GlobalStateContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a get_implicit_key_arc4_uint()uint64 method call against the GlobalStateContract contract - */ - getImplicitKeyArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Uint(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_string()string method call against the GlobalStateContract contract - */ - getImplicitKeyArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4String(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_byte()byte method call against the GlobalStateContract contract - */ - getImplicitKeyArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Byte(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_bool()bool method call against the GlobalStateContract contract - */ - getImplicitKeyArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Bool(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_address()address method call against the GlobalStateContract contract - */ - getImplicitKeyArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Address(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_uint128()uint128 method call against the GlobalStateContract contract - */ - getImplicitKeyArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Uint128(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_dynamic_bytes()byte[] method call against the GlobalStateContract contract - */ - getImplicitKeyArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4DynamicBytes(params))) - return this - }, - /** - * Add a get_implicit_key_tuple()(uint64,byte[],bool) method call against the GlobalStateContract contract - */ - getImplicitKeyTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyTuple(params))) - return this - }, - /** - * Add a get_arc4_uint()uint64 method call against the GlobalStateContract contract - */ - getArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Uint(params))) - return this - }, - /** - * Add a get_arc4_string()string method call against the GlobalStateContract contract - */ - getArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4String(params))) - return this - }, - /** - * Add a get_arc4_byte()byte method call against the GlobalStateContract contract - */ - getArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Byte(params))) - return this - }, - /** - * Add a get_arc4_bool()bool method call against the GlobalStateContract contract - */ - getArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Bool(params))) - return this - }, - /** - * Add a get_arc4_address()address method call against the GlobalStateContract contract - */ - getArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Address(params))) - return this - }, - /** - * Add a get_arc4_uint128()uint128 method call against the GlobalStateContract contract - */ - getArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Uint128(params))) - return this - }, - /** - * Add a get_arc4_dynamic_bytes()byte[] method call against the GlobalStateContract contract - */ - getArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4DynamicBytes(params))) - return this - }, - /** - * Add a set_implicit_key_arc4_uint(uint64)void method call against the GlobalStateContract contract - */ - setImplicitKeyArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Uint(params))) - return this - }, - /** - * Add a set_implicit_key_arc4_string(string)void method call against the GlobalStateContract contract - */ - setImplicitKeyArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4String(params))) - return this - }, - /** - * Add a set_implicit_key_arc4_byte(byte)void method call against the GlobalStateContract contract - */ - setImplicitKeyArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Byte(params))) - return this - }, - /** - * Add a set_implicit_key_arc4_bool(bool)void method call against the GlobalStateContract contract - */ - setImplicitKeyArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Bool(params))) - return this - }, - /** - * Add a set_implicit_key_arc4_address(address)void method call against the GlobalStateContract contract - */ - setImplicitKeyArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Address(params))) - return this - }, - /** - * Add a set_implicit_key_arc4_uint128(uint128)void method call against the GlobalStateContract contract - */ - setImplicitKeyArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Uint128(params))) - return this - }, - /** - * Add a set_implicit_key_arc4_dynamic_bytes(byte[])void method call against the GlobalStateContract contract - */ - setImplicitKeyArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4DynamicBytes(params))) - return this - }, - /** - * Add a set_implicit_key_tuple((uint64,byte[],bool))void method call against the GlobalStateContract contract - */ - setImplicitKeyTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyTuple(params))) - return this - }, - /** - * Add a set_arc4_uint(uint64)void method call against the GlobalStateContract contract - */ - setArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Uint(params))) - return this - }, - /** - * Add a set_arc4_string(string)void method call against the GlobalStateContract contract - */ - setArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4String(params))) - return this - }, - /** - * Add a set_arc4_byte(byte)void method call against the GlobalStateContract contract - */ - setArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Byte(params))) - return this - }, - /** - * Add a set_arc4_bool(bool)void method call against the GlobalStateContract contract - */ - setArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Bool(params))) - return this - }, - /** - * Add a set_arc4_address(address)void method call against the GlobalStateContract contract - */ - setArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Address(params))) - return this - }, - /** - * Add a set_arc4_uint128(uint128)void method call against the GlobalStateContract contract - */ - setArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Uint128(params))) - return this - }, - /** - * Add a set_arc4_dynamic_bytes(byte[])void method call against the GlobalStateContract contract - */ - setArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4DynamicBytes(params))) - return this - }, - /** - * Add a clear state call to the GlobalStateContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as GlobalStateContractComposer - } -} -export type GlobalStateContractComposer = { - /** - * Calls the get_implicit_key_arc4_uint()uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4Uint(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_uint()uint64'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_string()string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4String(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_string()string'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_byte()byte ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4Byte(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_byte()byte'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_bool()bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4Bool(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_bool()bool'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_address()address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4Address(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_address()address'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_uint128()uint128 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4Uint128(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_uint128()uint128'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_dynamic_bytes()byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4DynamicBytes(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_dynamic_bytes()byte[]'] | undefined]> - - /** - * Calls the get_implicit_key_tuple()(uint64,byte[],bool) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyTuple(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_tuple()(uint64,byte[],bool)'] | undefined]> - - /** - * Calls the get_arc4_uint()uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4Uint(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_uint()uint64'] | undefined]> - - /** - * Calls the get_arc4_string()string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4String(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_string()string'] | undefined]> - - /** - * Calls the get_arc4_byte()byte ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4Byte(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_byte()byte'] | undefined]> - - /** - * Calls the get_arc4_bool()bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4Bool(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_bool()bool'] | undefined]> - - /** - * Calls the get_arc4_address()address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4Address(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_address()address'] | undefined]> - - /** - * Calls the get_arc4_uint128()uint128 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4Uint128(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_uint128()uint128'] | undefined]> - - /** - * Calls the get_arc4_dynamic_bytes()byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4DynamicBytes(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_dynamic_bytes()byte[]'] | undefined]> - - /** - * Calls the set_implicit_key_arc4_uint(uint64)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setImplicitKeyArc4Uint(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_uint(uint64)void'] | undefined]> - - /** - * Calls the set_implicit_key_arc4_string(string)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setImplicitKeyArc4String(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_string(string)void'] | undefined]> - - /** - * Calls the set_implicit_key_arc4_byte(byte)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setImplicitKeyArc4Byte(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_byte(byte)void'] | undefined]> - - /** - * Calls the set_implicit_key_arc4_bool(bool)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setImplicitKeyArc4Bool(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_bool(bool)void'] | undefined]> - - /** - * Calls the set_implicit_key_arc4_address(address)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setImplicitKeyArc4Address(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_address(address)void'] | undefined]> - - /** - * Calls the set_implicit_key_arc4_uint128(uint128)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setImplicitKeyArc4Uint128(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_uint128(uint128)void'] | undefined]> - - /** - * Calls the set_implicit_key_arc4_dynamic_bytes(byte[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setImplicitKeyArc4DynamicBytes(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_dynamic_bytes(byte[])void'] | undefined]> - - /** - * Calls the set_implicit_key_tuple((uint64,byte[],bool))void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setImplicitKeyTuple(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_tuple((uint64,byte[],bool))void'] | undefined]> - - /** - * Calls the set_arc4_uint(uint64)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setArc4Uint(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_uint(uint64)void'] | undefined]> - - /** - * Calls the set_arc4_string(string)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setArc4String(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_string(string)void'] | undefined]> - - /** - * Calls the set_arc4_byte(byte)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setArc4Byte(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_byte(byte)void'] | undefined]> - - /** - * Calls the set_arc4_bool(bool)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setArc4Bool(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_bool(bool)void'] | undefined]> - - /** - * Calls the set_arc4_address(address)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setArc4Address(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_address(address)void'] | undefined]> - - /** - * Calls the set_arc4_uint128(uint128)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setArc4Uint128(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_uint128(uint128)void'] | undefined]> - - /** - * Calls the set_arc4_dynamic_bytes(byte[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - setArc4DynamicBytes(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_dynamic_bytes(byte[])void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the GlobalStateContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): GlobalStateContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): GlobalStateContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type GlobalStateContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateValidator.ts b/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateValidator.ts deleted file mode 100644 index 483c414..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateValidator.ts +++ /dev/null @@ -1,557 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"GlobalStateValidator","structs":{},"methods":[{"name":"validate_g_args","args":[{"type":"uint64","name":"arg1"},{"type":"string","name":"arg2"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[72],"errorMessage":"transaction type is appl"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHhjMGViNWM2NwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIEdsb2JhbFN0YXRlVmFsaWRhdG9yKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBieXRlY18wIC8vIG1ldGhvZCAidmFsaWRhdGVfZ19hcmdzKHVpbnQ2NCxzdHJpbmcpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdmFsaWRhdGVfZ19hcmdzX3JvdXRlQDMKICAgIGVycgoKbWFpbl92YWxpZGF0ZV9nX2FyZ3Nfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIHZhbGlkYXRlX2dfYXJncwoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuR2xvYmFsU3RhdGVWYWxpZGF0b3IuY29udHJhY3QuR2xvYmFsU3RhdGVWYWxpZGF0b3IudmFsaWRhdGVfZ19hcmdzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmFsaWRhdGVfZ19hcmdzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjcKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygwKSA9PSBhcmM0LmFyYzRfc2lnbmF0dXJlKCJ2YWxpZGF0ZV9nX2FyZ3ModWludDY0LHN0cmluZyl2b2lkIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIGJ5dGVjXzAgLy8gbWV0aG9kICJ2YWxpZGF0ZV9nX2FyZ3ModWludDY0LHN0cmluZyl2b2lkIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjgKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygxKSA9PSBhcmcxLmJ5dGVzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjkKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygyKSA9PSBhcmcyLmJ5dGVzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6MTAKICAgIC8vIGFzc2VydCBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKFR4bi5ncm91cF9pbmRleCkuYXBwX2FyZ3MoMSkgPT0gYXJnMS5ieXRlcwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgcHVzaGludCAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weToxMQogICAgLy8gYXNzZXJ0IGd0eG4uVHJhbnNhY3Rpb24oVHhuLmdyb3VwX2luZGV4KS5hcHBfYXJncygxKSA9PSBhcmcxLmJ5dGVzCiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weToxMgogICAgLy8gYXNzZXJ0IG9wLkdUeG4uYXBwbGljYXRpb25fYXJncyhUeG4uZ3JvdXBfaW5kZXgsIDEpID09IGFyZzEuYnl0ZXMKICAgIHR4biBHcm91cEluZGV4CiAgICBndHhuc2EgQXBwbGljYXRpb25BcmdzIDEKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6MTMKICAgIC8vIGFzc2VydCBvcC5UeG4uYXBwbGljYXRpb25fYXJncygxKSA9PSBhcmcxLmJ5dGVzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyYBBMDrXGcxG0EAEyg2GgCOAQABADEZFDEYEERCAAgxGRQxGBQQQzYaATYaAjYaACgSRDYaAUsCEkQ2GgISRDEWSTgQgQYSRIEBwhpLARJEMRaBAcIaSwESRDEWORoBSwESRDYaARJEgQFD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the GlobalStateValidator contract - */ -export type GlobalStateValidatorArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'validate_g_args(uint64,string)void': { - arg1: bigint | number - arg2: string - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'validate_g_args(uint64,string)void': [arg1: bigint | number, arg2: string] - } -} - -/** - * The return type for each method - */ -export type GlobalStateValidatorReturns = { - 'validate_g_args(uint64,string)void': void -} - -/** - * Defines the types of available calls and state of the GlobalStateValidator smart contract. - */ -export type GlobalStateValidatorTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'validate_g_args(uint64,string)void' | 'validate_g_args', { - argsObj: GlobalStateValidatorArgs['obj']['validate_g_args(uint64,string)void'] - argsTuple: GlobalStateValidatorArgs['tuple']['validate_g_args(uint64,string)void'] - returns: GlobalStateValidatorReturns['validate_g_args(uint64,string)void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type GlobalStateValidatorSignatures = keyof GlobalStateValidatorTypes['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the GlobalStateValidator smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = GlobalStateValidatorTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the GlobalStateValidator smart contract to the method's return type - */ -export type MethodReturn = GlobalStateValidatorTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type GlobalStateValidatorCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type GlobalStateValidatorDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: GlobalStateValidatorCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the GlobalStateValidator smart contract - */ -export abstract class GlobalStateValidatorParamsFactory { - /** - * Constructs a no op call for the validate_g_args(uint64,string)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static validateGArgs(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'validate_g_args(uint64,string)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.arg1, params.args.arg2], - } - } -} - -/** - * A factory to create and deploy one or more instance of the GlobalStateValidator smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class GlobalStateValidatorFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `GlobalStateValidatorFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new GlobalStateValidatorClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new GlobalStateValidatorClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the GlobalStateValidator smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: GlobalStateValidatorDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new GlobalStateValidatorClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the GlobalStateValidator smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the GlobalStateValidator smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the GlobalStateValidator smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new GlobalStateValidatorClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the GlobalStateValidator smart contract - */ -export class GlobalStateValidatorClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `GlobalStateValidatorClient` - * - * @param appClient An `AppClient` instance which has been created with the GlobalStateValidator app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `GlobalStateValidatorClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `GlobalStateValidatorClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new GlobalStateValidatorClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `GlobalStateValidatorClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new GlobalStateValidatorClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the GlobalStateValidator smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the GlobalStateValidator smart contract using the `validate_g_args(uint64,string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - validateGArgs: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(GlobalStateValidatorParamsFactory.validateGArgs(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the GlobalStateValidator smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the GlobalStateValidator smart contract using the `validate_g_args(uint64,string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - validateGArgs: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(GlobalStateValidatorParamsFactory.validateGArgs(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the GlobalStateValidator smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the GlobalStateValidator smart contract using the `validate_g_args(uint64,string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - validateGArgs: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(GlobalStateValidatorParamsFactory.validateGArgs(params)) - return {...result, return: result.return as unknown as (undefined | GlobalStateValidatorReturns['validate_g_args(uint64,string)void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new GlobalStateValidatorClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current GlobalStateValidator app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): GlobalStateValidatorComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a validate_g_args(uint64,string)void method call against the GlobalStateValidator contract - */ - validateGArgs(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.validateGArgs(params))) - return this - }, - /** - * Add a clear state call to the GlobalStateValidator contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as GlobalStateValidatorComposer - } -} -export type GlobalStateValidatorComposer = { - /** - * Calls the validate_g_args(uint64,string)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - validateGArgs(params?: CallParams): GlobalStateValidatorComposer<[...TReturns, GlobalStateValidatorReturns['validate_g_args(uint64,string)void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the GlobalStateValidator smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): GlobalStateValidatorComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): GlobalStateValidatorComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type GlobalStateValidatorComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/HelloWorld.ts b/examples/p-py/projects/p-py-frontend/src/contracts/HelloWorld.ts deleted file mode 100644 index e60b7c5..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/HelloWorld.ts +++ /dev/null @@ -1,560 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"HelloWorld","structs":{},"methods":[{"name":"hello","args":[{"type":"string","name":"name"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[44],"errorMessage":"invalid array length header"},{"pc":[52],"errorMessage":"invalid number of bytes for arc4.dynamic_array"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5weTo1CiAgICAvLyBjbGFzcyBIZWxsb1dvcmxkKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2hlbGxvX3JvdXRlQDMKICAgIGVycgoKbWFpbl9oZWxsb19yb3V0ZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LnB5OjYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgaGVsbG8KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLmhlbGxvX3dvcmxkLmNvbnRyYWN0LkhlbGxvV29ybGQuaGVsbG9bcm91dGluZ10oKSAtPiB2b2lkOgpoZWxsbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5weTo2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgcHVzaGludCAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5weTo4CiAgICAvLyByZXR1cm4gIkhlbGxvLCAiICsgbmFtZQogICAgcHVzaGJ5dGVzICJIZWxsbywgIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QucHk6NgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgAQCvs4RNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEM2GgFJgQBZgQIISwEVEkRXAgCAB0hlbGxvLCBMUEkVFlcGAkxQgAQVH3x1TFCwgQFD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the HelloWorld contract - */ -export type HelloWorldArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'hello(string)string': { - name: string - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'hello(string)string': [name: string] - } -} - -/** - * The return type for each method - */ -export type HelloWorldReturns = { - 'hello(string)string': string -} - -/** - * Defines the types of available calls and state of the HelloWorld smart contract. - */ -export type HelloWorldTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'hello(string)string' | 'hello', { - argsObj: HelloWorldArgs['obj']['hello(string)string'] - argsTuple: HelloWorldArgs['tuple']['hello(string)string'] - returns: HelloWorldReturns['hello(string)string'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type HelloWorldSignatures = keyof HelloWorldTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type HelloWorldNonVoidMethodSignatures = keyof HelloWorldTypes['methods'] extends infer T ? T extends keyof HelloWorldTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the HelloWorld smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = HelloWorldTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the HelloWorld smart contract to the method's return type - */ -export type MethodReturn = HelloWorldTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type HelloWorldCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type HelloWorldDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: HelloWorldCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the HelloWorld smart contract - */ -export abstract class HelloWorldParamsFactory { - /** - * Constructs a no op call for the hello(string)string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static hello(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'hello(string)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.name], - } - } -} - -/** - * A factory to create and deploy one or more instance of the HelloWorld smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class HelloWorldFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `HelloWorldFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new HelloWorldClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new HelloWorldClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the HelloWorld smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: HelloWorldDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new HelloWorldClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the HelloWorld smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the HelloWorld smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the HelloWorld smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new HelloWorldClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the HelloWorld smart contract - */ -export class HelloWorldClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `HelloWorldClient` - * - * @param appClient An `AppClient` instance which has been created with the HelloWorld app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `HelloWorldClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `HelloWorldClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new HelloWorldClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `HelloWorldClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new HelloWorldClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the HelloWorld smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - hello: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(HelloWorldParamsFactory.hello(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the HelloWorld smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - hello: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(HelloWorldParamsFactory.hello(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the HelloWorld smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - hello: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(HelloWorldParamsFactory.hello(params)) - return {...result, return: result.return as unknown as (undefined | HelloWorldReturns['hello(string)string'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new HelloWorldClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current HelloWorld app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): HelloWorldComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a hello(string)string method call against the HelloWorld contract - */ - hello(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hello(params))) - return this - }, - /** - * Add a clear state call to the HelloWorld contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as HelloWorldComposer - } -} -export type HelloWorldComposer = { - /** - * Calls the hello(string)string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - hello(params?: CallParams): HelloWorldComposer<[...TReturns, HelloWorldReturns['hello(string)string'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the HelloWorld smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): HelloWorldComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): HelloWorldComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type HelloWorldComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ITxnOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ITxnOpsContract.ts deleted file mode 100644 index a3d8854..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/ITxnOpsContract.ts +++ /dev/null @@ -1,554 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"ITxnOpsContract","structs":{},"methods":[{"name":"verify_itxn_ops","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYgMTAwMAogICAgYnl0ZWNibG9jayAweDA2ODEwMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ4OAogICAgLy8gY2xhc3MgSVR4bk9wc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHg0ZTdjZDljYiAvLyBtZXRob2QgInZlcmlmeV9pdHhuX29wcygpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdmVyaWZ5X2l0eG5fb3BzX3JvdXRlQDMKICAgIGVycgoKbWFpbl92ZXJpZnlfaXR4bl9vcHNfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiB2ZXJpZnlfaXR4bl9vcHMKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LklUeG5PcHNDb250cmFjdC52ZXJpZnlfaXR4bl9vcHNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfaXR4bl9vcHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDkxCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5iZWdpbigpCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDkyCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfdHlwZV9lbnVtKGFsZ29weS5UcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTMKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9vbl9jb21wbGV0aW9uKGFsZ29weS5PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uKQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ5NAogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc2V0X2FwcHJvdmFsX3Byb2dyYW0oQnl0ZXMuZnJvbV9oZXgoIjA2ODEwMSIpKQogICAgYnl0ZWNfMCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTUtNDk2CiAgICAvLyAjIHBhZ2VzIGVzc2VudGlhbGx5IGFwcGVuZHMKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9hcHByb3ZhbF9wcm9ncmFtX3BhZ2VzKEJ5dGVzLmZyb21faGV4KCIwNjgxMDEiKSkKICAgIGJ5dGVjXzAgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTcKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9jbGVhcl9zdGF0ZV9wcm9ncmFtKEJ5dGVzLmZyb21faGV4KCIwNjgxMDEiKSkKICAgIGJ5dGVjXzAgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTgKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9mZWUoYWxnb3B5Lm9wLkdsb2JhbC5taW5fdHhuX2ZlZSkKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDk5CiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5uZXh0KCkKICAgIGl0eG5fbmV4dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwMAogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc2V0X3R5cGVfZW51bShhbGdvcHkuVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpCiAgICBpbnRjXzAgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTAxCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfcmVjZWl2ZXIoYWxnb3B5Lm9wLkdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MDIKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9hbW91bnQoYWxnb3B5LlVJbnQ2NCgxMDAwKSkKICAgIGludGNfMiAvLyAxMDAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwMwogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA1CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLklUeG4ucmVjZWl2ZXIoKSA9PSBhbGdvcHkub3AuR2xvYmFsLmNyZWF0b3JfYWRkcmVzcwogICAgaXR4biBSZWNlaXZlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA2CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLklUeG4uYW1vdW50KCkgPT0gYWxnb3B5LlVJbnQ2NCgxMDAwKQogICAgaXR4biBBbW91bnQKICAgIGludGNfMiAvLyAxMDAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA3CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLklUeG4udHlwZV9lbnVtKCkgPT0gYWxnb3B5LlRyYW5zYWN0aW9uVHlwZS5QYXltZW50CiAgICBpdHhuIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA5CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLkdJVHhuLnR5cGVfZW51bSgwKSA9PSBhbGdvcHkuVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgZ2l0eG4gMCBUeXBlRW51bQogICAgaW50Y18xIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTAKICAgIC8vIGFzc2VydCBhbGdvcHkub3AuR0lUeG4udHlwZV9lbnVtKDEpID09IGFsZ29weS5UcmFuc2FjdGlvblR5cGUuUGF5bWVudAogICAgZ2l0eG4gMSBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyADAQboByYBAwaBATEbQQAYgAROfNnLNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEOxI7IQgQWyGSiyHiiyQCiyHzIAsgG2IrIQMgmyBySyCLO0BzIJEkS0CCQSRLQQIhJEtwAQIxJEtwEQIhJEIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the ITxnOpsContract contract - */ -export type ITxnOpsContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify_itxn_ops()void': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify_itxn_ops()void': [] - } -} - -/** - * The return type for each method - */ -export type ITxnOpsContractReturns = { - 'verify_itxn_ops()void': void -} - -/** - * Defines the types of available calls and state of the ITxnOpsContract smart contract. - */ -export type ITxnOpsContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify_itxn_ops()void' | 'verify_itxn_ops', { - argsObj: ITxnOpsContractArgs['obj']['verify_itxn_ops()void'] - argsTuple: ITxnOpsContractArgs['tuple']['verify_itxn_ops()void'] - returns: ITxnOpsContractReturns['verify_itxn_ops()void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type ITxnOpsContractSignatures = keyof ITxnOpsContractTypes['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the ITxnOpsContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = ITxnOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the ITxnOpsContract smart contract to the method's return type - */ -export type MethodReturn = ITxnOpsContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type ITxnOpsContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type ITxnOpsContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: ITxnOpsContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the ITxnOpsContract smart contract - */ -export abstract class ITxnOpsContractParamsFactory { - /** - * Constructs a no op call for the verify_itxn_ops()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyItxnOps(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_itxn_ops()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } -} - -/** - * A factory to create and deploy one or more instance of the ITxnOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class ITxnOpsContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `ITxnOpsContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new ITxnOpsContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new ITxnOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the ITxnOpsContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: ITxnOpsContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new ITxnOpsContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ITxnOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ITxnOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ITxnOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new ITxnOpsContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the ITxnOpsContract smart contract - */ -export class ITxnOpsContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `ITxnOpsContractClient` - * - * @param appClient An `AppClient` instance which has been created with the ITxnOpsContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `ITxnOpsContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `ITxnOpsContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new ITxnOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `ITxnOpsContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new ITxnOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the ITxnOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the ITxnOpsContract smart contract using the `verify_itxn_ops()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyItxnOps: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ITxnOpsContractParamsFactory.verifyItxnOps(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the ITxnOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the ITxnOpsContract smart contract using the `verify_itxn_ops()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyItxnOps: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ITxnOpsContractParamsFactory.verifyItxnOps(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the ITxnOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the ITxnOpsContract smart contract using the `verify_itxn_ops()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyItxnOps: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ITxnOpsContractParamsFactory.verifyItxnOps(params)) - return {...result, return: result.return as unknown as (undefined | ITxnOpsContractReturns['verify_itxn_ops()void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new ITxnOpsContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current ITxnOpsContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): ITxnOpsContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_itxn_ops()void method call against the ITxnOpsContract contract - */ - verifyItxnOps(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyItxnOps(params))) - return this - }, - /** - * Add a clear state call to the ITxnOpsContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as ITxnOpsContractComposer - } -} -export type ITxnOpsContractComposer = { - /** - * Calls the verify_itxn_ops()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyItxnOps(params?: CallParams): ITxnOpsContractComposer<[...TReturns, ITxnOpsContractReturns['verify_itxn_ops()void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the ITxnOpsContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): ITxnOpsContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): ITxnOpsContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type ITxnOpsContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayContract.ts deleted file mode 100644 index ff91ca4..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayContract.ts +++ /dev/null @@ -1,2231 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"ImmutableArrayContract","structs":{},"methods":[{"name":"test_uint64_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_biguint_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_bool_array","args":[{"type":"uint64","name":"length"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_fixed_size_tuple_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_fixed_size_named_tuple_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_sized_tuple_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_sized_named_tuple_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_implicit_conversion_log","args":[{"type":"uint64[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_implicit_conversion_emit","args":[{"type":"uint64[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[{"name":"emit_test","args":[{"type":"uint64[]","name":"field1"}]}],"recommendations":{}},{"name":"test_nested_array","args":[{"type":"uint64","name":"arr_to_add"},{"type":"uint64[][]","name":"arr"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_bit_packed_tuples","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"sum_uints_and_lengths_and_trues","args":[{"type":"uint64[]","name":"arr1"},{"type":"bool[]","name":"arr2"},{"type":"(uint64,bool,bool)[]","name":"arr3"},{"type":"(uint64,string)[]","name":"arr4"}],"returns":{"type":"(uint64,uint64,uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_uint64_return","args":[{"type":"uint64","name":"append"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_bool_return","args":[{"type":"uint64","name":"append"}],"returns":{"type":"bool[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_tuple_return","args":[{"type":"uint64","name":"append"}],"returns":{"type":"(uint64,bool,bool)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_tuple_return","args":[{"type":"uint64","name":"append"}],"returns":{"type":"(uint64,string)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_convert_to_array_and_back","args":[{"type":"(uint64,bool,bool)[]","name":"arr"},{"type":"uint64","name":"append"}],"returns":{"type":"(uint64,bool,bool)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_concat_with_arc4_tuple","args":[{"type":"(uint64,uint64)","name":"arg"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_concat_with_native_tuple","args":[{"type":"(uint64,uint64)","name":"arg"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_concat_with_arc4_tuple","args":[{"type":"(string,string)","name":"arg"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_concat_with_native_tuple","args":[{"type":"(string,string)","name":"arg"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_concat_immutable_dynamic","args":[{"type":"(uint64,string)[]","name":"imm1"},{"type":"(uint64,string)[]","name":"imm2"}],"returns":{"type":"(uint64,string)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_immutable_arc4","args":[{"type":"(uint64,uint64)[]","name":"imm"}],"returns":{"type":"(uint64,uint64)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_imm_fixed_arr","args":[],"returns":{"type":"(uint64,uint64)[3]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":11},"local":{"ints":0,"bytes":0}},"keys":{"global":{"a":{"keyType":"AVMString","valueType":"uint64[]","key":"YQ=="},"g":{"keyType":"AVMString","valueType":"bool[]","key":"Zw=="},"c":{"keyType":"AVMString","valueType":"(uint64,uint64)[]","key":"Yw=="},"d":{"keyType":"AVMString","valueType":"(uint64,bool,bool)[]","key":"ZA=="},"e":{"keyType":"AVMString","valueType":"(uint64,byte[])[]","key":"ZQ=="},"f":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"Zg=="},"bool2":{"keyType":"AVMString","valueType":"(bool,bool)[]","key":"Ym9vbDI="},"bool7":{"keyType":"AVMString","valueType":"(uint64,bool,bool,bool,bool,bool,bool,bool,uint64)[]","key":"Ym9vbDc="},"bool8":{"keyType":"AVMString","valueType":"(uint64,bool,bool,bool,bool,bool,bool,bool,bool,uint64)[]","key":"Ym9vbDg="},"bool9":{"keyType":"AVMString","valueType":"(uint64,bool,bool,bool,bool,bool,bool,bool,bool,bool,uint64)[]","key":"Ym9vbDk="},"imm_fixed_arr":{"keyType":"AVMString","valueType":"(uint64,uint64)[3]","key":"aW1tX2ZpeGVkX2Fycg=="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[4104],"errorMessage":"check self.imm_fixed_arr exists"},{"pc":[2179,2487],"errorMessage":"expected 1, 0"},{"pc":[2094,2402],"errorMessage":"expected 1st element to be correct"},{"pc":[2099,2409],"errorMessage":"expected 2nd element to be correct"},{"pc":[2240,2549],"errorMessage":"expected 4, 3"},{"pc":[3988],"errorMessage":"expected arrays to be different"},{"pc":[4022],"errorMessage":"expected arrays to be the same"},{"pc":[1548],"errorMessage":"expected element 0 to be False"},{"pc":[1567],"errorMessage":"expected element 1 to be False"},{"pc":[1585],"errorMessage":"expected element 2 to be True"},{"pc":[4049],"errorMessage":"expected items on iteration to be the same"},{"pc":[1611],"errorMessage":"expected last element to be False"},{"pc":[3935],"errorMessage":"expected non empty array"},{"pc":[3363],"errorMessage":"expected string length to match index"},{"pc":[4099],"errorMessage":"expected sum to be 10"},{"pc":[4072],"errorMessage":"expected sum to be 15"},{"pc":[852,1156,1221,1289,1346,1456,1541,1560,1579,1602,1753,1817,2050,2131,2196,2358,2441,2504,3214,3307,3950,4007,4045,4091],"errorMessage":"index access is out of bounds"},{"pc":[968,1009,1065,1092,1132,1160,1204,1269,1326,1438,1525,1656,1715,1779,1906,2008,2114,2316,2424,2681,2722,3012,3021,3030,3039,3107,3144,3188,3269,3910,3933],"errorMessage":"invalid array length header"},{"pc":[923,996,1120,1194,1244,1314,1426,1692,1881,2622,2769,2833,2919,2958,2989,3438,3571,3745,3779,3814],"errorMessage":"max array length exceeded"},{"pc":[1307],"errorMessage":"overflow"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA4CiAgICBieXRlY2Jsb2NrIDB4IDB4MTUxZjdjNzUgMHgwMDAwIDB4MDAgMHgwMDAyIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYgMHgwMDBhIDB4NjI2OTY3NzU2OTZlNzQgMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIgMHgwMDAyMDAwNDAwMDcwMDAxNjEwMDAxNjIgImltbV9maXhlZF9hcnIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo5MwogICAgLy8gY2xhc3MgSW1tdXRhYmxlQXJyYXlDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NDRkNDJmOTkgMHhiN2VhYTYwYiAweDc0M2Q3MGVkIDB4MWM3ZTA0OTQgMHhhMmQ1ODYwYiAweGUwNWZjNTY0IDB4MWUwOTJiODMgMHgwMTMxMDI2MiAweGM4NjU0YTk4IDB4ODlkMTk2ZjggMHg2Y2I3Yzk5MSAweDk4OThiZjAyIDB4ZjZiNjFlZTggMHg2MGI4NmE3YiAweDczYWQyODNmIDB4NTI5ZGZhZTkgMHgyMDZkNTE0ZiAweGUwNjQ2NWUyIDB4ZWMwMzAwYTIgMHhlY2RmMTRhZiAweDUxMWFjYTY0IDB4Mjk4NTJlNGYgMHg2ZDRhYTM1OCAweGI3Y2I5NmJkIC8vIG1ldGhvZCAidGVzdF91aW50NjRfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfYmlndWludF9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9ib29sX2FycmF5KHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2ZpeGVkX3NpemVfdHVwbGVfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfZml4ZWRfc2l6ZV9uYW1lZF90dXBsZV9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9sb2codWludDY0W10pdm9pZCIsIG1ldGhvZCAidGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2VtaXQodWludDY0W10pdm9pZCIsIG1ldGhvZCAidGVzdF9uZXN0ZWRfYXJyYXkodWludDY0LHVpbnQ2NFtdW10pdWludDY0W10iLCBtZXRob2QgInRlc3RfYml0X3BhY2tlZF90dXBsZXMoKXZvaWQiLCBtZXRob2QgInN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXModWludDY0W10sYm9vbFtdLCh1aW50NjQsYm9vbCxib29sKVtdLCh1aW50NjQsc3RyaW5nKVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ0ZXN0X3VpbnQ2NF9yZXR1cm4odWludDY0KXVpbnQ2NFtdIiwgbWV0aG9kICJ0ZXN0X2Jvb2xfcmV0dXJuKHVpbnQ2NClib29sW10iLCBtZXRob2QgInRlc3RfdHVwbGVfcmV0dXJuKHVpbnQ2NCkodWludDY0LGJvb2wsYm9vbClbXSIsIG1ldGhvZCAidGVzdF9keW5hbWljX3R1cGxlX3JldHVybih1aW50NjQpKHVpbnQ2NCxzdHJpbmcpW10iLCBtZXRob2QgInRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFjaygodWludDY0LGJvb2wsYm9vbClbXSx1aW50NjQpKHVpbnQ2NCxib29sLGJvb2wpW10iLCBtZXRob2QgInRlc3RfY29uY2F0X3dpdGhfYXJjNF90dXBsZSgodWludDY0LHVpbnQ2NCkpdWludDY0W10iLCBtZXRob2QgInRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlKCh1aW50NjQsdWludDY0KSl1aW50NjRbXSIsIG1ldGhvZCAidGVzdF9keW5hbWljX2NvbmNhdF93aXRoX2FyYzRfdHVwbGUoKHN0cmluZyxzdHJpbmcpKXN0cmluZ1tdIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlKChzdHJpbmcsc3RyaW5nKSlzdHJpbmdbXSIsIG1ldGhvZCAidGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWMoKHVpbnQ2NCxzdHJpbmcpW10sKHVpbnQ2NCxzdHJpbmcpW10pKHVpbnQ2NCxzdHJpbmcpW10iLCBtZXRob2QgInRlc3RfaW1tdXRhYmxlX2FyYzQoKHVpbnQ2NCx1aW50NjQpW10pKHVpbnQ2NCx1aW50NjQpW10iLCBtZXRob2QgInRlc3RfaW1tX2ZpeGVkX2FycigpKHVpbnQ2NCx1aW50NjQpWzNdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF91aW50NjRfYXJyYXkgdGVzdF9iaWd1aW50X2FycmF5IHRlc3RfYm9vbF9hcnJheSB0ZXN0X2ZpeGVkX3NpemVfdHVwbGVfYXJyYXkgdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5IHRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheSB0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXkgdGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2xvZyB0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fZW1pdCB0ZXN0X25lc3RlZF9hcnJheSB0ZXN0X2JpdF9wYWNrZWRfdHVwbGVzIHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXMgdGVzdF91aW50NjRfcmV0dXJuIHRlc3RfYm9vbF9yZXR1cm4gdGVzdF90dXBsZV9yZXR1cm4gdGVzdF9keW5hbWljX3R1cGxlX3JldHVybiB0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2sgdGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlIHRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlIHRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9hcmM0X3R1cGxlIHRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9uYXRpdmVfdHVwbGUgdGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWMgdGVzdF9pbW11dGFibGVfYXJjNCB0ZXN0X2ltbV9maXhlZF9hcnIKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzMToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZShhcnJheTogYnl0ZXMsIGZpeGVkX2J5dGVfc2l6ZTogdWludDY0KSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemU6CiAgICBwcm90byAyIDIKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZHVwCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgZHVwMgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0MwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQoYXJyYXk6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDEgMgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgMwogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9idXJ5IDEKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMoYXJyYXk6IGJ5dGVzLCBuZXdfaXRlbXNfYnl0ZXM6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgcmVhZF9zdGVwOiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzOgogICAgcHJvdG8gNCAxCiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDIKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXBuIDIKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICByZXBsYWNlMiAwCiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBwdXNoaW50IDcKICAgICsKICAgIGludGNfMyAvLyA4CiAgICAvCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3CiAgICArCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX2lmX2Vsc2VAMgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyA1CiAgICAtCiAgICBiemVybwogICAgZnJhbWVfZGlnIDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIGZyYW1lX2RpZyAzCiAgICBwdXNoaW50IDE2CiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBmcmFtZV9idXJ5IDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfd2hpbGVfdG9wQDM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfYWZ0ZXJfd2hpbGVANQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBnZXRiaXQKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX3doaWxlX3RvcEAzCgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX3doaWxlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18wIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuc3VtX2ltbV9maXhlZChhcnI6IGJ5dGVzKSAtPiB1aW50NjQ6CnN1bV9pbW1fZml4ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzAtNTcxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHN1bV9pbW1fZml4ZWQoYXJyOiBOYXRpdmVTdHJ1Y3QzKSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3MgogICAgLy8gdG90YWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBkdXAKCnN1bV9pbW1fZml4ZWRfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTczCiAgICAvLyBmb3IgaXRlbSBpbiBhcnI6CiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGludCAzCiAgICA8CiAgICBieiBzdW1faW1tX2ZpeGVkX2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzMtNTc0CiAgICAvLyBmb3IgaXRlbSBpbiBhcnI6CiAgICAvLyAgICAgdG90YWwgKz0gaXRlbS5mb28KICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgcHVzaGludCAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzQKICAgIC8vIHRvdGFsICs9IGl0ZW0uZm9vCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3My01NzQKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIC8vICAgICB0b3RhbCArPSBpdGVtLmZvbwogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3NAogICAgLy8gdG90YWwgKz0gaXRlbS5mb28KICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTc1CiAgICAvLyB0b3RhbCArPSBpdGVtLmJhcgogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgc3VtX2ltbV9maXhlZF9mb3JfaGVhZGVyQDEKCnN1bV9pbW1fZml4ZWRfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzYKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUudGltZXMobjogdWludDY0KSAtPiBieXRlczoKdGltZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzktNTgwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHRpbWVzKG46IFVJbnQ2NCkgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODEKICAgIC8vIHJlc3VsdCA9IFN0cmluZygpCiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODIKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2Uobik6CiAgICBpbnRjXzAgLy8gMAoKdGltZXNfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTgyCiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKG4pOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMQogICAgPAogICAgYnogdGltZXNfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU4MwogICAgLy8gcmVzdWx0ICs9IFN0cmluZygiICIpCiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGJ5dGVzICIgIgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU4MgogICAgLy8gZm9yIF9pIGluIHVyYW5nZShuKToKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHRpbWVzX2Zvcl9oZWFkZXJAMQoKdGltZXNfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODQKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLmFkZF94KGFycjogYnl0ZXMsIHg6IHVpbnQ2NCkgLT4gYnl0ZXM6CmFkZF94OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg3LTU4OAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZGRfeChhcnI6IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0sIHg6IFVJbnQ2NCkgLT4gSW1tdXRhYmxlQXJyYXlbVUludDY0XToKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzAgLy8gMAoKYWRkX3hfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBieiBhZGRfeF9hZnRlcl9mb3JANAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTkwCiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKGkpCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIGFkZF94X2Zvcl9oZWFkZXJAMQoKYWRkX3hfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1OTEKICAgIC8vIHJldHVybiBhcnIKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X3VpbnQ2NF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfdWludDY0X2FycmF5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6OTkKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoVUludDY0KDQyKSkKICAgIHB1c2hieXRlcyAweDAwMDEwMDAwMDAwMDAwMDAwMDJhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDMKICAgIC8vIGFyciA9IGFkZF94KGFyciwgVUludDY0KDUpKQogICAgcHVzaGludCA1CiAgICBjYWxsc3ViIGFkZF94CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDQKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDUKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEwNwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChVSW50NjQoNDMpKQogICAgcHVzaGludCA0MwogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDgKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDcKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgNwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTA5CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSA0MwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQzCiAgICA9PQogICAgYXNzZXJ0CiAgICBpbnRjXzIgLy8gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEwCiAgICAvLyBhc3NlcnQgYXJyWzBdID09IDQyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0MgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTk2CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKHgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfdWludDY0X2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NgogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEyCiAgICAvLyBhcnIgPSBwb3BfeChhcnIsIFVJbnQ2NCgzKSkKICAgIHB1c2hpbnQgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTk2CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKHgpOgogICAgPAogICAgYnogdGVzdF91aW50NjRfYXJyYXlfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NwogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZQogICAgYnVyeSAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NgogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X3VpbnQ2NF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfdWludDY0X2FycmF5X2FmdGVyX2ZvckA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEzCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExNAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTE2CiAgICAvLyBhcnIgPSBhZGRfeChhcnIsIFVJbnQ2NCgxMCkpCiAgICBwdXNoaW50IDEwCiAgICBjYWxsc3ViIGFkZF94CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMTcKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExOAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gOQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgOQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTIwCiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKFVJbnQ2NCg0NCkpCiAgICBwdXNoaW50IDQ0CiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjEKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEyMgogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gNDQKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0NAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTI0CiAgICAvLyBhcnIgPSBhcnIucmVwbGFjZSgyLCBVSW50NjQoMjMpKQogICAgcHVzaGludCAyMwogICAgaXRvYgogICAgcmVwbGFjZTIgMTggLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjUKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDE1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjYKICAgIC8vIGFzc2VydCBhcnJbMl0gPT0gMjMKICAgIGR1cAogICAgcHVzaGludCAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMjMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEyOAogICAgLy8gc2VsZi5hID0gYXJyCiAgICBwdXNoYnl0ZXMgImEiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6OTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2JpZ3VpbnRfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2JpZ3VpbnRfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzUKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludChUeG4ubnVtX2FwcF9hcmdzIC0gMSkpCiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGl0b2IKICAgIHB1c2hpbnQgNjQKICAgIGJ6ZXJvCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzIKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W0JpZ1VJbnRdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzUKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludChUeG4ubnVtX2FwcF9hcmdzIC0gMSkpCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHB1c2hieXRlcyAweDAwMDEKICAgIHJlcGxhY2UyIDAKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM2CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM3CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSAwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNjQKICAgICoKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWNfMCAvLyAweAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKHgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYmlndWludF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MDMKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM5CiAgICAvLyBhcnIgPSBhZGRfeGIoYXJyLCBVSW50NjQoNSkpCiAgICBwdXNoaW50IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKHgpOgogICAgPAogICAgYnogdGVzdF9iaWd1aW50X2FycmF5X2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MDQKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludChpKSkKICAgIGR1cG4gMgogICAgaXRvYgogICAgZGlnIDQKICAgIGJ8CiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfYmlndWludF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfYmlndWludF9hcnJheV9hZnRlcl9mb3JANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0MAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNgogICAgZGlnIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDEKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA2NAogICAgKgogICAgcHVzaGludCA2NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwNAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0MwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChCaWdVSW50KDIqKjUxMiAtIDEpIC0gVHhuLm51bV9hcHBfYXJncykKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpdG9iCiAgICBieXRlYyA1IC8vIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIHN3YXAKICAgIGItCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZGlnIDUKICAgIGJ8CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDQKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA3CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDUKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDIqKjUxMiAtIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA2NAogICAgKgogICAgcHVzaGludCA2NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0NgogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAwCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDY0CiAgICBieXRlY18wIC8vIDB4CiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTQ4CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKEJpZ1VJbnQoMioqNTEyIC0gMSkpCiAgICBzd2FwCiAgICBieXRlYyA1IC8vIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDkKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE1MAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMioqNTEyIC0gMQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA2NAogICAgKgogICAgcHVzaGludCA2NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA1IC8vIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTEKICAgIC8vIGFzc2VydCBhcnJbMF0gPT0gMAogICAgZHVwCiAgICBleHRyYWN0IDIgNjQKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTMKICAgIC8vIEJveChJbW11dGFibGVBcnJheVtCaWdVSW50XSwga2V5PWIiYmlndWludCIpLnZhbHVlID0gYXJyCiAgICBieXRlYyA3IC8vIDB4NjI2OTY3NzU2OTZlNzQKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgNyAvLyAweDYyNjk2Nzc1Njk2ZTc0CiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2Jvb2xfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2Jvb2xfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTcKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W2Jvb2xdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjEKICAgIC8vIGZvciBpIGluIHVyYW5nZShsZW5ndGgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYm9vbF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjEKICAgIC8vIGZvciBpIGluIHVyYW5nZShsZW5ndGgpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjIKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoaSA9PSBUeG4ubnVtX2FwcF9hcmdzKQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGRpZyAxCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGludGNfMyAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTYxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UobGVuZ3RoKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9ib29sX2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTY0CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGgKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBidXJ5IDUKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE2NgogICAgLy8gaWYgbGVuZ3RoID4gMDoKICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE2NwogICAgLy8gYXNzZXJ0IG5vdCBhcnJbMF0sICJleHBlY3RlZCBlbGVtZW50IDAgdG8gYmUgRmFsc2UiCiAgICBkaWcgMwogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZWxlbWVudCAwIHRvIGJlIEZhbHNlCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTY4CiAgICAvLyBpZiBsZW5ndGggPiAxOgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjkKICAgIC8vIGFzc2VydCBub3QgYXJyWzFdLCAiZXhwZWN0ZWQgZWxlbWVudCAxIHRvIGJlIEZhbHNlIgogICAgaW50Y18xIC8vIDEKICAgIGRpZyA0CiAgICA8CiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBwdXNoaW50IDE3CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBleHBlY3RlZCBlbGVtZW50IDEgdG8gYmUgRmFsc2UKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzAKICAgIC8vIGlmIGxlbmd0aCA+IDI6CiAgICBkaWcgMgogICAgaW50Y18yIC8vIDIKICAgID4KICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzEKICAgIC8vIGFzc2VydCBhcnJbMl0sICJleHBlY3RlZCBlbGVtZW50IDIgdG8gYmUgVHJ1ZSIKICAgIGludGNfMiAvLyAyCiAgICBkaWcgNAogICAgPAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcHVzaGludCAxOAogICAgZ2V0Yml0CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZWxlbWVudCAyIHRvIGJlIFRydWUKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTcyCiAgICAvLyBpZiBsZW5ndGggPiAzOgogICAgZGlnIDIKICAgIHB1c2hpbnQgMwogICAgPgogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE3MwogICAgLy8gYXNzZXJ0IG5vdCBhcnJbbGVuZ3RoIC0gMV0sICJleHBlY3RlZCBsYXN0IGVsZW1lbnQgdG8gYmUgRmFsc2UiCiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGludCAxNgogICAgKwogICAgZGlnIDIKICAgIHN3YXAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxhc3QgZWxlbWVudCB0byBiZSBGYWxzZQoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzUKICAgIC8vIHNlbGYuZyA9IGFycgogICAgcHVzaGJ5dGVzICJnIgogICAgZGlnIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzYKICAgIC8vIGlmIGxlbmd0aDoKICAgIGRpZyAyCiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICBkaWcgMwogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBzZXRiaXQKICAgIHN3YXAKICAgIHB1c2hpbnQgNwogICAgKwogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGludGNfMiAvLyAyCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTc4CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGggLSAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICA9PQogICAgYXNzZXJ0Cgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4MgogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXlbdHVwbGVbVUludDY0LCBVSW50NjRdXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg1CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4NQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgIDwKICAgIGJ6IHRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg2CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKChpICsgMSwgaSArIDIpKQogICAgZHVwbiAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAzCiAgICBidXJ5IDEKICAgIGIgdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg4CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA1CiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4OQogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAoVUludDY0KDEpLCBVSW50NjQoMikpCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMTYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxOTAKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IChVSW50NjQoNSksIFVJbnQ2NCg2KSkKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIHN3YXAKICAgIHB1c2hpbnQgNgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5MgogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBwdXNoaW50IDE2CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemUKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTkzCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTk0CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IChVSW50NjQoMSksIFVJbnQ2NCgyKSkKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAxNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5NQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg0KSwgVUludDY0KDUpKQogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgcHVzaGludCA0CiAgICA9PQogICAgc3dhcAogICAgcHVzaGludCA1CiAgICA9PQogICAgJiYKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTk2CiAgICAvLyBzZWxmLmMgPSBhcnIKICAgIHB1c2hieXRlcyAiYyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDAKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W015VHVwbGVdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDMKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNQogICAgPAogICAgYnogdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDQKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlUdXBsZShmb289aSwgYmFyPWkgJSAyID09IDAsIGJhej1pICogMyAlIDIgPT0gMCkpCiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAyCiAgICAlCiAgICAhCiAgICBkaWcgMQogICAgcHVzaGludCAzCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDIKICAgIGl0b2IKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDYKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwNwogICAgLy8gZm9vLCBiYXIsIGJheiA9IGFyclswXQogICAgZHVwCiAgICBleHRyYWN0IDIgOQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBwdXNoaW50IDY0CiAgICBnZXRiaXQKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA2NQogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDgKICAgIC8vIGFzc2VydCBmb28gPT0gMAogICAgdW5jb3ZlciAyCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwOQogICAgLy8gYXNzZXJ0IGJhcgogICAgc3dhcAogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTAKICAgIC8vIGFzc2VydCBiYXoKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjExCiAgICAvLyBzZWxmLmQgPSBhcnIKICAgIHB1c2hieXRlcyAiZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxOTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTUKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W3R1cGxlW1VJbnQ2NCwgQnl0ZXNdXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjE4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIxOAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgIDwKICAgIGJ6IHRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjE5CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKChpICsgMSwgb3AuYnplcm8oaSkpKQogICAgZHVwbiAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgc3dhcAogICAgYnplcm8KICAgIGRpZyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGJ5dGVjIDYgLy8gMHgwMDBhCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMwogICAgYnVyeSAxCiAgICBiIHRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyMQogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGJ1cnkgNAogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjIKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEKCnRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjIKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA8CiAgICBieiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyMwogICAgLy8gYXNzZXJ0IGFycltpXVswXSA9PSBpICsgMSwgImV4cGVjdGVkIDFzdCBlbGVtZW50IHRvIGJlIGNvcnJlY3QiCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZGlnIDYKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMXN0IGVsZW1lbnQgdG8gYmUgY29ycmVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjI0CiAgICAvLyBhc3NlcnQgYXJyW2ldWzFdLmxlbmd0aCA9PSBpLCAiZXhwZWN0ZWQgMm5kIGVsZW1lbnQgdG8gYmUgY29ycmVjdCIKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDJuZCBlbGVtZW50IHRvIGJlIGNvcnJlY3QKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2Cgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjYKICAgIC8vIGFyciA9IGFyci5wb3AoKQogICAgZGlnIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyNwogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyOAogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAoVUludDY0KDEpLCBvcC5iemVybygwKSksICJleHBlY3RlZCAxLCAwIgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgaW50Y18wIC8vIDAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDEsIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyOQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg0KSwgb3AuYnplcm8oMykpLCAiZXhwZWN0ZWQgNCwgMyIKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDQKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIHB1c2hpbnQgMwogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgNCwgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjMwCiAgICAvLyBzZWxmLmUgPSBhcnIKICAgIHB1c2hieXRlcyAiZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzQKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W015RHluYW1pY1NpemVkVHVwbGVdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzcKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjM3CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNQogICAgPAogICAgYnogdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzgKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlEeW5hbWljU2l6ZWRUdXBsZShmb289aSArIDEsIGJhcj10aW1lcyhpKSkpCiAgICBkdXBuIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBjYWxsc3ViIHRpbWVzCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyA2IC8vIDB4MDAwYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDMKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDAKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBidXJ5IDQKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNQogICAgPAogICAgYnogdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDIKICAgIC8vIGFzc2VydCBhcnJbaV1bMF0gPT0gaSArIDEsICJleHBlY3RlZCAxc3QgZWxlbWVudCB0byBiZSBjb3JyZWN0IgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGRpZyA2CiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDUKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDFzdCBlbGVtZW50IHRvIGJlIGNvcnJlY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI0MwogICAgLy8gYXNzZXJ0IGFycltpXVsxXSA9PSB0aW1lcyhpKSwgImV4cGVjdGVkIDJuZCBlbGVtZW50IHRvIGJlIGNvcnJlY3QiCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgdGltZXMKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMm5kIGVsZW1lbnQgdG8gYmUgY29ycmVjdAogICAgYnVyeSAxCiAgICBiIHRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDYKCnRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheV9hZnRlcl9mb3JAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI0NQogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBkaWcgMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ2CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ3CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IE15RHluYW1pY1NpemVkVHVwbGUoVUludDY0KDEpLCBTdHJpbmcoKSksICJleHBlY3RlZCAxLCAwIgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAiIgogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMSwgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ4CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSBNeUR5bmFtaWNTaXplZFR1cGxlKFVJbnQ2NCg0KSwgU3RyaW5nKCIgICAiKSksICJleHBlY3RlZCA0LCAzIgogICAgZGlnIDEKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgNAogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA0CiAgICA9PQogICAgc3dhcAogICAgcHVzaGJ5dGVzICIgICAiCiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBleHBlY3RlZCA0LCAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDkKICAgIC8vIHNlbGYuZiA9IGFycgogICAgcHVzaGJ5dGVzICJmIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9sb2dbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fbG9nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjUzCiAgICAvLyBsb2coYXJyKQogICAgbG9nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fZW1pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9lbWl0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU3CiAgICAvLyBhcmM0LmVtaXQoImVtaXRfdGVzdCIsIGFycikKICAgIHB1c2hieXRlcyAweGZhNDBjMDUzMDAwMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU3CiAgICAvLyBhcmM0LmVtaXQoImVtaXRfdGVzdCIsIGFycikKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X25lc3RlZF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfbmVzdGVkX2FycmF5OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMgogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjMtMjY0CiAgICAvLyAjIGFkZCBuIG5ldyBhcnJheXMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcnJfdG9fYWRkKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjMtMjY0CiAgICAvLyAjIGFkZCBuIG5ldyBhcnJheXMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcnJfdG9fYWRkKToKICAgIGR1cAogICAgZGlnIDMKICAgIDwKICAgIGJ6IHRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjUKICAgIC8vIGV4dHJhX2FyciA9IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGJ1cnkgMTIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2NgogICAgLy8gZm9yIGogaW4gdXJhbmdlKGkpOgogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjY2CiAgICAvLyBmb3IgaiBpbiB1cmFuZ2UoaSk6CiAgICBkaWcgNAogICAgZGlnIDEKICAgIDwKICAgIGJ6IHRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckA3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjcKICAgIC8vIGV4dHJhX2FyciA9IGV4dHJhX2Fyci5hcHBlbmQoaikKICAgIGRpZyA0CiAgICBkdXAKICAgIGl0b2IKICAgIGRpZyAxMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2NgogICAgLy8gZm9yIGogaW4gdXJhbmdlKGkpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiB0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDQKCnRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjY4CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKGV4dHJhX2FycikKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBkaWcgMTQKICAgIGNvbmNhdAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjYzLTI2NAogICAgLy8gIyBhZGQgbiBuZXcgYXJyYXlzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXJyX3RvX2FkZCk6CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3MC0yNzEKICAgIC8vICMgc3VtIGlubmVyIGFycmF5cyBhbmQgcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgc3VtcwogICAgLy8gdG90YWxzID0gSW1tdXRhYmxlQXJyYXlbVUludDY0XSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYnVyeSAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjcyCiAgICAvLyBmb3IgaW5uZXJfYXJyIGluIGFycjoKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgYnVyeSA5CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA3Cgp0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDEwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjcyCiAgICAvLyBmb3IgaW5uZXJfYXJyIGluIGFycjoKICAgIGRpZyA2CiAgICBkaWcgOQogICAgPAogICAgYnogdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDEzCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA3CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBidXJ5IDEyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MTAKICAgIC8vIHRvdGFsID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYxMQogICAgLy8gZm9yIGkgaW4gYXJyOgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGJ1cnkgOAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgoKdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAxNToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYxMQogICAgLy8gZm9yIGkgaW4gYXJyOgogICAgZGlnIDUKICAgIGRpZyA4CiAgICA8CiAgICBieiB0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAMTcKICAgIGRpZyAxMAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjEyCiAgICAvLyB0b3RhbCArPSBpCiAgICBkaWcgNQogICAgKwogICAgYnVyeSA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA2CiAgICBiIHRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJAMTUKCnRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckAxNzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3MwogICAgLy8gdG90YWxzID0gdG90YWxzLmFwcGVuZChzdW1fYXJyKGlubmVyX2FycikpCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDEwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAxMAogICAgZGlnIDYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDcKICAgIGIgdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAxMAoKdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2JpdF9wYWNrZWRfdHVwbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9iaXRfcGFja2VkX3R1cGxlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3OQogICAgLy8gYXJyMiA9IEltbXV0YWJsZUFycmF5W1R3b0Jvb2xUdXBsZV0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4MC0yODIKICAgIC8vIGFycjcgPSBJbW11dGFibGVBcnJheVtTZXZlbkJvb2xUdXBsZV0oKQogICAgLy8gYXJyOCA9IEltbXV0YWJsZUFycmF5W0VpZ2h0Qm9vbFR1cGxlXSgpCiAgICAvLyBhcnI5ID0gSW1tdXRhYmxlQXJyYXlbTmluZUJvb2xUdXBsZV0oKQogICAgZHVwbiAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyODgKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2JpdF9wYWNrZWRfdHVwbGVzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4OAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgIDwKICAgIGJ6IHRlc3RfYml0X3BhY2tlZF90dXBsZXNfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4OQogICAgLy8gYXJyMiA9IGFycjIuYXBwZW5kKFR3b0Jvb2xUdXBsZShhPWkgPT0gMCwgYj1pID09IDEpKQogICAgZHVwbiAyCiAgICAhCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI5MwogICAgLy8gYmFyPWkgKyAxLAogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTYKICAgIC8vIGM9aSA9PSAyLAogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjk3CiAgICAvLyBkPWkgPT0gMywKICAgIGRpZyAzCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTgKICAgIC8vIGU9aSA9PSA0LAogICAgZGlnIDQKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI5OQogICAgLy8gZj1pID09IDUsCiAgICBkaWcgNQogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzAwCiAgICAvLyBnPWkgPT0gNiwKICAgIGRpZyA2CiAgICBwdXNoaW50IDYKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTAtMzAyCiAgICAvLyBhcnI3ID0gYXJyNy5hcHBlbmQoCiAgICAvLyAgICAgU2V2ZW5Cb29sVHVwbGUoCiAgICAvLyAgICAgICAgIGZvbz1pLAogICAgLy8gICAgICAgICBiYXI9aSArIDEsCiAgICAvLyAgICAgICAgIGE9aSA9PSAwLAogICAgLy8gICAgICAgICBiPWkgPT0gMSwKICAgIC8vICAgICAgICAgYz1pID09IDIsCiAgICAvLyAgICAgICAgIGQ9aSA9PSAzLAogICAgLy8gICAgICAgICBlPWkgPT0gNCwKICAgIC8vICAgICAgICAgZj1pID09IDUsCiAgICAvLyAgICAgICAgIGc9aSA9PSA2LAogICAgLy8gICAgICkKICAgIC8vICkKICAgIGRpZyA3CiAgICBpdG9iCiAgICB1bmNvdmVyIDcKICAgIGludGNfMiAvLyAyCiAgICB1bmNvdmVyIDcKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCA1CiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCA2CiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgZHVwMgogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDkKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMxNAogICAgLy8gaD1pID09IDcsCiAgICBkaWcgNAogICAgcHVzaGludCA3CiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzAzLTMxNgogICAgLy8gYXJyOCA9IGFycjguYXBwZW5kKAogICAgLy8gICAgIEVpZ2h0Qm9vbFR1cGxlKAogICAgLy8gICAgICAgICBmb289aSwKICAgIC8vICAgICAgICAgYmFyPWkgKyAxLAogICAgLy8gICAgICAgICBhPWkgPT0gMCwKICAgIC8vICAgICAgICAgYj1pID09IDEsCiAgICAvLyAgICAgICAgIGM9aSA9PSAyLAogICAgLy8gICAgICAgICBkPWkgPT0gMywKICAgIC8vICAgICAgICAgZT1pID09IDQsCiAgICAvLyAgICAgICAgIGY9aSA9PSA1LAogICAgLy8gICAgICAgICBnPWkgPT0gNiwKICAgIC8vICAgICAgICAgaD1pID09IDcsCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDcKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkaWcgNwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgNwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzI5CiAgICAvLyBpPWkgPT0gOCwKICAgIHVuY292ZXIgMwogICAgaW50Y18zIC8vIDgKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMTctMzMxCiAgICAvLyBhcnI5ID0gYXJyOS5hcHBlbmQoCiAgICAvLyAgICAgTmluZUJvb2xUdXBsZSgKICAgIC8vICAgICAgICAgZm9vPWksCiAgICAvLyAgICAgICAgIGJhcj1pICsgMSwKICAgIC8vICAgICAgICAgYT1pID09IDAsCiAgICAvLyAgICAgICAgIGI9aSA9PSAxLAogICAgLy8gICAgICAgICBjPWkgPT0gMiwKICAgIC8vICAgICAgICAgZD1pID09IDMsCiAgICAvLyAgICAgICAgIGU9aSA9PSA0LAogICAgLy8gICAgICAgICBmPWkgPT0gNSwKICAgIC8vICAgICAgICAgZz1pID09IDYsCiAgICAvLyAgICAgICAgIGg9aSA9PSA3LAogICAgLy8gICAgICAgICBpPWkgPT0gOCwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAzCiAgICBidXJ5IDEKICAgIGIgdGVzdF9iaXRfcGFja2VkX3R1cGxlc19mb3JfaGVhZGVyQDIKCnRlc3RfYml0X3BhY2tlZF90dXBsZXNfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzMKICAgIC8vIGFzc2VydCBhcnIyLmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzQKICAgIC8vIGFzc2VydCBhcnI3Lmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzUKICAgIC8vIGFzc2VydCBhcnI4Lmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzYKICAgIC8vIGFzc2VydCBhcnI5Lmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzcKICAgIC8vIHNlbGYuYm9vbDIgPSBhcnIyCiAgICBwdXNoYnl0ZXMgImJvb2wyIgogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzM4CiAgICAvLyBzZWxmLmJvb2w3ID0gYXJyNwogICAgcHVzaGJ5dGVzICJib29sNyIKICAgIHVuY292ZXIgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMzOQogICAgLy8gc2VsZi5ib29sOCA9IGFycjgKICAgIHB1c2hieXRlcyAiYm9vbDgiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNDAKICAgIC8vIHNlbGYuYm9vbDkgPSBhcnI5CiAgICBwdXNoYnl0ZXMgImJvb2w5IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzOgogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTAKICAgIC8vIHN1bTEgPSBzdW0yID0gc3VtMyA9IHN1bTQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUxCiAgICAvLyBmb3IgaSBpbiBhcnIxOgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMCAvLyAwCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MQogICAgLy8gZm9yIGkgaW4gYXJyMToKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDUKICAgIGRpZyA5CiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTIKICAgIC8vIHN1bTEgKz0gaQogICAgZGlnIDQKICAgICsKICAgIGJ1cnkgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMgoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MwogICAgLy8gZm9yIGIgaW4gYXJyMjoKICAgIGRpZyA4CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgYnVyeSAxNwogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUzCiAgICAvLyBmb3IgYiBpbiBhcnIyOgogICAgZGlnIDEyCiAgICBkaWcgMTcKICAgIDwKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDExCiAgICBkaWcgMTIKICAgIHB1c2hpbnQgMTYKICAgICsKICAgIGRpZyA5CiAgICBzd2FwCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1NAogICAgLy8gaWYgYjoKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTUKICAgIC8vIHN1bTIgKz0gMQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDQKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUA5OgogICAgZGlnIDEyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxMwogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJANgoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTYKICAgIC8vIGZvciB0dXAgaW4gYXJyMzoKICAgIGRpZyA3CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgYnVyeSAxNgogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTIKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckAxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1NgogICAgLy8gZm9yIHR1cCBpbiBhcnIzOgogICAgZGlnIDExCiAgICBkaWcgMTYKICAgIDwKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDE5CiAgICBkaWcgNwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxMgogICAgcHVzaGludCA5CiAgICAqCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBwdXNoaW50IDY0CiAgICBnZXRiaXQKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA2NQogICAgZ2V0Yml0CiAgICBidXJ5IDEzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTcKICAgIC8vIHN1bTMgKz0gdHVwLmZvbwogICAgZGlnIDYKICAgIHVuY292ZXIgMgogICAgKwogICAgYnVyeSA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTgKICAgIC8vIGlmIHR1cC5iYXI6CiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1OQogICAgLy8gc3VtMyArPSAxCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYwCiAgICAvLyBpZiB0dXAuYmF6OgogICAgZGlnIDEwCiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM2MQogICAgLy8gc3VtMyArPSAxCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9pZl9lbHNlQDE3OgogICAgZGlnIDExCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxMgogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMTIKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDE5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYyCiAgICAvLyBmb3IgaWR4LCBkeW5fdHVwIGluIHVlbnVtZXJhdGUoYXJyNCk6CiAgICBkaWcgNgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGJ1cnkgMTUKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMjA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjIKICAgIC8vIGZvciBpZHgsIGR5bl90dXAgaW4gdWVudW1lcmF0ZShhcnI0KToKICAgIGRpZyAxMwogICAgZGlnIDE1CiAgICA8CiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAyMwogICAgZGlnIDYKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMTQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkaWcgMTgKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYzCiAgICAvLyBzdW00ICs9IGR5bl90dXAuZm9vCiAgICBkaWcgOQogICAgdW5jb3ZlciAyCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjQKICAgIC8vIHN1bTQgKz0gZHluX3R1cC5iYXIuYnl0ZXMubGVuZ3RoCiAgICBzd2FwCiAgICBsZW4KICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICBidXJ5IDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM2NQogICAgLy8gYXNzZXJ0IGR5bl90dXAuYmFyLmJ5dGVzLmxlbmd0aCA9PSBpZHgsICJleHBlY3RlZCBzdHJpbmcgbGVuZ3RoIHRvIG1hdGNoIGluZGV4IgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHN0cmluZyBsZW5ndGggdG8gbWF0Y2ggaW5kZXgKICAgIGJ1cnkgMTQKICAgIGIgc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19mb3JfaGVhZGVyQDIwCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAyMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAyCiAgICBpdG9iCiAgICBkaWcgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNgogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X3VpbnQ2NF9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3VpbnQ2NF9yZXR1cm46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzEKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIHB1c2hieXRlcyAweDAwMDMwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF91aW50NjRfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X3VpbnQ2NF9yZXR1cm5fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChpKQogICAgZHVwbiAyCiAgICBpdG9iCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzcyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF91aW50NjRfcmV0dXJuX2Zvcl9oZWFkZXJAMgoKdGVzdF91aW50NjRfcmV0dXJuX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfYm9vbF9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2Jvb2xfcmV0dXJuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc4CiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheSgoVHJ1ZSwgRmFsc2UsIFRydWUsIEZhbHNlLCBUcnVlKSkKICAgIHB1c2hieXRlcyAweDAwMDVhOAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2Jvb2xfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3OQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2Jvb2xfcmV0dXJuX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODAKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoaSAlIDIgPT0gMCkKICAgIGR1cG4gMgogICAgaW50Y18yIC8vIDIKICAgICUKICAgICEKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGludGNfMyAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9ib29sX3JldHVybl9mb3JfaGVhZGVyQDIKCnRlc3RfYm9vbF9yZXR1cm5fYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF90dXBsZV9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3R1cGxlX3JldHVybjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NQogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXkoKE15VHVwbGUoVUludDY0KCksIFRydWUsIEZhbHNlKSwpKQogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDAwMDAwMDAwMDAwMDA4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzg2CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X3R1cGxlX3JldHVybl9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODYKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF90dXBsZV9yZXR1cm5fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChNeVR1cGxlKGZvbz1pLCBiYXI9aSAlIDIgPT0gMCwgYmF6PWkgJSAzID09IDApKQogICAgZHVwbiAyCiAgICBpbnRjXzIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDEKICAgIHB1c2hpbnQgMwogICAgJQogICAgIQogICAgZGlnIDIKICAgIGl0b2IKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfdHVwbGVfcmV0dXJuX2Zvcl9oZWFkZXJAMgoKdGVzdF90dXBsZV9yZXR1cm5fYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9keW5hbWljX3R1cGxlX3JldHVybltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZHluYW1pY190dXBsZV9yZXR1cm46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTIKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5KChNeUR5bmFtaWNTaXplZFR1cGxlKFVJbnQ2NCgpLCBTdHJpbmcoIkhlbGxvIikpLCkpCiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDBhMDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9keW5hbWljX3R1cGxlX3JldHVybl9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF9keW5hbWljX3R1cGxlX3JldHVybl9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzk0CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKE15RHluYW1pY1NpemVkVHVwbGUoaSwgdGltZXMoaSkpKQogICAgZHVwbiAyCiAgICBjYWxsc3ViIHRpbWVzCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyA2IC8vIDB4MDAwYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfZHluYW1pY190dXBsZV9yZXR1cm5fZm9yX2hlYWRlckAyCgp0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFja1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFjazoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwMgogICAgLy8gbXV0YWJsZS5leHRlbmQoYXJyKQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwNAogICAgLy8gbXV0YWJsZS5hcHBlbmQoTXlUdXBsZShmb289aSwgYmFyPWkgJSAyID09IDAsIGJhej1pICUgMyA9PSAwKSkKICAgIGR1cG4gMgogICAgaW50Y18yIC8vIDIKICAgICUKICAgICEKICAgIGRpZyAxCiAgICBwdXNoaW50IDMKICAgICUKICAgICEKICAgIGRpZyA0CiAgICBjb3ZlciAzCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgYnVyeSAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MDMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfZm9yX2hlYWRlckAyCgp0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDA1CiAgICAvLyByZXR1cm4gbXV0YWJsZS5mcmVlemUoKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOQogICAgLwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDExCiAgICAvLyBwcmVmaXggPSBJbW11dGFibGVBcnJheSgoYXJjNC5VSW50NjQoMSksIGFyYzQuVUludDY0KDIpKSkKICAgIGJ5dGVjIDggLy8gMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxMgogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZXh0cmFjdCA4IDgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQyMAogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxOQogICAgLy8gcHJlZml4ID0gSW1tdXRhYmxlQXJyYXkoKGFyYzQuVUludDY0KDEpLCBhcmM0LlVJbnQ2NCgyKSkpCiAgICBieXRlYyA4IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjAKICAgIC8vIHJlc3VsdCA9IHByZWZpeCArIGFyZwogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBwdXNoYnl0ZXMgMHgwMDA0CiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfYXJjNF90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9hcmM0X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDI4CiAgICAvLyByZXN1bHQgPSBwcmVmaXggKyBhcmcKICAgIGV4dHJhY3QgNCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjcKICAgIC8vIHByZWZpeCA9IEltbXV0YWJsZUFycmF5KChhcmM0LlN0cmluZygiYSIpLCBhcmM0LlN0cmluZygiYiIpKSkKICAgIGJ5dGVjIDkgLy8gMHgwMDAyMDAwNDAwMDcwMDAxNjEwMDAxNjIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQyOAogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDM2CiAgICAvLyByZXN1bHQgPSBwcmVmaXggKyBhcmcKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDM1CiAgICAvLyBwcmVmaXggPSBJbW11dGFibGVBcnJheSgoYXJjNC5TdHJpbmcoImEiKSwgYXJjNC5TdHJpbmcoImIiKSkpCiAgICBieXRlYyA5IC8vIDB4MDAwMjAwMDQwMDA3MDAwMTYxMDAwMTYyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MzYKICAgIC8vIHJlc3VsdCA9IHByZWZpeCArIGFyZwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2NvbmNhdF9pbW11dGFibGVfZHluYW1pYzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ0MwogICAgLy8gcmV0dXJuIGltbTEgKyBpbW0yCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgZXh0cmFjdCAyIDAKICAgIHVuY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FyYzRbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcmM0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ3CiAgICAvLyBhc3NlcnQgaW1tLCAiZXhwZWN0ZWQgbm9uIGVtcHR5IGFycmF5IgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgbm9uIGVtcHR5IGFycmF5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NDgKICAgIC8vIGltbSA9IGltbS5yZXBsYWNlKGltbS5sZW5ndGggLSAxLCBpbW1bMF0pCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAxNgogICAgc3dhcAogICAgcHVzaGludCAxNgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIHN3YXAKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9pbW1fZml4ZWRfYXJyW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9pbW1fZml4ZWRfYXJyOgogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDUzCiAgICAvLyBhcnIxID0gemVyb19ieXRlcyhOYXRpdmVTdHJ1Y3QzKQogICAgcHVzaGludCA0OAogICAgYnplcm8KICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU0CiAgICAvLyBzdHJ1Y3QxMiA9IE5hdGl2ZVN0cnVjdChUeG4ubnVtX2FwcF9hcmdzICsgMSwgVHhuLm51bV9hcHBfYXJncyArIDIpCiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ1NQogICAgLy8gYXJyMiA9IE5hdGl2ZVN0cnVjdDMoKHN0cnVjdDEyLCBzdHJ1Y3QxMiwgc3RydWN0MTIpKQogICAgZHVwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU3CiAgICAvLyBhc3NlcnQgYXJyMSAhPSBhcnIyLCAiZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIGRpZmZlcmVudCIKICAgICE9CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIGRpZmZlcmVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDYwCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2MAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDMpOgogICAgZHVwCiAgICBwdXNoaW50IDMKICAgIDwKICAgIGJ6IHRlc3RfaW1tX2ZpeGVkX2Fycl9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDYxCiAgICAvLyBhcnIxID0gYXJyMS5yZXBsYWNlKGksIHN0cnVjdDEyKQogICAgZHVwbiAyCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZGlnIDUKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnVyeSA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NjAKICAgIC8vIGZvciBpIGluIHVyYW5nZSgzKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJAMgoKdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDYzCiAgICAvLyBhc3NlcnQgYXJyMSA9PSBhcnIyLCAiZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIHRoZSBzYW1lIgogICAgZGlnIDMKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFycmF5cyB0byBiZSB0aGUgc2FtZQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2NQogICAgLy8gZm9yIHN0cnVjdF9pdCBpbiBhcnIxOgogICAgZGlnIDQKICAgIHB1c2hpbnQgMwogICAgPAogICAgYnogdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA5CiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgcHVzaGludCAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NjYKICAgIC8vIGFzc2VydCBzdHJ1Y3RfaXQgPT0gc3RydWN0MTIsICJleHBlY3RlZCBpdGVtcyBvbiBpdGVyYXRpb24gdG8gYmUgdGhlIHNhbWUiCiAgICBkaWcgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBpdGVtcyBvbiBpdGVyYXRpb24gdG8gYmUgdGhlIHNhbWUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDUKICAgIGIgdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJANgoKdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDY4CiAgICAvLyBzZWxmLmltbV9maXhlZF9hcnIgPSBhcnIxCiAgICBieXRlYyAxMCAvLyAiaW1tX2ZpeGVkX2FyciIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzIKICAgIC8vIGFzc2VydCBzdW1faW1tX2ZpeGVkKG11dF9hcnIuZnJlZXplKCkpID09IDE1LCAiZXhwZWN0ZWQgc3VtIHRvIGJlIDE1IgogICAgZHVwCiAgICBjYWxsc3ViIHN1bV9pbW1fZml4ZWQKICAgIHB1c2hpbnQgMTUKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgc3VtIHRvIGJlIDE1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzQKICAgIC8vIG11dF9hcnJbMF0gPSBOYXRpdmVTdHJ1Y3QoVUludDY0KCksIFVJbnQ2NCgpKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDAgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzUKICAgIC8vIGFzc2VydCBzdW1faW1tX2ZpeGVkKG11dF9hcnIuZnJlZXplKCkpID09IDEwLCAiZXhwZWN0ZWQgc3VtIHRvIGJlIDEwIgogICAgY2FsbHN1YiBzdW1faW1tX2ZpeGVkCiAgICBwdXNoaW50IDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHN1bSB0byBiZSAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDc3CiAgICAvLyByZXR1cm4gc2VsZi5pbW1fZml4ZWRfYXJyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImltbV9maXhlZF9hcnIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1tX2ZpeGVkX2FyciBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAAECCCYLAAQVH3x1AgAAAQACAAJA/////////////////////////////////////////////////////////////////////////////////////wIACgdiaWd1aW50EgACAAAAAAAAAAEAAAAAAAAAAgwAAgAEAAcAAWEAAWINaW1tX2ZpeGVkX2FycjEbQQC3MRkURDEYRIIYBETUL5kEt+qmCwR0PXDtBBx+BJQEotWGCwTgX8VkBB4JK4MEATECYgTIZUqYBInRlvgEbLfJkQSYmL8CBPa2HugEYLhqewRzrSg/BFKd+ukEIG1RTwTgZGXiBOwDAKIE7N8UrwRRGspkBCmFLk8EbUqjWAS3y5a9NhoAjhgCaQNQBHoFNQXlBkoHfAixCLcIxgmjCsEL8gw+DHEMww0jDXINiw2nDboN4w4MDikAMRkUMRgUEEOKAgKL/iJZIwkWVwYAi/5MXABJFYv/CUqL/1hPAiJPA1KJigECi/8iWSMJSSQLSYv/VwIASU4CSU8CWUlPAkkVTE4CUigiiwaLAQxBABuLAosGSU4CWSQJFlcGAosFTFCMBSQIjAZC/92LABZXBgKLBVCLASQIiwJMiwNSUIsEjACMAYmKBAEoRwKL/CJZRwKL/ghJFlcGAIv8TFwATgJMgQcIJQpJTwKBBwglCklOAgxBAAyLBosFCa+LBExQjAQijACLA4EQCEmMAov+CIwBiwKLAQxBACCL/YsASU4CU4sEiwJJTgNPAlSMBCMIjAKL/wiMAEL/2IsEjACJigMBi/0iWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJIosEiwIMQQAjiwNJFlcGAosBiwRJTgRPAl1JjAFLAVkkCAiMAyQIjARC/9WLAIsBUIwAiYoEAShJi/4kC4v8JAsiiwSLAwxBAByL/YsESU4CWYsCCBZXBgKLAUxQjAEkCIwEQv/ci/0VjAAijASLBIsCDEEAHIv/iwRJTgJZiwAIFlcGAosBTFCMASQIjARC/9yL/Iv+CBZXBgKLAVCL/YsDiwBSUIv/FYv/iwJPAlJQjACJigEBIkmLAYEDDEEAH4sBSYEQC4v/TIEQWEkiW4sACEwlWwiMACMIjAFC/9mJigEBKCKLAYv/DEEAEYsAgAEgUIwAiwEjCIwBQv/niYoCASKLAIv/DEEAHYsASRaL/kxQi/4iWSMIFlcGAlwAjP4jCIwAQv/bi/5MiYAKAAEAAAAAAAAAKoEFiP/CSSJZSYEGEkRJIwlLAlcCAEwlC1uBBBJEgSsWTwJMUEwjCBZXBgJcAEcCIllJgQcSRCMJSwFXAgBMJQtbgSsSRCRbgSoSRCJJgQMMQQARSwEliP07RQNISSMIRQFC/+hLAUkiWUmBBBJEIwlLAVcCAEwlC1skEkSBCoj/RkkiWUmBDhJESSMJSwJXAgBMJQtbgQkSRIEsFk8CTFBMIwgWVwYCXABJIllJgQ8SRCMJSwFXAgBMJQtbgSwSRIEXFlwSSSJZgQ8SREmBEluBFxJEgAFhTGcjQzEbIwkWgUCvSU4CqypMUIACAAFcAEcCIllJIxJEIwlMVwIATIFAC4FAWCioRCJJgQUMQQAgRwIWSwSrSwNJTwJQTCJZIwgWVwYCXABFAyMIRQFC/9lLAUkiWUmBBhJESSMJSwJXAgBMgUALgUBYgAEEqEQxGxYnBUyhSRWBQA5ESwWrTwJMUEwjCBZXBgJcAEkiWUmBBxJESSMJSwJXAgBMgUALgUBYgED////////////////////////////////////////////////////////////////////////////////////+qERLAVcCQCioREwnBVBMIwgWVwYCXABJIllJJRJEIwlLAVcCAEyBQAuBQFgnBahESVcCQCioRCcHvEgnB0y/I0MoNhoBFyoiSUsDDEEAHjEbSwFJTwISKyJPAlRLA0wjJYj78EUDIwhFAUL/20sBIllJRQVLA0lOAhJEQQAKSwNESwGBEFMUREsCIw1BAAwjSwQMREsBgRFTFERLAiQNQQALJEsEDERLAYESU0RLAoEDDUEAEksCIwlJSwUMRIEQCEsCTFMURIABZ0sCZ0sCQQAoSwMjCUkWVwYASwNMXABLAYEQCCJUTIEHCCUKJAgiTFIiWUsDIwkSRCNDKiJJgQUMQQAlRwIjCEwkCEsBFkwWUEsDSU8CUEwiWSMIFlcGAlwARQNFAUL/1EsBSSJZSYEFEkRLAVcCAEsCVwIQSSJbTCVbTCMSTCQSEERMIwmBEAuBEFhJIltMJVtMgQUSTIEGEhBEgRCI+mZFAUkiWUmBBBJESwFXAgBLAlcCEEkiW0wlW0wjEkwkEhBETCMJgRALgRBYSSJbTCVbTIEEEkyBBRIQRIABY0xnI0MqIkmBBQxBADRHAiQYFEsBgQMLJBgUSwIWKyJPBFQjTwNUUEsDSU8CUEwiWSMIFlcGAlwARQMjCEUBQv/FSwFJIlmBBRJESVcCCUkiW0sBgUBTTwKBQVNPAhRETEREgAFkTGcjQygqIkmBBQxBADVHAiMITK9LA0kiWUxXAgBLAxZLAxUWVwYCTwRQTCcGUExQJwRMUE4CI08DiPruRQNFAUL/xEsBIllJRQSBBRJEIkUBSYEFDEEAT0sBVwIASwFJTgIkC0sBTFlLAiMISwZLAQlLAxVLAiQLSwVMWU8CTU8DTwNPAlJJIltLASVZSwIVTwNOAlJXAgBMSwISRBVPAhJERQFC/6pLAYj5OUUBSSJZSYEEEkRLAVcCAEkiWUsCIwlLAhVLAyRZSwFMSwNNSwRPBE8CUkkiW0sBJVlLAhVPA04CUlcCAEwjEiKvTwISEERLASQLSwNMWU8CIwhPBEsBCUwkC0sETFlPA0xPAk1SSSJbSwElWUsCFU8DTgJSVwIATIEEEoEDr08CEhBEgAFlTGcjQygqIkmBBQxBADdHAiMITIj6j0sDSSJZTFcCAEsDFksDFRZXBgJPBFBMJwZQTFAnBExQTgIjTwOI+bpFA0UBQv/CSwEiWUlFBIEFEkQiRQFJgQUMQQBRSwFXAgBLAUlOAiQLSwFMWUsCIwhLBksBCUsDFUsCJAtLBUxZTwJNTwNPA08CUkkiW0sBJVlLAhVPA04CUlcCAExLAhJETwKI+gESREUBQv+oSwGI+ANFAUkiWUmBBBJESwFXAgBJIllLAiMJSwIVSwMkWUsBTEsDTUsETwRPAlJJIltLASVZSwIVTwNOAlJXAgBMIxJMKBIQREsBJAtLA0xZTwIjCE8ESwEJTCQLSwRMWU8DTE8CTVJJIltLASVZSwIVTwNOAlJXAgBMgQQSTIADICAgEhBEgAFmTGcjQzYaAbAjQ4AG+kDAUwACNhoBULAjQyJHAihHBTYaARc2GgIiSUsDDEEATCpFDCJFBUsESwEMQQAeSwRJFksNSU8CUEwiWSMIFlcGAlwARQ0jCEUFQv/aSwFJIllMVwIAJwRLDlBOAiNPA4j4U0UCSSMIRQFC/60qRQpLASJZRQkiRQdLBksJDEEAYUsBVwIASwckC0sBTFlKWSULJAhYSUUMIkUFIllFCCJFBksFSwgMQQAZSwpXAgBLBklOAiULW0sFCEUFIwhFBkL/30sDFksKSU8CUEwiWSMIFlcGAlwARQpLBiMIRQdC/5cpSwpQsCNDKkcDIkmBBQxBAMZHAhRLASMSKyJPA1QjTwJUSwZJTgJLAVBPAiJZIwgWVwYCXABFB0sBIwhLAiQSSwOBAxJLBIEEEksFgQUSSwaBBhJLBxZPByRPB1SBA08GVIEETwVUgQVPBFSBBk8DVEpQSwMWTEsBUEsJSU8CUEwiWSMIFlcGAlwARQlLBIEHEk8CgQdPAlRPAkxQSUsCUEsHSU8CUEwiWSMIFlcGAlwARQdPAyUSKyJPAlRQTFBLA0lPAlBMIlkjCBZXBgJcAEUDRQFC/zNLBEkiWYEFEkRLBEkiWYEFEkRLBEkiWYEFEkRLBEkiWYEFEkSABWJvb2wyTwRngAVib29sN08DZ4AFYm9vbDhPAmeABWJvb2w5TGcjQyhHBjYaATYaAjYaAzYaBCJHAzYaASJZIklLAgxBABlLCVcCAEsBSU4CJQtbSwQIRQQjCEUBQv/gSwgiWUURIkUNSwxLEQxBABtLDIEQCEsJTFNBAAZLAyMIRQRLDCMIRQ1C/91LByJZRRAiRQxLC0sQDEEAQEsHVwIASwyBCQuBCVhJIltLAYFAU08CgUFTRQ1LBk8CCEUGQQAGSwQjCEUFSwpBAAZLBCMIRQVLCyMIRQxC/7hLBiJZRQ8iRQ5LDUsPDEEAVksGVwIASw5JTgIkC0sBTFlLAiMISxJLAQlLAxVLAiQLSwVMWU8CTU8DTwNPAlJJIltLASVZSwIVTwNOAlJXAgBLCU8CCEwVTEsBCEUJTwISREUOQv+iSwIWSwQWUEsFFlBLBhZQKUxQsCNDNhoBF4AaAAMAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAMiSUsDDEEAHUcCFksDSU8CUEwiWSMIFlcGAlwARQMjCEUBQv/cKUsCULAjQzYaAReAAwAFqCJJSwMMQQAbRwIkGBQrIk8CVEsDTCMliPQsRQMjCEUBQv/eKUsCULAjQzYaAReACwABAAAAAAAAAACAIklLAwxBADJHAiQYFEsBgQMYFEsCFisiTwRUI08DVFBLA0lPAlBMIlkjCBZXBgJcAEUDIwhFAUL/xylLAlCwI0M2GgEXgBUAAQACAAAAAAAAAAAACgAFSGVsbG8iSUsDDEEANkcCiPUySwNJIllMVwIASwMWSwMVFlcGAk8EUEwnBlBMUCcETFBOAiNPA4j0XUUDIwhFAUL/wylLAlCwI0M2GgE2GgIXTFcCACJJSwMMQQApRwIkGBRLAYEDGBRLBE4DSwIWKyJPBFQjTwNUUE8CTFBFAyMIRQFC/9BLAUkVgQkKFlcGAkxQKUxQsCNDJwg2GgFQSVcCABUlChZXBgJcAClMULAjQzYaAUlXAAhMVwgIUCcITFCAAgAEXAApTFCwI0M2GgFXBAAnCUwkiPNSKUxQsCNDNhoBSSJZSwEkWUsCTwJLAlJLAhVPA08DTwJSUCcJTCSI8ykpTFCwI0M2GgE2GgJLASJZTwJXAgBLAlcCAE8DIllPA08DTwJPA4jzailMULAjQzYaAUkiWUlEIwlLAVcCEEyBEAskCExdKUxQsCNDKIEwr0kxGyMIMRskCEwWTBZQSU4CSUsBUExQSU4CE0QiSYEDDEEAFEcCgRALSwVMSwVdRQUjCEUBQv/lSwNLAhJEIkUFSwSBAwxBABdLBEmBEAtLBUyBEFhLBBJEIwhFBUL/4ScKSwRJTgJnSYjzV4EPEkSAEAAAAAAAAAAAAAAAAAAAAABcAIjzPIEKEkQiJwplRClMULAjQw==","clear":"C4EBQw=="},"events":[{"name":"emit_test","args":[{"type":"uint64[]","name":"field1"}]}],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the ImmutableArrayContract contract - */ -export type ImmutableArrayContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'test_uint64_array()void': Record - 'test_biguint_array()void': Record - 'test_bool_array(uint64)void': { - length: bigint | number - } - 'test_fixed_size_tuple_array()void': Record - 'test_fixed_size_named_tuple_array()void': Record - 'test_dynamic_sized_tuple_array()void': Record - 'test_dynamic_sized_named_tuple_array()void': Record - 'test_implicit_conversion_log(uint64[])void': { - arr: bigint[] | number[] - } - 'test_implicit_conversion_emit(uint64[])void': { - arr: bigint[] | number[] - } - 'test_nested_array(uint64,uint64[][])uint64[]': { - arrToAdd: bigint | number - arr: bigint[] | number[][] - } - 'test_bit_packed_tuples()void': Record - 'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)': { - arr1: bigint[] | number[] - arr2: boolean[] - arr3: [bigint | number, boolean, boolean][] - arr4: [bigint | number, string][] - } - 'test_uint64_return(uint64)uint64[]': { - append: bigint | number - } - 'test_bool_return(uint64)bool[]': { - append: bigint | number - } - 'test_tuple_return(uint64)(uint64,bool,bool)[]': { - append: bigint | number - } - 'test_dynamic_tuple_return(uint64)(uint64,string)[]': { - append: bigint | number - } - 'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]': { - arr: [bigint | number, boolean, boolean][] - append: bigint | number - } - 'test_concat_with_arc4_tuple((uint64,uint64))uint64[]': { - arg: [bigint | number, bigint | number] - } - 'test_concat_with_native_tuple((uint64,uint64))uint64[]': { - arg: [bigint | number, bigint | number] - } - 'test_dynamic_concat_with_arc4_tuple((string,string))string[]': { - arg: [string, string] - } - 'test_dynamic_concat_with_native_tuple((string,string))string[]': { - arg: [string, string] - } - 'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]': { - imm1: [bigint | number, string][] - imm2: [bigint | number, string][] - } - 'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]': { - imm: [bigint | number, bigint | number][] - } - 'test_imm_fixed_arr()(uint64,uint64)[3]': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'test_uint64_array()void': [] - 'test_biguint_array()void': [] - 'test_bool_array(uint64)void': [length: bigint | number] - 'test_fixed_size_tuple_array()void': [] - 'test_fixed_size_named_tuple_array()void': [] - 'test_dynamic_sized_tuple_array()void': [] - 'test_dynamic_sized_named_tuple_array()void': [] - 'test_implicit_conversion_log(uint64[])void': [arr: bigint[] | number[]] - 'test_implicit_conversion_emit(uint64[])void': [arr: bigint[] | number[]] - 'test_nested_array(uint64,uint64[][])uint64[]': [arrToAdd: bigint | number, arr: bigint[] | number[][]] - 'test_bit_packed_tuples()void': [] - 'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)': [arr1: bigint[] | number[], arr2: boolean[], arr3: [bigint | number, boolean, boolean][], arr4: [bigint | number, string][]] - 'test_uint64_return(uint64)uint64[]': [append: bigint | number] - 'test_bool_return(uint64)bool[]': [append: bigint | number] - 'test_tuple_return(uint64)(uint64,bool,bool)[]': [append: bigint | number] - 'test_dynamic_tuple_return(uint64)(uint64,string)[]': [append: bigint | number] - 'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]': [arr: [bigint | number, boolean, boolean][], append: bigint | number] - 'test_concat_with_arc4_tuple((uint64,uint64))uint64[]': [arg: [bigint | number, bigint | number]] - 'test_concat_with_native_tuple((uint64,uint64))uint64[]': [arg: [bigint | number, bigint | number]] - 'test_dynamic_concat_with_arc4_tuple((string,string))string[]': [arg: [string, string]] - 'test_dynamic_concat_with_native_tuple((string,string))string[]': [arg: [string, string]] - 'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]': [imm1: [bigint | number, string][], imm2: [bigint | number, string][]] - 'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]': [imm: [bigint | number, bigint | number][]] - 'test_imm_fixed_arr()(uint64,uint64)[3]': [] - } -} - -/** - * The return type for each method - */ -export type ImmutableArrayContractReturns = { - 'test_uint64_array()void': void - 'test_biguint_array()void': void - 'test_bool_array(uint64)void': void - 'test_fixed_size_tuple_array()void': void - 'test_fixed_size_named_tuple_array()void': void - 'test_dynamic_sized_tuple_array()void': void - 'test_dynamic_sized_named_tuple_array()void': void - 'test_implicit_conversion_log(uint64[])void': void - 'test_implicit_conversion_emit(uint64[])void': void - 'test_nested_array(uint64,uint64[][])uint64[]': bigint[] - 'test_bit_packed_tuples()void': void - 'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)': [bigint, bigint, bigint, bigint] - 'test_uint64_return(uint64)uint64[]': bigint[] - 'test_bool_return(uint64)bool[]': boolean[] - 'test_tuple_return(uint64)(uint64,bool,bool)[]': [bigint, boolean, boolean][] - 'test_dynamic_tuple_return(uint64)(uint64,string)[]': [bigint, string][] - 'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]': [bigint, boolean, boolean][] - 'test_concat_with_arc4_tuple((uint64,uint64))uint64[]': bigint[] - 'test_concat_with_native_tuple((uint64,uint64))uint64[]': bigint[] - 'test_dynamic_concat_with_arc4_tuple((string,string))string[]': string[] - 'test_dynamic_concat_with_native_tuple((string,string))string[]': string[] - 'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]': [bigint, string][] - 'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]': [bigint, bigint][] - 'test_imm_fixed_arr()(uint64,uint64)[3]': [[bigint, bigint], [bigint, bigint], [bigint, bigint]] -} - -/** - * Defines the types of available calls and state of the ImmutableArrayContract smart contract. - */ -export type ImmutableArrayContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'test_uint64_array()void' | 'test_uint64_array', { - argsObj: ImmutableArrayContractArgs['obj']['test_uint64_array()void'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_uint64_array()void'] - returns: ImmutableArrayContractReturns['test_uint64_array()void'] - }> - & Record<'test_biguint_array()void' | 'test_biguint_array', { - argsObj: ImmutableArrayContractArgs['obj']['test_biguint_array()void'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_biguint_array()void'] - returns: ImmutableArrayContractReturns['test_biguint_array()void'] - }> - & Record<'test_bool_array(uint64)void' | 'test_bool_array', { - argsObj: ImmutableArrayContractArgs['obj']['test_bool_array(uint64)void'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_bool_array(uint64)void'] - returns: ImmutableArrayContractReturns['test_bool_array(uint64)void'] - }> - & Record<'test_fixed_size_tuple_array()void' | 'test_fixed_size_tuple_array', { - argsObj: ImmutableArrayContractArgs['obj']['test_fixed_size_tuple_array()void'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_fixed_size_tuple_array()void'] - returns: ImmutableArrayContractReturns['test_fixed_size_tuple_array()void'] - }> - & Record<'test_fixed_size_named_tuple_array()void' | 'test_fixed_size_named_tuple_array', { - argsObj: ImmutableArrayContractArgs['obj']['test_fixed_size_named_tuple_array()void'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_fixed_size_named_tuple_array()void'] - returns: ImmutableArrayContractReturns['test_fixed_size_named_tuple_array()void'] - }> - & Record<'test_dynamic_sized_tuple_array()void' | 'test_dynamic_sized_tuple_array', { - argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_sized_tuple_array()void'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_sized_tuple_array()void'] - returns: ImmutableArrayContractReturns['test_dynamic_sized_tuple_array()void'] - }> - & Record<'test_dynamic_sized_named_tuple_array()void' | 'test_dynamic_sized_named_tuple_array', { - argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_sized_named_tuple_array()void'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_sized_named_tuple_array()void'] - returns: ImmutableArrayContractReturns['test_dynamic_sized_named_tuple_array()void'] - }> - & Record<'test_implicit_conversion_log(uint64[])void' | 'test_implicit_conversion_log', { - argsObj: ImmutableArrayContractArgs['obj']['test_implicit_conversion_log(uint64[])void'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_implicit_conversion_log(uint64[])void'] - returns: ImmutableArrayContractReturns['test_implicit_conversion_log(uint64[])void'] - }> - & Record<'test_implicit_conversion_emit(uint64[])void' | 'test_implicit_conversion_emit', { - argsObj: ImmutableArrayContractArgs['obj']['test_implicit_conversion_emit(uint64[])void'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_implicit_conversion_emit(uint64[])void'] - returns: ImmutableArrayContractReturns['test_implicit_conversion_emit(uint64[])void'] - }> - & Record<'test_nested_array(uint64,uint64[][])uint64[]' | 'test_nested_array', { - argsObj: ImmutableArrayContractArgs['obj']['test_nested_array(uint64,uint64[][])uint64[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_nested_array(uint64,uint64[][])uint64[]'] - returns: ImmutableArrayContractReturns['test_nested_array(uint64,uint64[][])uint64[]'] - }> - & Record<'test_bit_packed_tuples()void' | 'test_bit_packed_tuples', { - argsObj: ImmutableArrayContractArgs['obj']['test_bit_packed_tuples()void'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_bit_packed_tuples()void'] - returns: ImmutableArrayContractReturns['test_bit_packed_tuples()void'] - }> - & Record<'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)' | 'sum_uints_and_lengths_and_trues', { - argsObj: ImmutableArrayContractArgs['obj']['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'] - argsTuple: ImmutableArrayContractArgs['tuple']['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'] - returns: ImmutableArrayContractReturns['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'] - }> - & Record<'test_uint64_return(uint64)uint64[]' | 'test_uint64_return', { - argsObj: ImmutableArrayContractArgs['obj']['test_uint64_return(uint64)uint64[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_uint64_return(uint64)uint64[]'] - returns: ImmutableArrayContractReturns['test_uint64_return(uint64)uint64[]'] - }> - & Record<'test_bool_return(uint64)bool[]' | 'test_bool_return', { - argsObj: ImmutableArrayContractArgs['obj']['test_bool_return(uint64)bool[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_bool_return(uint64)bool[]'] - returns: ImmutableArrayContractReturns['test_bool_return(uint64)bool[]'] - }> - & Record<'test_tuple_return(uint64)(uint64,bool,bool)[]' | 'test_tuple_return', { - argsObj: ImmutableArrayContractArgs['obj']['test_tuple_return(uint64)(uint64,bool,bool)[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_tuple_return(uint64)(uint64,bool,bool)[]'] - returns: ImmutableArrayContractReturns['test_tuple_return(uint64)(uint64,bool,bool)[]'] - }> - & Record<'test_dynamic_tuple_return(uint64)(uint64,string)[]' | 'test_dynamic_tuple_return', { - argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_tuple_return(uint64)(uint64,string)[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_tuple_return(uint64)(uint64,string)[]'] - returns: ImmutableArrayContractReturns['test_dynamic_tuple_return(uint64)(uint64,string)[]'] - }> - & Record<'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]' | 'test_convert_to_array_and_back', { - argsObj: ImmutableArrayContractArgs['obj']['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'] - returns: ImmutableArrayContractReturns['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'] - }> - & Record<'test_concat_with_arc4_tuple((uint64,uint64))uint64[]' | 'test_concat_with_arc4_tuple', { - argsObj: ImmutableArrayContractArgs['obj']['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'] - returns: ImmutableArrayContractReturns['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'] - }> - & Record<'test_concat_with_native_tuple((uint64,uint64))uint64[]' | 'test_concat_with_native_tuple', { - argsObj: ImmutableArrayContractArgs['obj']['test_concat_with_native_tuple((uint64,uint64))uint64[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_concat_with_native_tuple((uint64,uint64))uint64[]'] - returns: ImmutableArrayContractReturns['test_concat_with_native_tuple((uint64,uint64))uint64[]'] - }> - & Record<'test_dynamic_concat_with_arc4_tuple((string,string))string[]' | 'test_dynamic_concat_with_arc4_tuple', { - argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_concat_with_arc4_tuple((string,string))string[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_concat_with_arc4_tuple((string,string))string[]'] - returns: ImmutableArrayContractReturns['test_dynamic_concat_with_arc4_tuple((string,string))string[]'] - }> - & Record<'test_dynamic_concat_with_native_tuple((string,string))string[]' | 'test_dynamic_concat_with_native_tuple', { - argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_concat_with_native_tuple((string,string))string[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_concat_with_native_tuple((string,string))string[]'] - returns: ImmutableArrayContractReturns['test_dynamic_concat_with_native_tuple((string,string))string[]'] - }> - & Record<'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]' | 'test_concat_immutable_dynamic', { - argsObj: ImmutableArrayContractArgs['obj']['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'] - returns: ImmutableArrayContractReturns['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'] - }> - & Record<'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]' | 'test_immutable_arc4', { - argsObj: ImmutableArrayContractArgs['obj']['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'] - returns: ImmutableArrayContractReturns['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'] - }> - & Record<'test_imm_fixed_arr()(uint64,uint64)[3]' | 'test_imm_fixed_arr', { - argsObj: ImmutableArrayContractArgs['obj']['test_imm_fixed_arr()(uint64,uint64)[3]'] - argsTuple: ImmutableArrayContractArgs['tuple']['test_imm_fixed_arr()(uint64,uint64)[3]'] - returns: ImmutableArrayContractReturns['test_imm_fixed_arr()(uint64,uint64)[3]'] - }> - /** - * Defines the shape of the state of the application. - */ - state: { - global: { - keys: { - a: bigint[] - g: boolean[] - c: [bigint, bigint][] - d: [bigint, boolean, boolean][] - e: [bigint, Uint8Array][] - f: [bigint, string][] - bool2: [boolean, boolean][] - bool7: [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] - bool8: [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] - bool9: [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] - immFixedArr: [[bigint, bigint], [bigint, bigint], [bigint, bigint]] - } - maps: {} - } - } -} - -/** - * Defines the possible abi call signatures. - */ -export type ImmutableArrayContractSignatures = keyof ImmutableArrayContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type ImmutableArrayContractNonVoidMethodSignatures = keyof ImmutableArrayContractTypes['methods'] extends infer T ? T extends keyof ImmutableArrayContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the ImmutableArrayContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = ImmutableArrayContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the ImmutableArrayContract smart contract to the method's return type - */ -export type MethodReturn = ImmutableArrayContractTypes['methods'][TSignature]['returns'] - -/** - * Defines the shape of the keyed global state of the application. - */ -export type GlobalKeysState = ImmutableArrayContractTypes['state']['global']['keys'] - - -/** - * Defines supported create method params for this smart contract - */ -export type ImmutableArrayContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type ImmutableArrayContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: ImmutableArrayContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the ImmutableArrayContract smart contract - */ -export abstract class ImmutableArrayContractParamsFactory { - /** - * Constructs a no op call for the test_uint64_array()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testUint64Array(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_uint64_array()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_biguint_array()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testBiguintArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_biguint_array()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_bool_array(uint64)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testBoolArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_bool_array(uint64)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.length], - } - } - /** - * Constructs a no op call for the test_fixed_size_tuple_array()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testFixedSizeTupleArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_fixed_size_tuple_array()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_fixed_size_named_tuple_array()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testFixedSizeNamedTupleArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_fixed_size_named_tuple_array()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_dynamic_sized_tuple_array()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testDynamicSizedTupleArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_dynamic_sized_tuple_array()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_dynamic_sized_named_tuple_array()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testDynamicSizedNamedTupleArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_dynamic_sized_named_tuple_array()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_implicit_conversion_log(uint64[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testImplicitConversionLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_implicit_conversion_log(uint64[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.arr], - } - } - /** - * Constructs a no op call for the test_implicit_conversion_emit(uint64[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testImplicitConversionEmit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_implicit_conversion_emit(uint64[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.arr], - } - } - /** - * Constructs a no op call for the test_nested_array(uint64,uint64[][])uint64[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testNestedArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_nested_array(uint64,uint64[][])uint64[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.arrToAdd, params.args.arr], - } - } - /** - * Constructs a no op call for the test_bit_packed_tuples()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testBitPackedTuples(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_bit_packed_tuples()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static sumUintsAndLengthsAndTrues(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.arr1, params.args.arr2, params.args.arr3, params.args.arr4], - } - } - /** - * Constructs a no op call for the test_uint64_return(uint64)uint64[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testUint64Return(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_uint64_return(uint64)uint64[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.append], - } - } - /** - * Constructs a no op call for the test_bool_return(uint64)bool[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testBoolReturn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_bool_return(uint64)bool[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.append], - } - } - /** - * Constructs a no op call for the test_tuple_return(uint64)(uint64,bool,bool)[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testTupleReturn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_tuple_return(uint64)(uint64,bool,bool)[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.append], - } - } - /** - * Constructs a no op call for the test_dynamic_tuple_return(uint64)(uint64,string)[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testDynamicTupleReturn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_dynamic_tuple_return(uint64)(uint64,string)[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.append], - } - } - /** - * Constructs a no op call for the test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testConvertToArrayAndBack(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.arr, params.args.append], - } - } - /** - * Constructs a no op call for the test_concat_with_arc4_tuple((uint64,uint64))uint64[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testConcatWithArc4Tuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_concat_with_arc4_tuple((uint64,uint64))uint64[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.arg], - } - } - /** - * Constructs a no op call for the test_concat_with_native_tuple((uint64,uint64))uint64[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testConcatWithNativeTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_concat_with_native_tuple((uint64,uint64))uint64[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.arg], - } - } - /** - * Constructs a no op call for the test_dynamic_concat_with_arc4_tuple((string,string))string[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testDynamicConcatWithArc4Tuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_dynamic_concat_with_arc4_tuple((string,string))string[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.arg], - } - } - /** - * Constructs a no op call for the test_dynamic_concat_with_native_tuple((string,string))string[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testDynamicConcatWithNativeTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_dynamic_concat_with_native_tuple((string,string))string[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.arg], - } - } - /** - * Constructs a no op call for the test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testConcatImmutableDynamic(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.imm1, params.args.imm2], - } - } - /** - * Constructs a no op call for the test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testImmutableArc4(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.imm], - } - } - /** - * Constructs a no op call for the test_imm_fixed_arr()(uint64,uint64)[3] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testImmFixedArr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_imm_fixed_arr()(uint64,uint64)[3]' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } -} - -/** - * A factory to create and deploy one or more instance of the ImmutableArrayContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class ImmutableArrayContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `ImmutableArrayContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new ImmutableArrayContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new ImmutableArrayContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the ImmutableArrayContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: ImmutableArrayContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new ImmutableArrayContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ImmutableArrayContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ImmutableArrayContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ImmutableArrayContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new ImmutableArrayContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the ImmutableArrayContract smart contract - */ -export class ImmutableArrayContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `ImmutableArrayContractClient` - * - * @param appClient An `AppClient` instance which has been created with the ImmutableArrayContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `ImmutableArrayContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `ImmutableArrayContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new ImmutableArrayContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `ImmutableArrayContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new ImmutableArrayContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the ImmutableArrayContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testUint64Array: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testUint64Array(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_biguint_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testBiguintArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testBiguintArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_array(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testBoolArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testBoolArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testFixedSizeTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testFixedSizeTupleArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_named_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testFixedSizeNamedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testFixedSizeNamedTupleArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testDynamicSizedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicSizedTupleArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_named_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testDynamicSizedNamedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicSizedNamedTupleArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_log(uint64[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testImplicitConversionLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testImplicitConversionLog(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_emit(uint64[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testImplicitConversionEmit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testImplicitConversionEmit(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_nested_array(uint64,uint64[][])uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testNestedArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testNestedArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_bit_packed_tuples()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testBitPackedTuples: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testBitPackedTuples(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - sumUintsAndLengthsAndTrues: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.sumUintsAndLengthsAndTrues(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_return(uint64)uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testUint64Return: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testUint64Return(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_return(uint64)bool[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testBoolReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testBoolReturn(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_tuple_return(uint64)(uint64,bool,bool)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testTupleReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testTupleReturn(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_tuple_return(uint64)(uint64,string)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testDynamicTupleReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicTupleReturn(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testConvertToArrayAndBack: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testConvertToArrayAndBack(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_arc4_tuple((uint64,uint64))uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testConcatWithArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testConcatWithArc4Tuple(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_native_tuple((uint64,uint64))uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testConcatWithNativeTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testConcatWithNativeTuple(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_arc4_tuple((string,string))string[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testDynamicConcatWithArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithArc4Tuple(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_native_tuple((string,string))string[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testDynamicConcatWithNativeTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithNativeTuple(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testConcatImmutableDynamic: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testConcatImmutableDynamic(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testImmutableArc4: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testImmutableArc4(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_imm_fixed_arr()(uint64,uint64)[3]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testImmFixedArr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayContractParamsFactory.testImmFixedArr(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the ImmutableArrayContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testUint64Array: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testUint64Array(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_biguint_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testBiguintArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testBiguintArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_array(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testBoolArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testBoolArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testFixedSizeTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testFixedSizeTupleArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_named_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testFixedSizeNamedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testFixedSizeNamedTupleArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testDynamicSizedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicSizedTupleArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_named_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testDynamicSizedNamedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicSizedNamedTupleArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_log(uint64[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testImplicitConversionLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testImplicitConversionLog(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_emit(uint64[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testImplicitConversionEmit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testImplicitConversionEmit(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_nested_array(uint64,uint64[][])uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testNestedArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testNestedArray(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_bit_packed_tuples()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testBitPackedTuples: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testBitPackedTuples(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - sumUintsAndLengthsAndTrues: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.sumUintsAndLengthsAndTrues(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_return(uint64)uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testUint64Return: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testUint64Return(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_return(uint64)bool[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testBoolReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testBoolReturn(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_tuple_return(uint64)(uint64,bool,bool)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testTupleReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testTupleReturn(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_tuple_return(uint64)(uint64,string)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testDynamicTupleReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicTupleReturn(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testConvertToArrayAndBack: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testConvertToArrayAndBack(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_arc4_tuple((uint64,uint64))uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testConcatWithArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testConcatWithArc4Tuple(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_native_tuple((uint64,uint64))uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testConcatWithNativeTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testConcatWithNativeTuple(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_arc4_tuple((string,string))string[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testDynamicConcatWithArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithArc4Tuple(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_native_tuple((string,string))string[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testDynamicConcatWithNativeTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithNativeTuple(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testConcatImmutableDynamic: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testConcatImmutableDynamic(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testImmutableArc4: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testImmutableArc4(params)) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_imm_fixed_arr()(uint64,uint64)[3]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testImmFixedArr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testImmFixedArr(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the ImmutableArrayContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testUint64Array: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testUint64Array(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_uint64_array()void'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_biguint_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testBiguintArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testBiguintArray(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_biguint_array()void'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_array(uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testBoolArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testBoolArray(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_bool_array(uint64)void'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testFixedSizeTupleArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testFixedSizeTupleArray(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_fixed_size_tuple_array()void'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_named_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testFixedSizeNamedTupleArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testFixedSizeNamedTupleArray(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_fixed_size_named_tuple_array()void'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testDynamicSizedTupleArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicSizedTupleArray(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_sized_tuple_array()void'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_named_tuple_array()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testDynamicSizedNamedTupleArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicSizedNamedTupleArray(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_sized_named_tuple_array()void'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_log(uint64[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testImplicitConversionLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testImplicitConversionLog(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_implicit_conversion_log(uint64[])void'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_emit(uint64[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testImplicitConversionEmit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testImplicitConversionEmit(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_implicit_conversion_emit(uint64[])void'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_nested_array(uint64,uint64[][])uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testNestedArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testNestedArray(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_nested_array(uint64,uint64[][])uint64[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_bit_packed_tuples()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testBitPackedTuples: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testBitPackedTuples(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_bit_packed_tuples()void'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - sumUintsAndLengthsAndTrues: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.sumUintsAndLengthsAndTrues(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_return(uint64)uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testUint64Return: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testUint64Return(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_uint64_return(uint64)uint64[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_return(uint64)bool[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testBoolReturn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testBoolReturn(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_bool_return(uint64)bool[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_tuple_return(uint64)(uint64,bool,bool)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testTupleReturn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testTupleReturn(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_tuple_return(uint64)(uint64,bool,bool)[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_tuple_return(uint64)(uint64,string)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testDynamicTupleReturn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicTupleReturn(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_tuple_return(uint64)(uint64,string)[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testConvertToArrayAndBack: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testConvertToArrayAndBack(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_arc4_tuple((uint64,uint64))uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testConcatWithArc4Tuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testConcatWithArc4Tuple(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_native_tuple((uint64,uint64))uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testConcatWithNativeTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testConcatWithNativeTuple(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_concat_with_native_tuple((uint64,uint64))uint64[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_arc4_tuple((string,string))string[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testDynamicConcatWithArc4Tuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithArc4Tuple(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_concat_with_arc4_tuple((string,string))string[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_native_tuple((string,string))string[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testDynamicConcatWithNativeTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithNativeTuple(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_concat_with_native_tuple((string,string))string[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testConcatImmutableDynamic: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testConcatImmutableDynamic(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testImmutableArc4: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testImmutableArc4(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'])} - }, - - /** - * Makes a call to the ImmutableArrayContract smart contract using the `test_imm_fixed_arr()(uint64,uint64)[3]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testImmFixedArr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testImmFixedArr(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_imm_fixed_arr()(uint64,uint64)[3]'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new ImmutableArrayContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current ImmutableArrayContract app - */ - state = { - /** - * Methods to access global state for the current ImmutableArrayContract app - */ - global: { - /** - * Get all current keyed values from global state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.global.getAll() - return { - a: result.a, - g: result.g, - c: result.c, - d: result.d, - e: result.e, - f: result.f, - bool2: result.bool2, - bool7: result.bool7, - bool8: result.bool8, - bool9: result.bool9, - immFixedArr: result.imm_fixed_arr, - } - }, - /** - * Get the current value of the a key in global state - */ - a: async (): Promise => { return (await this.appClient.state.global.getValue("a")) as bigint[] | undefined }, - /** - * Get the current value of the g key in global state - */ - g: async (): Promise => { return (await this.appClient.state.global.getValue("g")) as boolean[] | undefined }, - /** - * Get the current value of the c key in global state - */ - c: async (): Promise<[bigint, bigint][] | undefined> => { return (await this.appClient.state.global.getValue("c")) as [bigint, bigint][] | undefined }, - /** - * Get the current value of the d key in global state - */ - d: async (): Promise<[bigint, boolean, boolean][] | undefined> => { return (await this.appClient.state.global.getValue("d")) as [bigint, boolean, boolean][] | undefined }, - /** - * Get the current value of the e key in global state - */ - e: async (): Promise<[bigint, Uint8Array][] | undefined> => { return (await this.appClient.state.global.getValue("e")) as [bigint, Uint8Array][] | undefined }, - /** - * Get the current value of the f key in global state - */ - f: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.global.getValue("f")) as [bigint, string][] | undefined }, - /** - * Get the current value of the bool2 key in global state - */ - bool2: async (): Promise<[boolean, boolean][] | undefined> => { return (await this.appClient.state.global.getValue("bool2")) as [boolean, boolean][] | undefined }, - /** - * Get the current value of the bool7 key in global state - */ - bool7: async (): Promise<[bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined> => { return (await this.appClient.state.global.getValue("bool7")) as [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined }, - /** - * Get the current value of the bool8 key in global state - */ - bool8: async (): Promise<[bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined> => { return (await this.appClient.state.global.getValue("bool8")) as [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined }, - /** - * Get the current value of the bool9 key in global state - */ - bool9: async (): Promise<[bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined> => { return (await this.appClient.state.global.getValue("bool9")) as [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined }, - /** - * Get the current value of the imm_fixed_arr key in global state - */ - immFixedArr: async (): Promise<[[bigint, bigint], [bigint, bigint], [bigint, bigint]] | undefined> => { return (await this.appClient.state.global.getValue("imm_fixed_arr")) as [[bigint, bigint], [bigint, bigint], [bigint, bigint]] | undefined }, - }, - } - - public newGroup(composerConfig?: TransactionComposerConfig): ImmutableArrayContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a test_uint64_array()void method call against the ImmutableArrayContract contract - */ - testUint64Array(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testUint64Array(params))) - return this - }, - /** - * Add a test_biguint_array()void method call against the ImmutableArrayContract contract - */ - testBiguintArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBiguintArray(params))) - return this - }, - /** - * Add a test_bool_array(uint64)void method call against the ImmutableArrayContract contract - */ - testBoolArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBoolArray(params))) - return this - }, - /** - * Add a test_fixed_size_tuple_array()void method call against the ImmutableArrayContract contract - */ - testFixedSizeTupleArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testFixedSizeTupleArray(params))) - return this - }, - /** - * Add a test_fixed_size_named_tuple_array()void method call against the ImmutableArrayContract contract - */ - testFixedSizeNamedTupleArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testFixedSizeNamedTupleArray(params))) - return this - }, - /** - * Add a test_dynamic_sized_tuple_array()void method call against the ImmutableArrayContract contract - */ - testDynamicSizedTupleArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicSizedTupleArray(params))) - return this - }, - /** - * Add a test_dynamic_sized_named_tuple_array()void method call against the ImmutableArrayContract contract - */ - testDynamicSizedNamedTupleArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicSizedNamedTupleArray(params))) - return this - }, - /** - * Add a test_implicit_conversion_log(uint64[])void method call against the ImmutableArrayContract contract - */ - testImplicitConversionLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImplicitConversionLog(params))) - return this - }, - /** - * Add a test_implicit_conversion_emit(uint64[])void method call against the ImmutableArrayContract contract - */ - testImplicitConversionEmit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImplicitConversionEmit(params))) - return this - }, - /** - * Add a test_nested_array(uint64,uint64[][])uint64[] method call against the ImmutableArrayContract contract - */ - testNestedArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testNestedArray(params))) - return this - }, - /** - * Add a test_bit_packed_tuples()void method call against the ImmutableArrayContract contract - */ - testBitPackedTuples(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBitPackedTuples(params))) - return this - }, - /** - * Add a sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64) method call against the ImmutableArrayContract contract - */ - sumUintsAndLengthsAndTrues(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sumUintsAndLengthsAndTrues(params))) - return this - }, - /** - * Add a test_uint64_return(uint64)uint64[] method call against the ImmutableArrayContract contract - */ - testUint64Return(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testUint64Return(params))) - return this - }, - /** - * Add a test_bool_return(uint64)bool[] method call against the ImmutableArrayContract contract - */ - testBoolReturn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBoolReturn(params))) - return this - }, - /** - * Add a test_tuple_return(uint64)(uint64,bool,bool)[] method call against the ImmutableArrayContract contract - */ - testTupleReturn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testTupleReturn(params))) - return this - }, - /** - * Add a test_dynamic_tuple_return(uint64)(uint64,string)[] method call against the ImmutableArrayContract contract - */ - testDynamicTupleReturn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicTupleReturn(params))) - return this - }, - /** - * Add a test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[] method call against the ImmutableArrayContract contract - */ - testConvertToArrayAndBack(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testConvertToArrayAndBack(params))) - return this - }, - /** - * Add a test_concat_with_arc4_tuple((uint64,uint64))uint64[] method call against the ImmutableArrayContract contract - */ - testConcatWithArc4Tuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testConcatWithArc4Tuple(params))) - return this - }, - /** - * Add a test_concat_with_native_tuple((uint64,uint64))uint64[] method call against the ImmutableArrayContract contract - */ - testConcatWithNativeTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testConcatWithNativeTuple(params))) - return this - }, - /** - * Add a test_dynamic_concat_with_arc4_tuple((string,string))string[] method call against the ImmutableArrayContract contract - */ - testDynamicConcatWithArc4Tuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicConcatWithArc4Tuple(params))) - return this - }, - /** - * Add a test_dynamic_concat_with_native_tuple((string,string))string[] method call against the ImmutableArrayContract contract - */ - testDynamicConcatWithNativeTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicConcatWithNativeTuple(params))) - return this - }, - /** - * Add a test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[] method call against the ImmutableArrayContract contract - */ - testConcatImmutableDynamic(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testConcatImmutableDynamic(params))) - return this - }, - /** - * Add a test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[] method call against the ImmutableArrayContract contract - */ - testImmutableArc4(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArc4(params))) - return this - }, - /** - * Add a test_imm_fixed_arr()(uint64,uint64)[3] method call against the ImmutableArrayContract contract - */ - testImmFixedArr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmFixedArr(params))) - return this - }, - /** - * Add a clear state call to the ImmutableArrayContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as ImmutableArrayContractComposer - } -} -export type ImmutableArrayContractComposer = { - /** - * Calls the test_uint64_array()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testUint64Array(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_uint64_array()void'] | undefined]> - - /** - * Calls the test_biguint_array()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testBiguintArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_biguint_array()void'] | undefined]> - - /** - * Calls the test_bool_array(uint64)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testBoolArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_bool_array(uint64)void'] | undefined]> - - /** - * Calls the test_fixed_size_tuple_array()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testFixedSizeTupleArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_fixed_size_tuple_array()void'] | undefined]> - - /** - * Calls the test_fixed_size_named_tuple_array()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testFixedSizeNamedTupleArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_fixed_size_named_tuple_array()void'] | undefined]> - - /** - * Calls the test_dynamic_sized_tuple_array()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testDynamicSizedTupleArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_sized_tuple_array()void'] | undefined]> - - /** - * Calls the test_dynamic_sized_named_tuple_array()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testDynamicSizedNamedTupleArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_sized_named_tuple_array()void'] | undefined]> - - /** - * Calls the test_implicit_conversion_log(uint64[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testImplicitConversionLog(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_implicit_conversion_log(uint64[])void'] | undefined]> - - /** - * Calls the test_implicit_conversion_emit(uint64[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testImplicitConversionEmit(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_implicit_conversion_emit(uint64[])void'] | undefined]> - - /** - * Calls the test_nested_array(uint64,uint64[][])uint64[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testNestedArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_nested_array(uint64,uint64[][])uint64[]'] | undefined]> - - /** - * Calls the test_bit_packed_tuples()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testBitPackedTuples(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_bit_packed_tuples()void'] | undefined]> - - /** - * Calls the sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - sumUintsAndLengthsAndTrues(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'] | undefined]> - - /** - * Calls the test_uint64_return(uint64)uint64[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testUint64Return(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_uint64_return(uint64)uint64[]'] | undefined]> - - /** - * Calls the test_bool_return(uint64)bool[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testBoolReturn(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_bool_return(uint64)bool[]'] | undefined]> - - /** - * Calls the test_tuple_return(uint64)(uint64,bool,bool)[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testTupleReturn(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_tuple_return(uint64)(uint64,bool,bool)[]'] | undefined]> - - /** - * Calls the test_dynamic_tuple_return(uint64)(uint64,string)[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testDynamicTupleReturn(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_tuple_return(uint64)(uint64,string)[]'] | undefined]> - - /** - * Calls the test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testConvertToArrayAndBack(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'] | undefined]> - - /** - * Calls the test_concat_with_arc4_tuple((uint64,uint64))uint64[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testConcatWithArc4Tuple(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'] | undefined]> - - /** - * Calls the test_concat_with_native_tuple((uint64,uint64))uint64[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testConcatWithNativeTuple(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_concat_with_native_tuple((uint64,uint64))uint64[]'] | undefined]> - - /** - * Calls the test_dynamic_concat_with_arc4_tuple((string,string))string[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testDynamicConcatWithArc4Tuple(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_concat_with_arc4_tuple((string,string))string[]'] | undefined]> - - /** - * Calls the test_dynamic_concat_with_native_tuple((string,string))string[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testDynamicConcatWithNativeTuple(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_concat_with_native_tuple((string,string))string[]'] | undefined]> - - /** - * Calls the test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testConcatImmutableDynamic(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'] | undefined]> - - /** - * Calls the test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testImmutableArc4(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'] | undefined]> - - /** - * Calls the test_imm_fixed_arr()(uint64,uint64)[3] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testImmFixedArr(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_imm_fixed_arr()(uint64,uint64)[3]'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the ImmutableArrayContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): ImmutableArrayContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): ImmutableArrayContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type ImmutableArrayContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayInitContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayInitContract.ts deleted file mode 100644 index 358fea4..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayInitContract.ts +++ /dev/null @@ -1,755 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"ImmutableArrayInitContract","structs":{},"methods":[{"name":"test_immutable_array_init","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_immutable_array_init_without_type_generic","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reference_array_init","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reference_array_init_without_type_generic","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[42],"errorMessage":"OnCompletion must be NoOp"},{"pc":[89],"errorMessage":"OnCompletion must be NoOp && can only call when creating"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayA4IDMgMSAwCiAgICBieXRlY2Jsb2NrIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzkKICAgIC8vIGNsYXNzIEltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDExCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDg0MzRiYTJhIDB4NjNhYWJiYTAgMHhkYmFmMDM0ZSAweGE5ZDE0NTU0IC8vIG1ldGhvZCAidGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdCgpdm9pZCIsIG1ldGhvZCAidGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYygpdm9pZCIsIG1ldGhvZCAidGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdCgpdm9pZCIsIG1ldGhvZCAidGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYygpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXQgdGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYyB0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0IHRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWMKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDkwCiAgICAvLyBhMyA9IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0oUmVmZXJlbmNlQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTEyCiAgICAvLyBhMyA9IEltbXV0YWJsZUFycmF5KFJlZmVyZW5jZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUluaXRDb250cmFjdC50ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNgogICAgLy8gYTEgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyOAogICAgLy8gYTIgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKEZpeGVkQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKSkKICAgIGR1cAogICAgcG9wCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyOQogICAgLy8gYXNzZXJ0IGExLmxlbmd0aCA9PSBhMi5sZW5ndGgKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzAKICAgIC8vIGFzc2VydCBhMVswXSA9PSBhMlswXQogICAgZHVwCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzEKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhMlsxXQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzIKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhMlsyXQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzQKICAgIC8vIGEzID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XShJbW11dGFibGVBcnJheSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgcG9wCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzNgogICAgLy8gYXNzZXJ0IGExWzBdID09IGEzWzBdCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzcKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhM1sxXQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzgKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhM1syXQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MjYKICAgIC8vIGExID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQxCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGE0Lmxlbmd0aAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQyCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTRbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQzCiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTRbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ0CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTRbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0LnRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ4CiAgICAvLyBhMSA9IFJlZmVyZW5jZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1MAogICAgLy8gYTIgPSBSZWZlcmVuY2VBcnJheShGaXhlZEFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBkdXAKICAgIHBvcAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NTEKICAgIC8vIGFzc2VydCBhMS5sZW5ndGggPT0gYTIubGVuZ3RoCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUyCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTJbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUzCiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTJbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU0CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTJbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU2CiAgICAvLyBhMyA9IFJlZmVyZW5jZUFycmF5KEltbXV0YWJsZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU4CiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTNbMF0KICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1OQogICAgLy8gYXNzZXJ0IGExWzFdID09IGEzWzFdCiAgICBkdXAKICAgIGludGNfMCAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU2MAogICAgLy8gYXNzZXJ0IGExWzJdID09IGEzWzJdCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0OAogICAgLy8gYTEgPSBSZWZlcmVuY2VBcnJheSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTYzCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGE0Lmxlbmd0aAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY0CiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTRbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY1CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTRbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY2CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTRbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"byteCode":{"approval":"CiAECAMBACYBGAAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAzEbQQArMRkURDEYRIIEBIQ0uioEY6q7oATbrwNOBKnRRVQ2GgCOBAAJAA0AEQBjADEZFDEYFBBDKEgkQyhIJEMoSUhHAhUiCiMSREklWyQSREkiW4ECEkSBEFsjEkQoSEcCJVskEkRJIluBAhJEgRBbIxJEKEgoSEkVIgojEkRJJVskEkRJIluBAhJEgRBbIxJDKElIRwIVIgojEkRJJVskEkRJIluBAhJEgRBbIxJEKEhHAiVbJBJESSJbgQISRIEQWyMSRChIKEhJFSIKIxJESSVbJBJESSJbgQISRIEQWyMSQw==","clear":"CoEBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the ImmutableArrayInitContract contract - */ -export type ImmutableArrayInitContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'test_immutable_array_init()void': Record - 'test_immutable_array_init_without_type_generic()void': Record - 'test_reference_array_init()void': Record - 'test_reference_array_init_without_type_generic()void': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'test_immutable_array_init()void': [] - 'test_immutable_array_init_without_type_generic()void': [] - 'test_reference_array_init()void': [] - 'test_reference_array_init_without_type_generic()void': [] - } -} - -/** - * The return type for each method - */ -export type ImmutableArrayInitContractReturns = { - 'test_immutable_array_init()void': void - 'test_immutable_array_init_without_type_generic()void': void - 'test_reference_array_init()void': void - 'test_reference_array_init_without_type_generic()void': void -} - -/** - * Defines the types of available calls and state of the ImmutableArrayInitContract smart contract. - */ -export type ImmutableArrayInitContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'test_immutable_array_init()void' | 'test_immutable_array_init', { - argsObj: ImmutableArrayInitContractArgs['obj']['test_immutable_array_init()void'] - argsTuple: ImmutableArrayInitContractArgs['tuple']['test_immutable_array_init()void'] - returns: ImmutableArrayInitContractReturns['test_immutable_array_init()void'] - }> - & Record<'test_immutable_array_init_without_type_generic()void' | 'test_immutable_array_init_without_type_generic', { - argsObj: ImmutableArrayInitContractArgs['obj']['test_immutable_array_init_without_type_generic()void'] - argsTuple: ImmutableArrayInitContractArgs['tuple']['test_immutable_array_init_without_type_generic()void'] - returns: ImmutableArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'] - }> - & Record<'test_reference_array_init()void' | 'test_reference_array_init', { - argsObj: ImmutableArrayInitContractArgs['obj']['test_reference_array_init()void'] - argsTuple: ImmutableArrayInitContractArgs['tuple']['test_reference_array_init()void'] - returns: ImmutableArrayInitContractReturns['test_reference_array_init()void'] - }> - & Record<'test_reference_array_init_without_type_generic()void' | 'test_reference_array_init_without_type_generic', { - argsObj: ImmutableArrayInitContractArgs['obj']['test_reference_array_init_without_type_generic()void'] - argsTuple: ImmutableArrayInitContractArgs['tuple']['test_reference_array_init_without_type_generic()void'] - returns: ImmutableArrayInitContractReturns['test_reference_array_init_without_type_generic()void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type ImmutableArrayInitContractSignatures = keyof ImmutableArrayInitContractTypes['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the ImmutableArrayInitContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = ImmutableArrayInitContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the ImmutableArrayInitContract smart contract to the method's return type - */ -export type MethodReturn = ImmutableArrayInitContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type ImmutableArrayInitContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type ImmutableArrayInitContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: ImmutableArrayInitContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the ImmutableArrayInitContract smart contract - */ -export abstract class ImmutableArrayInitContractParamsFactory { - /** - * Constructs a no op call for the test_immutable_array_init()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testImmutableArrayInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_immutable_array_init()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_immutable_array_init_without_type_generic()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testImmutableArrayInitWithoutTypeGeneric(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_immutable_array_init_without_type_generic()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_reference_array_init()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testReferenceArrayInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_reference_array_init()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the test_reference_array_init_without_type_generic()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testReferenceArrayInitWithoutTypeGeneric(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_reference_array_init_without_type_generic()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } -} - -/** - * A factory to create and deploy one or more instance of the ImmutableArrayInitContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class ImmutableArrayInitContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `ImmutableArrayInitContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new ImmutableArrayInitContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new ImmutableArrayInitContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the ImmutableArrayInitContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: ImmutableArrayInitContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new ImmutableArrayInitContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ImmutableArrayInitContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ImmutableArrayInitContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the ImmutableArrayInitContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new ImmutableArrayInitContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the ImmutableArrayInitContract smart contract - */ -export class ImmutableArrayInitContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `ImmutableArrayInitContractClient` - * - * @param appClient An `AppClient` instance which has been created with the ImmutableArrayInitContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `ImmutableArrayInitContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `ImmutableArrayInitContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new ImmutableArrayInitContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `ImmutableArrayInitContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new ImmutableArrayInitContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the ImmutableArrayInitContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testImmutableArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInit(params)) - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testImmutableArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testReferenceArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInit(params)) - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testReferenceArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the ImmutableArrayInitContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testImmutableArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInit(params)) - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testImmutableArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testReferenceArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInit(params)) - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testReferenceArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the ImmutableArrayInitContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testImmutableArrayInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInit(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayInitContractReturns['test_immutable_array_init()void'])} - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testImmutableArrayInitWithoutTypeGeneric: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'])} - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testReferenceArrayInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInit(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayInitContractReturns['test_reference_array_init()void'])} - }, - - /** - * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testReferenceArrayInitWithoutTypeGeneric: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) - return {...result, return: result.return as unknown as (undefined | ImmutableArrayInitContractReturns['test_reference_array_init_without_type_generic()void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new ImmutableArrayInitContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current ImmutableArrayInitContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): ImmutableArrayInitContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a test_immutable_array_init()void method call against the ImmutableArrayInitContract contract - */ - testImmutableArrayInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArrayInit(params))) - return this - }, - /** - * Add a test_immutable_array_init_without_type_generic()void method call against the ImmutableArrayInitContract contract - */ - testImmutableArrayInitWithoutTypeGeneric(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArrayInitWithoutTypeGeneric(params))) - return this - }, - /** - * Add a test_reference_array_init()void method call against the ImmutableArrayInitContract contract - */ - testReferenceArrayInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testReferenceArrayInit(params))) - return this - }, - /** - * Add a test_reference_array_init_without_type_generic()void method call against the ImmutableArrayInitContract contract - */ - testReferenceArrayInitWithoutTypeGeneric(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testReferenceArrayInitWithoutTypeGeneric(params))) - return this - }, - /** - * Add a clear state call to the ImmutableArrayInitContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as ImmutableArrayInitContractComposer - } -} -export type ImmutableArrayInitContractComposer = { - /** - * Calls the test_immutable_array_init()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testImmutableArrayInit(params?: CallParams): ImmutableArrayInitContractComposer<[...TReturns, ImmutableArrayInitContractReturns['test_immutable_array_init()void'] | undefined]> - - /** - * Calls the test_immutable_array_init_without_type_generic()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testImmutableArrayInitWithoutTypeGeneric(params?: CallParams): ImmutableArrayInitContractComposer<[...TReturns, ImmutableArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'] | undefined]> - - /** - * Calls the test_reference_array_init()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testReferenceArrayInit(params?: CallParams): ImmutableArrayInitContractComposer<[...TReturns, ImmutableArrayInitContractReturns['test_reference_array_init()void'] | undefined]> - - /** - * Calls the test_reference_array_init_without_type_generic()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testReferenceArrayInitWithoutTypeGeneric(params?: CallParams): ImmutableArrayInitContractComposer<[...TReturns, ImmutableArrayInitContractReturns['test_reference_array_init_without_type_generic()void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the ImmutableArrayInitContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): ImmutableArrayInitContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): ImmutableArrayInitContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type ImmutableArrayInitContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/LocalStateContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/LocalStateContract.ts deleted file mode 100644 index 767e777..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/LocalStateContract.ts +++ /dev/null @@ -1,1746 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"LocalStateContract","structs":{},"methods":[{"name":"opt_in","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["OptIn"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_uint","args":[{"type":"address","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_string","args":[{"type":"address","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_byte","args":[{"type":"address","name":"a"}],"returns":{"type":"byte"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_bool","args":[{"type":"address","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_address","args":[{"type":"address","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_uint128","args":[{"type":"address","name":"a"}],"returns":{"type":"uint128"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_dynamic_bytes","args":[{"type":"address","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_tuple","args":[{"type":"address","name":"a"}],"returns":{"type":"(uint64,byte[],bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_uint","args":[{"type":"address","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_string","args":[{"type":"address","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_byte","args":[{"type":"address","name":"a"}],"returns":{"type":"byte"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_bool","args":[{"type":"address","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_address","args":[{"type":"address","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_uint128","args":[{"type":"address","name":"a"}],"returns":{"type":"uint128"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_dynamic_bytes","args":[{"type":"address","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":15}},"keys":{"global":{},"local":{"implicit_key_arc4_uint":{"keyType":"AVMString","valueType":"uint64","key":"aW1wbGljaXRfa2V5X2FyYzRfdWludA=="},"implicit_key_arc4_string":{"keyType":"AVMString","valueType":"string","key":"aW1wbGljaXRfa2V5X2FyYzRfc3RyaW5n"},"implicit_key_arc4_byte":{"keyType":"AVMString","valueType":"byte","key":"aW1wbGljaXRfa2V5X2FyYzRfYnl0ZQ=="},"implicit_key_arc4_bool":{"keyType":"AVMString","valueType":"bool","key":"aW1wbGljaXRfa2V5X2FyYzRfYm9vbA=="},"implicit_key_arc4_address":{"keyType":"AVMString","valueType":"address","key":"aW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcw=="},"implicit_key_arc4_uint128":{"keyType":"AVMString","valueType":"uint128","key":"aW1wbGljaXRfa2V5X2FyYzRfdWludDEyOA=="},"implicit_key_arc4_dynamic_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"aW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcw=="},"implicit_key_tuple":{"keyType":"AVMString","valueType":"(uint64,byte[],bool)","key":"aW1wbGljaXRfa2V5X3R1cGxl"},"arc4_uint":{"keyType":"AVMString","valueType":"uint64","key":"ZXhwbGljaXRfa2V5X2FyYzRfdWludA=="},"arc4_string":{"keyType":"AVMString","valueType":"string","key":"ZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5n"},"arc4_byte":{"keyType":"AVMString","valueType":"byte","key":"ZXhwbGljaXRfa2V5X2FyYzRfYnl0ZQ=="},"arc4_bool":{"keyType":"AVMString","valueType":"bool","key":"ZXhwbGljaXRfa2V5X2FyYzRfYm9vbA=="},"arc4_address":{"keyType":"AVMString","valueType":"address","key":"ZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcw=="},"arc4_uint128":{"keyType":"AVMString","valueType":"uint128","key":"ZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOA=="},"arc4_dynamic_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"ZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcw=="}},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[891],"errorMessage":"check self.arc4_address exists for account"},{"pc":[877],"errorMessage":"check self.arc4_bool exists for account"},{"pc":[863],"errorMessage":"check self.arc4_byte exists for account"},{"pc":[919],"errorMessage":"check self.arc4_dynamic_bytes exists for account"},{"pc":[849],"errorMessage":"check self.arc4_string exists for account"},{"pc":[835],"errorMessage":"check self.arc4_uint exists for account"},{"pc":[905],"errorMessage":"check self.arc4_uint128 exists for account"},{"pc":[779],"errorMessage":"check self.implicit_key_arc4_address exists for account"},{"pc":[765],"errorMessage":"check self.implicit_key_arc4_bool exists for account"},{"pc":[751],"errorMessage":"check self.implicit_key_arc4_byte exists for account"},{"pc":[807],"errorMessage":"check self.implicit_key_arc4_dynamic_bytes exists for account"},{"pc":[737],"errorMessage":"check self.implicit_key_arc4_string exists for account"},{"pc":[724],"errorMessage":"check self.implicit_key_arc4_uint exists for account"},{"pc":[793],"errorMessage":"check self.implicit_key_arc4_uint128 exists for account"},{"pc":[821],"errorMessage":"check self.implicit_key_tuple exists for account"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIgMHgwMDAwMDAwMDAwMDAwNTM5ICJpbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmciIDB4MDAwNTQ4NjU2YzZjNmYgImltcGxpY2l0X2tleV9hcmM0X2J5dGUiICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIiAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiIDB4MDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgImltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczICJpbXBsaWNpdF9rZXlfdHVwbGUiICJleHBsaWNpdF9rZXlfYXJjNF91aW50IiAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIiAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIgImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOCIgImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjYzCiAgICAvLyBjbGFzcyBMb2NhbFN0YXRlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDI2CiAgICBwdXNoYnl0ZXMgMHgzMGM2ZDU4YSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2luX3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY2MwogICAgLy8gY2xhc3MgTG9jYWxTdGF0ZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhiM2NmYTM4OSAweGRiODU4MTc2IDB4NzgyNjc3NjIgMHg0MjYzNTFjOCAweDA3NWNhZTkxIDB4NTljMGI4MGIgMHgwZDZmYTY5MCAweDk3ZTEwZDljIDB4MmU0YThjNDkgMHhiMjJjZDIxZSAweGIzZjQ0NzAxIDB4ZWRkOTcyOTcgMHg2NzFkMzUzYyAweGEzZmQ2ZmRjIDB4Y2QyZTVkNjYgLy8gbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludChhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyhhZGRyZXNzKXN0cmluZyIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGUoYWRkcmVzcylieXRlIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbChhZGRyZXNzKWJvb2wiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKGFkZHJlc3MpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgoYWRkcmVzcyl1aW50MTI4IiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyhhZGRyZXNzKWJ5dGVbXSIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV90dXBsZShhZGRyZXNzKSh1aW50NjQsYnl0ZVtdLGJvb2wpIiwgbWV0aG9kICJnZXRfYXJjNF91aW50KGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJnZXRfYXJjNF9zdHJpbmcoYWRkcmVzcylzdHJpbmciLCBtZXRob2QgImdldF9hcmM0X2J5dGUoYWRkcmVzcylieXRlIiwgbWV0aG9kICJnZXRfYXJjNF9ib29sKGFkZHJlc3MpYm9vbCIsIG1ldGhvZCAiZ2V0X2FyYzRfYWRkcmVzcyhhZGRyZXNzKWFkZHJlc3MiLCBtZXRob2QgImdldF9hcmM0X3VpbnQxMjgoYWRkcmVzcyl1aW50MTI4IiwgbWV0aG9kICJnZXRfYXJjNF9keW5hbWljX2J5dGVzKGFkZHJlc3MpYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBnZXRfaW1wbGljaXRfa2V5X3R1cGxlIGdldF9hcmM0X3VpbnQgZ2V0X2FyYzRfc3RyaW5nIGdldF9hcmM0X2J5dGUgZ2V0X2FyYzRfYm9vbCBnZXRfYXJjNF9hZGRyZXNzIGdldF9hcmM0X3VpbnQxMjggZ2V0X2FyYzRfZHluYW1pY19ieXRlcwogICAgZXJyCgptYWluX29wdF9pbl9yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE9wdEluCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgb3B0X2luCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDI2OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0Lm9wdF9pbltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdF9pbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2ODgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuVUludDY0KDEzMzcpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDUzOQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY4OQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlY18zIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICBieXRlYyA0IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTAKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZVtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQnl0ZSgwKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyA1IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTEKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQm9vbChUcnVlKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgcHVzaGJ5dGVzIDB4ODAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTIKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQWRkcmVzcygKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTMKICAgIC8vIEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5Mi02OTQKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQWRkcmVzcygKICAgIC8vICAgICBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzCiAgICAvLyApCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk1CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjhbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlVJbnQxMjgoMioqMTAwKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyA4IC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk2CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkR5bmFtaWNCeXRlcygKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTAgLy8gImltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk2LTY5OAogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoCiAgICAvLyAgICAgYiJkeW5hbWljIGJ5dGVzIgogICAgLy8gKQogICAgYnl0ZWMgMTEgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTkKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gKFVJbnQ2NCgxMCksIEJ5dGVzKGIidGVzdCIpLCBGYWxzZSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTIgLy8gImltcGxpY2l0X2tleV90dXBsZSIKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMGEwMDBiMDAwMDA0NzQ2NTczNzQKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDEKICAgIC8vIHNlbGYuYXJjNF91aW50W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5VSW50NjQoMTMzNykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTMgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDUzOQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwMgogICAgLy8gc2VsZi5hcmM0X3N0cmluZ1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuU3RyaW5nKCJIZWxsbyIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDE0IC8vICJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njg5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZ1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuU3RyaW5nKCJIZWxsbyIpCiAgICBieXRlYyA0IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDIKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmdbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwMwogICAgLy8gc2VsZi5hcmM0X2J5dGVbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJ5dGUoMCkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTUgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwNAogICAgLy8gc2VsZi5hcmM0X2Jvb2xbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJvb2woVHJ1ZSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTYgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjkxCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2xbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJvb2woVHJ1ZSkKICAgIHB1c2hieXRlcyAweDgwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA0CiAgICAvLyBzZWxmLmFyYzRfYm9vbFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQm9vbChUcnVlKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwNQogICAgLy8gc2VsZi5hcmM0X2FkZHJlc3NbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkFkZHJlc3MoR2xvYmFsLmNyZWF0b3JfYWRkcmVzcykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTcgLy8gImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDYKICAgIC8vIHNlbGYuYXJjNF91aW50MTI4W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5VSW50MTI4KDIqKjEwMCkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTggLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDcKICAgIC8vIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTkgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk2LTY5OAogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoCiAgICAvLyAgICAgYiJkeW5hbWljIGJ5dGVzIgogICAgLy8gKQogICAgYnl0ZWMgMTEgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDcKICAgIC8vIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA5LTcxMAogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgaW1wbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MTIKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnRbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDktNzEwCiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxNgogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyMAogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZVthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ieXRlIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyNAogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyOAogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDcgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczMgogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDggLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczNgogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQwCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGVbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMiAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0Mi03NDMKICAgIC8vICMgR2V0dGVyIG1ldGhvZHMgZm9yIGV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQ1CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3VpbnRbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfdWludCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDItNzQzCiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfc3RyaW5nW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDkKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfc3RyaW5nW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfc3RyaW5nIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTMKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYnl0ZVthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJleHBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ieXRlIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ib29sOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTcKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYm9vbFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ib29sIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2FkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjEKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYWRkcmVzc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9hZGRyZXNzIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjUKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfdWludDEyOFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF91aW50MTI4IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2R5bmFtaWNfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9keW5hbWljX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjkKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfZHluYW1pY19ieXRlc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmFAQVH3x1FmltcGxpY2l0X2tleV9hcmM0X3VpbnQIAAAAAAAABTkYaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nBwAFSGVsbG8WaW1wbGljaXRfa2V5X2FyYzRfYnl0ZRZpbXBsaWNpdF9rZXlfYXJjNF9ib29sGWltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MZaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOBAAAAAQAAAAAAAAAAAAAAAAH2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMPAA1keW5hbWljIGJ5dGVzEmltcGxpY2l0X2tleV90dXBsZRZleHBsaWNpdF9rZXlfYXJjNF91aW50GGV4cGxpY2l0X2tleV9hcmM0X3N0cmluZxZleHBsaWNpdF9rZXlfYXJjNF9ieXRlFmV4cGxpY2l0X2tleV9hcmM0X2Jvb2wZZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcxlleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4H2V4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMxG0EAkIAEMMbVijYaAI4BAHgxGRREMRhEgg8Es8+jiQTbhYF2BHgmd2IEQmNRyAQHXK6RBFnAuAsEDW+mkASX4Q2cBC5KjEkEsizSHgSz9EcBBO3ZcpcEZx01PASj/W/cBM0uXWY2GgCODwCQAJ0AqgC4AMYA1ADiAPAA/gEMARoBKAE2AUQBUgAxGSISMRgQREIACDEZFDEYFBBDMgkpKmYyCSsnBGYyCScFgAEAZjIJJwaAAYBmMgknBzIJZjIJJwgnCWYyCScKJwtmMgknDIARAAAAAAAAAAoACwAABHRlc3RmMgknDSpmMgknDicEZjIJJw+AAQBmMgknEIABgGYyCScRMglmMgknEicJZjIJJxMnC2YiQzYaASMpY0QoTFCwIkM2GgEjK2NEKExQsCJDNhoBIycFY0QoTFCwIkM2GgEjJwZjRChMULAiQzYaASMnB2NEKExQsCJDNhoBIycIY0QoTFCwIkM2GgEjJwpjRChMULAiQzYaASMnDGNEKExQsCJDNhoBIycNY0QoTFCwIkM2GgEjJw5jRChMULAiQzYaASMnD2NEKExQsCJDNhoBIycQY0QoTFCwIkM2GgEjJxFjRChMULAiQzYaASMnEmNEKExQsCJDNhoBIycTY0QoTFCwIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the LocalStateContract contract - */ -export type LocalStateContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'opt_in()void': Record - 'get_implicit_key_arc4_uint(address)uint64': { - a: string - } - 'get_implicit_key_arc4_string(address)string': { - a: string - } - 'get_implicit_key_arc4_byte(address)byte': { - a: string - } - 'get_implicit_key_arc4_bool(address)bool': { - a: string - } - 'get_implicit_key_arc4_address(address)address': { - a: string - } - 'get_implicit_key_arc4_uint128(address)uint128': { - a: string - } - 'get_implicit_key_arc4_dynamic_bytes(address)byte[]': { - a: string - } - 'get_implicit_key_tuple(address)(uint64,byte[],bool)': { - a: string - } - 'get_arc4_uint(address)uint64': { - a: string - } - 'get_arc4_string(address)string': { - a: string - } - 'get_arc4_byte(address)byte': { - a: string - } - 'get_arc4_bool(address)bool': { - a: string - } - 'get_arc4_address(address)address': { - a: string - } - 'get_arc4_uint128(address)uint128': { - a: string - } - 'get_arc4_dynamic_bytes(address)byte[]': { - a: string - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'opt_in()void': [] - 'get_implicit_key_arc4_uint(address)uint64': [a: string] - 'get_implicit_key_arc4_string(address)string': [a: string] - 'get_implicit_key_arc4_byte(address)byte': [a: string] - 'get_implicit_key_arc4_bool(address)bool': [a: string] - 'get_implicit_key_arc4_address(address)address': [a: string] - 'get_implicit_key_arc4_uint128(address)uint128': [a: string] - 'get_implicit_key_arc4_dynamic_bytes(address)byte[]': [a: string] - 'get_implicit_key_tuple(address)(uint64,byte[],bool)': [a: string] - 'get_arc4_uint(address)uint64': [a: string] - 'get_arc4_string(address)string': [a: string] - 'get_arc4_byte(address)byte': [a: string] - 'get_arc4_bool(address)bool': [a: string] - 'get_arc4_address(address)address': [a: string] - 'get_arc4_uint128(address)uint128': [a: string] - 'get_arc4_dynamic_bytes(address)byte[]': [a: string] - } -} - -/** - * The return type for each method - */ -export type LocalStateContractReturns = { - 'opt_in()void': void - 'get_implicit_key_arc4_uint(address)uint64': bigint - 'get_implicit_key_arc4_string(address)string': string - 'get_implicit_key_arc4_byte(address)byte': number - 'get_implicit_key_arc4_bool(address)bool': boolean - 'get_implicit_key_arc4_address(address)address': string - 'get_implicit_key_arc4_uint128(address)uint128': bigint - 'get_implicit_key_arc4_dynamic_bytes(address)byte[]': Uint8Array - 'get_implicit_key_tuple(address)(uint64,byte[],bool)': [bigint, Uint8Array, boolean] - 'get_arc4_uint(address)uint64': bigint - 'get_arc4_string(address)string': string - 'get_arc4_byte(address)byte': number - 'get_arc4_bool(address)bool': boolean - 'get_arc4_address(address)address': string - 'get_arc4_uint128(address)uint128': bigint - 'get_arc4_dynamic_bytes(address)byte[]': Uint8Array -} - -/** - * Defines the types of available calls and state of the LocalStateContract smart contract. - */ -export type LocalStateContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'opt_in()void' | 'opt_in', { - argsObj: LocalStateContractArgs['obj']['opt_in()void'] - argsTuple: LocalStateContractArgs['tuple']['opt_in()void'] - returns: LocalStateContractReturns['opt_in()void'] - }> - & Record<'get_implicit_key_arc4_uint(address)uint64' | 'get_implicit_key_arc4_uint', { - argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_uint(address)uint64'] - argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_uint(address)uint64'] - returns: LocalStateContractReturns['get_implicit_key_arc4_uint(address)uint64'] - }> - & Record<'get_implicit_key_arc4_string(address)string' | 'get_implicit_key_arc4_string', { - argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_string(address)string'] - argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_string(address)string'] - returns: LocalStateContractReturns['get_implicit_key_arc4_string(address)string'] - }> - & Record<'get_implicit_key_arc4_byte(address)byte' | 'get_implicit_key_arc4_byte', { - argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_byte(address)byte'] - argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_byte(address)byte'] - returns: LocalStateContractReturns['get_implicit_key_arc4_byte(address)byte'] - }> - & Record<'get_implicit_key_arc4_bool(address)bool' | 'get_implicit_key_arc4_bool', { - argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_bool(address)bool'] - argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_bool(address)bool'] - returns: LocalStateContractReturns['get_implicit_key_arc4_bool(address)bool'] - }> - & Record<'get_implicit_key_arc4_address(address)address' | 'get_implicit_key_arc4_address', { - argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_address(address)address'] - argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_address(address)address'] - returns: LocalStateContractReturns['get_implicit_key_arc4_address(address)address'] - }> - & Record<'get_implicit_key_arc4_uint128(address)uint128' | 'get_implicit_key_arc4_uint128', { - argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_uint128(address)uint128'] - argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_uint128(address)uint128'] - returns: LocalStateContractReturns['get_implicit_key_arc4_uint128(address)uint128'] - }> - & Record<'get_implicit_key_arc4_dynamic_bytes(address)byte[]' | 'get_implicit_key_arc4_dynamic_bytes', { - argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_dynamic_bytes(address)byte[]'] - argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_dynamic_bytes(address)byte[]'] - returns: LocalStateContractReturns['get_implicit_key_arc4_dynamic_bytes(address)byte[]'] - }> - & Record<'get_implicit_key_tuple(address)(uint64,byte[],bool)' | 'get_implicit_key_tuple', { - argsObj: LocalStateContractArgs['obj']['get_implicit_key_tuple(address)(uint64,byte[],bool)'] - argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_tuple(address)(uint64,byte[],bool)'] - returns: LocalStateContractReturns['get_implicit_key_tuple(address)(uint64,byte[],bool)'] - }> - & Record<'get_arc4_uint(address)uint64' | 'get_arc4_uint', { - argsObj: LocalStateContractArgs['obj']['get_arc4_uint(address)uint64'] - argsTuple: LocalStateContractArgs['tuple']['get_arc4_uint(address)uint64'] - returns: LocalStateContractReturns['get_arc4_uint(address)uint64'] - }> - & Record<'get_arc4_string(address)string' | 'get_arc4_string', { - argsObj: LocalStateContractArgs['obj']['get_arc4_string(address)string'] - argsTuple: LocalStateContractArgs['tuple']['get_arc4_string(address)string'] - returns: LocalStateContractReturns['get_arc4_string(address)string'] - }> - & Record<'get_arc4_byte(address)byte' | 'get_arc4_byte', { - argsObj: LocalStateContractArgs['obj']['get_arc4_byte(address)byte'] - argsTuple: LocalStateContractArgs['tuple']['get_arc4_byte(address)byte'] - returns: LocalStateContractReturns['get_arc4_byte(address)byte'] - }> - & Record<'get_arc4_bool(address)bool' | 'get_arc4_bool', { - argsObj: LocalStateContractArgs['obj']['get_arc4_bool(address)bool'] - argsTuple: LocalStateContractArgs['tuple']['get_arc4_bool(address)bool'] - returns: LocalStateContractReturns['get_arc4_bool(address)bool'] - }> - & Record<'get_arc4_address(address)address' | 'get_arc4_address', { - argsObj: LocalStateContractArgs['obj']['get_arc4_address(address)address'] - argsTuple: LocalStateContractArgs['tuple']['get_arc4_address(address)address'] - returns: LocalStateContractReturns['get_arc4_address(address)address'] - }> - & Record<'get_arc4_uint128(address)uint128' | 'get_arc4_uint128', { - argsObj: LocalStateContractArgs['obj']['get_arc4_uint128(address)uint128'] - argsTuple: LocalStateContractArgs['tuple']['get_arc4_uint128(address)uint128'] - returns: LocalStateContractReturns['get_arc4_uint128(address)uint128'] - }> - & Record<'get_arc4_dynamic_bytes(address)byte[]' | 'get_arc4_dynamic_bytes', { - argsObj: LocalStateContractArgs['obj']['get_arc4_dynamic_bytes(address)byte[]'] - argsTuple: LocalStateContractArgs['tuple']['get_arc4_dynamic_bytes(address)byte[]'] - returns: LocalStateContractReturns['get_arc4_dynamic_bytes(address)byte[]'] - }> - /** - * Defines the shape of the state of the application. - */ - state: { - local: { - keys: { - implicitKeyArc4Uint: bigint - implicitKeyArc4String: string - implicitKeyArc4Byte: number - implicitKeyArc4Bool: boolean - implicitKeyArc4Address: string - implicitKeyArc4Uint128: bigint - implicitKeyArc4DynamicBytes: Uint8Array - implicitKeyTuple: [bigint, Uint8Array, boolean] - arc4Uint: bigint - arc4String: string - arc4Byte: number - arc4Bool: boolean - arc4Address: string - arc4Uint128: bigint - arc4DynamicBytes: Uint8Array - } - maps: {} - } - } -} - -/** - * Defines the possible abi call signatures. - */ -export type LocalStateContractSignatures = keyof LocalStateContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type LocalStateContractNonVoidMethodSignatures = keyof LocalStateContractTypes['methods'] extends infer T ? T extends keyof LocalStateContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the LocalStateContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = LocalStateContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the LocalStateContract smart contract to the method's return type - */ -export type MethodReturn = LocalStateContractTypes['methods'][TSignature]['returns'] - -/** - * Defines the shape of the keyed local state of the application. - */ -export type LocalKeysState = LocalStateContractTypes['state']['local']['keys'] - - -/** - * Defines supported create method params for this smart contract - */ -export type LocalStateContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type LocalStateContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: LocalStateContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the LocalStateContract smart contract - */ -export abstract class LocalStateContractParamsFactory { - /** - * Gets available optIn ABI call param factories - */ - static get optIn() { - return { - /** - * Constructs opt-in ABI call params for the LocalStateContract smart contract using the opt_in()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - optIn(params: CallParams): AppClientMethodCallParams { - return { - ...params, - method: 'opt_in()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - }, - } - } - - /** - * Constructs a no op call for the get_implicit_key_arc4_uint(address)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_uint(address)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_string(address)string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_string(address)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_byte(address)byte ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_byte(address)byte' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_bool(address)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_bool(address)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_address(address)address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_address(address)address' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_uint128(address)uint128 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_uint128(address)uint128' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_implicit_key_arc4_dynamic_bytes(address)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_arc4_dynamic_bytes(address)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_implicit_key_tuple(address)(uint64,byte[],bool) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getImplicitKeyTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_implicit_key_tuple(address)(uint64,byte[],bool)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_arc4_uint(address)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_uint(address)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_arc4_string(address)string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_string(address)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_arc4_byte(address)byte ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_byte(address)byte' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_arc4_bool(address)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_bool(address)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_arc4_address(address)address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_address(address)address' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_arc4_uint128(address)uint128 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_uint128(address)uint128' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the get_arc4_dynamic_bytes(address)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_arc4_dynamic_bytes(address)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } -} - -/** - * A factory to create and deploy one or more instance of the LocalStateContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class LocalStateContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `LocalStateContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new LocalStateContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new LocalStateContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the LocalStateContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: LocalStateContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new LocalStateContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the LocalStateContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the LocalStateContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the LocalStateContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new LocalStateContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the LocalStateContract smart contract - */ -export class LocalStateContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `LocalStateContractClient` - * - * @param appClient An `AppClient` instance which has been created with the LocalStateContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `LocalStateContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `LocalStateContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new LocalStateContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `LocalStateContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new LocalStateContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the LocalStateContract smart contract using the `opt_in()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The optIn params - */ - optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { - return this.appClient.params.optIn(LocalStateContractParamsFactory.optIn.optIn(params)) - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the LocalStateContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint(address)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_string(address)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4String(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_byte(address)byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_bool(address)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_address(address)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Address(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint128(address)uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes(address)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_tuple(address)(uint64,byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyTuple(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint(address)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Uint(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_string(address)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getArc4String(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_byte(address)byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Byte(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_bool(address)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Bool(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_address(address)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Address(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint128(address)uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Uint128(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_dynamic_bytes(address)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(LocalStateContractParamsFactory.getArc4DynamicBytes(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the LocalStateContract smart contract using the `opt_in()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The optIn transaction - */ - optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { - return this.appClient.createTransaction.optIn(LocalStateContractParamsFactory.optIn.optIn(params)) - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the LocalStateContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint(address)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_string(address)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4String(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_byte(address)byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_bool(address)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_address(address)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Address(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint128(address)uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes(address)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_tuple(address)(uint64,byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyTuple(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint(address)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Uint(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_string(address)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4String(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_byte(address)byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Byte(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_bool(address)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Bool(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_address(address)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Address(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint128(address)uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Uint128(params)) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_dynamic_bytes(address)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4DynamicBytes(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the LocalStateContract smart contract using the `opt_in()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The optIn result - */ - optIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { - const result = await this.appClient.send.optIn(LocalStateContractParamsFactory.optIn.optIn(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['opt_in()void'])} - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the LocalStateContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint(address)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_uint(address)uint64'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_string(address)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4String(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_string(address)string'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_byte(address)byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_byte(address)byte'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_bool(address)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_bool(address)bool'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_address(address)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Address(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_address(address)address'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint128(address)uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_uint128(address)uint128'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes(address)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_dynamic_bytes(address)byte[]'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_tuple(address)(uint64,byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getImplicitKeyTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyTuple(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_tuple(address)(uint64,byte[],bool)'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint(address)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Uint(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_uint(address)uint64'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_string(address)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4String(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_string(address)string'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_byte(address)byte` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Byte(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_byte(address)byte'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_bool(address)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Bool(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_bool(address)bool'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_address(address)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Address(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_address(address)address'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint128(address)uint128` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Uint128(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_uint128(address)uint128'])} - }, - - /** - * Makes a call to the LocalStateContract smart contract using the `get_arc4_dynamic_bytes(address)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4DynamicBytes(params)) - return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_dynamic_bytes(address)byte[]'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new LocalStateContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current LocalStateContract app - */ - state = { - /** - * Methods to access local state for the current LocalStateContract app - */ - local: (address: string | Address) => { - const encodedAddress = typeof address === 'string' ? address : encodeAddress(address.publicKey) - return { - /** - * Get all current keyed values from local state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.local(encodedAddress).getAll() - return { - implicitKeyArc4Uint: result.implicit_key_arc4_uint, - implicitKeyArc4String: result.implicit_key_arc4_string, - implicitKeyArc4Byte: result.implicit_key_arc4_byte, - implicitKeyArc4Bool: result.implicit_key_arc4_bool, - implicitKeyArc4Address: result.implicit_key_arc4_address, - implicitKeyArc4Uint128: result.implicit_key_arc4_uint128, - implicitKeyArc4DynamicBytes: result.implicit_key_arc4_dynamic_bytes, - implicitKeyTuple: result.implicit_key_tuple, - arc4Uint: result.arc4_uint, - arc4String: result.arc4_string, - arc4Byte: result.arc4_byte, - arc4Bool: result.arc4_bool, - arc4Address: result.arc4_address, - arc4Uint128: result.arc4_uint128, - arc4DynamicBytes: result.arc4_dynamic_bytes, - } - }, - /** - * Get the current value of the implicit_key_arc4_uint key in local state - */ - implicitKeyArc4Uint: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_uint")) as bigint | undefined }, - /** - * Get the current value of the implicit_key_arc4_string key in local state - */ - implicitKeyArc4String: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_string")) as string | undefined }, - /** - * Get the current value of the implicit_key_arc4_byte key in local state - */ - implicitKeyArc4Byte: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_byte")) as number | undefined }, - /** - * Get the current value of the implicit_key_arc4_bool key in local state - */ - implicitKeyArc4Bool: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_bool")) as boolean | undefined }, - /** - * Get the current value of the implicit_key_arc4_address key in local state - */ - implicitKeyArc4Address: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_address")) as string | undefined }, - /** - * Get the current value of the implicit_key_arc4_uint128 key in local state - */ - implicitKeyArc4Uint128: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_uint128")) as bigint | undefined }, - /** - * Get the current value of the implicit_key_arc4_dynamic_bytes key in local state - */ - implicitKeyArc4DynamicBytes: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_dynamic_bytes")) as Uint8Array | undefined }, - /** - * Get the current value of the implicit_key_tuple key in local state - */ - implicitKeyTuple: async (): Promise<[bigint, Uint8Array, boolean] | undefined> => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_tuple")) as [bigint, Uint8Array, boolean] | undefined }, - /** - * Get the current value of the arc4_uint key in local state - */ - arc4Uint: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_uint")) as bigint | undefined }, - /** - * Get the current value of the arc4_string key in local state - */ - arc4String: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_string")) as string | undefined }, - /** - * Get the current value of the arc4_byte key in local state - */ - arc4Byte: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_byte")) as number | undefined }, - /** - * Get the current value of the arc4_bool key in local state - */ - arc4Bool: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_bool")) as boolean | undefined }, - /** - * Get the current value of the arc4_address key in local state - */ - arc4Address: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_address")) as string | undefined }, - /** - * Get the current value of the arc4_uint128 key in local state - */ - arc4Uint128: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_uint128")) as bigint | undefined }, - /** - * Get the current value of the arc4_dynamic_bytes key in local state - */ - arc4DynamicBytes: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_dynamic_bytes")) as Uint8Array | undefined }, - } - }, - } - - public newGroup(composerConfig?: TransactionComposerConfig): LocalStateContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a get_implicit_key_arc4_uint(address)uint64 method call against the LocalStateContract contract - */ - getImplicitKeyArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Uint(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_string(address)string method call against the LocalStateContract contract - */ - getImplicitKeyArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4String(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_byte(address)byte method call against the LocalStateContract contract - */ - getImplicitKeyArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Byte(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_bool(address)bool method call against the LocalStateContract contract - */ - getImplicitKeyArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Bool(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_address(address)address method call against the LocalStateContract contract - */ - getImplicitKeyArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Address(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_uint128(address)uint128 method call against the LocalStateContract contract - */ - getImplicitKeyArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Uint128(params))) - return this - }, - /** - * Add a get_implicit_key_arc4_dynamic_bytes(address)byte[] method call against the LocalStateContract contract - */ - getImplicitKeyArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4DynamicBytes(params))) - return this - }, - /** - * Add a get_implicit_key_tuple(address)(uint64,byte[],bool) method call against the LocalStateContract contract - */ - getImplicitKeyTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyTuple(params))) - return this - }, - /** - * Add a get_arc4_uint(address)uint64 method call against the LocalStateContract contract - */ - getArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Uint(params))) - return this - }, - /** - * Add a get_arc4_string(address)string method call against the LocalStateContract contract - */ - getArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4String(params))) - return this - }, - /** - * Add a get_arc4_byte(address)byte method call against the LocalStateContract contract - */ - getArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Byte(params))) - return this - }, - /** - * Add a get_arc4_bool(address)bool method call against the LocalStateContract contract - */ - getArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Bool(params))) - return this - }, - /** - * Add a get_arc4_address(address)address method call against the LocalStateContract contract - */ - getArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Address(params))) - return this - }, - /** - * Add a get_arc4_uint128(address)uint128 method call against the LocalStateContract contract - */ - getArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Uint128(params))) - return this - }, - /** - * Add a get_arc4_dynamic_bytes(address)byte[] method call against the LocalStateContract contract - */ - getArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4DynamicBytes(params))) - return this - }, - get optIn() { - return { - optIn: (params: CallParams) => { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn.optIn(params))) - return this - }, - } - }, - /** - * Add a clear state call to the LocalStateContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as LocalStateContractComposer - } -} -export type LocalStateContractComposer = { - /** - * Calls the get_implicit_key_arc4_uint(address)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4Uint(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_uint(address)uint64'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_string(address)string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4String(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_string(address)string'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_byte(address)byte ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4Byte(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_byte(address)byte'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_bool(address)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4Bool(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_bool(address)bool'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_address(address)address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4Address(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_address(address)address'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_uint128(address)uint128 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4Uint128(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_uint128(address)uint128'] | undefined]> - - /** - * Calls the get_implicit_key_arc4_dynamic_bytes(address)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyArc4DynamicBytes(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_dynamic_bytes(address)byte[]'] | undefined]> - - /** - * Calls the get_implicit_key_tuple(address)(uint64,byte[],bool) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getImplicitKeyTuple(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_tuple(address)(uint64,byte[],bool)'] | undefined]> - - /** - * Calls the get_arc4_uint(address)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4Uint(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_uint(address)uint64'] | undefined]> - - /** - * Calls the get_arc4_string(address)string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4String(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_string(address)string'] | undefined]> - - /** - * Calls the get_arc4_byte(address)byte ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4Byte(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_byte(address)byte'] | undefined]> - - /** - * Calls the get_arc4_bool(address)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4Bool(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_bool(address)bool'] | undefined]> - - /** - * Calls the get_arc4_address(address)address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4Address(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_address(address)address'] | undefined]> - - /** - * Calls the get_arc4_uint128(address)uint128 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4Uint128(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_uint128(address)uint128'] | undefined]> - - /** - * Calls the get_arc4_dynamic_bytes(address)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getArc4DynamicBytes(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_dynamic_bytes(address)byte[]'] | undefined]> - - /** - * Gets available optIn methods - */ - readonly optIn: { - /** - * Opts the user into an existing instance of the LocalStateContract smart contract using the opt_in()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - optIn(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['opt_in()void'] | undefined]> - } - - /** - * Makes a clear_state call to an existing instance of the LocalStateContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): LocalStateContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): LocalStateContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type LocalStateContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/MiscellaneousOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/MiscellaneousOpsContract.ts deleted file mode 100644 index afd9e82..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/MiscellaneousOpsContract.ts +++ /dev/null @@ -1,3082 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"MiscellaneousOpsContract","structs":{},"methods":[{"name":"verify_addw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_base64_decode_standard","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_base64_decode_url","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_bitlen","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_a_size"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_bitlen","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bsqrt","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_btoi","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bzero","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_concat","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"uint64","name":"pad_a_size"},{"type":"uint64","name":"pad_b_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_divmodw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"},{"type":"uint64","name":"d"}],"returns":{"type":"(uint64,uint64,uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_divw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_err","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_exp","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_expw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract_from_2","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract_uint16","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract_uint32","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_getbit_bytes","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_getbit_uint64","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_getbyte","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_itob","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_mulw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_replace","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_select_bytes","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_select_uint64","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_setbit_bytes","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"bool","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_setbit_uint64","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"},{"type":"bool","name":"c"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_setbyte","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_shl","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_shr","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_sqrt","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_substring","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_json_ref_string","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_json_ref_uint64","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_json_ref_object","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDE1MWY3Yzc1MDAyMCAweDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDQ0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg0NTg0N2VlYSAweGY1N2FjZWI1IDB4N2Q2MzE3MzAgMHhhMWIyNDQ0MSAweGNkN2JlMWFjIDB4N2NmZGE2NGIgMHg1NGE5MTBkOSAweGM0NjU2OGRlIDB4N2E0NmE2YWUgMHgwNDM3MjIwOSAweDdlNWY2ZDcyIDB4MjRlYmNmODQgMHg5YzBiMzM5NyAweDBhZDQwZGE0IDB4OTUxNzg4NzAgMHhkZWVkYzk5YiAweGFiMjE1MGJiIDB4MDJhNTQwMTcgMHgzZGI2NmI0MSAweDZlM2ZmMzhjIDB4OGYzYjlmMTggMHgxNjE2NmY5YSAweDJmNDcyMDY1IDB4ZDVhNzM5YzMgMHg2MWYzYjNlMSAweDU2Y2YzNjhiIDB4OTE5ZmZiZDIgMHhhYWU4YjY5NyAweDg0NzQyMmIxIDB4ZDUyNjAzMjcgMHgxMTRjOGM2ZCAweDM5ZTllNjJhIDB4ZDZhNGMwNWUgMHgxZWY4MTUxYSAweDY2ZGQ3Zjk2IDB4NGQ5ZWNlYjIgMHgxOWJhNzBlZSAvLyBtZXRob2QgInZlcmlmeV9hZGR3KHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfYmFzZTY0X2RlY29kZV9zdGFuZGFyZChieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmFzZTY0X2RlY29kZV91cmwoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2JpdGxlbihieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9iaXRsZW4odWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2JzcXJ0KGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9idG9pKGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9iemVybyh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfY29uY2F0KGJ5dGVbXSxieXRlW10sdWludDY0LHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9kaXZtb2R3KHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidmVyaWZ5X2RpdncodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZXJyKCl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfZXhwKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZXhwdyh1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidmVyaWZ5X2V4dHJhY3QoYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdF9mcm9tXzIoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2V4dHJhY3RfdWludDE2KGJ5dGVbXSx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdF91aW50MzIoYnl0ZVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9leHRyYWN0X3VpbnQ2NChieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2dldGJpdF9ieXRlcyhieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9nZXRiaXRfdWludDY0KHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2dldGJ5dGUoYnl0ZVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9pdG9iKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9tdWx3KHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfcmVwbGFjZShieXRlW10sdWludDY0LGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9zZWxlY3RfYnl0ZXMoYnl0ZVtdLGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc2VsZWN0X3VpbnQ2NCh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9zZXRiaXRfYnl0ZXMoYnl0ZVtdLHVpbnQ2NCxib29sKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X3NldGJpdF91aW50NjQodWludDY0LHVpbnQ2NCxib29sKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3NldGJ5dGUoYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc2hsKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc2hyKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc3FydCh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc3Vic3RyaW5nKGJ5dGVbXSx1aW50NjQsdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2pzb25fcmVmX3N0cmluZyhieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2pzb25fcmVmX3VpbnQ2NChieXRlW10sYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2pzb25fcmVmX29iamVjdChieXRlW10sYnl0ZVtdKWJ5dGVbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9hZGR3IHZlcmlmeV9iYXNlNjRfZGVjb2RlX3N0YW5kYXJkIHZlcmlmeV9iYXNlNjRfZGVjb2RlX3VybCB2ZXJpZnlfYnl0ZXNfYml0bGVuIHZlcmlmeV91aW50NjRfYml0bGVuIHZlcmlmeV9ic3FydCB2ZXJpZnlfYnRvaSB2ZXJpZnlfYnplcm8gdmVyaWZ5X2NvbmNhdCB2ZXJpZnlfZGl2bW9kdyB2ZXJpZnlfZGl2dyBtYWluX3ZlcmlmeV9lcnJfcm91dGVAMTUgdmVyaWZ5X2V4cCB2ZXJpZnlfZXhwdyB2ZXJpZnlfZXh0cmFjdCB2ZXJpZnlfZXh0cmFjdF9mcm9tXzIgdmVyaWZ5X2V4dHJhY3RfdWludDE2IHZlcmlmeV9leHRyYWN0X3VpbnQzMiB2ZXJpZnlfZXh0cmFjdF91aW50NjQgdmVyaWZ5X2dldGJpdF9ieXRlcyB2ZXJpZnlfZ2V0Yml0X3VpbnQ2NCB2ZXJpZnlfZ2V0Ynl0ZSB2ZXJpZnlfaXRvYiB2ZXJpZnlfbXVsdyB2ZXJpZnlfcmVwbGFjZSB2ZXJpZnlfc2VsZWN0X2J5dGVzIHZlcmlmeV9zZWxlY3RfdWludDY0IHZlcmlmeV9zZXRiaXRfYnl0ZXMgdmVyaWZ5X3NldGJpdF91aW50NjQgdmVyaWZ5X3NldGJ5dGUgdmVyaWZ5X3NobCB2ZXJpZnlfc2hyIHZlcmlmeV9zcXJ0IHZlcmlmeV9zdWJzdHJpbmcgdmVyaWZ5X2pzb25fcmVmX3N0cmluZyB2ZXJpZnlfanNvbl9yZWZfdWludDY0IHZlcmlmeV9qc29uX3JlZl9vYmplY3QKICAgIGVycgoKbWFpbl92ZXJpZnlfZXJyX3JvdXRlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANDQ6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYWRkd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hZGR3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjcKICAgIC8vIHJlc3VsdCA9IG9wLmFkZHcoYSwgYikKICAgIGFkZHcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Jhc2U2NF9kZWNvZGVfc3RhbmRhcmRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmFzZTY0X2RlY29kZV9zdGFuZGFyZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyCiAgICAvLyByZXN1bHQgPSBvcC5iYXNlNjRfZGVjb2RlKG9wLkJhc2U2NC5TdGRFbmNvZGluZywgYSkKICAgIGJhc2U2NF9kZWNvZGUgU3RkRW5jb2RpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIHJlc3VsdCA9IG9wLmJhc2U2NF9kZWNvZGUob3AuQmFzZTY0LlVSTEVuY29kaW5nLCBhKQogICAgYmFzZTY0X2RlY29kZSBVUkxFbmNvZGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfYml0bGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX2JpdGxlbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBhID0gb3AuYnplcm8ocGFkX2Ffc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToyMwogICAgLy8gcmVzdWx0ID0gb3AuYml0bGVuKGEpCiAgICBiaXRsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2JpdGxlbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfYml0bGVuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToyOAogICAgLy8gcmVzdWx0ID0gb3AuYml0bGVuKGEpCiAgICBiaXRsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYnNxcnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnNxcnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTozMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTozNAogICAgLy8gcmVzdWx0ID0gb3AuYnNxcnQoYV9iaWd1aW50KQogICAgYnNxcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2J0b2lbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnRvaToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjM5CiAgICAvLyByZXN1bHQgPSBvcC5idG9pKGEpCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTozNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2J6ZXJvW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J6ZXJvOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NAogICAgLy8gcmVzdWx0ID0gb3AuYnplcm8oYSkKICAgIGJ6ZXJvCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NQogICAgLy8gcmV0dXJuIG9wLnNoYTI1NihyZXN1bHQpCiAgICBzaGEyNTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2NvbmNhdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9jb25jYXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NDkKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfYV9zaXplKSArIGEKICAgIHN3YXAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NTAKICAgIC8vIGIgPSBvcC5iemVybyhwYWRfYl9zaXplKSArIGIKICAgIHN3YXAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NTEKICAgIC8vIHJlc3VsdCA9IGEgKyBiCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjUyCiAgICAvLyByZXN1bHQgPSBvcC5zaGEyNTYocmVzdWx0KQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9kaXZtb2R3W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Rpdm1vZHc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjU5CiAgICAvLyByZXN1bHQgPSBvcC5kaXZtb2R3KGEsIGIsIGMsIGQpCiAgICBkaXZtb2R3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Rpdndbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGl2dzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NjQKICAgIC8vIHJlc3VsdCA9IG9wLmRpdncoYSwgYiwgYykKICAgIGRpdncKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXhwW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4cDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIHJlc3VsdCA9IG9wLmV4cChhLCBiKQogICAgZXhwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4cHdbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZXhwdzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NzgKICAgIC8vIHJlc3VsdCA9IG9wLmV4cHcoYSwgYikKICAgIGV4cHcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4MwogICAgLy8gcmVzdWx0ID0gb3AuZXh0cmFjdChhLCBiLCBjKQogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3RfZnJvbV8yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3RfZnJvbV8yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4OAogICAgLy8gcmVzdWx0ID0gb3AuZXh0cmFjdChhLCAyLCAwKQogICAgZXh0cmFjdCA0IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3RfdWludDE2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3RfdWludDE2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTMKICAgIC8vIHJlc3VsdCA9IG9wLmV4dHJhY3RfdWludDE2KGEsIGIpCiAgICBleHRyYWN0X3VpbnQxNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0X3VpbnQzMltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9leHRyYWN0X3VpbnQzMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyByZXN1bHQgPSBvcC5leHRyYWN0X3VpbnQzMihhLCBiKQogICAgZXh0cmFjdF91aW50MzIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXh0cmFjdF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZXh0cmFjdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgcHVzaGludCA4CiAgICBleHRyYWN0MwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZ2V0Yml0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldGJpdF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMDgKICAgIC8vIHJlc3VsdCA9IG9wLmdldGJpdChhLCBiKQogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18yIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZ2V0Yml0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRiaXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTEzCiAgICAvLyByZXN1bHQgPSBvcC5nZXRiaXQoYSwgYikKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMiAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2dldGJ5dGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0Ynl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjExNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMTgKICAgIC8vIHJlc3VsdCA9IG9wLmdldGJ5dGUoYSwgYikKICAgIGdldGJ5dGUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjExNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2l0b2Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfaXRvYjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gcmVzdWx0ID0gb3AuaXRvYihhKQogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUwMDA4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfbXVsd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9tdWx3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTI4CiAgICAvLyByZXN1bHQgPSBvcC5tdWx3KGEsIGIpCiAgICBtdWx3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3JlcGxhY2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfcmVwbGFjZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTMzCiAgICAvLyByZXN1bHQgPSBvcC5yZXBsYWNlKGEsIGIsIGMpCiAgICByZXBsYWNlMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NlbGVjdF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zZWxlY3RfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gcmVzdWx0ID0gb3Auc2VsZWN0X2J5dGVzKGEsIGIsIGMpCiAgICBzZWxlY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zZWxlY3RfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NlbGVjdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDMKICAgIC8vIHJlc3VsdCA9IG9wLnNlbGVjdF91aW50NjQoYSwgYiwgYykKICAgIHNlbGVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2V0Yml0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NldGJpdF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDgKICAgIC8vIHJlc3VsdCA9IG9wLnNldGJpdF9ieXRlcyhhLCBiLCBjKQogICAgc2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2V0Yml0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zZXRiaXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUzCiAgICAvLyByZXN1bHQgPSBvcC5zZXRiaXRfdWludDY0KGEsIGIsIGMpCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NldGJ5dGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2V0Ynl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNTgKICAgIC8vIHJlc3VsdCA9IG9wLnNldGJ5dGUoYSwgYiwgYykKICAgIHNldGJ5dGUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zaGxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2hsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTYzCiAgICAvLyByZXN1bHQgPSBvcC5zaGwoYSwgYikKICAgIHNobAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2hyW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NocjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2OAogICAgLy8gcmVzdWx0ID0gb3Auc2hyKGEsIGIpCiAgICBzaHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NxcnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3FydDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3MwogICAgLy8gcmVzdWx0ID0gb3Auc3FydChhKQogICAgc3FydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc3Vic3RyaW5nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N1YnN0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNzgKICAgIC8vIHJlc3VsdCA9IG9wLnN1YnN0cmluZyhhLCBiLCBjKQogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2pzb25fcmVmX3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9qc29uX3JlZl9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gcmVzdWx0ID0gb3AuSnNvblJlZi5qc29uX3N0cmluZyhhLCBiKQogICAganNvbl9yZWYgSlNPTlN0cmluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2pzb25fcmVmX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9qc29uX3JlZl91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gcmVzdWx0ID0gb3AuSnNvblJlZi5qc29uX3VpbnQ2NChhLCBiKQogICAganNvbl9yZWYgSlNPTlVpbnQ2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfanNvbl9yZWZfb2JqZWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2pzb25fcmVmX29iamVjdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTkzCiAgICAvLyByZXN1bHQgPSBvcC5Kc29uUmVmLmpzb25fb2JqZWN0KGEsIGIpCiAgICBqc29uX3JlZiBKU09OT2JqZWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmAwQVH3x1BhUffHUAIAEAMRtBARMxGRREMRhEgiUERYR+6gT1es61BH1jFzAEobJEQQTNe+GsBHz9pksEVKkQ2QTEZWjeBHpGpq4EBDciCQR+X21yBCTrz4QEnAszlwQK1A2kBJUXiHAE3u3JmwSrIVC7BAKlQBcEPbZrQQRuP/OMBI87nxgEFhZvmgQvRyBlBNWnOcMEYfOz4QRWzzaLBJGf+9IEqui2lwSEdCKxBNUmAycEEUyMbQQ56eYqBNakwF4EHvgVGgRm3X+WBE2ezrIEGbpw7jYaAI4lAAoAHgA0AEoAXwBrAIAAjgCaAMAA5QABAPkBCQEdAToBTgFgAXIBhQGbAa8BwQHTAecCBgIlAjkCVwJsAokCmQKpArUC0gLuAwMAADEZFDEYFBBDNhoBFzYaAhceTBZMFlAoTFCwIkM2GgFXAgBeAUkVFlcGAkxQKExQsCJDNhoBVwIAXgBJFRZXBgJMUChMULAiQzYaAVcCADYaAhevTFCTFihMULAiQzYaAReTFihMULAiQzYaAVcCAJZJFRZXBgJMUChMULAiQzYaAVcCABcWKExQsCJDNhoBF68BKUxQsCJDNhoBVwIANhoCVwIANhoDFzYaBBdMr08DUEyvTwJQUAEpTFCwIkM2GgEXNhoCFzYaAxc2GgQXH08DFk8DFlBPAhZQTBZQKExQsCJDNhoBFzYaAhc2GgMXlxYoTFCwIkM2GgEXNhoCF5QWKExQsCJDNhoBFzYaAheVTBZMFlAoTFCwIkM2GgFXAgA2GgIXNhoDF1hJFRZXBgJMUChMULAiQzYaAVcEAEkVFlcGAkxQKExQsCJDNhoBVwIANhoCF1kWKExQsCJDNhoBVwIANhoCF1oWKExQsCJDNhoBVwIANhoCF4EIWChMULAiQzYaAVcCADYaAhdTKiNPAlQoTFCwIkM2GgEXNhoCF1MqI08CVChMULAiQzYaAVcCADYaAhdVFihMULAiQzYaARcWgAYVH3x1AAhMULAiQzYaARc2GgIXHUwWTBZQKExQsCJDNhoBVwIANhoCFzYaA1cCAF1JFRZXBgJMUChMULAiQzYaAVcCADYaAlcCADYaAxdNSRUWVwYCTFAoTFCwIkM2GgEXNhoCFzYaAxdNFihMULAiQzYaAVcCADYaAhc2GgMjU1RJFRZXBgJMUChMULAiQzYaARc2GgIXNhoDI1NUFihMULAiQzYaAVcCADYaAhc2GgMXVkkVFlcGAkxQKExQsCJDNhoBFzYaAheQFihMULAiQzYaARc2GgIXkRYoTFCwIkM2GgEXkhYoTFCwIkM2GgFXAgA2GgIXNhoDF1JJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAF8ASRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgBfARYoTFCwIkM2GgFXAgA2GgJXAgBfAkkVFlcGAkxQKExQsCJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the MiscellaneousOpsContract contract - */ -export type MiscellaneousOpsContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify_addw(uint64,uint64)(uint64,uint64)': { - a: bigint | number - b: bigint | number - } - 'verify_base64_decode_standard(byte[])byte[]': { - a: Uint8Array - } - 'verify_base64_decode_url(byte[])byte[]': { - a: Uint8Array - } - 'verify_bytes_bitlen(byte[],uint64)uint64': { - a: Uint8Array - padASize: bigint | number - } - 'verify_uint64_bitlen(uint64)uint64': { - a: bigint | number - } - 'verify_bsqrt(byte[])byte[]': { - a: Uint8Array - } - 'verify_btoi(byte[])uint64': { - a: Uint8Array - } - 'verify_bzero(uint64)byte[]': { - a: bigint | number - } - 'verify_concat(byte[],byte[],uint64,uint64)byte[]': { - a: Uint8Array - b: Uint8Array - padASize: bigint | number - padBSize: bigint | number - } - 'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)': { - a: bigint | number - b: bigint | number - c: bigint | number - d: bigint | number - } - 'verify_divw(uint64,uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - c: bigint | number - } - 'verify_err()void': Record - 'verify_exp(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_expw(uint64,uint64)(uint64,uint64)': { - a: bigint | number - b: bigint | number - } - 'verify_extract(byte[],uint64,uint64)byte[]': { - a: Uint8Array - b: bigint | number - c: bigint | number - } - 'verify_extract_from_2(byte[])byte[]': { - a: Uint8Array - } - 'verify_extract_uint16(byte[],uint64)uint64': { - a: Uint8Array - b: bigint | number - } - 'verify_extract_uint32(byte[],uint64)uint64': { - a: Uint8Array - b: bigint | number - } - 'verify_extract_uint64(byte[],uint64)uint64': { - a: Uint8Array - b: bigint | number - } - 'verify_getbit_bytes(byte[],uint64)bool': { - a: Uint8Array - b: bigint | number - } - 'verify_getbit_uint64(uint64,uint64)bool': { - a: bigint | number - b: bigint | number - } - 'verify_getbyte(byte[],uint64)uint64': { - a: Uint8Array - b: bigint | number - } - 'verify_itob(uint64)byte[]': { - a: bigint | number - } - 'verify_mulw(uint64,uint64)(uint64,uint64)': { - a: bigint | number - b: bigint | number - } - 'verify_replace(byte[],uint64,byte[])byte[]': { - a: Uint8Array - b: bigint | number - c: Uint8Array - } - 'verify_select_bytes(byte[],byte[],uint64)byte[]': { - a: Uint8Array - b: Uint8Array - c: bigint | number - } - 'verify_select_uint64(uint64,uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - c: bigint | number - } - 'verify_setbit_bytes(byte[],uint64,bool)byte[]': { - a: Uint8Array - b: bigint | number - c: boolean - } - 'verify_setbit_uint64(uint64,uint64,bool)uint64': { - a: bigint | number - b: bigint | number - c: boolean - } - 'verify_setbyte(byte[],uint64,uint64)byte[]': { - a: Uint8Array - b: bigint | number - c: bigint | number - } - 'verify_shl(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_shr(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_sqrt(uint64)uint64': { - a: bigint | number - } - 'verify_substring(byte[],uint64,uint64)byte[]': { - a: Uint8Array - b: bigint | number - c: bigint | number - } - 'verify_json_ref_string(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_json_ref_uint64(byte[],byte[])uint64': { - a: Uint8Array - b: Uint8Array - } - 'verify_json_ref_object(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify_addw(uint64,uint64)(uint64,uint64)': [a: bigint | number, b: bigint | number] - 'verify_base64_decode_standard(byte[])byte[]': [a: Uint8Array] - 'verify_base64_decode_url(byte[])byte[]': [a: Uint8Array] - 'verify_bytes_bitlen(byte[],uint64)uint64': [a: Uint8Array, padASize: bigint | number] - 'verify_uint64_bitlen(uint64)uint64': [a: bigint | number] - 'verify_bsqrt(byte[])byte[]': [a: Uint8Array] - 'verify_btoi(byte[])uint64': [a: Uint8Array] - 'verify_bzero(uint64)byte[]': [a: bigint | number] - 'verify_concat(byte[],byte[],uint64,uint64)byte[]': [a: Uint8Array, b: Uint8Array, padASize: bigint | number, padBSize: bigint | number] - 'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)': [a: bigint | number, b: bigint | number, c: bigint | number, d: bigint | number] - 'verify_divw(uint64,uint64,uint64)uint64': [a: bigint | number, b: bigint | number, c: bigint | number] - 'verify_err()void': [] - 'verify_exp(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_expw(uint64,uint64)(uint64,uint64)': [a: bigint | number, b: bigint | number] - 'verify_extract(byte[],uint64,uint64)byte[]': [a: Uint8Array, b: bigint | number, c: bigint | number] - 'verify_extract_from_2(byte[])byte[]': [a: Uint8Array] - 'verify_extract_uint16(byte[],uint64)uint64': [a: Uint8Array, b: bigint | number] - 'verify_extract_uint32(byte[],uint64)uint64': [a: Uint8Array, b: bigint | number] - 'verify_extract_uint64(byte[],uint64)uint64': [a: Uint8Array, b: bigint | number] - 'verify_getbit_bytes(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] - 'verify_getbit_uint64(uint64,uint64)bool': [a: bigint | number, b: bigint | number] - 'verify_getbyte(byte[],uint64)uint64': [a: Uint8Array, b: bigint | number] - 'verify_itob(uint64)byte[]': [a: bigint | number] - 'verify_mulw(uint64,uint64)(uint64,uint64)': [a: bigint | number, b: bigint | number] - 'verify_replace(byte[],uint64,byte[])byte[]': [a: Uint8Array, b: bigint | number, c: Uint8Array] - 'verify_select_bytes(byte[],byte[],uint64)byte[]': [a: Uint8Array, b: Uint8Array, c: bigint | number] - 'verify_select_uint64(uint64,uint64,uint64)uint64': [a: bigint | number, b: bigint | number, c: bigint | number] - 'verify_setbit_bytes(byte[],uint64,bool)byte[]': [a: Uint8Array, b: bigint | number, c: boolean] - 'verify_setbit_uint64(uint64,uint64,bool)uint64': [a: bigint | number, b: bigint | number, c: boolean] - 'verify_setbyte(byte[],uint64,uint64)byte[]': [a: Uint8Array, b: bigint | number, c: bigint | number] - 'verify_shl(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_shr(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_sqrt(uint64)uint64': [a: bigint | number] - 'verify_substring(byte[],uint64,uint64)byte[]': [a: Uint8Array, b: bigint | number, c: bigint | number] - 'verify_json_ref_string(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_json_ref_uint64(byte[],byte[])uint64': [a: Uint8Array, b: Uint8Array] - 'verify_json_ref_object(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - } -} - -/** - * The return type for each method - */ -export type MiscellaneousOpsContractReturns = { - 'verify_addw(uint64,uint64)(uint64,uint64)': [bigint, bigint] - 'verify_base64_decode_standard(byte[])byte[]': Uint8Array - 'verify_base64_decode_url(byte[])byte[]': Uint8Array - 'verify_bytes_bitlen(byte[],uint64)uint64': bigint - 'verify_uint64_bitlen(uint64)uint64': bigint - 'verify_bsqrt(byte[])byte[]': Uint8Array - 'verify_btoi(byte[])uint64': bigint - 'verify_bzero(uint64)byte[]': Uint8Array - 'verify_concat(byte[],byte[],uint64,uint64)byte[]': Uint8Array - 'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)': [bigint, bigint, bigint, bigint] - 'verify_divw(uint64,uint64,uint64)uint64': bigint - 'verify_err()void': void - 'verify_exp(uint64,uint64)uint64': bigint - 'verify_expw(uint64,uint64)(uint64,uint64)': [bigint, bigint] - 'verify_extract(byte[],uint64,uint64)byte[]': Uint8Array - 'verify_extract_from_2(byte[])byte[]': Uint8Array - 'verify_extract_uint16(byte[],uint64)uint64': bigint - 'verify_extract_uint32(byte[],uint64)uint64': bigint - 'verify_extract_uint64(byte[],uint64)uint64': bigint - 'verify_getbit_bytes(byte[],uint64)bool': boolean - 'verify_getbit_uint64(uint64,uint64)bool': boolean - 'verify_getbyte(byte[],uint64)uint64': bigint - 'verify_itob(uint64)byte[]': Uint8Array - 'verify_mulw(uint64,uint64)(uint64,uint64)': [bigint, bigint] - 'verify_replace(byte[],uint64,byte[])byte[]': Uint8Array - 'verify_select_bytes(byte[],byte[],uint64)byte[]': Uint8Array - 'verify_select_uint64(uint64,uint64,uint64)uint64': bigint - 'verify_setbit_bytes(byte[],uint64,bool)byte[]': Uint8Array - 'verify_setbit_uint64(uint64,uint64,bool)uint64': bigint - 'verify_setbyte(byte[],uint64,uint64)byte[]': Uint8Array - 'verify_shl(uint64,uint64)uint64': bigint - 'verify_shr(uint64,uint64)uint64': bigint - 'verify_sqrt(uint64)uint64': bigint - 'verify_substring(byte[],uint64,uint64)byte[]': Uint8Array - 'verify_json_ref_string(byte[],byte[])byte[]': Uint8Array - 'verify_json_ref_uint64(byte[],byte[])uint64': bigint - 'verify_json_ref_object(byte[],byte[])byte[]': Uint8Array -} - -/** - * Defines the types of available calls and state of the MiscellaneousOpsContract smart contract. - */ -export type MiscellaneousOpsContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify_addw(uint64,uint64)(uint64,uint64)' | 'verify_addw', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_addw(uint64,uint64)(uint64,uint64)'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_addw(uint64,uint64)(uint64,uint64)'] - returns: MiscellaneousOpsContractReturns['verify_addw(uint64,uint64)(uint64,uint64)'] - }> - & Record<'verify_base64_decode_standard(byte[])byte[]' | 'verify_base64_decode_standard', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_base64_decode_standard(byte[])byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_base64_decode_standard(byte[])byte[]'] - returns: MiscellaneousOpsContractReturns['verify_base64_decode_standard(byte[])byte[]'] - }> - & Record<'verify_base64_decode_url(byte[])byte[]' | 'verify_base64_decode_url', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_base64_decode_url(byte[])byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_base64_decode_url(byte[])byte[]'] - returns: MiscellaneousOpsContractReturns['verify_base64_decode_url(byte[])byte[]'] - }> - & Record<'verify_bytes_bitlen(byte[],uint64)uint64' | 'verify_bytes_bitlen', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_bytes_bitlen(byte[],uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_bytes_bitlen(byte[],uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_bytes_bitlen(byte[],uint64)uint64'] - }> - & Record<'verify_uint64_bitlen(uint64)uint64' | 'verify_uint64_bitlen', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_uint64_bitlen(uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_uint64_bitlen(uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_uint64_bitlen(uint64)uint64'] - }> - & Record<'verify_bsqrt(byte[])byte[]' | 'verify_bsqrt', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_bsqrt(byte[])byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_bsqrt(byte[])byte[]'] - returns: MiscellaneousOpsContractReturns['verify_bsqrt(byte[])byte[]'] - }> - & Record<'verify_btoi(byte[])uint64' | 'verify_btoi', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_btoi(byte[])uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_btoi(byte[])uint64'] - returns: MiscellaneousOpsContractReturns['verify_btoi(byte[])uint64'] - }> - & Record<'verify_bzero(uint64)byte[]' | 'verify_bzero', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_bzero(uint64)byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_bzero(uint64)byte[]'] - returns: MiscellaneousOpsContractReturns['verify_bzero(uint64)byte[]'] - }> - & Record<'verify_concat(byte[],byte[],uint64,uint64)byte[]' | 'verify_concat', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_concat(byte[],byte[],uint64,uint64)byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_concat(byte[],byte[],uint64,uint64)byte[]'] - returns: MiscellaneousOpsContractReturns['verify_concat(byte[],byte[],uint64,uint64)byte[]'] - }> - & Record<'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)' | 'verify_divmodw', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'] - returns: MiscellaneousOpsContractReturns['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'] - }> - & Record<'verify_divw(uint64,uint64,uint64)uint64' | 'verify_divw', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_divw(uint64,uint64,uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_divw(uint64,uint64,uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_divw(uint64,uint64,uint64)uint64'] - }> - & Record<'verify_err()void' | 'verify_err', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_err()void'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_err()void'] - returns: MiscellaneousOpsContractReturns['verify_err()void'] - }> - & Record<'verify_exp(uint64,uint64)uint64' | 'verify_exp', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_exp(uint64,uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_exp(uint64,uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_exp(uint64,uint64)uint64'] - }> - & Record<'verify_expw(uint64,uint64)(uint64,uint64)' | 'verify_expw', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_expw(uint64,uint64)(uint64,uint64)'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_expw(uint64,uint64)(uint64,uint64)'] - returns: MiscellaneousOpsContractReturns['verify_expw(uint64,uint64)(uint64,uint64)'] - }> - & Record<'verify_extract(byte[],uint64,uint64)byte[]' | 'verify_extract', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract(byte[],uint64,uint64)byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract(byte[],uint64,uint64)byte[]'] - returns: MiscellaneousOpsContractReturns['verify_extract(byte[],uint64,uint64)byte[]'] - }> - & Record<'verify_extract_from_2(byte[])byte[]' | 'verify_extract_from_2', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract_from_2(byte[])byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract_from_2(byte[])byte[]'] - returns: MiscellaneousOpsContractReturns['verify_extract_from_2(byte[])byte[]'] - }> - & Record<'verify_extract_uint16(byte[],uint64)uint64' | 'verify_extract_uint16', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract_uint16(byte[],uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract_uint16(byte[],uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_extract_uint16(byte[],uint64)uint64'] - }> - & Record<'verify_extract_uint32(byte[],uint64)uint64' | 'verify_extract_uint32', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract_uint32(byte[],uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract_uint32(byte[],uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_extract_uint32(byte[],uint64)uint64'] - }> - & Record<'verify_extract_uint64(byte[],uint64)uint64' | 'verify_extract_uint64', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract_uint64(byte[],uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract_uint64(byte[],uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_extract_uint64(byte[],uint64)uint64'] - }> - & Record<'verify_getbit_bytes(byte[],uint64)bool' | 'verify_getbit_bytes', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_getbit_bytes(byte[],uint64)bool'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_getbit_bytes(byte[],uint64)bool'] - returns: MiscellaneousOpsContractReturns['verify_getbit_bytes(byte[],uint64)bool'] - }> - & Record<'verify_getbit_uint64(uint64,uint64)bool' | 'verify_getbit_uint64', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_getbit_uint64(uint64,uint64)bool'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_getbit_uint64(uint64,uint64)bool'] - returns: MiscellaneousOpsContractReturns['verify_getbit_uint64(uint64,uint64)bool'] - }> - & Record<'verify_getbyte(byte[],uint64)uint64' | 'verify_getbyte', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_getbyte(byte[],uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_getbyte(byte[],uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_getbyte(byte[],uint64)uint64'] - }> - & Record<'verify_itob(uint64)byte[]' | 'verify_itob', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_itob(uint64)byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_itob(uint64)byte[]'] - returns: MiscellaneousOpsContractReturns['verify_itob(uint64)byte[]'] - }> - & Record<'verify_mulw(uint64,uint64)(uint64,uint64)' | 'verify_mulw', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_mulw(uint64,uint64)(uint64,uint64)'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_mulw(uint64,uint64)(uint64,uint64)'] - returns: MiscellaneousOpsContractReturns['verify_mulw(uint64,uint64)(uint64,uint64)'] - }> - & Record<'verify_replace(byte[],uint64,byte[])byte[]' | 'verify_replace', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_replace(byte[],uint64,byte[])byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_replace(byte[],uint64,byte[])byte[]'] - returns: MiscellaneousOpsContractReturns['verify_replace(byte[],uint64,byte[])byte[]'] - }> - & Record<'verify_select_bytes(byte[],byte[],uint64)byte[]' | 'verify_select_bytes', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_select_bytes(byte[],byte[],uint64)byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_select_bytes(byte[],byte[],uint64)byte[]'] - returns: MiscellaneousOpsContractReturns['verify_select_bytes(byte[],byte[],uint64)byte[]'] - }> - & Record<'verify_select_uint64(uint64,uint64,uint64)uint64' | 'verify_select_uint64', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_select_uint64(uint64,uint64,uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_select_uint64(uint64,uint64,uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_select_uint64(uint64,uint64,uint64)uint64'] - }> - & Record<'verify_setbit_bytes(byte[],uint64,bool)byte[]' | 'verify_setbit_bytes', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_setbit_bytes(byte[],uint64,bool)byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_setbit_bytes(byte[],uint64,bool)byte[]'] - returns: MiscellaneousOpsContractReturns['verify_setbit_bytes(byte[],uint64,bool)byte[]'] - }> - & Record<'verify_setbit_uint64(uint64,uint64,bool)uint64' | 'verify_setbit_uint64', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_setbit_uint64(uint64,uint64,bool)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_setbit_uint64(uint64,uint64,bool)uint64'] - returns: MiscellaneousOpsContractReturns['verify_setbit_uint64(uint64,uint64,bool)uint64'] - }> - & Record<'verify_setbyte(byte[],uint64,uint64)byte[]' | 'verify_setbyte', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_setbyte(byte[],uint64,uint64)byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_setbyte(byte[],uint64,uint64)byte[]'] - returns: MiscellaneousOpsContractReturns['verify_setbyte(byte[],uint64,uint64)byte[]'] - }> - & Record<'verify_shl(uint64,uint64)uint64' | 'verify_shl', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_shl(uint64,uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_shl(uint64,uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_shl(uint64,uint64)uint64'] - }> - & Record<'verify_shr(uint64,uint64)uint64' | 'verify_shr', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_shr(uint64,uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_shr(uint64,uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_shr(uint64,uint64)uint64'] - }> - & Record<'verify_sqrt(uint64)uint64' | 'verify_sqrt', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_sqrt(uint64)uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_sqrt(uint64)uint64'] - returns: MiscellaneousOpsContractReturns['verify_sqrt(uint64)uint64'] - }> - & Record<'verify_substring(byte[],uint64,uint64)byte[]' | 'verify_substring', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_substring(byte[],uint64,uint64)byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_substring(byte[],uint64,uint64)byte[]'] - returns: MiscellaneousOpsContractReturns['verify_substring(byte[],uint64,uint64)byte[]'] - }> - & Record<'verify_json_ref_string(byte[],byte[])byte[]' | 'verify_json_ref_string', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_json_ref_string(byte[],byte[])byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_json_ref_string(byte[],byte[])byte[]'] - returns: MiscellaneousOpsContractReturns['verify_json_ref_string(byte[],byte[])byte[]'] - }> - & Record<'verify_json_ref_uint64(byte[],byte[])uint64' | 'verify_json_ref_uint64', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_json_ref_uint64(byte[],byte[])uint64'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_json_ref_uint64(byte[],byte[])uint64'] - returns: MiscellaneousOpsContractReturns['verify_json_ref_uint64(byte[],byte[])uint64'] - }> - & Record<'verify_json_ref_object(byte[],byte[])byte[]' | 'verify_json_ref_object', { - argsObj: MiscellaneousOpsContractArgs['obj']['verify_json_ref_object(byte[],byte[])byte[]'] - argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_json_ref_object(byte[],byte[])byte[]'] - returns: MiscellaneousOpsContractReturns['verify_json_ref_object(byte[],byte[])byte[]'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type MiscellaneousOpsContractSignatures = keyof MiscellaneousOpsContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type MiscellaneousOpsContractNonVoidMethodSignatures = keyof MiscellaneousOpsContractTypes['methods'] extends infer T ? T extends keyof MiscellaneousOpsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the MiscellaneousOpsContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = MiscellaneousOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the MiscellaneousOpsContract smart contract to the method's return type - */ -export type MethodReturn = MiscellaneousOpsContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type MiscellaneousOpsContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type MiscellaneousOpsContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: MiscellaneousOpsContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the MiscellaneousOpsContract smart contract - */ -export abstract class MiscellaneousOpsContractParamsFactory { - /** - * Constructs a no op call for the verify_addw(uint64,uint64)(uint64,uint64) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAddw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_addw(uint64,uint64)(uint64,uint64)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_base64_decode_standard(byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBase64DecodeStandard(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_base64_decode_standard(byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_base64_decode_url(byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBase64DecodeUrl(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_base64_decode_url(byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_bytes_bitlen(byte[],uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBytesBitlen(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bytes_bitlen(byte[],uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padASize], - } - } - /** - * Constructs a no op call for the verify_uint64_bitlen(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Bitlen(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_bitlen(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_bsqrt(byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBsqrt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bsqrt(byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_btoi(byte[])uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBtoi(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_btoi(byte[])uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_bzero(uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBzero(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bzero(uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_concat(byte[],byte[],uint64,uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyConcat(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_concat(byte[],byte[],uint64,uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.padASize, params.args.padBSize], - } - } - /** - * Constructs a no op call for the verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyDivmodw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d], - } - } - /** - * Constructs a no op call for the verify_divw(uint64,uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyDivw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_divw(uint64,uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_err()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyErr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_err()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the verify_exp(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyExp(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_exp(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_expw(uint64,uint64)(uint64,uint64) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyExpw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_expw(uint64,uint64)(uint64,uint64)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_extract(byte[],uint64,uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyExtract(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_extract(byte[],uint64,uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_extract_from_2(byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyExtractFrom_2(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_extract_from_2(byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_extract_uint16(byte[],uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyExtractUint16(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_extract_uint16(byte[],uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_extract_uint32(byte[],uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyExtractUint32(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_extract_uint32(byte[],uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_extract_uint64(byte[],uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyExtractUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_extract_uint64(byte[],uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_getbit_bytes(byte[],uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyGetbitBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_getbit_bytes(byte[],uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_getbit_uint64(uint64,uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyGetbitUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_getbit_uint64(uint64,uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_getbyte(byte[],uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyGetbyte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_getbyte(byte[],uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_itob(uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyItob(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_itob(uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_mulw(uint64,uint64)(uint64,uint64) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyMulw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_mulw(uint64,uint64)(uint64,uint64)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_replace(byte[],uint64,byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyReplace(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_replace(byte[],uint64,byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_select_bytes(byte[],byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifySelectBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_select_bytes(byte[],byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_select_uint64(uint64,uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifySelectUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_select_uint64(uint64,uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_setbit_bytes(byte[],uint64,bool)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifySetbitBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_setbit_bytes(byte[],uint64,bool)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_setbit_uint64(uint64,uint64,bool)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifySetbitUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_setbit_uint64(uint64,uint64,bool)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_setbyte(byte[],uint64,uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifySetbyte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_setbyte(byte[],uint64,uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_shl(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyShl(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_shl(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_shr(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyShr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_shr(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_sqrt(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifySqrt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_sqrt(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_substring(byte[],uint64,uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifySubstring(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_substring(byte[],uint64,uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_json_ref_string(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyJsonRefString(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_json_ref_string(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_json_ref_uint64(byte[],byte[])uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyJsonRefUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_json_ref_uint64(byte[],byte[])uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_json_ref_object(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyJsonRefObject(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_json_ref_object(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } -} - -/** - * A factory to create and deploy one or more instance of the MiscellaneousOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class MiscellaneousOpsContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `MiscellaneousOpsContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new MiscellaneousOpsContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new MiscellaneousOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the MiscellaneousOpsContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: MiscellaneousOpsContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new MiscellaneousOpsContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the MiscellaneousOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the MiscellaneousOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the MiscellaneousOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new MiscellaneousOpsContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the MiscellaneousOpsContract smart contract - */ -export class MiscellaneousOpsContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `MiscellaneousOpsContractClient` - * - * @param appClient An `AppClient` instance which has been created with the MiscellaneousOpsContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `MiscellaneousOpsContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `MiscellaneousOpsContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new MiscellaneousOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `MiscellaneousOpsContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new MiscellaneousOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the MiscellaneousOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_addw(uint64,uint64)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAddw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyAddw(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_standard(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBase64DecodeStandard: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeStandard(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_url(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBase64DecodeUrl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeUrl(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bytes_bitlen(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBytesBitlen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBytesBitlen(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_uint64_bitlen(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Bitlen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyUint64Bitlen(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bsqrt(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBsqrt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBsqrt(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_btoi(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBtoi: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBtoi(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bzero(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBzero: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBzero(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_concat(byte[],byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyConcat: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyConcat(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyDivmodw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyDivmodw(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divw(uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyDivw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyDivw(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_err()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyErr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyErr(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_exp(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyExp: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExp(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_expw(uint64,uint64)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyExpw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExpw(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract(byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyExtract: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtract(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_from_2(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyExtractFrom_2: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtractFrom_2(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint16(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyExtractUint16: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint16(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint32(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyExtractUint32: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint32(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint64(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyExtractUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint64(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_bytes(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyGetbitBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyGetbitBytes(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_uint64(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyGetbitUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyGetbitUint64(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbyte(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyGetbyte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyGetbyte(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_itob(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyItob: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyItob(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_mulw(uint64,uint64)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyMulw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyMulw(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_replace(byte[],uint64,byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyReplace: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyReplace(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_bytes(byte[],byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifySelectBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySelectBytes(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_uint64(uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifySelectUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySelectUint64(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_bytes(byte[],uint64,bool)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifySetbitBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySetbitBytes(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_uint64(uint64,uint64,bool)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifySetbitUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySetbitUint64(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbyte(byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifySetbyte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySetbyte(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shl(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyShl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyShl(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shr(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyShr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyShr(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_sqrt(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifySqrt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySqrt(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_substring(byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifySubstring: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySubstring(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_string(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyJsonRefString: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefString(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_uint64(byte[],byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyJsonRefUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefUint64(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_object(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyJsonRefObject: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefObject(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the MiscellaneousOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_addw(uint64,uint64)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAddw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyAddw(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_standard(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBase64DecodeStandard: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeStandard(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_url(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBase64DecodeUrl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeUrl(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bytes_bitlen(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBytesBitlen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBytesBitlen(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_uint64_bitlen(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Bitlen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyUint64Bitlen(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bsqrt(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBsqrt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBsqrt(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_btoi(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBtoi: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBtoi(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bzero(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBzero: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBzero(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_concat(byte[],byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyConcat: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyConcat(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyDivmodw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyDivmodw(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divw(uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyDivw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyDivw(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_err()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyErr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyErr(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_exp(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyExp: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExp(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_expw(uint64,uint64)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyExpw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExpw(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract(byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyExtract: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtract(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_from_2(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyExtractFrom_2: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtractFrom_2(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint16(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyExtractUint16: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint16(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint32(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyExtractUint32: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint32(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint64(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyExtractUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint64(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_bytes(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyGetbitBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyGetbitBytes(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_uint64(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyGetbitUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyGetbitUint64(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbyte(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyGetbyte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyGetbyte(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_itob(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyItob: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyItob(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_mulw(uint64,uint64)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyMulw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyMulw(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_replace(byte[],uint64,byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyReplace: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyReplace(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_bytes(byte[],byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifySelectBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySelectBytes(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_uint64(uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifySelectUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySelectUint64(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_bytes(byte[],uint64,bool)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifySetbitBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySetbitBytes(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_uint64(uint64,uint64,bool)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifySetbitUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySetbitUint64(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbyte(byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifySetbyte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySetbyte(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shl(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyShl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyShl(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shr(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyShr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyShr(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_sqrt(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifySqrt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySqrt(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_substring(byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifySubstring: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySubstring(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_string(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyJsonRefString: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefString(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_uint64(byte[],byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyJsonRefUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefUint64(params)) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_object(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyJsonRefObject: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefObject(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the MiscellaneousOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_addw(uint64,uint64)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAddw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyAddw(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_addw(uint64,uint64)(uint64,uint64)'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_standard(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBase64DecodeStandard: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeStandard(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_base64_decode_standard(byte[])byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_url(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBase64DecodeUrl: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeUrl(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_base64_decode_url(byte[])byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bytes_bitlen(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBytesBitlen: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBytesBitlen(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_bytes_bitlen(byte[],uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_uint64_bitlen(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Bitlen: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyUint64Bitlen(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_uint64_bitlen(uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bsqrt(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBsqrt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBsqrt(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_bsqrt(byte[])byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_btoi(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBtoi: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBtoi(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_btoi(byte[])uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bzero(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBzero: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBzero(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_bzero(uint64)byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_concat(byte[],byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyConcat: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyConcat(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_concat(byte[],byte[],uint64,uint64)byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyDivmodw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyDivmodw(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divw(uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyDivw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyDivw(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_divw(uint64,uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_err()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyErr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyErr(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_err()void'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_exp(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyExp: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExp(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_exp(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_expw(uint64,uint64)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyExpw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExpw(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_expw(uint64,uint64)(uint64,uint64)'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract(byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyExtract: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtract(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract(byte[],uint64,uint64)byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_from_2(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyExtractFrom_2: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtractFrom_2(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract_from_2(byte[])byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint16(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyExtractUint16: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint16(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract_uint16(byte[],uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint32(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyExtractUint32: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint32(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract_uint32(byte[],uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint64(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyExtractUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint64(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract_uint64(byte[],uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_bytes(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyGetbitBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyGetbitBytes(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_getbit_bytes(byte[],uint64)bool'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_uint64(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyGetbitUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyGetbitUint64(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_getbit_uint64(uint64,uint64)bool'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbyte(byte[],uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyGetbyte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyGetbyte(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_getbyte(byte[],uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_itob(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyItob: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyItob(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_itob(uint64)byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_mulw(uint64,uint64)(uint64,uint64)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyMulw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyMulw(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_mulw(uint64,uint64)(uint64,uint64)'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_replace(byte[],uint64,byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyReplace: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyReplace(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_replace(byte[],uint64,byte[])byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_bytes(byte[],byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifySelectBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySelectBytes(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_select_bytes(byte[],byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_uint64(uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifySelectUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySelectUint64(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_select_uint64(uint64,uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_bytes(byte[],uint64,bool)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifySetbitBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySetbitBytes(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_setbit_bytes(byte[],uint64,bool)byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_uint64(uint64,uint64,bool)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifySetbitUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySetbitUint64(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_setbit_uint64(uint64,uint64,bool)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbyte(byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifySetbyte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySetbyte(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_setbyte(byte[],uint64,uint64)byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shl(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyShl: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyShl(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_shl(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shr(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyShr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyShr(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_shr(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_sqrt(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifySqrt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySqrt(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_sqrt(uint64)uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_substring(byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifySubstring: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySubstring(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_substring(byte[],uint64,uint64)byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_string(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyJsonRefString: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefString(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_json_ref_string(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_uint64(byte[],byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyJsonRefUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefUint64(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_json_ref_uint64(byte[],byte[])uint64'])} - }, - - /** - * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_object(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyJsonRefObject: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefObject(params)) - return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_json_ref_object(byte[],byte[])byte[]'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new MiscellaneousOpsContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current MiscellaneousOpsContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): MiscellaneousOpsContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_addw(uint64,uint64)(uint64,uint64) method call against the MiscellaneousOpsContract contract - */ - verifyAddw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAddw(params))) - return this - }, - /** - * Add a verify_base64_decode_standard(byte[])byte[] method call against the MiscellaneousOpsContract contract - */ - verifyBase64DecodeStandard(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBase64DecodeStandard(params))) - return this - }, - /** - * Add a verify_base64_decode_url(byte[])byte[] method call against the MiscellaneousOpsContract contract - */ - verifyBase64DecodeUrl(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBase64DecodeUrl(params))) - return this - }, - /** - * Add a verify_bytes_bitlen(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifyBytesBitlen(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesBitlen(params))) - return this - }, - /** - * Add a verify_uint64_bitlen(uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifyUint64Bitlen(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Bitlen(params))) - return this - }, - /** - * Add a verify_bsqrt(byte[])byte[] method call against the MiscellaneousOpsContract contract - */ - verifyBsqrt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBsqrt(params))) - return this - }, - /** - * Add a verify_btoi(byte[])uint64 method call against the MiscellaneousOpsContract contract - */ - verifyBtoi(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBtoi(params))) - return this - }, - /** - * Add a verify_bzero(uint64)byte[] method call against the MiscellaneousOpsContract contract - */ - verifyBzero(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBzero(params))) - return this - }, - /** - * Add a verify_concat(byte[],byte[],uint64,uint64)byte[] method call against the MiscellaneousOpsContract contract - */ - verifyConcat(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyConcat(params))) - return this - }, - /** - * Add a verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64) method call against the MiscellaneousOpsContract contract - */ - verifyDivmodw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyDivmodw(params))) - return this - }, - /** - * Add a verify_divw(uint64,uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifyDivw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyDivw(params))) - return this - }, - /** - * Add a verify_err()void method call against the MiscellaneousOpsContract contract - */ - verifyErr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyErr(params))) - return this - }, - /** - * Add a verify_exp(uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifyExp(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExp(params))) - return this - }, - /** - * Add a verify_expw(uint64,uint64)(uint64,uint64) method call against the MiscellaneousOpsContract contract - */ - verifyExpw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExpw(params))) - return this - }, - /** - * Add a verify_extract(byte[],uint64,uint64)byte[] method call against the MiscellaneousOpsContract contract - */ - verifyExtract(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtract(params))) - return this - }, - /** - * Add a verify_extract_from_2(byte[])byte[] method call against the MiscellaneousOpsContract contract - */ - verifyExtractFrom_2(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtractFrom_2(params))) - return this - }, - /** - * Add a verify_extract_uint16(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifyExtractUint16(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtractUint16(params))) - return this - }, - /** - * Add a verify_extract_uint32(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifyExtractUint32(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtractUint32(params))) - return this - }, - /** - * Add a verify_extract_uint64(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifyExtractUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtractUint64(params))) - return this - }, - /** - * Add a verify_getbit_bytes(byte[],uint64)bool method call against the MiscellaneousOpsContract contract - */ - verifyGetbitBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetbitBytes(params))) - return this - }, - /** - * Add a verify_getbit_uint64(uint64,uint64)bool method call against the MiscellaneousOpsContract contract - */ - verifyGetbitUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetbitUint64(params))) - return this - }, - /** - * Add a verify_getbyte(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifyGetbyte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetbyte(params))) - return this - }, - /** - * Add a verify_itob(uint64)byte[] method call against the MiscellaneousOpsContract contract - */ - verifyItob(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyItob(params))) - return this - }, - /** - * Add a verify_mulw(uint64,uint64)(uint64,uint64) method call against the MiscellaneousOpsContract contract - */ - verifyMulw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyMulw(params))) - return this - }, - /** - * Add a verify_replace(byte[],uint64,byte[])byte[] method call against the MiscellaneousOpsContract contract - */ - verifyReplace(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyReplace(params))) - return this - }, - /** - * Add a verify_select_bytes(byte[],byte[],uint64)byte[] method call against the MiscellaneousOpsContract contract - */ - verifySelectBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySelectBytes(params))) - return this - }, - /** - * Add a verify_select_uint64(uint64,uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifySelectUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySelectUint64(params))) - return this - }, - /** - * Add a verify_setbit_bytes(byte[],uint64,bool)byte[] method call against the MiscellaneousOpsContract contract - */ - verifySetbitBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySetbitBytes(params))) - return this - }, - /** - * Add a verify_setbit_uint64(uint64,uint64,bool)uint64 method call against the MiscellaneousOpsContract contract - */ - verifySetbitUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySetbitUint64(params))) - return this - }, - /** - * Add a verify_setbyte(byte[],uint64,uint64)byte[] method call against the MiscellaneousOpsContract contract - */ - verifySetbyte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySetbyte(params))) - return this - }, - /** - * Add a verify_shl(uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifyShl(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyShl(params))) - return this - }, - /** - * Add a verify_shr(uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifyShr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyShr(params))) - return this - }, - /** - * Add a verify_sqrt(uint64)uint64 method call against the MiscellaneousOpsContract contract - */ - verifySqrt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySqrt(params))) - return this - }, - /** - * Add a verify_substring(byte[],uint64,uint64)byte[] method call against the MiscellaneousOpsContract contract - */ - verifySubstring(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySubstring(params))) - return this - }, - /** - * Add a verify_json_ref_string(byte[],byte[])byte[] method call against the MiscellaneousOpsContract contract - */ - verifyJsonRefString(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyJsonRefString(params))) - return this - }, - /** - * Add a verify_json_ref_uint64(byte[],byte[])uint64 method call against the MiscellaneousOpsContract contract - */ - verifyJsonRefUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyJsonRefUint64(params))) - return this - }, - /** - * Add a verify_json_ref_object(byte[],byte[])byte[] method call against the MiscellaneousOpsContract contract - */ - verifyJsonRefObject(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyJsonRefObject(params))) - return this - }, - /** - * Add a clear state call to the MiscellaneousOpsContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as MiscellaneousOpsContractComposer - } -} -export type MiscellaneousOpsContractComposer = { - /** - * Calls the verify_addw(uint64,uint64)(uint64,uint64) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAddw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_addw(uint64,uint64)(uint64,uint64)'] | undefined]> - - /** - * Calls the verify_base64_decode_standard(byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBase64DecodeStandard(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_base64_decode_standard(byte[])byte[]'] | undefined]> - - /** - * Calls the verify_base64_decode_url(byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBase64DecodeUrl(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_base64_decode_url(byte[])byte[]'] | undefined]> - - /** - * Calls the verify_bytes_bitlen(byte[],uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBytesBitlen(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_bytes_bitlen(byte[],uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_bitlen(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Bitlen(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_uint64_bitlen(uint64)uint64'] | undefined]> - - /** - * Calls the verify_bsqrt(byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBsqrt(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_bsqrt(byte[])byte[]'] | undefined]> - - /** - * Calls the verify_btoi(byte[])uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBtoi(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_btoi(byte[])uint64'] | undefined]> - - /** - * Calls the verify_bzero(uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBzero(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_bzero(uint64)byte[]'] | undefined]> - - /** - * Calls the verify_concat(byte[],byte[],uint64,uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyConcat(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_concat(byte[],byte[],uint64,uint64)byte[]'] | undefined]> - - /** - * Calls the verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyDivmodw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'] | undefined]> - - /** - * Calls the verify_divw(uint64,uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyDivw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_divw(uint64,uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_err()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyErr(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_err()void'] | undefined]> - - /** - * Calls the verify_exp(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyExp(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_exp(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_expw(uint64,uint64)(uint64,uint64) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyExpw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_expw(uint64,uint64)(uint64,uint64)'] | undefined]> - - /** - * Calls the verify_extract(byte[],uint64,uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyExtract(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract(byte[],uint64,uint64)byte[]'] | undefined]> - - /** - * Calls the verify_extract_from_2(byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyExtractFrom_2(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract_from_2(byte[])byte[]'] | undefined]> - - /** - * Calls the verify_extract_uint16(byte[],uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyExtractUint16(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract_uint16(byte[],uint64)uint64'] | undefined]> - - /** - * Calls the verify_extract_uint32(byte[],uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyExtractUint32(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract_uint32(byte[],uint64)uint64'] | undefined]> - - /** - * Calls the verify_extract_uint64(byte[],uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyExtractUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract_uint64(byte[],uint64)uint64'] | undefined]> - - /** - * Calls the verify_getbit_bytes(byte[],uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyGetbitBytes(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_getbit_bytes(byte[],uint64)bool'] | undefined]> - - /** - * Calls the verify_getbit_uint64(uint64,uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyGetbitUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_getbit_uint64(uint64,uint64)bool'] | undefined]> - - /** - * Calls the verify_getbyte(byte[],uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyGetbyte(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_getbyte(byte[],uint64)uint64'] | undefined]> - - /** - * Calls the verify_itob(uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyItob(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_itob(uint64)byte[]'] | undefined]> - - /** - * Calls the verify_mulw(uint64,uint64)(uint64,uint64) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyMulw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_mulw(uint64,uint64)(uint64,uint64)'] | undefined]> - - /** - * Calls the verify_replace(byte[],uint64,byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyReplace(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_replace(byte[],uint64,byte[])byte[]'] | undefined]> - - /** - * Calls the verify_select_bytes(byte[],byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifySelectBytes(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_select_bytes(byte[],byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_select_uint64(uint64,uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifySelectUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_select_uint64(uint64,uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_setbit_bytes(byte[],uint64,bool)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifySetbitBytes(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_setbit_bytes(byte[],uint64,bool)byte[]'] | undefined]> - - /** - * Calls the verify_setbit_uint64(uint64,uint64,bool)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifySetbitUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_setbit_uint64(uint64,uint64,bool)uint64'] | undefined]> - - /** - * Calls the verify_setbyte(byte[],uint64,uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifySetbyte(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_setbyte(byte[],uint64,uint64)byte[]'] | undefined]> - - /** - * Calls the verify_shl(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyShl(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_shl(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_shr(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyShr(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_shr(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_sqrt(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifySqrt(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_sqrt(uint64)uint64'] | undefined]> - - /** - * Calls the verify_substring(byte[],uint64,uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifySubstring(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_substring(byte[],uint64,uint64)byte[]'] | undefined]> - - /** - * Calls the verify_json_ref_string(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyJsonRefString(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_json_ref_string(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_json_ref_uint64(byte[],byte[])uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyJsonRefUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_json_ref_uint64(byte[],byte[])uint64'] | undefined]> - - /** - * Calls the verify_json_ref_object(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyJsonRefObject(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_json_ref_object(byte[],byte[])byte[]'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the MiscellaneousOpsContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): MiscellaneousOpsContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): MiscellaneousOpsContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type MiscellaneousOpsContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/PrimitiveOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/PrimitiveOpsContract.ts deleted file mode 100644 index 5ff671b..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/PrimitiveOpsContract.ts +++ /dev/null @@ -1,4701 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"PrimitiveOpsContract","structs":{},"methods":[{"name":"verify_uint64_init","args":[{"type":"byte[]","name":"raw_value"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_add","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_sub","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_mul","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_div","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_mod","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_and","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_or","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_xor","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_not","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_lshift","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_rshift","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_pow","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_eq","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_ne","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_lt","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_le","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_gt","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_ge","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_init","args":[{"type":"uint64","name":"raw_value"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_add","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"uint64","name":"pad_a_size"},{"type":"uint64","name":"pad_b_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_and","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_or","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_xor","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_not","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_add","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_add_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_sub","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_sub_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_mul","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_mul_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_div","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_div_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_mod","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_mod_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_and","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_and_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_or","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_or_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_xor","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_xor_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_eq_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_ne_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_lt_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_le_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_gt_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_ge_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_init","args":[{"type":"string","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_startswith","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_endswith","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_join","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_log","args":[{"type":"string","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"},{"type":"bool","name":"e"},{"type":"string","name":"f"},{"type":"uint64","name":"g"},{"type":"uint256","name":"h"},{"type":"ufixed32x8","name":"i"},{"type":"ufixed256x16","name":"j"},{"type":"byte[]","name":"k"},{"type":"byte[]","name":"m"},{"type":"byte[]","name":"n"},{"type":"byte[5]","name":"o"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDAwICItIiAweDE1MWY3Yzc1MDAyMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANjcKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDcyNWM2OTJiIDB4MTczMTQ1NTkgMHg1M2YzNDg5MyAweDg4YzhiMjY5IDB4YTQ2NGI3YWIgMHg5YzhiMTFiOCAweDZmNDA2NTRlIDB4ZWM5YTI5NzQgMHhjNzkzNzA4ZiAweDdkZGI3NDk5IDB4YTIxYzQ0M2QgMHg2ZTdmYjIxMiAweGIwMDdmY2IwIDB4MmViYzIwZDQgMHhiMDk1NGI2NiAweGRkMTQwYWVmIDB4YWNlNDc0ZGEgMHhiYTY5NDk5MCAweDZkYjU4MWMwIDB4OTFjOGRiODkgMHhkYmU3NzE1OCAweDlhMGYyMmUxIDB4NjQwMzNkMzcgMHgyYTcyMzdjNSAweGUzYTk0NDU4IDB4NDJmODdmN2QgMHgyYjU1NDJhNCAweDliZTJmYmU5IDB4MWNkOTI1MTUgMHg2NGUxNzA1YyAweGYxMjcxYzUwIDB4MmFiNjNiNzAgMHg4MzRiYjdkMiAweDUzMTYyMGQ3IDB4M2ZiOWU3NjkgMHhmYThkYjBiYyAweGE3MmVhNDg1IDB4YjdiMGJhMTkgMHg3NDQ2MGM0MiAweGFiMzIwNzM4IDB4NTJhZDQ2NTQgMHgxMDE1NjM5OSAweDBmMDc1OTU3IDB4YmQ4NDNkZmYgMHhiMzc3ZDM4MSAweDg5NzY3MjY1IDB4NDU2YjRiMjMgMHgzM2QxYjg4YyAweDZiZjk3M2VhIDB4NjdjZDZiYjIgMHgzZjU4ODA1YSAweDFlMTMwMDM5IDB4NTA5ZGM5MWQgMHhhNTY0YTIwMiAweDIzNjUwNzYzIDB4ZjhjOGY4ZDUgMHgyM2ZhZjdhNCAweDdkMGFmZTE1IDB4NDg1ODFhZGYgMHgzZGFlZjljZCAvLyBtZXRob2QgInZlcmlmeV91aW50NjRfaW5pdChieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2FkZCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9zdWIodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbXVsKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2Rpdih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9tb2QodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfYW5kKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X29yKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X3hvcih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9ub3QodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9sc2hpZnQodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfcnNoaWZ0KHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X3Bvdyh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9lcSh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbmUodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2x0KHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9sZSh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfZ3QodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2dlKHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2luaXQodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2FkZChieXRlW10sYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfYW5kKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfb3IoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc194b3IoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc19ub3QoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2FkZChieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfYWRkX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfc3ViKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9zdWJfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9tdWwoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X211bF91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2RpdihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZGl2X3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbW9kKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9tb2RfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9hbmQoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X29yKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9vcl91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X3hvcihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfeG9yX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9lcV91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9uZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2x0KGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9sZV91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9ndChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2dlKGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19pbml0KHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aChzdHJpbmcsc3RyaW5nKWJvb2wiLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfZW5kc3dpdGgoc3RyaW5nLHN0cmluZylib29sIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2pvaW4oc3RyaW5nLHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9sb2coc3RyaW5nLHVpbnQ2NCxieXRlW10sYnl0ZVtdLGJvb2wsc3RyaW5nLHVpbnQ2NCx1aW50MjU2LHVmaXhlZDMyeDgsdWZpeGVkMjU2eDE2LGJ5dGVbXSxieXRlW10sYnl0ZVtdLGJ5dGVbNV0pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV91aW50NjRfaW5pdCB2ZXJpZnlfdWludDY0X2FkZCB2ZXJpZnlfdWludDY0X3N1YiB2ZXJpZnlfdWludDY0X211bCB2ZXJpZnlfdWludDY0X2RpdiB2ZXJpZnlfdWludDY0X21vZCB2ZXJpZnlfdWludDY0X2FuZCB2ZXJpZnlfdWludDY0X29yIHZlcmlmeV91aW50NjRfeG9yIHZlcmlmeV91aW50NjRfbm90IHZlcmlmeV91aW50NjRfbHNoaWZ0IHZlcmlmeV91aW50NjRfcnNoaWZ0IHZlcmlmeV91aW50NjRfcG93IHZlcmlmeV91aW50NjRfZXEgdmVyaWZ5X3VpbnQ2NF9uZSB2ZXJpZnlfdWludDY0X2x0IHZlcmlmeV91aW50NjRfbGUgdmVyaWZ5X3VpbnQ2NF9ndCB2ZXJpZnlfdWludDY0X2dlIHZlcmlmeV9ieXRlc19pbml0IHZlcmlmeV9ieXRlc19hZGQgdmVyaWZ5X2J5dGVzX2VxIHZlcmlmeV9ieXRlc19uZSB2ZXJpZnlfYnl0ZXNfYW5kIHZlcmlmeV9ieXRlc19vciB2ZXJpZnlfYnl0ZXNfeG9yIHZlcmlmeV9ieXRlc19ub3QgdmVyaWZ5X2JpZ3VpbnRfYWRkIHZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfc3ViIHZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbXVsIHZlcmlmeV9iaWd1aW50X211bF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfZGl2IHZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbW9kIHZlcmlmeV9iaWd1aW50X21vZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfYW5kIHZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfb3IgdmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0IHZlcmlmeV9iaWd1aW50X3hvciB2ZXJpZnlfYmlndWludF94b3JfdWludDY0IHZlcmlmeV9iaWd1aW50X2VxIHZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NCB2ZXJpZnlfYmlndWludF9uZSB2ZXJpZnlfYmlndWludF9uZV91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbHQgdmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0IHZlcmlmeV9iaWd1aW50X2xlIHZlcmlmeV9iaWd1aW50X2xlX3VpbnQ2NCB2ZXJpZnlfYmlndWludF9ndCB2ZXJpZnlfYmlndWludF9ndF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfZ2UgdmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0IHZlcmlmeV9zdHJpbmdfaW5pdCB2ZXJpZnlfc3RyaW5nX3N0YXJ0c3dpdGggdmVyaWZ5X3N0cmluZ19lbmRzd2l0aCB2ZXJpZnlfc3RyaW5nX2pvaW4gdmVyaWZ5X2xvZwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDY3OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjkKICAgIC8vIHJlc3VsdCA9IG9wLmJ0b2kocmF3X3ZhbHVlKQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9hZGRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0CiAgICAvLyByZXN1bHQgPSBhICsgYgogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfc3ViW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9zdWI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOQogICAgLy8gcmVzdWx0ID0gYSAtIGIKICAgIC0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X211bFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbXVsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQKICAgIC8vIHJlc3VsdCA9IGEgKiBiCiAgICAqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9kaXZbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2RpdjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI5CiAgICAvLyByZXN1bHQgPSBhIC8vIGIKICAgIC8KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X21vZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbW9kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzQKICAgIC8vIHJlc3VsdCA9IGEgJSBiCiAgICAlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9hbmRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2FuZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM5CiAgICAvLyByZXN1bHQgPSBhICYgYgogICAgJgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfb3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X29yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDQKICAgIC8vIHJlc3VsdCA9IGEgfCBiCiAgICB8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF94b3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X3hvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyByZXN1bHQgPSBhIF4gYgogICAgXgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbm90W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9ub3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NAogICAgLy8gcmVzdWx0ID0gfmEKICAgIH4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2xzaGlmdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbHNoaWZ0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIHJlc3VsdCA9IGEgPDwgYgogICAgc2hsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9yc2hpZnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X3JzaGlmdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY0CiAgICAvLyByZXN1bHQgPSBhID4+IGIKICAgIHNocgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfcG93W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9wb3c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2OQogICAgLy8gcmVzdWx0ID0gYSoqYgogICAgZXhwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfZXE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3NAogICAgLy8gcmVzdWx0ID0gYSA9PSBiCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9uZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyByZXN1bHQgPSBhICE9IGIKICAgICE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODQKICAgIC8vIHJlc3VsdCA9IGEgPCBiCiAgICA8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2xlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODkKICAgIC8vIHJlc3VsdCA9IGEgPD0gYgogICAgPD0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9ndFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NAogICAgLy8gcmVzdWx0ID0gYSA+IGIKICAgID4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9nZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5OQogICAgLy8gcmVzdWx0ID0gYSA+PSBiCiAgICA+PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ieXRlc19pbml0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmVzdWx0ID0gb3AuaXRvYihyYXdfdmFsdWUpCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1MDAwOAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19hZGRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfYWRkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTExCiAgICAvLyBhID0gb3AuYnplcm8ocGFkX2Ffc2l6ZSkgKyBhCiAgICBzd2FwCiAgICBiemVybwogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTEyCiAgICAvLyBiID0gb3AuYnplcm8ocGFkX2Jfc2l6ZSkgKyBiCiAgICBzd2FwCiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTEzCiAgICAvLyByZXN1bHQgPSBhICsgYgogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExNAogICAgLy8gcmVzdWx0ID0gb3Auc2hhMjU2KHJlc3VsdCkKICAgIHNoYTI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUwMDIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX2VxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTE5CiAgICAvLyByZXN1bHQgPSBhID09IGIKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfbmVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfbmU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjQKICAgIC8vIHJlc3VsdCA9IGEgIT0gYgogICAgIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19hbmRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfYW5kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTI5CiAgICAvLyByZXN1bHQgPSBhICYgYgogICAgYiYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19vcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ieXRlc19vcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gcmVzdWx0ID0gYSB8IGIKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfeG9yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX3hvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gcmVzdWx0ID0gYSBeIGIKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfbm90W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX25vdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQ0CiAgICAvLyBhID0gb3AuYnplcm8ocGFkX3NpemUpICsgYQogICAgYnplcm8KICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDUKICAgIC8vIHJlc3VsdCA9IH5hCiAgICBifgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDYKICAgIC8vIHJlc3VsdCA9IG9wLnNoYTI1NihyZXN1bHQpCiAgICBzaGEyNTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FkZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICsgYl9iaWd1aW50CiAgICBiKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfYWRkX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1OQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICsgYgogICAgaXRvYgogICAgYisKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3N1Yltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X3N1YjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IC0gYl9iaWd1aW50CiAgICBiLQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfc3ViX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3MgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IC0gYgogICAgaXRvYgogICAgYi0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X211bFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X211bDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3OQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICogYl9iaWd1aW50CiAgICBiKgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbXVsX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X211bF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICogYgogICAgaXRvYgogICAgYioKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2Rpdltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2RpdjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE5MgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IC8vIGJfYmlndWludAogICAgYi8KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9kaXZfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTgKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCAvLyBiCiAgICBpdG9iCiAgICBiLwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbW9kW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbW9kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjA1CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJSBiX2JpZ3VpbnQKICAgIGIlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9tb2RfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbW9kX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjExCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJSBiCiAgICBpdG9iCiAgICBiJQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfYW5kW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfYW5kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjE4CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJiBiX2JpZ3VpbnQKICAgIGImCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9hbmRfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfYW5kX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI0CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJiBiCiAgICBpdG9iCiAgICBiJgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfb3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9vcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzMQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IHwgYl9iaWd1aW50CiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzcKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCB8IGIKICAgIGl0b2IKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF94b3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF94b3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDQKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCBeIGJfYmlndWludAogICAgYl4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3hvcl91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF94b3JfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTAKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCBeIGIKICAgIGl0b2IKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjU3CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPT0gYl9iaWd1aW50CiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjYzCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPT0gYgogICAgaXRvYgogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9uZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcwCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgIT0gYl9iaWd1aW50CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjc2CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgIT0gYgogICAgaXRvYgogICAgYiE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9sdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjgzCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPCBiX2JpZ3VpbnQKICAgIGI8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9sdF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9sdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI4OQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IDwgYgogICAgaXRvYgogICAgYjwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTYKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA8PSBiX2JpZ3VpbnQKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMDIKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA8PSBiCiAgICBpdG9iCiAgICBiPD0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2d0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMDkKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA+IGJfYmlndWludAogICAgYj4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzE1CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPiBiCiAgICBpdG9iCiAgICBiPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9nZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyMgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ID49IGJfYmlndWludAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9nZV91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9nZV91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ID49IGIKICAgIGl0b2IKICAgIGI+PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N0cmluZ19pbml0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzMzCiAgICAvLyByZXN1bHQgPSBTdHJpbmcoIkhlbGxvLCAiKSArIGEKICAgIHB1c2hieXRlcyAiSGVsbG8sICIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzM4CiAgICAvLyByZXN1bHQgPSBhLnN0YXJ0c3dpdGgoYikKICAgIGxlbgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGxlbgogICAgPgogICAgYnogdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoX3Rlcm5hcnlfZmFsc2VAMwogICAgaW50Y18xIC8vIDAKCnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aF90ZXJuYXJ5X21lcmdlQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoX3Rlcm5hcnlfZmFsc2VAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzM4CiAgICAvLyByZXN1bHQgPSBhLnN0YXJ0c3dpdGgoYikKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMAogICAgZGlnIDIKICAgIGV4dHJhY3QzCiAgICBkaWcgMgogICAgPT0KICAgIGIgdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoX3Rlcm5hcnlfbWVyZ2VANAoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19lbmRzd2l0aFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfZW5kc3dpdGg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gcmVzdWx0ID0gYS5lbmRzd2l0aChiKQogICAgbGVuCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID4KICAgIGJ6IHZlcmlmeV9zdHJpbmdfZW5kc3dpdGhfdGVybmFyeV9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMAoKdmVyaWZ5X3N0cmluZ19lbmRzd2l0aF90ZXJuYXJ5X21lcmdlQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKdmVyaWZ5X3N0cmluZ19lbmRzd2l0aF90ZXJuYXJ5X2ZhbHNlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gcmVzdWx0ID0gYS5lbmRzd2l0aChiKQogICAgZHVwCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICAtCiAgICBkaWcgNQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0MwogICAgZGlnIDMKICAgID09CiAgICBiIHZlcmlmeV9zdHJpbmdfZW5kc3dpdGhfdGVybmFyeV9tZXJnZUA0CgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2pvaW5bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2pvaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzQ4CiAgICAvLyByZXN1bHQgPSBTdHJpbmcoIiwgIikuam9pbigoYSwgYikpCiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgIiwgIgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNzMKICAgIC8vIGxvZyhhLCBiLCBjLCBkX2JpZ3VpbnQsIGUsIGYsIGcsIGgsIGksIGosIGFyYzRfaywgYXJjNF9tLCBhcmM0X24sIG8sIHNlcD0iLSIpCiAgICB1bmNvdmVyIDEzCiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmBAQVH3x1AQABLQYVH3x1ACAxG0EBszEZFEQxGESCPARyXGkrBBcxRVkEU/NIkwSIyLJpBKRkt6sEnIsRuARvQGVOBOyaKXQEx5NwjwR923SZBKIcRD0Ebn+yEgSwB/ywBC68INQEsJVLZgTdFArvBKzkdNoEumlJkARttYHABJHI24kE2+dxWASaDyLhBGQDPTcEKnI3xQTjqURYBEL4f30EK1VCpASb4vvpBBzZJRUEZOFwXATxJxxQBCq2O3AEg0u30gRTFiDXBD+552kE+o2wvASnLqSFBLewuhkEdEYMQgSrMgc4BFKtRlQEEBVjmQQPB1lXBL2EPf8Es3fTgQSJdnJlBEVrSyMEM9G4jARr+XPqBGfNa7IEP1iAWgQeEwA5BFCdyR0EpWSiAgQjZQdjBPjI+NUEI/r3pAR9Cv4VBEhYGt8EPa75zTYaAI48AAkAFwAnADcARwBXAGcAdwCHAJcAowCzAMMA0wDnAPsBDwEjATcBSwFdAYMBmwGzAc4B6QIEAhkCNAJOAmkCgwKeArgC0wLtAwgDIgM9A1cDcgOMA6cDwQPZA/AECAQfBDcETgRmBH0ElQSsBMQE2wT6BSsFZgWIADEZFDEYFBBDNhoBVwIAFxYoTFCwIkM2GgEXNhoCFwgWKExQsCJDNhoBFzYaAhcJFihMULAiQzYaARc2GgIXCxYoTFCwIkM2GgEXNhoCFwoWKExQsCJDNhoBFzYaAhcYFihMULAiQzYaARc2GgIXGhYoTFCwIkM2GgEXNhoCFxkWKExQsCJDNhoBFzYaAhcbFihMULAiQzYaARccFihMULAiQzYaARc2GgIXkBYoTFCwIkM2GgEXNhoCF5EWKExQsCJDNhoBFzYaAheUFihMULAiQzYaARc2GgIXEikjTwJUKExQsCJDNhoBFzYaAhcTKSNPAlQoTFCwIkM2GgEXNhoCFwwpI08CVChMULAiQzYaARc2GgIXDikjTwJUKExQsCJDNhoBFzYaAhcNKSNPAlQoTFCwIkM2GgEXNhoCFw8pI08CVChMULAiQzYaARcWgAYVH3x1AAhMULAiQzYaAVcCADYaAlcCADYaAxc2GgQXTK9PA1BMr08CUFABK0xQsCJDNhoBVwIANhoCVwIAEikjTwJUKExQsCJDNhoBVwIANhoCVwIAEykjTwJUKExQsCJDNhoBVwIANhoCVwIArEkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAq0kVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIArUkVFlcGAkxQKExQsCJDNhoBVwIANhoCF69MUK4BK0xQsCJDNhoBVwIANhoCVwIAoEkVFlcGAkxQKExQsCJDNhoBVwIANhoCFxagSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgChSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFqFJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKNJFRZXBgJMUChMULAiQzYaAVcCADYaAhcWo0kVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAokkVFlcGAkxQKExQsCJDNhoBVwIANhoCFxaiSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCqSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFqpJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKxJFRZXBgJMUChMULAiQzYaAVcCADYaAhcWrEkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAq0kVFlcGAkxQKExQsCJDNhoBVwIANhoCFxarSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCtSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFq1JFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKgpI08CVChMULAiQzYaAVcCADYaAhcWqCkjTwJUKExQsCJDNhoBVwIANhoCVwIAqSkjTwJUKExQsCJDNhoBVwIANhoCFxapKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgCkKSNPAlQoTFCwIkM2GgFXAgA2GgIXFqQpI08CVChMULAiQzYaAVcCADYaAlcCAKYpI08CVChMULAiQzYaAVcCADYaAhcWpikjTwJUKExQsCJDNhoBVwIANhoCVwIApSkjTwJUKExQsCJDNhoBVwIANhoCFxalKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgCnKSNPAlQoTFCwIkM2GgFXAgA2GgIXFqcpI08CVChMULAiQzYaAVcCAIAHSGVsbG8sIExQSRUWVwYCTFAoTFCwIkM2GgFXAgBJNhoCVwIASU4CFUlPAhUNQQAMIykjTwJUKExQsCJDSwIjSwJYSwISQv/pNhoBVwIASTYaAlcCAElOAhVJTwIVSU4CDUEADCMpI08CVChMULAiQ0lLAklOAglLBUxPAlhLAxJC/+I2GgFXAgA2GgJXAgBMgAIsIFBMUEkVFlcGAkxQKExQsCJDNhoBVwIANhoCFzYaA1cCADYaBFcCADYaBTYaBjYaBzYaCDYaCTYaCjYaC1cCADYaDFcCADYaDVcCADYaDk8NKlBPDRZQKlBPDFAqUE8LUCpQTwpQKlBPCVAqUE8IUCpQTwdQKlBPBlAqUE8FUCpQTwRQKlBPA1AqUE8CUCpQTFCwIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the PrimitiveOpsContract contract - */ -export type PrimitiveOpsContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify_uint64_init(byte[])uint64': { - rawValue: Uint8Array - } - 'verify_uint64_add(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_sub(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_mul(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_div(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_mod(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_and(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_or(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_xor(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_not(uint64)uint64': { - a: bigint | number - } - 'verify_uint64_lshift(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_rshift(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_pow(uint64,uint64)uint64': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_eq(uint64,uint64)bool': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_ne(uint64,uint64)bool': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_lt(uint64,uint64)bool': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_le(uint64,uint64)bool': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_gt(uint64,uint64)bool': { - a: bigint | number - b: bigint | number - } - 'verify_uint64_ge(uint64,uint64)bool': { - a: bigint | number - b: bigint | number - } - 'verify_bytes_init(uint64)byte[]': { - rawValue: bigint | number - } - 'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]': { - a: Uint8Array - b: Uint8Array - padASize: bigint | number - padBSize: bigint | number - } - 'verify_bytes_eq(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_bytes_ne(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_bytes_and(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_bytes_or(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_bytes_xor(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_bytes_not(byte[],uint64)byte[]': { - a: Uint8Array - padSize: bigint | number - } - 'verify_biguint_add(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_add_uint64(byte[],uint64)byte[]': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_sub(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_sub_uint64(byte[],uint64)byte[]': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_mul(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_mul_uint64(byte[],uint64)byte[]': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_div(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_div_uint64(byte[],uint64)byte[]': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_mod(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_mod_uint64(byte[],uint64)byte[]': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_and(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_and_uint64(byte[],uint64)byte[]': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_or(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_or_uint64(byte[],uint64)byte[]': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_xor(byte[],byte[])byte[]': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_xor_uint64(byte[],uint64)byte[]': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_eq(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_eq_uint64(byte[],uint64)bool': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_ne(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_ne_uint64(byte[],uint64)bool': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_lt(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_lt_uint64(byte[],uint64)bool': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_le(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_le_uint64(byte[],uint64)bool': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_gt(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_gt_uint64(byte[],uint64)bool': { - a: Uint8Array - b: bigint | number - } - 'verify_biguint_ge(byte[],byte[])bool': { - a: Uint8Array - b: Uint8Array - } - 'verify_biguint_ge_uint64(byte[],uint64)bool': { - a: Uint8Array - b: bigint | number - } - 'verify_string_init(string)string': { - a: string - } - 'verify_string_startswith(string,string)bool': { - a: string - b: string - } - 'verify_string_endswith(string,string)bool': { - a: string - b: string - } - 'verify_string_join(string,string)string': { - a: string - b: string - } - 'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void': { - a: string - b: bigint | number - c: Uint8Array - d: Uint8Array - e: boolean - f: string - g: bigint | number - h: bigint | number - i: number - j: number - k: Uint8Array - m: Uint8Array - n: Uint8Array - o: Uint8Array - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify_uint64_init(byte[])uint64': [rawValue: Uint8Array] - 'verify_uint64_add(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_uint64_sub(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_uint64_mul(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_uint64_div(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_uint64_mod(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_uint64_and(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_uint64_or(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_uint64_xor(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_uint64_not(uint64)uint64': [a: bigint | number] - 'verify_uint64_lshift(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_uint64_rshift(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_uint64_pow(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] - 'verify_uint64_eq(uint64,uint64)bool': [a: bigint | number, b: bigint | number] - 'verify_uint64_ne(uint64,uint64)bool': [a: bigint | number, b: bigint | number] - 'verify_uint64_lt(uint64,uint64)bool': [a: bigint | number, b: bigint | number] - 'verify_uint64_le(uint64,uint64)bool': [a: bigint | number, b: bigint | number] - 'verify_uint64_gt(uint64,uint64)bool': [a: bigint | number, b: bigint | number] - 'verify_uint64_ge(uint64,uint64)bool': [a: bigint | number, b: bigint | number] - 'verify_bytes_init(uint64)byte[]': [rawValue: bigint | number] - 'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]': [a: Uint8Array, b: Uint8Array, padASize: bigint | number, padBSize: bigint | number] - 'verify_bytes_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_bytes_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_bytes_and(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_bytes_or(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_bytes_xor(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_bytes_not(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] - 'verify_biguint_add(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_add_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] - 'verify_biguint_sub(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_sub_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] - 'verify_biguint_mul(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_mul_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] - 'verify_biguint_div(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_div_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] - 'verify_biguint_mod(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_mod_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] - 'verify_biguint_and(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_and_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] - 'verify_biguint_or(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_or_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] - 'verify_biguint_xor(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_xor_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] - 'verify_biguint_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_eq_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] - 'verify_biguint_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_ne_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] - 'verify_biguint_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_lt_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] - 'verify_biguint_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_le_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] - 'verify_biguint_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_gt_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] - 'verify_biguint_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] - 'verify_biguint_ge_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] - 'verify_string_init(string)string': [a: string] - 'verify_string_startswith(string,string)bool': [a: string, b: string] - 'verify_string_endswith(string,string)bool': [a: string, b: string] - 'verify_string_join(string,string)string': [a: string, b: string] - 'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void': [a: string, b: bigint | number, c: Uint8Array, d: Uint8Array, e: boolean, f: string, g: bigint | number, h: bigint | number, i: number, j: number, k: Uint8Array, m: Uint8Array, n: Uint8Array, o: Uint8Array] - } -} - -/** - * The return type for each method - */ -export type PrimitiveOpsContractReturns = { - 'verify_uint64_init(byte[])uint64': bigint - 'verify_uint64_add(uint64,uint64)uint64': bigint - 'verify_uint64_sub(uint64,uint64)uint64': bigint - 'verify_uint64_mul(uint64,uint64)uint64': bigint - 'verify_uint64_div(uint64,uint64)uint64': bigint - 'verify_uint64_mod(uint64,uint64)uint64': bigint - 'verify_uint64_and(uint64,uint64)uint64': bigint - 'verify_uint64_or(uint64,uint64)uint64': bigint - 'verify_uint64_xor(uint64,uint64)uint64': bigint - 'verify_uint64_not(uint64)uint64': bigint - 'verify_uint64_lshift(uint64,uint64)uint64': bigint - 'verify_uint64_rshift(uint64,uint64)uint64': bigint - 'verify_uint64_pow(uint64,uint64)uint64': bigint - 'verify_uint64_eq(uint64,uint64)bool': boolean - 'verify_uint64_ne(uint64,uint64)bool': boolean - 'verify_uint64_lt(uint64,uint64)bool': boolean - 'verify_uint64_le(uint64,uint64)bool': boolean - 'verify_uint64_gt(uint64,uint64)bool': boolean - 'verify_uint64_ge(uint64,uint64)bool': boolean - 'verify_bytes_init(uint64)byte[]': Uint8Array - 'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]': Uint8Array - 'verify_bytes_eq(byte[],byte[])bool': boolean - 'verify_bytes_ne(byte[],byte[])bool': boolean - 'verify_bytes_and(byte[],byte[])byte[]': Uint8Array - 'verify_bytes_or(byte[],byte[])byte[]': Uint8Array - 'verify_bytes_xor(byte[],byte[])byte[]': Uint8Array - 'verify_bytes_not(byte[],uint64)byte[]': Uint8Array - 'verify_biguint_add(byte[],byte[])byte[]': Uint8Array - 'verify_biguint_add_uint64(byte[],uint64)byte[]': Uint8Array - 'verify_biguint_sub(byte[],byte[])byte[]': Uint8Array - 'verify_biguint_sub_uint64(byte[],uint64)byte[]': Uint8Array - 'verify_biguint_mul(byte[],byte[])byte[]': Uint8Array - 'verify_biguint_mul_uint64(byte[],uint64)byte[]': Uint8Array - 'verify_biguint_div(byte[],byte[])byte[]': Uint8Array - 'verify_biguint_div_uint64(byte[],uint64)byte[]': Uint8Array - 'verify_biguint_mod(byte[],byte[])byte[]': Uint8Array - 'verify_biguint_mod_uint64(byte[],uint64)byte[]': Uint8Array - 'verify_biguint_and(byte[],byte[])byte[]': Uint8Array - 'verify_biguint_and_uint64(byte[],uint64)byte[]': Uint8Array - 'verify_biguint_or(byte[],byte[])byte[]': Uint8Array - 'verify_biguint_or_uint64(byte[],uint64)byte[]': Uint8Array - 'verify_biguint_xor(byte[],byte[])byte[]': Uint8Array - 'verify_biguint_xor_uint64(byte[],uint64)byte[]': Uint8Array - 'verify_biguint_eq(byte[],byte[])bool': boolean - 'verify_biguint_eq_uint64(byte[],uint64)bool': boolean - 'verify_biguint_ne(byte[],byte[])bool': boolean - 'verify_biguint_ne_uint64(byte[],uint64)bool': boolean - 'verify_biguint_lt(byte[],byte[])bool': boolean - 'verify_biguint_lt_uint64(byte[],uint64)bool': boolean - 'verify_biguint_le(byte[],byte[])bool': boolean - 'verify_biguint_le_uint64(byte[],uint64)bool': boolean - 'verify_biguint_gt(byte[],byte[])bool': boolean - 'verify_biguint_gt_uint64(byte[],uint64)bool': boolean - 'verify_biguint_ge(byte[],byte[])bool': boolean - 'verify_biguint_ge_uint64(byte[],uint64)bool': boolean - 'verify_string_init(string)string': string - 'verify_string_startswith(string,string)bool': boolean - 'verify_string_endswith(string,string)bool': boolean - 'verify_string_join(string,string)string': string - 'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void': void -} - -/** - * Defines the types of available calls and state of the PrimitiveOpsContract smart contract. - */ -export type PrimitiveOpsContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify_uint64_init(byte[])uint64' | 'verify_uint64_init', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_init(byte[])uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_init(byte[])uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_init(byte[])uint64'] - }> - & Record<'verify_uint64_add(uint64,uint64)uint64' | 'verify_uint64_add', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_add(uint64,uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_add(uint64,uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_add(uint64,uint64)uint64'] - }> - & Record<'verify_uint64_sub(uint64,uint64)uint64' | 'verify_uint64_sub', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_sub(uint64,uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_sub(uint64,uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_sub(uint64,uint64)uint64'] - }> - & Record<'verify_uint64_mul(uint64,uint64)uint64' | 'verify_uint64_mul', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_mul(uint64,uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_mul(uint64,uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_mul(uint64,uint64)uint64'] - }> - & Record<'verify_uint64_div(uint64,uint64)uint64' | 'verify_uint64_div', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_div(uint64,uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_div(uint64,uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_div(uint64,uint64)uint64'] - }> - & Record<'verify_uint64_mod(uint64,uint64)uint64' | 'verify_uint64_mod', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_mod(uint64,uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_mod(uint64,uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_mod(uint64,uint64)uint64'] - }> - & Record<'verify_uint64_and(uint64,uint64)uint64' | 'verify_uint64_and', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_and(uint64,uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_and(uint64,uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_and(uint64,uint64)uint64'] - }> - & Record<'verify_uint64_or(uint64,uint64)uint64' | 'verify_uint64_or', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_or(uint64,uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_or(uint64,uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_or(uint64,uint64)uint64'] - }> - & Record<'verify_uint64_xor(uint64,uint64)uint64' | 'verify_uint64_xor', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_xor(uint64,uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_xor(uint64,uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_xor(uint64,uint64)uint64'] - }> - & Record<'verify_uint64_not(uint64)uint64' | 'verify_uint64_not', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_not(uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_not(uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_not(uint64)uint64'] - }> - & Record<'verify_uint64_lshift(uint64,uint64)uint64' | 'verify_uint64_lshift', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_lshift(uint64,uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_lshift(uint64,uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_lshift(uint64,uint64)uint64'] - }> - & Record<'verify_uint64_rshift(uint64,uint64)uint64' | 'verify_uint64_rshift', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_rshift(uint64,uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_rshift(uint64,uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_rshift(uint64,uint64)uint64'] - }> - & Record<'verify_uint64_pow(uint64,uint64)uint64' | 'verify_uint64_pow', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_pow(uint64,uint64)uint64'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_pow(uint64,uint64)uint64'] - returns: PrimitiveOpsContractReturns['verify_uint64_pow(uint64,uint64)uint64'] - }> - & Record<'verify_uint64_eq(uint64,uint64)bool' | 'verify_uint64_eq', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_eq(uint64,uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_eq(uint64,uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_uint64_eq(uint64,uint64)bool'] - }> - & Record<'verify_uint64_ne(uint64,uint64)bool' | 'verify_uint64_ne', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_ne(uint64,uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_ne(uint64,uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_uint64_ne(uint64,uint64)bool'] - }> - & Record<'verify_uint64_lt(uint64,uint64)bool' | 'verify_uint64_lt', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_lt(uint64,uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_lt(uint64,uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_uint64_lt(uint64,uint64)bool'] - }> - & Record<'verify_uint64_le(uint64,uint64)bool' | 'verify_uint64_le', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_le(uint64,uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_le(uint64,uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_uint64_le(uint64,uint64)bool'] - }> - & Record<'verify_uint64_gt(uint64,uint64)bool' | 'verify_uint64_gt', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_gt(uint64,uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_gt(uint64,uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_uint64_gt(uint64,uint64)bool'] - }> - & Record<'verify_uint64_ge(uint64,uint64)bool' | 'verify_uint64_ge', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_ge(uint64,uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_ge(uint64,uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_uint64_ge(uint64,uint64)bool'] - }> - & Record<'verify_bytes_init(uint64)byte[]' | 'verify_bytes_init', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_init(uint64)byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_init(uint64)byte[]'] - returns: PrimitiveOpsContractReturns['verify_bytes_init(uint64)byte[]'] - }> - & Record<'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]' | 'verify_bytes_add', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'] - returns: PrimitiveOpsContractReturns['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'] - }> - & Record<'verify_bytes_eq(byte[],byte[])bool' | 'verify_bytes_eq', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_eq(byte[],byte[])bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_eq(byte[],byte[])bool'] - returns: PrimitiveOpsContractReturns['verify_bytes_eq(byte[],byte[])bool'] - }> - & Record<'verify_bytes_ne(byte[],byte[])bool' | 'verify_bytes_ne', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_ne(byte[],byte[])bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_ne(byte[],byte[])bool'] - returns: PrimitiveOpsContractReturns['verify_bytes_ne(byte[],byte[])bool'] - }> - & Record<'verify_bytes_and(byte[],byte[])byte[]' | 'verify_bytes_and', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_and(byte[],byte[])byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_and(byte[],byte[])byte[]'] - returns: PrimitiveOpsContractReturns['verify_bytes_and(byte[],byte[])byte[]'] - }> - & Record<'verify_bytes_or(byte[],byte[])byte[]' | 'verify_bytes_or', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_or(byte[],byte[])byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_or(byte[],byte[])byte[]'] - returns: PrimitiveOpsContractReturns['verify_bytes_or(byte[],byte[])byte[]'] - }> - & Record<'verify_bytes_xor(byte[],byte[])byte[]' | 'verify_bytes_xor', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_xor(byte[],byte[])byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_xor(byte[],byte[])byte[]'] - returns: PrimitiveOpsContractReturns['verify_bytes_xor(byte[],byte[])byte[]'] - }> - & Record<'verify_bytes_not(byte[],uint64)byte[]' | 'verify_bytes_not', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_not(byte[],uint64)byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_not(byte[],uint64)byte[]'] - returns: PrimitiveOpsContractReturns['verify_bytes_not(byte[],uint64)byte[]'] - }> - & Record<'verify_biguint_add(byte[],byte[])byte[]' | 'verify_biguint_add', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_add(byte[],byte[])byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_add(byte[],byte[])byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_add(byte[],byte[])byte[]'] - }> - & Record<'verify_biguint_add_uint64(byte[],uint64)byte[]' | 'verify_biguint_add_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_add_uint64(byte[],uint64)byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_add_uint64(byte[],uint64)byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_add_uint64(byte[],uint64)byte[]'] - }> - & Record<'verify_biguint_sub(byte[],byte[])byte[]' | 'verify_biguint_sub', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_sub(byte[],byte[])byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_sub(byte[],byte[])byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_sub(byte[],byte[])byte[]'] - }> - & Record<'verify_biguint_sub_uint64(byte[],uint64)byte[]' | 'verify_biguint_sub_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_sub_uint64(byte[],uint64)byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_sub_uint64(byte[],uint64)byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_sub_uint64(byte[],uint64)byte[]'] - }> - & Record<'verify_biguint_mul(byte[],byte[])byte[]' | 'verify_biguint_mul', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_mul(byte[],byte[])byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_mul(byte[],byte[])byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_mul(byte[],byte[])byte[]'] - }> - & Record<'verify_biguint_mul_uint64(byte[],uint64)byte[]' | 'verify_biguint_mul_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_mul_uint64(byte[],uint64)byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_mul_uint64(byte[],uint64)byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_mul_uint64(byte[],uint64)byte[]'] - }> - & Record<'verify_biguint_div(byte[],byte[])byte[]' | 'verify_biguint_div', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_div(byte[],byte[])byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_div(byte[],byte[])byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_div(byte[],byte[])byte[]'] - }> - & Record<'verify_biguint_div_uint64(byte[],uint64)byte[]' | 'verify_biguint_div_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_div_uint64(byte[],uint64)byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_div_uint64(byte[],uint64)byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_div_uint64(byte[],uint64)byte[]'] - }> - & Record<'verify_biguint_mod(byte[],byte[])byte[]' | 'verify_biguint_mod', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_mod(byte[],byte[])byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_mod(byte[],byte[])byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_mod(byte[],byte[])byte[]'] - }> - & Record<'verify_biguint_mod_uint64(byte[],uint64)byte[]' | 'verify_biguint_mod_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_mod_uint64(byte[],uint64)byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_mod_uint64(byte[],uint64)byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_mod_uint64(byte[],uint64)byte[]'] - }> - & Record<'verify_biguint_and(byte[],byte[])byte[]' | 'verify_biguint_and', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_and(byte[],byte[])byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_and(byte[],byte[])byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_and(byte[],byte[])byte[]'] - }> - & Record<'verify_biguint_and_uint64(byte[],uint64)byte[]' | 'verify_biguint_and_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_and_uint64(byte[],uint64)byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_and_uint64(byte[],uint64)byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_and_uint64(byte[],uint64)byte[]'] - }> - & Record<'verify_biguint_or(byte[],byte[])byte[]' | 'verify_biguint_or', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_or(byte[],byte[])byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_or(byte[],byte[])byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_or(byte[],byte[])byte[]'] - }> - & Record<'verify_biguint_or_uint64(byte[],uint64)byte[]' | 'verify_biguint_or_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_or_uint64(byte[],uint64)byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_or_uint64(byte[],uint64)byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_or_uint64(byte[],uint64)byte[]'] - }> - & Record<'verify_biguint_xor(byte[],byte[])byte[]' | 'verify_biguint_xor', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_xor(byte[],byte[])byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_xor(byte[],byte[])byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_xor(byte[],byte[])byte[]'] - }> - & Record<'verify_biguint_xor_uint64(byte[],uint64)byte[]' | 'verify_biguint_xor_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_xor_uint64(byte[],uint64)byte[]'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_xor_uint64(byte[],uint64)byte[]'] - returns: PrimitiveOpsContractReturns['verify_biguint_xor_uint64(byte[],uint64)byte[]'] - }> - & Record<'verify_biguint_eq(byte[],byte[])bool' | 'verify_biguint_eq', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_eq(byte[],byte[])bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_eq(byte[],byte[])bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_eq(byte[],byte[])bool'] - }> - & Record<'verify_biguint_eq_uint64(byte[],uint64)bool' | 'verify_biguint_eq_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_eq_uint64(byte[],uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_eq_uint64(byte[],uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_eq_uint64(byte[],uint64)bool'] - }> - & Record<'verify_biguint_ne(byte[],byte[])bool' | 'verify_biguint_ne', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_ne(byte[],byte[])bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_ne(byte[],byte[])bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_ne(byte[],byte[])bool'] - }> - & Record<'verify_biguint_ne_uint64(byte[],uint64)bool' | 'verify_biguint_ne_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_ne_uint64(byte[],uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_ne_uint64(byte[],uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_ne_uint64(byte[],uint64)bool'] - }> - & Record<'verify_biguint_lt(byte[],byte[])bool' | 'verify_biguint_lt', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_lt(byte[],byte[])bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_lt(byte[],byte[])bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_lt(byte[],byte[])bool'] - }> - & Record<'verify_biguint_lt_uint64(byte[],uint64)bool' | 'verify_biguint_lt_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_lt_uint64(byte[],uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_lt_uint64(byte[],uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_lt_uint64(byte[],uint64)bool'] - }> - & Record<'verify_biguint_le(byte[],byte[])bool' | 'verify_biguint_le', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_le(byte[],byte[])bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_le(byte[],byte[])bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_le(byte[],byte[])bool'] - }> - & Record<'verify_biguint_le_uint64(byte[],uint64)bool' | 'verify_biguint_le_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_le_uint64(byte[],uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_le_uint64(byte[],uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_le_uint64(byte[],uint64)bool'] - }> - & Record<'verify_biguint_gt(byte[],byte[])bool' | 'verify_biguint_gt', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_gt(byte[],byte[])bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_gt(byte[],byte[])bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_gt(byte[],byte[])bool'] - }> - & Record<'verify_biguint_gt_uint64(byte[],uint64)bool' | 'verify_biguint_gt_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_gt_uint64(byte[],uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_gt_uint64(byte[],uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_gt_uint64(byte[],uint64)bool'] - }> - & Record<'verify_biguint_ge(byte[],byte[])bool' | 'verify_biguint_ge', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_ge(byte[],byte[])bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_ge(byte[],byte[])bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_ge(byte[],byte[])bool'] - }> - & Record<'verify_biguint_ge_uint64(byte[],uint64)bool' | 'verify_biguint_ge_uint64', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_ge_uint64(byte[],uint64)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_ge_uint64(byte[],uint64)bool'] - returns: PrimitiveOpsContractReturns['verify_biguint_ge_uint64(byte[],uint64)bool'] - }> - & Record<'verify_string_init(string)string' | 'verify_string_init', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_string_init(string)string'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_string_init(string)string'] - returns: PrimitiveOpsContractReturns['verify_string_init(string)string'] - }> - & Record<'verify_string_startswith(string,string)bool' | 'verify_string_startswith', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_string_startswith(string,string)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_string_startswith(string,string)bool'] - returns: PrimitiveOpsContractReturns['verify_string_startswith(string,string)bool'] - }> - & Record<'verify_string_endswith(string,string)bool' | 'verify_string_endswith', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_string_endswith(string,string)bool'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_string_endswith(string,string)bool'] - returns: PrimitiveOpsContractReturns['verify_string_endswith(string,string)bool'] - }> - & Record<'verify_string_join(string,string)string' | 'verify_string_join', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_string_join(string,string)string'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_string_join(string,string)string'] - returns: PrimitiveOpsContractReturns['verify_string_join(string,string)string'] - }> - & Record<'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void' | 'verify_log', { - argsObj: PrimitiveOpsContractArgs['obj']['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'] - argsTuple: PrimitiveOpsContractArgs['tuple']['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'] - returns: PrimitiveOpsContractReturns['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type PrimitiveOpsContractSignatures = keyof PrimitiveOpsContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type PrimitiveOpsContractNonVoidMethodSignatures = keyof PrimitiveOpsContractTypes['methods'] extends infer T ? T extends keyof PrimitiveOpsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the PrimitiveOpsContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = PrimitiveOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the PrimitiveOpsContract smart contract to the method's return type - */ -export type MethodReturn = PrimitiveOpsContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type PrimitiveOpsContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type PrimitiveOpsContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: PrimitiveOpsContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the PrimitiveOpsContract smart contract - */ -export abstract class PrimitiveOpsContractParamsFactory { - /** - * Constructs a no op call for the verify_uint64_init(byte[])uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Init(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_init(byte[])uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.rawValue], - } - } - /** - * Constructs a no op call for the verify_uint64_add(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Add(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_add(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_sub(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Sub(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_sub(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_mul(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Mul(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_mul(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_div(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Div(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_div(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_mod(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Mod(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_mod(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_and(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64And(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_and(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_or(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Or(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_or(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_xor(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Xor(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_xor(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_not(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Not(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_not(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_uint64_lshift(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Lshift(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_lshift(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_rshift(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Rshift(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_rshift(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_pow(uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Pow(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_pow(uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_eq(uint64,uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Eq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_eq(uint64,uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_ne(uint64,uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Ne(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_ne(uint64,uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_lt(uint64,uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Lt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_lt(uint64,uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_le(uint64,uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Le(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_le(uint64,uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_gt(uint64,uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Gt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_gt(uint64,uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_uint64_ge(uint64,uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyUint64Ge(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_uint64_ge(uint64,uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_bytes_init(uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBytesInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bytes_init(uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.rawValue], - } - } - /** - * Constructs a no op call for the verify_bytes_add(byte[],byte[],uint64,uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBytesAdd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.padASize, params.args.padBSize], - } - } - /** - * Constructs a no op call for the verify_bytes_eq(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBytesEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bytes_eq(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_bytes_ne(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBytesNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bytes_ne(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_bytes_and(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBytesAnd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bytes_and(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_bytes_or(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBytesOr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bytes_or(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_bytes_xor(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBytesXor(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bytes_xor(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_bytes_not(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBytesNot(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_bytes_not(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], - } - } - /** - * Constructs a no op call for the verify_biguint_add(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintAdd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_add(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_add_uint64(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintAddUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_add_uint64(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_sub(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintSub(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_sub(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_sub_uint64(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintSubUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_sub_uint64(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_mul(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintMul(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_mul(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_mul_uint64(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintMulUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_mul_uint64(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_div(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintDiv(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_div(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_div_uint64(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintDivUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_div_uint64(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_mod(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintMod(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_mod(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_mod_uint64(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintModUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_mod_uint64(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_and(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintAnd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_and(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_and_uint64(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintAndUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_and_uint64(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_or(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintOr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_or(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_or_uint64(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintOrUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_or_uint64(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_xor(byte[],byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintXor(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_xor(byte[],byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_xor_uint64(byte[],uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintXorUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_xor_uint64(byte[],uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_eq(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_eq(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_eq_uint64(byte[],uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintEqUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_eq_uint64(byte[],uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_ne(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_ne(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_ne_uint64(byte[],uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintNeUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_ne_uint64(byte[],uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_lt(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_lt(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_lt_uint64(byte[],uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintLtUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_lt_uint64(byte[],uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_le(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_le(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_le_uint64(byte[],uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintLeUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_le_uint64(byte[],uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_gt(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_gt(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_gt_uint64(byte[],uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintGtUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_gt_uint64(byte[],uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_ge(byte[],byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_ge(byte[],byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_biguint_ge_uint64(byte[],uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyBiguintGeUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_biguint_ge_uint64(byte[],uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_string_init(string)string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyStringInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_string_init(string)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_string_startswith(string,string)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyStringStartswith(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_string_startswith(string,string)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_string_endswith(string,string)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyStringEndswith(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_string_endswith(string,string)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_string_join(string,string)string ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyStringJoin(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_string_join(string,string)string' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d, params.args.e, params.args.f, params.args.g, params.args.h, params.args.i, params.args.j, params.args.k, params.args.m, params.args.n, params.args.o], - } - } -} - -/** - * A factory to create and deploy one or more instance of the PrimitiveOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class PrimitiveOpsContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `PrimitiveOpsContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new PrimitiveOpsContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new PrimitiveOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the PrimitiveOpsContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: PrimitiveOpsContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new PrimitiveOpsContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the PrimitiveOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the PrimitiveOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the PrimitiveOpsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new PrimitiveOpsContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the PrimitiveOpsContract smart contract - */ -export class PrimitiveOpsContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `PrimitiveOpsContractClient` - * - * @param appClient An `AppClient` instance which has been created with the PrimitiveOpsContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `PrimitiveOpsContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `PrimitiveOpsContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new PrimitiveOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `PrimitiveOpsContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new PrimitiveOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the PrimitiveOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_init(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Init: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Init(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_add(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Add: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Add(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_sub(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Sub: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Sub(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mul(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Mul: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Mul(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_div(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Div: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Div(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mod(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Mod: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Mod(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_and(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64And: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64And(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_or(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Or: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Or(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_xor(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Xor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Xor(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_not(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Not: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Not(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lshift(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Lshift: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Lshift(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_rshift(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Rshift: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Rshift(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_pow(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Pow: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Pow(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_eq(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Eq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Eq(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ne(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Ne: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Ne(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lt(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Lt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Lt(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_le(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Le: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Le(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_gt(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Gt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Gt(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ge(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyUint64Ge: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Ge(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_init(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBytesInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesInit(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_add(byte[],byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBytesAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesAdd(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBytesEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesEq(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBytesNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesNe(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_and(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBytesAnd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesAnd(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_or(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBytesOr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesOr(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_xor(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBytesXor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesXor(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_not(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBytesNot: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesNot(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintAdd(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintAddUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintAddUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintSub: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintSub(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintSubUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintSubUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintMul: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintMul(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintMulUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintMulUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintDiv: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintDiv(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintDivUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintDivUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintMod: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintMod(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintModUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintModUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintAnd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintAnd(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintAndUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintAndUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintOr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintOr(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintOrUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintOrUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintXor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintXor(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintXorUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintXorUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintEq(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintEqUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintEqUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintNe(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintNeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintNeUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintLt(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintLtUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintLtUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintLe(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintLeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintLeUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintGt(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintGtUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintGtUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintGe(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyBiguintGeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintGeUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyStringInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyStringInit(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_startswith(string,string)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyStringStartswith: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyStringStartswith(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_endswith(string,string)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyStringEndswith: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyStringEndswith(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_join(string,string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyStringJoin: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyStringJoin(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyLog(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the PrimitiveOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_init(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Init: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Init(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_add(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Add: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Add(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_sub(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Sub: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Sub(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mul(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Mul: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Mul(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_div(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Div: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Div(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mod(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Mod: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Mod(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_and(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64And: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64And(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_or(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Or: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Or(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_xor(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Xor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Xor(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_not(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Not: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Not(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lshift(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Lshift: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Lshift(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_rshift(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Rshift: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Rshift(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_pow(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Pow: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Pow(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_eq(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Eq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Eq(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ne(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Ne: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Ne(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lt(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Lt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Lt(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_le(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Le: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Le(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_gt(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Gt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Gt(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ge(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyUint64Ge: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Ge(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_init(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBytesInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesInit(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_add(byte[],byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBytesAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesAdd(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBytesEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesEq(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBytesNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesNe(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_and(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBytesAnd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesAnd(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_or(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBytesOr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesOr(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_xor(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBytesXor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesXor(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_not(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBytesNot: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesNot(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintAdd(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintAddUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintAddUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintSub: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintSub(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintSubUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintSubUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintMul: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintMul(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintMulUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintMulUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintDiv: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintDiv(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintDivUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintDivUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintMod: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintMod(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintModUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintModUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintAnd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintAnd(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintAndUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintAndUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintOr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintOr(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintOrUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintOrUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintXor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintXor(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintXorUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintXorUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintEq(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintEqUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintEqUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintNe(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintNeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintNeUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintLt(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintLtUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintLtUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintLe(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintLeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintLeUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintGt(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintGtUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintGtUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintGe(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyBiguintGeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintGeUint64(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyStringInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyStringInit(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_startswith(string,string)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyStringStartswith: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyStringStartswith(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_endswith(string,string)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyStringEndswith: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyStringEndswith(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_join(string,string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyStringJoin: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyStringJoin(params)) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyLog(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the PrimitiveOpsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_init(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Init: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Init(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_init(byte[])uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_add(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Add: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Add(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_add(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_sub(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Sub: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Sub(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_sub(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mul(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Mul: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Mul(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_mul(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_div(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Div: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Div(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_div(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mod(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Mod: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Mod(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_mod(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_and(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64And: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64And(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_and(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_or(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Or: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Or(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_or(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_xor(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Xor: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Xor(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_xor(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_not(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Not: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Not(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_not(uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lshift(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Lshift: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Lshift(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_lshift(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_rshift(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Rshift: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Rshift(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_rshift(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_pow(uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Pow: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Pow(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_pow(uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_eq(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Eq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Eq(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_eq(uint64,uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ne(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Ne: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Ne(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_ne(uint64,uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lt(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Lt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Lt(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_lt(uint64,uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_le(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Le: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Le(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_le(uint64,uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_gt(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Gt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Gt(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_gt(uint64,uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ge(uint64,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyUint64Ge: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Ge(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_ge(uint64,uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_init(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBytesInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesInit(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_init(uint64)byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_add(byte[],byte[],uint64,uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBytesAdd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesAdd(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBytesEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesEq(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_eq(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBytesNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesNe(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_ne(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_and(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBytesAnd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesAnd(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_and(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_or(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBytesOr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesOr(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_or(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_xor(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBytesXor: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesXor(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_xor(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_not(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBytesNot: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesNot(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_not(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintAdd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintAdd(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_add(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintAddUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintAddUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_add_uint64(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintSub: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintSub(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_sub(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintSubUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintSubUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_sub_uint64(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintMul: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintMul(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_mul(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintMulUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintMulUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_mul_uint64(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintDiv: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintDiv(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_div(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintDivUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintDivUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_div_uint64(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintMod: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintMod(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_mod(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintModUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintModUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_mod_uint64(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintAnd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintAnd(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_and(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintAndUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintAndUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_and_uint64(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintOr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintOr(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_or(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintOrUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintOrUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_or_uint64(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor(byte[],byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintXor: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintXor(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_xor(byte[],byte[])byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor_uint64(byte[],uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintXorUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintXorUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_xor_uint64(byte[],uint64)byte[]'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintEq(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_eq(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintEqUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintEqUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_eq_uint64(byte[],uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintNe(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_ne(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintNeUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintNeUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_ne_uint64(byte[],uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintLt(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_lt(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintLtUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintLtUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_lt_uint64(byte[],uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintLe(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_le(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintLeUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintLeUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_le_uint64(byte[],uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintGt(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_gt(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintGtUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintGtUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_gt_uint64(byte[],uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge(byte[],byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintGe(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_ge(byte[],byte[])bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge_uint64(byte[],uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyBiguintGeUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintGeUint64(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_ge_uint64(byte[],uint64)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyStringInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyStringInit(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_string_init(string)string'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_startswith(string,string)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyStringStartswith: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyStringStartswith(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_string_startswith(string,string)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_endswith(string,string)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyStringEndswith: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyStringEndswith(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_string_endswith(string,string)bool'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_join(string,string)string` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyStringJoin: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyStringJoin(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_string_join(string,string)string'])} - }, - - /** - * Makes a call to the PrimitiveOpsContract smart contract using the `verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyLog(params)) - return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new PrimitiveOpsContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current PrimitiveOpsContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): PrimitiveOpsContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_uint64_init(byte[])uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Init(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Init(params))) - return this - }, - /** - * Add a verify_uint64_add(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Add(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Add(params))) - return this - }, - /** - * Add a verify_uint64_sub(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Sub(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Sub(params))) - return this - }, - /** - * Add a verify_uint64_mul(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Mul(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Mul(params))) - return this - }, - /** - * Add a verify_uint64_div(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Div(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Div(params))) - return this - }, - /** - * Add a verify_uint64_mod(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Mod(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Mod(params))) - return this - }, - /** - * Add a verify_uint64_and(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64And(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64And(params))) - return this - }, - /** - * Add a verify_uint64_or(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Or(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Or(params))) - return this - }, - /** - * Add a verify_uint64_xor(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Xor(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Xor(params))) - return this - }, - /** - * Add a verify_uint64_not(uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Not(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Not(params))) - return this - }, - /** - * Add a verify_uint64_lshift(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Lshift(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Lshift(params))) - return this - }, - /** - * Add a verify_uint64_rshift(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Rshift(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Rshift(params))) - return this - }, - /** - * Add a verify_uint64_pow(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract - */ - verifyUint64Pow(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Pow(params))) - return this - }, - /** - * Add a verify_uint64_eq(uint64,uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyUint64Eq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Eq(params))) - return this - }, - /** - * Add a verify_uint64_ne(uint64,uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyUint64Ne(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Ne(params))) - return this - }, - /** - * Add a verify_uint64_lt(uint64,uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyUint64Lt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Lt(params))) - return this - }, - /** - * Add a verify_uint64_le(uint64,uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyUint64Le(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Le(params))) - return this - }, - /** - * Add a verify_uint64_gt(uint64,uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyUint64Gt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Gt(params))) - return this - }, - /** - * Add a verify_uint64_ge(uint64,uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyUint64Ge(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Ge(params))) - return this - }, - /** - * Add a verify_bytes_init(uint64)byte[] method call against the PrimitiveOpsContract contract - */ - verifyBytesInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesInit(params))) - return this - }, - /** - * Add a verify_bytes_add(byte[],byte[],uint64,uint64)byte[] method call against the PrimitiveOpsContract contract - */ - verifyBytesAdd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesAdd(params))) - return this - }, - /** - * Add a verify_bytes_eq(byte[],byte[])bool method call against the PrimitiveOpsContract contract - */ - verifyBytesEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesEq(params))) - return this - }, - /** - * Add a verify_bytes_ne(byte[],byte[])bool method call against the PrimitiveOpsContract contract - */ - verifyBytesNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesNe(params))) - return this - }, - /** - * Add a verify_bytes_and(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract - */ - verifyBytesAnd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesAnd(params))) - return this - }, - /** - * Add a verify_bytes_or(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract - */ - verifyBytesOr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesOr(params))) - return this - }, - /** - * Add a verify_bytes_xor(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract - */ - verifyBytesXor(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesXor(params))) - return this - }, - /** - * Add a verify_bytes_not(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract - */ - verifyBytesNot(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesNot(params))) - return this - }, - /** - * Add a verify_biguint_add(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintAdd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintAdd(params))) - return this - }, - /** - * Add a verify_biguint_add_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintAddUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintAddUint64(params))) - return this - }, - /** - * Add a verify_biguint_sub(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintSub(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintSub(params))) - return this - }, - /** - * Add a verify_biguint_sub_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintSubUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintSubUint64(params))) - return this - }, - /** - * Add a verify_biguint_mul(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintMul(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintMul(params))) - return this - }, - /** - * Add a verify_biguint_mul_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintMulUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintMulUint64(params))) - return this - }, - /** - * Add a verify_biguint_div(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintDiv(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintDiv(params))) - return this - }, - /** - * Add a verify_biguint_div_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintDivUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintDivUint64(params))) - return this - }, - /** - * Add a verify_biguint_mod(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintMod(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintMod(params))) - return this - }, - /** - * Add a verify_biguint_mod_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintModUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintModUint64(params))) - return this - }, - /** - * Add a verify_biguint_and(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintAnd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintAnd(params))) - return this - }, - /** - * Add a verify_biguint_and_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintAndUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintAndUint64(params))) - return this - }, - /** - * Add a verify_biguint_or(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintOr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintOr(params))) - return this - }, - /** - * Add a verify_biguint_or_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintOrUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintOrUint64(params))) - return this - }, - /** - * Add a verify_biguint_xor(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintXor(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintXor(params))) - return this - }, - /** - * Add a verify_biguint_xor_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract - */ - verifyBiguintXorUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintXorUint64(params))) - return this - }, - /** - * Add a verify_biguint_eq(byte[],byte[])bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintEq(params))) - return this - }, - /** - * Add a verify_biguint_eq_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintEqUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintEqUint64(params))) - return this - }, - /** - * Add a verify_biguint_ne(byte[],byte[])bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintNe(params))) - return this - }, - /** - * Add a verify_biguint_ne_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintNeUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintNeUint64(params))) - return this - }, - /** - * Add a verify_biguint_lt(byte[],byte[])bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintLt(params))) - return this - }, - /** - * Add a verify_biguint_lt_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintLtUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintLtUint64(params))) - return this - }, - /** - * Add a verify_biguint_le(byte[],byte[])bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintLe(params))) - return this - }, - /** - * Add a verify_biguint_le_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintLeUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintLeUint64(params))) - return this - }, - /** - * Add a verify_biguint_gt(byte[],byte[])bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintGt(params))) - return this - }, - /** - * Add a verify_biguint_gt_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintGtUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintGtUint64(params))) - return this - }, - /** - * Add a verify_biguint_ge(byte[],byte[])bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintGe(params))) - return this - }, - /** - * Add a verify_biguint_ge_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract - */ - verifyBiguintGeUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintGeUint64(params))) - return this - }, - /** - * Add a verify_string_init(string)string method call against the PrimitiveOpsContract contract - */ - verifyStringInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringInit(params))) - return this - }, - /** - * Add a verify_string_startswith(string,string)bool method call against the PrimitiveOpsContract contract - */ - verifyStringStartswith(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringStartswith(params))) - return this - }, - /** - * Add a verify_string_endswith(string,string)bool method call against the PrimitiveOpsContract contract - */ - verifyStringEndswith(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringEndswith(params))) - return this - }, - /** - * Add a verify_string_join(string,string)string method call against the PrimitiveOpsContract contract - */ - verifyStringJoin(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringJoin(params))) - return this - }, - /** - * Add a verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void method call against the PrimitiveOpsContract contract - */ - verifyLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyLog(params))) - return this - }, - /** - * Add a clear state call to the PrimitiveOpsContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as PrimitiveOpsContractComposer - } -} -export type PrimitiveOpsContractComposer = { - /** - * Calls the verify_uint64_init(byte[])uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Init(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_init(byte[])uint64'] | undefined]> - - /** - * Calls the verify_uint64_add(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Add(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_add(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_sub(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Sub(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_sub(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_mul(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Mul(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_mul(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_div(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Div(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_div(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_mod(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Mod(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_mod(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_and(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64And(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_and(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_or(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Or(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_or(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_xor(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Xor(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_xor(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_not(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Not(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_not(uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_lshift(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Lshift(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_lshift(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_rshift(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Rshift(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_rshift(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_pow(uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Pow(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_pow(uint64,uint64)uint64'] | undefined]> - - /** - * Calls the verify_uint64_eq(uint64,uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Eq(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_eq(uint64,uint64)bool'] | undefined]> - - /** - * Calls the verify_uint64_ne(uint64,uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Ne(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_ne(uint64,uint64)bool'] | undefined]> - - /** - * Calls the verify_uint64_lt(uint64,uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Lt(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_lt(uint64,uint64)bool'] | undefined]> - - /** - * Calls the verify_uint64_le(uint64,uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Le(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_le(uint64,uint64)bool'] | undefined]> - - /** - * Calls the verify_uint64_gt(uint64,uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Gt(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_gt(uint64,uint64)bool'] | undefined]> - - /** - * Calls the verify_uint64_ge(uint64,uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyUint64Ge(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_ge(uint64,uint64)bool'] | undefined]> - - /** - * Calls the verify_bytes_init(uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBytesInit(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_init(uint64)byte[]'] | undefined]> - - /** - * Calls the verify_bytes_add(byte[],byte[],uint64,uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBytesAdd(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'] | undefined]> - - /** - * Calls the verify_bytes_eq(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBytesEq(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_eq(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_bytes_ne(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBytesNe(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_ne(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_bytes_and(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBytesAnd(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_and(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_bytes_or(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBytesOr(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_or(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_bytes_xor(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBytesXor(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_xor(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_bytes_not(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBytesNot(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_not(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_biguint_add(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintAdd(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_add(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_biguint_add_uint64(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintAddUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_add_uint64(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_biguint_sub(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintSub(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_sub(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_biguint_sub_uint64(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintSubUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_sub_uint64(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_biguint_mul(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintMul(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_mul(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_biguint_mul_uint64(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintMulUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_mul_uint64(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_biguint_div(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintDiv(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_div(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_biguint_div_uint64(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintDivUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_div_uint64(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_biguint_mod(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintMod(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_mod(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_biguint_mod_uint64(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintModUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_mod_uint64(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_biguint_and(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintAnd(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_and(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_biguint_and_uint64(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintAndUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_and_uint64(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_biguint_or(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintOr(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_or(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_biguint_or_uint64(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintOrUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_or_uint64(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_biguint_xor(byte[],byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintXor(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_xor(byte[],byte[])byte[]'] | undefined]> - - /** - * Calls the verify_biguint_xor_uint64(byte[],uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintXorUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_xor_uint64(byte[],uint64)byte[]'] | undefined]> - - /** - * Calls the verify_biguint_eq(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintEq(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_eq(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguint_eq_uint64(byte[],uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintEqUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_eq_uint64(byte[],uint64)bool'] | undefined]> - - /** - * Calls the verify_biguint_ne(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintNe(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_ne(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguint_ne_uint64(byte[],uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintNeUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_ne_uint64(byte[],uint64)bool'] | undefined]> - - /** - * Calls the verify_biguint_lt(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintLt(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_lt(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguint_lt_uint64(byte[],uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintLtUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_lt_uint64(byte[],uint64)bool'] | undefined]> - - /** - * Calls the verify_biguint_le(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintLe(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_le(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguint_le_uint64(byte[],uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintLeUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_le_uint64(byte[],uint64)bool'] | undefined]> - - /** - * Calls the verify_biguint_gt(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintGt(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_gt(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguint_gt_uint64(byte[],uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintGtUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_gt_uint64(byte[],uint64)bool'] | undefined]> - - /** - * Calls the verify_biguint_ge(byte[],byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintGe(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_ge(byte[],byte[])bool'] | undefined]> - - /** - * Calls the verify_biguint_ge_uint64(byte[],uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyBiguintGeUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_ge_uint64(byte[],uint64)bool'] | undefined]> - - /** - * Calls the verify_string_init(string)string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyStringInit(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_string_init(string)string'] | undefined]> - - /** - * Calls the verify_string_startswith(string,string)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyStringStartswith(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_string_startswith(string,string)bool'] | undefined]> - - /** - * Calls the verify_string_endswith(string,string)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyStringEndswith(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_string_endswith(string,string)bool'] | undefined]> - - /** - * Calls the verify_string_join(string,string)string ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyStringJoin(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_string_join(string,string)string'] | undefined]> - - /** - * Calls the verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyLog(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the PrimitiveOpsContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): PrimitiveOpsContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): PrimitiveOpsContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type PrimitiveOpsContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/README.md b/examples/p-py/projects/p-py-frontend/src/contracts/README.md deleted file mode 100644 index 04629b1..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/README.md +++ /dev/null @@ -1,14 +0,0 @@ -## How to connect my web app with Algorand smart contracts? - -The following folder is reserved for the Algorand Application Clients. The clients are used to interact with instances of Algorand Smart Contracts (ASC1s) deployed on-chain. - -To integrate this react frontend template with your smart contracts codebase, perform the following steps: - -1. Generate the typed client using `algokit generate client -l typescript -o {path/to/this/folder}` or using the dedicated `link` command `algokit project link` (ensure to invoke it from the root of this react project). Using the `link` command is especially useful within workspaces that have multiple contract projects. -2. The generated typescript client should be ready to be imported and used in this react frontend template, making it a full fledged dApp. - -> Please note, by default this template defines `"generate:app-clients": "algokit project link --all"` which is a shortcut to automatically link TEAL code from all `contract` projects in the workspace as typed clients into the `frontend` project that is invoking the `link` command. Refer to [documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/link.md) to read more about `link` command. - -## **How to interact with the smart contract?** - -The generated client provides a set of functions that can be used to interact with the ABI (Application Binary Interface) compliant Algorand smart contract. For example, if the smart contract has a function called `hello`, the generated client will have a function called `hello` that can be used to interact with the smart contract. Refer to a [full-stack end-to-end starter template](https://github.com/algorandfoundation/algokit-fullstack-template) for a reference example on invoking and interacting with typescript typed clients generated. diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/SignaturesContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/SignaturesContract.ts deleted file mode 100644 index e810782..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/SignaturesContract.ts +++ /dev/null @@ -1,1203 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"SignaturesContract","structs":{"AnotherStruct":[{"name":"one","type":"uint64"},{"name":"two","type":"string"}],"MyStruct":[{"name":"anotherStruct","type":"AnotherStruct"},{"name":"anotherStructAlias","type":"AnotherStruct"},{"name":"three","type":"uint128"},{"name":"four","type":"uint128"}]},"methods":[{"name":"create","args":[],"returns":{"type":"void"},"actions":{"create":["NoOp"],"call":[]},"readonly":false,"events":[],"recommendations":{}},{"name":"sink","args":[{"type":"string","name":"value"},{"type":"uint8[]","name":"arr"},{"type":"byte[4]","name":"fixed_bytes"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"alias","args":[{"type":"string","name":"value"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"with_txn","args":[{"type":"string","name":"value"},{"type":"pay","name":"pay"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"with_asset","args":[{"type":"string","name":"value"},{"type":"asset","name":"asset"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"with_app","args":[{"type":"string","name":"value"},{"type":"application","name":"app"},{"type":"uint64","name":"app_id"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"with_acc","args":[{"type":"string","name":"value"},{"type":"account","name":"acc"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"complex_sig","args":[{"type":"((uint64,string),(uint64,string),uint128,uint128)","struct":"MyStruct","name":"struct1"},{"type":"txn","name":"txn"},{"type":"account","name":"acc"},{"type":"uint8[]","name":"five"}],"returns":{"type":"((uint64,string),((uint64,string),(uint64,string),uint128,uint128))"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"echo_resource_by_index","args":[{"type":"asset","name":"asset"},{"type":"application","name":"app"},{"type":"account","name":"acc"}],"returns":{"type":"(uint64,uint64,address)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"echo_resource_by_value","args":[{"type":"uint64","name":"asset"},{"type":"uint64","name":"app"},{"type":"address","name":"acc"}],"returns":{"type":"(uint64,uint64,address)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":[],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[348,353,547,552],"errorMessage":"account funded"},{"pc":[284],"errorMessage":"application exists"},{"pc":[242],"errorMessage":"asset exists"},{"pc":[639],"errorMessage":"expected account to be passed by index"},{"pc":[693],"errorMessage":"expected account to be passed by value"},{"pc":[280],"errorMessage":"expected app id to match provided app id"},{"pc":[629],"errorMessage":"expected application to be passed by index"},{"pc":[687],"errorMessage":"expected application to be passed by value"},{"pc":[619],"errorMessage":"expected asset to be passed by index"},{"pc":[679],"errorMessage":"expected asset to be passed by value"},{"pc":[138],"errorMessage":"expected global to have app address"},{"pc":[132],"errorMessage":"expected global to have app id"},{"pc":[288],"errorMessage":"expected other app to have same creator"},{"pc":[143,147],"errorMessage":"expected txn to have 0"},{"pc":[392],"errorMessage":"invalid array length header"},{"pc":[400],"errorMessage":"invalid number of bytes for arc4.dynamic_array"},{"pc":[671],"errorMessage":"invalid number of bytes for arc4.static_array"},{"pc":[129,294],"errorMessage":"transaction type is appl"},{"pc":[190],"errorMessage":"transaction type is pay"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgNiAxMjMKICAgIGJ5dGVjYmxvY2sgMHgwMDAwIDB4MTUxZjdjNzUgMHgwMDAwMDAwMDAwMDAwMDAxIDB4MDAwMTMyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyNQogICAgLy8gY2xhc3MgU2lnbmF0dXJlc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDEzCiAgICBwdXNoYnl0ZXNzIDB4MmUwMTc4MWUgMHgzYjA1Y2YxNyAweDA2NThkY2MzIDB4NWI2NDQ3ZGUgMHgwNjFmNGU3NyAweGVhYTg5MTM5IDB4NTEwZTcyYTQgMHhkNmMyYWM3ZiAweDQ4MTQyZDVlIC8vIG1ldGhvZCAic2luayhzdHJpbmcsdWludDhbXSxieXRlWzRdKXZvaWQiLCBtZXRob2QgImFsaWFzKHN0cmluZyx1aW50OFtdKXZvaWQiLCBtZXRob2QgIndpdGhfdHhuKHN0cmluZyxwYXksdWludDhbXSl2b2lkIiwgbWV0aG9kICJ3aXRoX2Fzc2V0KHN0cmluZyxhc3NldCx1aW50OFtdKXZvaWQiLCBtZXRob2QgIndpdGhfYXBwKHN0cmluZyxhcHBsaWNhdGlvbix1aW50NjQsdWludDhbXSl2b2lkIiwgbWV0aG9kICJ3aXRoX2FjYyhzdHJpbmcsYWNjb3VudCx1aW50OFtdKXZvaWQiLCBtZXRob2QgImNvbXBsZXhfc2lnKCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpLHVpbnQxMjgsdWludDEyOCksdHhuLGFjY291bnQsdWludDhbXSkoKHVpbnQ2NCxzdHJpbmcpLCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpLHVpbnQxMjgsdWludDEyOCkpIiwgbWV0aG9kICJlY2hvX3Jlc291cmNlX2J5X2luZGV4KGFzc2V0LGFwcGxpY2F0aW9uLGFjY291bnQpKHVpbnQ2NCx1aW50NjQsYWRkcmVzcykiLCBtZXRob2QgImVjaG9fcmVzb3VyY2VfYnlfdmFsdWUodWludDY0LHVpbnQ2NCxhZGRyZXNzKSh1aW50NjQsdWludDY0LGFkZHJlc3MpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggc2luayBzaW5rMiB3aXRoX3R4biB3aXRoX2Fzc2V0IHdpdGhfYXBwIHdpdGhfYWNjIGNvbXBsZXhfc2lnIGVjaG9fcmVzb3VyY2VfYnlfaW5kZXggZWNob19yZXNvdXJjZV9ieV92YWx1ZQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjUKICAgIC8vIGNsYXNzIFNpZ25hdHVyZXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgcHVzaGJ5dGVzIDB4NGM1YzYxYmEgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGUKICAgIGVycgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyOAogICAgLy8gYXBwX3R4biA9IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24oMCkKICAgIGludGNfMSAvLyAwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyOQogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkICE9IDAsICJleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgaWQiCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzICE9IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozMC0zMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzICE9IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIC8vICksICJleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgYWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjgKICAgIC8vIGFwcF90eG4gPSBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKDApCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzMKICAgIC8vIGFzc2VydCBhcHBfdHhuLmFwcF9pZCA9PSAwLCAiZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMCIKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBleHBlY3RlZCB0eG4gdG8gaGF2ZSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozNAogICAgLy8gYXNzZXJ0IFR4bi5hcHBsaWNhdGlvbl9pZCA9PSAwLCAiZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMCIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5zaW5rW3JvdXRpbmddKCkgLT4gdm9pZDoKc2luazoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QodmFsaWRhdGVfZW5jb2Rpbmc9InVuc2FmZV9kaXNhYmxlZCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0MAogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDEKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHZhbGlkYXRlX2VuY29kaW5nPSJ1bnNhZmVfZGlzYWJsZWQiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5zaW5rMltyb3V0aW5nXSgpIC0+IHZvaWQ6CnNpbmsyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPSJhbGlhcyIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0NgogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDcKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9ImFsaWFzIikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF90eG5bcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX3R4bjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTEKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgdW5jb3ZlciAyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTIKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1MwogICAgLy8gYXNzZXJ0IHBheS5ncm91cF9pbmRleCA9PSAwCiAgICBkdXAKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTQKICAgIC8vIGFzc2VydCBUeG4uZ3JvdXBfaW5kZXggPT0gMQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1NQogICAgLy8gYXNzZXJ0IHBheS5hbW91bnQgPT0gMTIzCiAgICBndHhucyBBbW91bnQKICAgIGludGNfMyAvLyAxMjMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hc3NldFtyb3V0aW5nXSgpIC0+IHZvaWQ6CndpdGhfYXNzZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBhc3NlcnQgdmFsdWUKICAgIHVuY292ZXIgMgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBhc3NlcnQgYXJyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjEKICAgIC8vIGFzc2VydCBhc3NldC50b3RhbCA9PSAxMjMKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpbnRjXzMgLy8gMTIzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo2MgogICAgLy8gYXNzZXJ0IFR4bi5hc3NldHMoMCkgPT0gYXNzZXQKICAgIHR4bmEgQXNzZXRzIDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hcHBbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX2FwcDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjgKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgdW5jb3ZlciAzCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjkKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3MAogICAgLy8gYXNzZXJ0IGFwcC5pZCA9PSBhcHBfaWQsICJleHBlY3RlZCBhcHAgaWQgdG8gbWF0Y2ggcHJvdmlkZWQgYXBwIGlkIgogICAgZGlnIDEKICAgIGl0b2IKICAgIGI9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcCBpZCB0byBtYXRjaCBwcm92aWRlZCBhcHAgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBhc3NlcnQgYXBwLmNyZWF0b3IgPT0gb3AuR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgImV4cGVjdGVkIG90aGVyIGFwcCB0byBoYXZlIHNhbWUgY3JlYXRvciIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG90aGVyIGFwcCB0byBoYXZlIHNhbWUgY3JlYXRvcgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NzIKICAgIC8vIGFwcF90eG4gPSBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKDApCiAgICBpbnRjXzEgLy8gMAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjczCiAgICAvLyBhc3NlcnQgYXBwX3R4bi5hcHBzKDApID09IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkCiAgICBkdXAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25zCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9ucygwKSA9PSBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZAogICAgdHhuYSBBcHBsaWNhdGlvbnMgMAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3MgogICAgLy8gYXBwX3R4biA9IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24oMCkKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3NQogICAgLy8gYXNzZXJ0IGFwcF90eG4uYXBwcygxKSA9PSBhcHAKICAgIGludGNfMCAvLyAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9ucwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9ucygxKSA9PSBhcHAKICAgIHR4bmEgQXBwbGljYXRpb25zIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hY2Nbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX2FjYzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4MAogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4MQogICAgLy8gYXNzZXJ0IGFycgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBhc3NlcnQgYWNjLmJhbGFuY2UgPT0gYWNjLm1pbl9iYWxhbmNlICsgMTIzNAogICAgZHVwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBwdXNoaW50IDEyMzQKICAgICsKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBhc3NlcnQgVHhuLmFjY291bnRzKDApID09IFR4bi5zZW5kZXIKICAgIHR4bmEgQWNjb3VudHMgMAogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6ODQKICAgIC8vIGFzc2VydCBUeG4uYWNjb3VudHMoMSkgPT0gYWNjCiAgICB0eG5hIEFjY291bnRzIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3QuY29tcGxleF9zaWdbcm91dGluZ10oKSAtPiB2b2lkOgpjb21wbGV4X3NpZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBmaXZlLnZhbGlkYXRlKCkKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5MQogICAgLy8gYXNzZXJ0IFR4bi5udW1fYXBwX2FyZ3MgPT0gNAogICAgdHhuIE51bUFwcEFyZ3MKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTItOTMKICAgIC8vICMgc3RydWN0CiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdC5vbmUgPT0gMQogICAgZGlnIDMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDQKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyA1CiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4CiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjkyLTk0CiAgICAvLyAjIHN0cnVjdAogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3Qub25lID09IDEKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0LnR3byA9PSAiMiIKICAgIGR1cAogICAgcHVzaGludCA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdC50d28gPT0gIjIiCiAgICBieXRlY18zIC8vIDB4MDAwMTMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5NQogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3RfYWxpYXMub25lID09IDEKICAgIGRpZyA2CiAgICBsZW4KICAgIGRpZyA3CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5NS05NgogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3RfYWxpYXMub25lID09IDEKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0X2FsaWFzLnR3byA9PSAiMiIKICAgIGR1cAogICAgcHVzaGludCA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTQKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0LnR3byA9PSAiMiIKICAgIGJ5dGVjXzMgLy8gMHgwMDAxMzIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdF9hbGlhcy50d28gPT0gIjIiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5NwogICAgLy8gYXNzZXJ0IHN0cnVjdDEudGhyZWUgPT0gMwogICAgZGlnIDUKICAgIGV4dHJhY3QgNCAxNgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5OAogICAgLy8gYXNzZXJ0IHN0cnVjdDEuZm91ciA9PSA0CiAgICBkaWcgNQogICAgZXh0cmFjdCAyMCAxNgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMDAtMTAxCiAgICAvLyAjIHR4bgogICAgLy8gYXNzZXJ0IHR4bi5ncm91cF9pbmRleCA9PSBUeG4uZ3JvdXBfaW5kZXggLSAxCiAgICB1bmNvdmVyIDQKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTAzLTEwNAogICAgLy8gIyBhY2MKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygyKSA9PSBhcmM0LlVJbnQ4KDEpLmJ5dGVzICAjIGFjYyBhcnJheSByZWYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHB1c2hieXRlcyAweDAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMDUKICAgIC8vIGFzc2VydCBhY2MuYmFsYW5jZSA9PSBhY2MubWluX2JhbGFuY2UgKyAxMjM0CiAgICBkaWcgMwogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIHVuY292ZXIgNAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIHB1c2hpbnQgMTIzNAogICAgKwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTA2CiAgICAvLyBhc3NlcnQgZml2ZVswXSA9PSA1CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAxCiAgICBwdXNoYnl0ZXMgMHgwNQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHB1c2hpbnQgNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3QuZWNob19yZXNvdXJjZV9ieV9pbmRleFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmVjaG9fcmVzb3VyY2VfYnlfaW5kZXg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTAtMTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IiwKICAgIC8vICkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NldF9pZHggPSBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTE3CiAgICAvLyBhc3NlcnQgYXNzZXQgPT0gVHhuLmFzc2V0cyhhc3NldF9pZHgpLCAiZXhwZWN0ZWQgYXNzZXQgdG8gYmUgcGFzc2VkIGJ5IGluZGV4IgogICAgdHhuYXMgQXNzZXRzCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCB0byBiZSBwYXNzZWQgYnkgaW5kZXgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjExOAogICAgLy8gYXBwX2lkeCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMikpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTkKICAgIC8vIGFzc2VydCBhcHAgPT0gVHhuLmFwcGxpY2F0aW9ucyhhcHBfaWR4KSwgImV4cGVjdGVkIGFwcGxpY2F0aW9uIHRvIGJlIHBhc3NlZCBieSBpbmRleCIKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXBwbGljYXRpb24gdG8gYmUgcGFzc2VkIGJ5IGluZGV4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMjAKICAgIC8vIGFjY19pZHggPSBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDMpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTIxCiAgICAvLyBhc3NlcnQgYWNjID09IFR4bi5hY2NvdW50cyhhY2NfaWR4KSwgImV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IGluZGV4IgogICAgdHhuYXMgQWNjb3VudHMKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IGluZGV4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTAtMTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IiwKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5lY2hvX3Jlc291cmNlX2J5X3ZhbHVlW3JvdXRpbmddKCkgLT4gdm9pZDoKZWNob19yZXNvdXJjZV9ieV92YWx1ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEyNC0xMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICByZXNvdXJjZV9lbmNvZGluZz0idmFsdWUiLAogICAgLy8gKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMwCiAgICAvLyBhY2MudmFsaWRhdGUoKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMxCiAgICAvLyBhc3NldF9pZCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMzIKICAgIC8vIGFzc2VydCBhc3NldC5pZCA9PSBhc3NldF9pZCwgImV4cGVjdGVkIGFzc2V0IHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFzc2V0IHRvIGJlIHBhc3NlZCBieSB2YWx1ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMzCiAgICAvLyBhcHBfaWQgPSBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDIpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTM0CiAgICAvLyBhc3NlcnQgYXBwLmlkID09IGFwcF9pZCwgImV4cGVjdGVkIGFwcGxpY2F0aW9uIHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcGxpY2F0aW9uIHRvIGJlIHBhc3NlZCBieSB2YWx1ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTM2CiAgICAvLyBhc3NlcnQgYWNjLmJ5dGVzID09IGFkZHJlc3MsICJleHBlY3RlZCBhY2NvdW50IHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTM1CiAgICAvLyBhZGRyZXNzID0gVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMykKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gYXNzZXJ0IGFjYy5ieXRlcyA9PSBhZGRyZXNzLCAiZXhwZWN0ZWQgYWNjb3VudCB0byBiZSBwYXNzZWQgYnkgdmFsdWUiCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IHZhbHVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMjQtMTI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9InZhbHVlIiwKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAQAGeyYEAgAABBUffHUIAAAAAAAAAAEDAAEyMRkURDEYQQBHggkELgF4HgQ7Bc8XBAZY3MMEW2RH3gQGH053BOqokTkEUQ5ypATWwqx/BEgULV42GgCOCQApADcARQBuAJAA2AEJAeMCIgCABExcYbo2GgCOAQABACM4ECQSRDIIRDIKMgMTRCM4GBREMRgURCJDNhoCNhoBKBNEKBNEIkM2GgI2GgEoE0QoE0QiQzYaATEWIglJOBAiEkQ2GgJPAigTRCgTREk4FhREMRYiEkQ4CCUSRCJDNhoBNhoCF8AwNhoDTwIoE0QoE0RJcQBEJRJENjAAEkQiQzYaATYaAhfAMjYaAzYaBE8DKBNEKBNESwEWqERJcgdEMgkSRCM4ECQSRCNJwjIyCBJENjIAMggSRCMiwjJLARJENjIBEkQiQzYaATYaAhfAHDYaA08CKBNEKBNESXMAREsBcwFEgdIJCBJENhwAMQASRDYcARJEIkM2GgExFiIJNhoCF8AcNhoDSSNZgQIISwEVEkQxG4EEEkRLAyNZSwSBAllLBU8CSwJSSVcACCqoREmBCFlLARVLAk8CSwJSKxJESwYVSwdPBE8CUklXAAgqqERJgQhZSwEVUisSREsFVwQQgBAAAAAAAAAAAAAAAAAAAAADqERLBVcUEIAQAAAAAAAAAAAAAAAAAAAABKhETwQ4FjEWIgkSRDYaAoABARJESwNzAERPBHMBRIHSCQgSRE8CVwIBgAEFqESBBAgWVwYCgAIABExQTFBMUClMULAiQzYaARfAMDYaAhfAMjYaAxfAHDYaARfAMEsDEkQ2GgIXwDJLAhJENhoDF8AcSwESRE8CFk8CFlBMUClMULAiQzYaARc2GgIXNhoDSRWBIBJENhoBF0sDEkQ2GgIXSwISREk2GgMSRE8CFk8CFlBMUClMULAiQw==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -// Type definitions for ARC-56 structs - -export type AnotherStruct = { - one: bigint, - two: string -} - - -/** - * Converts the ABI tuple representation of a AnotherStruct to the struct representation - */ -export function AnotherStructFromTuple(abiTuple: [bigint, string]) { - const abiStructType = ABIStructType.fromStruct('AnotherStruct', APP_SPEC.structs) - return getStructValueFromTupleValue(abiStructType, abiTuple) as AnotherStruct -} - -export type MyStruct = { - anotherStruct: AnotherStruct, - anotherStructAlias: AnotherStruct, - three: bigint, - four: bigint -} - - -/** - * Converts the ABI tuple representation of a MyStruct to the struct representation - */ -export function MyStructFromTuple(abiTuple: [AnotherStruct, AnotherStruct, bigint, bigint]) { - const abiStructType = ABIStructType.fromStruct('MyStruct', APP_SPEC.structs) - return getStructValueFromTupleValue(abiStructType, abiTuple) as MyStruct -} - -/** - * The argument types for the SignaturesContract contract - */ -export type SignaturesContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'create()void': Record - 'sink(string,uint8[],byte[4])void': { - value: string - arr: bigint[] | number[] - fixedBytes: Uint8Array - } - 'alias(string,uint8[])void': { - value: string - arr: bigint[] | number[] - } - 'with_txn(string,pay,uint8[])void': { - value: string - pay: AppMethodCallTransactionArgument - arr: bigint[] | number[] - } - 'with_asset(string,asset,uint8[])void': { - value: string - asset: bigint - arr: bigint[] | number[] - } - 'with_app(string,application,uint64,uint8[])void': { - value: string - app: bigint - appId: bigint | number - arr: bigint[] | number[] - } - 'with_acc(string,account,uint8[])void': { - value: string - acc: Uint8Array | string - arr: bigint[] | number[] - } - 'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))': { - struct1: MyStruct - txn: AppMethodCallTransactionArgument - acc: Uint8Array | string - five: bigint[] | number[] - } - 'echo_resource_by_index(asset,application,account)(uint64,uint64,address)': { - asset: bigint - app: bigint - acc: Uint8Array | string - } - 'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)': { - asset: bigint | number - app: bigint | number - acc: string - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'create()void': [] - 'sink(string,uint8[],byte[4])void': [value: string, arr: bigint[] | number[], fixedBytes: Uint8Array] - 'alias(string,uint8[])void': [value: string, arr: bigint[] | number[]] - 'with_txn(string,pay,uint8[])void': [value: string, pay: AppMethodCallTransactionArgument, arr: bigint[] | number[]] - 'with_asset(string,asset,uint8[])void': [value: string, asset: bigint, arr: bigint[] | number[]] - 'with_app(string,application,uint64,uint8[])void': [value: string, app: bigint, appId: bigint | number, arr: bigint[] | number[]] - 'with_acc(string,account,uint8[])void': [value: string, acc: Uint8Array | string, arr: bigint[] | number[]] - 'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))': [struct1: MyStruct, txn: AppMethodCallTransactionArgument, acc: Uint8Array | string, five: bigint[] | number[]] - 'echo_resource_by_index(asset,application,account)(uint64,uint64,address)': [asset: bigint, app: bigint, acc: Uint8Array | string] - 'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)': [asset: bigint | number, app: bigint | number, acc: string] - } -} - -/** - * The return type for each method - */ -export type SignaturesContractReturns = { - 'create()void': void - 'sink(string,uint8[],byte[4])void': void - 'alias(string,uint8[])void': void - 'with_txn(string,pay,uint8[])void': void - 'with_asset(string,asset,uint8[])void': void - 'with_app(string,application,uint64,uint8[])void': void - 'with_acc(string,account,uint8[])void': void - 'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))': [[bigint, string], [[bigint, string], [bigint, string], bigint, bigint]] - 'echo_resource_by_index(asset,application,account)(uint64,uint64,address)': [bigint, bigint, string] - 'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)': [bigint, bigint, string] -} - -/** - * Defines the types of available calls and state of the SignaturesContract smart contract. - */ -export type SignaturesContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'create()void' | 'create', { - argsObj: SignaturesContractArgs['obj']['create()void'] - argsTuple: SignaturesContractArgs['tuple']['create()void'] - returns: SignaturesContractReturns['create()void'] - }> - & Record<'sink(string,uint8[],byte[4])void' | 'sink', { - argsObj: SignaturesContractArgs['obj']['sink(string,uint8[],byte[4])void'] - argsTuple: SignaturesContractArgs['tuple']['sink(string,uint8[],byte[4])void'] - returns: SignaturesContractReturns['sink(string,uint8[],byte[4])void'] - }> - & Record<'alias(string,uint8[])void' | 'alias', { - argsObj: SignaturesContractArgs['obj']['alias(string,uint8[])void'] - argsTuple: SignaturesContractArgs['tuple']['alias(string,uint8[])void'] - returns: SignaturesContractReturns['alias(string,uint8[])void'] - }> - & Record<'with_txn(string,pay,uint8[])void' | 'with_txn', { - argsObj: SignaturesContractArgs['obj']['with_txn(string,pay,uint8[])void'] - argsTuple: SignaturesContractArgs['tuple']['with_txn(string,pay,uint8[])void'] - returns: SignaturesContractReturns['with_txn(string,pay,uint8[])void'] - }> - & Record<'with_asset(string,asset,uint8[])void' | 'with_asset', { - argsObj: SignaturesContractArgs['obj']['with_asset(string,asset,uint8[])void'] - argsTuple: SignaturesContractArgs['tuple']['with_asset(string,asset,uint8[])void'] - returns: SignaturesContractReturns['with_asset(string,asset,uint8[])void'] - }> - & Record<'with_app(string,application,uint64,uint8[])void' | 'with_app', { - argsObj: SignaturesContractArgs['obj']['with_app(string,application,uint64,uint8[])void'] - argsTuple: SignaturesContractArgs['tuple']['with_app(string,application,uint64,uint8[])void'] - returns: SignaturesContractReturns['with_app(string,application,uint64,uint8[])void'] - }> - & Record<'with_acc(string,account,uint8[])void' | 'with_acc', { - argsObj: SignaturesContractArgs['obj']['with_acc(string,account,uint8[])void'] - argsTuple: SignaturesContractArgs['tuple']['with_acc(string,account,uint8[])void'] - returns: SignaturesContractReturns['with_acc(string,account,uint8[])void'] - }> - & Record<'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))' | 'complex_sig', { - argsObj: SignaturesContractArgs['obj']['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'] - argsTuple: SignaturesContractArgs['tuple']['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'] - returns: SignaturesContractReturns['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'] - }> - & Record<'echo_resource_by_index(asset,application,account)(uint64,uint64,address)' | 'echo_resource_by_index', { - argsObj: SignaturesContractArgs['obj']['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'] - argsTuple: SignaturesContractArgs['tuple']['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'] - returns: SignaturesContractReturns['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'] - }> - & Record<'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)' | 'echo_resource_by_value', { - argsObj: SignaturesContractArgs['obj']['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'] - argsTuple: SignaturesContractArgs['tuple']['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'] - returns: SignaturesContractReturns['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type SignaturesContractSignatures = keyof SignaturesContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type SignaturesContractNonVoidMethodSignatures = keyof SignaturesContractTypes['methods'] extends infer T ? T extends keyof SignaturesContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the SignaturesContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = SignaturesContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the SignaturesContract smart contract to the method's return type - */ -export type MethodReturn = SignaturesContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type SignaturesContractCreateCallParams = - | Expand & {method: 'create'} & { onComplete?: OnApplicationComplete.NoOp } & CreateSchema> - | Expand & {method: 'create()void'} & { onComplete?: OnApplicationComplete.NoOp } & CreateSchema> -/** - * Defines arguments required for the deploy method. - */ -export type SignaturesContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: SignaturesContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the SignaturesContract smart contract - */ -export abstract class SignaturesContractParamsFactory { - /** - * Gets available create ABI call param factories - */ - static get create() { - return { - _resolveByMethod(params: TParams) { - switch(params.method) { - case 'create': - case 'create()void': - return SignaturesContractParamsFactory.create.create(params) - } - throw new Error(`Unknown ' + verb + ' method`) - }, - - /** - * Constructs create ABI call params for the SignaturesContract smart contract using the create()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - create(params: CallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.NoOp }): AppClientMethodCallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.NoOp } { - return { - ...params, - method: 'create()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - }, - } - } - - /** - * Constructs a no op call for the sink(string,uint8[],byte[4])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static sink(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'sink(string,uint8[],byte[4])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.arr, params.args.fixedBytes], - } - } - /** - * Constructs a no op call for the alias(string,uint8[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static alias(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'alias(string,uint8[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.arr], - } - } - /** - * Constructs a no op call for the with_txn(string,pay,uint8[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static withTxn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'with_txn(string,pay,uint8[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.pay, params.args.arr], - } - } - /** - * Constructs a no op call for the with_asset(string,asset,uint8[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static withAsset(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'with_asset(string,asset,uint8[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.asset, params.args.arr], - } - } - /** - * Constructs a no op call for the with_app(string,application,uint64,uint8[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static withApp(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'with_app(string,application,uint64,uint8[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.app, params.args.appId, params.args.arr], - } - } - /** - * Constructs a no op call for the with_acc(string,account,uint8[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static withAcc(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'with_acc(string,account,uint8[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.acc, params.args.arr], - } - } - /** - * Constructs a no op call for the complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128)) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static complexSig(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))' as const, - args: Array.isArray(params.args) ? params.args : [params.args.struct1, params.args.txn, params.args.acc, params.args.five], - } - } - /** - * Constructs a no op call for the echo_resource_by_index(asset,application,account)(uint64,uint64,address) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static echoResourceByIndex(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'echo_resource_by_index(asset,application,account)(uint64,uint64,address)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.asset, params.args.app, params.args.acc], - } - } - /** - * Constructs a no op call for the echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static echoResourceByValue(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.asset, params.args.app, params.args.acc], - } - } -} - -/** - * A factory to create and deploy one or more instance of the SignaturesContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class SignaturesContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `SignaturesContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new SignaturesContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new SignaturesContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the SignaturesContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: SignaturesContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - createParams: params.createParams?.method ? SignaturesContractParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (SignaturesContractCreateCallParams & { args: Uint8Array[] }) : undefined, - }) - return { result: result.result, appClient: new SignaturesContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the SignaturesContract smart contract using the create()void ABI method. - * - * @param params The params for the smart contract call - * @returns The create params - */ - create: (params: CallParams & AppClientCompilationParams & CreateSchema & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appFactory.params.create(SignaturesContractParamsFactory.create.create(params)) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the SignaturesContract smart contract using the create()void ABI method. - * - * @param params The params for the smart contract call - * @returns The create transaction - */ - create: (params: CallParams & AppClientCompilationParams & CreateSchema & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appFactory.createTransaction.create(SignaturesContractParamsFactory.create.create(params)) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the SignaturesContract smart contract using an ABI method call using the create()void ABI method. - * - * @param params The params for the smart contract call - * @returns The create result - */ - create: async (params: CallParams & AppClientCompilationParams & CreateSchema & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appFactory.send.create(SignaturesContractParamsFactory.create.create(params)) - return { result: { ...result.result, return: result.result.return as unknown as (undefined | SignaturesContractReturns['create()void']) }, appClient: new SignaturesContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the SignaturesContract smart contract - */ -export class SignaturesContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `SignaturesContractClient` - * - * @param appClient An `AppClient` instance which has been created with the SignaturesContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `SignaturesContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `SignaturesContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new SignaturesContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `SignaturesContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new SignaturesContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the SignaturesContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `sink(string,uint8[],byte[4])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - sink: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(SignaturesContractParamsFactory.sink(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `alias(string,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - alias: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(SignaturesContractParamsFactory.alias(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_txn(string,pay,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - withTxn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(SignaturesContractParamsFactory.withTxn(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_asset(string,asset,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - withAsset: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(SignaturesContractParamsFactory.withAsset(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_app(string,application,uint64,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - withApp: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(SignaturesContractParamsFactory.withApp(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_acc(string,account,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - withAcc: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(SignaturesContractParamsFactory.withAcc(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - complexSig: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(SignaturesContractParamsFactory.complexSig(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_index(asset,application,account)(uint64,uint64,address)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - echoResourceByIndex: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(SignaturesContractParamsFactory.echoResourceByIndex(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - echoResourceByValue: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(SignaturesContractParamsFactory.echoResourceByValue(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the SignaturesContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `sink(string,uint8[],byte[4])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - sink: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(SignaturesContractParamsFactory.sink(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `alias(string,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - alias: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(SignaturesContractParamsFactory.alias(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_txn(string,pay,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - withTxn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(SignaturesContractParamsFactory.withTxn(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_asset(string,asset,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - withAsset: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(SignaturesContractParamsFactory.withAsset(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_app(string,application,uint64,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - withApp: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(SignaturesContractParamsFactory.withApp(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_acc(string,account,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - withAcc: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(SignaturesContractParamsFactory.withAcc(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - complexSig: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(SignaturesContractParamsFactory.complexSig(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_index(asset,application,account)(uint64,uint64,address)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - echoResourceByIndex: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(SignaturesContractParamsFactory.echoResourceByIndex(params)) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - echoResourceByValue: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(SignaturesContractParamsFactory.echoResourceByValue(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the SignaturesContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `sink(string,uint8[],byte[4])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - sink: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(SignaturesContractParamsFactory.sink(params)) - return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['sink(string,uint8[],byte[4])void'])} - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `alias(string,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - alias: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(SignaturesContractParamsFactory.alias(params)) - return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['alias(string,uint8[])void'])} - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_txn(string,pay,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - withTxn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(SignaturesContractParamsFactory.withTxn(params)) - return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['with_txn(string,pay,uint8[])void'])} - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_asset(string,asset,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - withAsset: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(SignaturesContractParamsFactory.withAsset(params)) - return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['with_asset(string,asset,uint8[])void'])} - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_app(string,application,uint64,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - withApp: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(SignaturesContractParamsFactory.withApp(params)) - return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['with_app(string,application,uint64,uint8[])void'])} - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `with_acc(string,account,uint8[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - withAcc: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(SignaturesContractParamsFactory.withAcc(params)) - return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['with_acc(string,account,uint8[])void'])} - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - complexSig: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(SignaturesContractParamsFactory.complexSig(params)) - return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'])} - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_index(asset,application,account)(uint64,uint64,address)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - echoResourceByIndex: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(SignaturesContractParamsFactory.echoResourceByIndex(params)) - return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'])} - }, - - /** - * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - echoResourceByValue: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(SignaturesContractParamsFactory.echoResourceByValue(params)) - return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new SignaturesContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current SignaturesContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): SignaturesContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a sink(string,uint8[],byte[4])void method call against the SignaturesContract contract - */ - sink(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sink(params))) - return this - }, - /** - * Add a alias(string,uint8[])void method call against the SignaturesContract contract - */ - alias(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.alias(params))) - return this - }, - /** - * Add a with_txn(string,pay,uint8[])void method call against the SignaturesContract contract - */ - withTxn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withTxn(params))) - return this - }, - /** - * Add a with_asset(string,asset,uint8[])void method call against the SignaturesContract contract - */ - withAsset(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withAsset(params))) - return this - }, - /** - * Add a with_app(string,application,uint64,uint8[])void method call against the SignaturesContract contract - */ - withApp(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withApp(params))) - return this - }, - /** - * Add a with_acc(string,account,uint8[])void method call against the SignaturesContract contract - */ - withAcc(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withAcc(params))) - return this - }, - /** - * Add a complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128)) method call against the SignaturesContract contract - */ - complexSig(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.complexSig(params))) - return this - }, - /** - * Add a echo_resource_by_index(asset,application,account)(uint64,uint64,address) method call against the SignaturesContract contract - */ - echoResourceByIndex(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.echoResourceByIndex(params))) - return this - }, - /** - * Add a echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address) method call against the SignaturesContract contract - */ - echoResourceByValue(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.echoResourceByValue(params))) - return this - }, - /** - * Add a clear state call to the SignaturesContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as SignaturesContractComposer - } -} -export type SignaturesContractComposer = { - /** - * Calls the sink(string,uint8[],byte[4])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - sink(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['sink(string,uint8[],byte[4])void'] | undefined]> - - /** - * Calls the alias(string,uint8[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - alias(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['alias(string,uint8[])void'] | undefined]> - - /** - * Calls the with_txn(string,pay,uint8[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - withTxn(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['with_txn(string,pay,uint8[])void'] | undefined]> - - /** - * Calls the with_asset(string,asset,uint8[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - withAsset(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['with_asset(string,asset,uint8[])void'] | undefined]> - - /** - * Calls the with_app(string,application,uint64,uint8[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - withApp(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['with_app(string,application,uint64,uint8[])void'] | undefined]> - - /** - * Calls the with_acc(string,account,uint8[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - withAcc(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['with_acc(string,account,uint8[])void'] | undefined]> - - /** - * Calls the complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128)) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - complexSig(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'] | undefined]> - - /** - * Calls the echo_resource_by_index(asset,application,account)(uint64,uint64,address) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - echoResourceByIndex(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'] | undefined]> - - /** - * Calls the echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - echoResourceByValue(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the SignaturesContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): SignaturesContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): SignaturesContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type SignaturesContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGet.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGet.ts deleted file mode 100644 index 62c4b5b..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGet.ts +++ /dev/null @@ -1,1319 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"arcs":[],"name":"StateAcctParamsGet","structs":{},"methods":[{"name":"verify_acct_balance","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_min_balance","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_auth_addr","args":[{"name":"a","type":"account"}],"returns":{"type":"byte[]"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_num_uint","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_num_byte_slice","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_extra_app_pages","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_apps_created","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_apps_opted_in","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_assets_created","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_assets","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_boxes","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_box_bytes","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}}],"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LmFwcHJvdmFsX3Byb2dyYW06CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDE2CiAgICBtZXRob2QgInZlcmlmeV9hY2N0X2JhbGFuY2UoYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X21pbl9iYWxhbmNlKGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF9hdXRoX2FkZHIoYWNjb3VudClieXRlW10iCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50KGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhY2NvdW50KXVpbnQ2NCIKICAgIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzKGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQoYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4oYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMoYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2JveGVzKGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMoYWNjb3VudCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3ZlcmlmeV9hY2N0X2JhbGFuY2Vfcm91dGVAMiBtYWluX3ZlcmlmeV9hY2N0X21pbl9iYWxhbmNlX3JvdXRlQDMgbWFpbl92ZXJpZnlfYWNjdF9hdXRoX2FkZHJfcm91dGVANCBtYWluX3ZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50X3JvdXRlQDUgbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZV9yb3V0ZUA2IG1haW5fdmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzX3JvdXRlQDcgbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWRfcm91dGVAOCBtYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW5fcm91dGVAOSBtYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkX3JvdXRlQDEwIG1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX3JvdXRlQDExIG1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXNfcm91dGVAMTIgbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXNfcm91dGVAMTMKICAgIGVyciAvLyByZWplY3QgdHJhbnNhY3Rpb24KCm1haW5fdmVyaWZ5X2FjY3RfYmFsYW5jZV9yb3V0ZUAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXQoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X2JhbGFuY2UKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfbWluX2JhbGFuY2Vfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF9taW5fYmFsYW5jZQogICAgaXRvYgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl92ZXJpZnlfYWNjdF9hdXRoX2FkZHJfcm91dGVANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF9hdXRoX2FkZHIKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50X3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2Vfcm91dGVANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZQogICAgaXRvYgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXNfcm91dGVANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkX3JvdXRlQDg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW5fcm91dGVAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX29wdGVkX2luCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkX3JvdXRlQDEwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXQoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19yb3V0ZUAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXNfcm91dGVAMTI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXMKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYm94X2J5dGVzX3JvdXRlQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXQoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlcwogICAgaXRvYgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIHJlamVjdCB0cmFuc2FjdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50IDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXQudmVyaWZ5X2FjY3RfYmFsYW5jZShhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4LTE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9hY2N0X2JhbGFuY2Uoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMAogICAgLy8gYmFsYW5jZSwgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9iYWxhbmNlKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBiYWxhbmNlCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LnZlcmlmeV9hY2N0X21pbl9iYWxhbmNlKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X21pbl9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzLTI0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9hY2N0X21pbl9iYWxhbmNlKHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhbGdvcHkuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUKICAgIC8vIG1pbl9iYWxhbmNlLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X21pbl9iYWxhbmNlKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjYKICAgIC8vIHJldHVybiBtaW5fYmFsYW5jZQogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF9hdXRoX2FkZHIoYTogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYWNjdF9hdXRoX2FkZHI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgtMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfYXV0aF9hZGRyKHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhbGdvcHkuQnl0ZXM6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMAogICAgLy8gYXV0aF9hZGRyLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2F1dGhfYWRkcihhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEF1dGhBZGRyCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMQogICAgLy8gcmV0dXJuIGF1dGhfYWRkci5ieXRlcwogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludChhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMy0zNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludChzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM1CiAgICAvLyB0b3RhbF9udW1fdWludCwgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9udW1fdWludChhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtVWludAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzYKICAgIC8vIHJldHVybiB0b3RhbF9udW1fdWludAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOC0zOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwCiAgICAvLyB0b3RhbF9udW1fYnl0ZV9zbGljZSwgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MQogICAgLy8gcmV0dXJuIHRvdGFsX251bV9ieXRlX3NsaWNlCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LnZlcmlmeV9hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlcyhhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDMtNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzKHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhbGdvcHkuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDUKICAgIC8vIHRvdGFsX2V4dHJhX2FwcF9wYWdlcywgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEV4dHJhQXBwUGFnZXMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2CiAgICAvLyByZXR1cm4gdG90YWxfZXh0cmFfYXBwX3BhZ2VzCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgtNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkKHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhbGdvcHkuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTAKICAgIC8vIHRvdGFsX2FwcHNfY3JlYXRlZCwgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNDcmVhdGVkCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MQogICAgLy8gcmV0dXJuIHRvdGFsX2FwcHNfY3JlYXRlZAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF90b3RhbF9hcHBzX29wdGVkX2luKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTMtNTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbihzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1CiAgICAvLyB0b3RhbF9hcHBzX29wdGVkX2luLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4oYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNPcHRlZEluCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NgogICAgLy8gcmV0dXJuIHRvdGFsX2FwcHNfb3B0ZWRfaW4KICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXQudmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTgtNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MAogICAgLy8gdG90YWxfYXNzZXRzX2NyZWF0ZWQsIF92YWwgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFzc2V0c0NyZWF0ZWQKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxCiAgICAvLyByZXR1cm4gdG90YWxfYXNzZXRzX2NyZWF0ZWQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXQudmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0czoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2My02NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NQogICAgLy8gdG90YWxfYXNzZXRzLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0cyhhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXNzZXRzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NgogICAgLy8gcmV0dXJuIHRvdGFsX2Fzc2V0cwogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF90b3RhbF9ib3hlcyhhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9ib3hlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OC02OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9ib3hlcyhzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwCiAgICAvLyB0b3RhbF9ib3hlcywgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9ib3hlcyhhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94ZXMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxCiAgICAvLyByZXR1cm4gdG90YWxfYm94ZXMKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXQudmVyaWZ5X2FjY3RfdG90YWxfYm94X2J5dGVzKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3My03NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NQogICAgLy8gdG90YWxfYm94X2J5dGVzLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveF9ieXRlcyhhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94Qnl0ZXMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyByZXR1cm4gdG90YWxfYm94X2J5dGVzCiAgICByZXRzdWIK","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgaW50IDEKICAgIHJldHVybgo="},"bareActions":{"create":["NoOp"],"call":[]}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the StateAcctParamsGet contract - */ -export type StateAcctParamsGetArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify_acct_balance(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_min_balance(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_auth_addr(account)byte[]': { - a: Uint8Array | string - } - 'verify_acct_total_num_uint(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_num_byte_slice(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_extra_app_pages(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_apps_created(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_apps_opted_in(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_assets_created(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_assets(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_boxes(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_box_bytes(account)uint64': { - a: Uint8Array | string - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify_acct_balance(account)uint64': [a: Uint8Array | string] - 'verify_acct_min_balance(account)uint64': [a: Uint8Array | string] - 'verify_acct_auth_addr(account)byte[]': [a: Uint8Array | string] - 'verify_acct_total_num_uint(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_num_byte_slice(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_extra_app_pages(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_apps_created(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_apps_opted_in(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_assets_created(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_assets(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_boxes(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_box_bytes(account)uint64': [a: Uint8Array | string] - } -} - -/** - * The return type for each method - */ -export type StateAcctParamsGetReturns = { - 'verify_acct_balance(account)uint64': bigint - 'verify_acct_min_balance(account)uint64': bigint - 'verify_acct_auth_addr(account)byte[]': Uint8Array - 'verify_acct_total_num_uint(account)uint64': bigint - 'verify_acct_total_num_byte_slice(account)uint64': bigint - 'verify_acct_total_extra_app_pages(account)uint64': bigint - 'verify_acct_total_apps_created(account)uint64': bigint - 'verify_acct_total_apps_opted_in(account)uint64': bigint - 'verify_acct_total_assets_created(account)uint64': bigint - 'verify_acct_total_assets(account)uint64': bigint - 'verify_acct_total_boxes(account)uint64': bigint - 'verify_acct_total_box_bytes(account)uint64': bigint -} - -/** - * Defines the types of available calls and state of the StateAcctParamsGet smart contract. - */ -export type StateAcctParamsGetTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify_acct_balance(account)uint64' | 'verify_acct_balance', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_balance(account)uint64'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_balance(account)uint64'] - returns: StateAcctParamsGetReturns['verify_acct_balance(account)uint64'] - }> - & Record<'verify_acct_min_balance(account)uint64' | 'verify_acct_min_balance', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_min_balance(account)uint64'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_min_balance(account)uint64'] - returns: StateAcctParamsGetReturns['verify_acct_min_balance(account)uint64'] - }> - & Record<'verify_acct_auth_addr(account)byte[]' | 'verify_acct_auth_addr', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_auth_addr(account)byte[]'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_auth_addr(account)byte[]'] - returns: StateAcctParamsGetReturns['verify_acct_auth_addr(account)byte[]'] - }> - & Record<'verify_acct_total_num_uint(account)uint64' | 'verify_acct_total_num_uint', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_num_uint(account)uint64'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_num_uint(account)uint64'] - returns: StateAcctParamsGetReturns['verify_acct_total_num_uint(account)uint64'] - }> - & Record<'verify_acct_total_num_byte_slice(account)uint64' | 'verify_acct_total_num_byte_slice', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_num_byte_slice(account)uint64'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_num_byte_slice(account)uint64'] - returns: StateAcctParamsGetReturns['verify_acct_total_num_byte_slice(account)uint64'] - }> - & Record<'verify_acct_total_extra_app_pages(account)uint64' | 'verify_acct_total_extra_app_pages', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_extra_app_pages(account)uint64'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_extra_app_pages(account)uint64'] - returns: StateAcctParamsGetReturns['verify_acct_total_extra_app_pages(account)uint64'] - }> - & Record<'verify_acct_total_apps_created(account)uint64' | 'verify_acct_total_apps_created', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_apps_created(account)uint64'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_apps_created(account)uint64'] - returns: StateAcctParamsGetReturns['verify_acct_total_apps_created(account)uint64'] - }> - & Record<'verify_acct_total_apps_opted_in(account)uint64' | 'verify_acct_total_apps_opted_in', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_apps_opted_in(account)uint64'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_apps_opted_in(account)uint64'] - returns: StateAcctParamsGetReturns['verify_acct_total_apps_opted_in(account)uint64'] - }> - & Record<'verify_acct_total_assets_created(account)uint64' | 'verify_acct_total_assets_created', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_assets_created(account)uint64'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_assets_created(account)uint64'] - returns: StateAcctParamsGetReturns['verify_acct_total_assets_created(account)uint64'] - }> - & Record<'verify_acct_total_assets(account)uint64' | 'verify_acct_total_assets', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_assets(account)uint64'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_assets(account)uint64'] - returns: StateAcctParamsGetReturns['verify_acct_total_assets(account)uint64'] - }> - & Record<'verify_acct_total_boxes(account)uint64' | 'verify_acct_total_boxes', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_boxes(account)uint64'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_boxes(account)uint64'] - returns: StateAcctParamsGetReturns['verify_acct_total_boxes(account)uint64'] - }> - & Record<'verify_acct_total_box_bytes(account)uint64' | 'verify_acct_total_box_bytes', { - argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_box_bytes(account)uint64'] - argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_box_bytes(account)uint64'] - returns: StateAcctParamsGetReturns['verify_acct_total_box_bytes(account)uint64'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type StateAcctParamsGetSignatures = keyof StateAcctParamsGetTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type StateAcctParamsGetNonVoidMethodSignatures = keyof StateAcctParamsGetTypes['methods'] extends infer T ? T extends keyof StateAcctParamsGetTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the StateAcctParamsGet smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = StateAcctParamsGetTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the StateAcctParamsGet smart contract to the method's return type - */ -export type MethodReturn = StateAcctParamsGetTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type StateAcctParamsGetCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type StateAcctParamsGetDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: StateAcctParamsGetCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAcctParamsGet smart contract - */ -export abstract class StateAcctParamsGetParamsFactory { - /** - * Constructs a no op call for the verify_acct_balance(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctBalance(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_balance(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_min_balance(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctMinBalance(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_min_balance(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_auth_addr(account)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctAuthAddr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_auth_addr(account)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_num_uint(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalNumUint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_num_uint(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_num_byte_slice(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalNumByteSlice(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_num_byte_slice(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_extra_app_pages(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalExtraAppPages(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_extra_app_pages(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_apps_created(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalAppsCreated(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_apps_created(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_apps_opted_in(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalAppsOptedIn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_apps_opted_in(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_assets_created(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalAssetsCreated(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_assets_created(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_assets(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalAssets(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_assets(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_boxes(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_boxes(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_box_bytes(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalBoxBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_box_bytes(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } -} - -/** - * A factory to create and deploy one or more instance of the StateAcctParamsGet smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class StateAcctParamsGetFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `StateAcctParamsGetFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new StateAcctParamsGetClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new StateAcctParamsGetClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the StateAcctParamsGet smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: StateAcctParamsGetDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new StateAcctParamsGetClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAcctParamsGet smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAcctParamsGet smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAcctParamsGet smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new StateAcctParamsGetClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the StateAcctParamsGet smart contract - */ -export class StateAcctParamsGetClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `StateAcctParamsGetClient` - * - * @param appClient An `AppClient` instance which has been created with the StateAcctParamsGet app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `StateAcctParamsGetClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `StateAcctParamsGetClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new StateAcctParamsGetClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `StateAcctParamsGetClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new StateAcctParamsGetClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the StateAcctParamsGet smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctBalance(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_min_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctMinBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctMinBalance(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_auth_addr(account)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctAuthAddr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctAuthAddr(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumUint(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumByteSlice(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalExtraAppPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalExtraAppPages(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalAppsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsCreated(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalAppsOptedIn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsOptedIn(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalAssetsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssetsCreated(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalAssets: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssets(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxes(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalBoxBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxBytes(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the StateAcctParamsGet smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctBalance(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_min_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctMinBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctMinBalance(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_auth_addr(account)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctAuthAddr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctAuthAddr(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumUint(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumByteSlice(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalExtraAppPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalExtraAppPages(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalAppsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsCreated(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalAppsOptedIn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsOptedIn(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalAssetsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssetsCreated(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalAssets: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssets(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxes(params)) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalBoxBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxBytes(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the StateAcctParamsGet smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctBalance: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctBalance(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_balance(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_min_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctMinBalance: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctMinBalance(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_min_balance(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_auth_addr(account)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctAuthAddr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctAuthAddr(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_auth_addr(account)byte[]'])} - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalNumUint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumUint(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_num_uint(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalNumByteSlice: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumByteSlice(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_num_byte_slice(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalExtraAppPages: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalExtraAppPages(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_extra_app_pages(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalAppsCreated: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsCreated(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_apps_created(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalAppsOptedIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsOptedIn(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_apps_opted_in(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalAssetsCreated: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssetsCreated(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_assets_created(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalAssets: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssets(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_assets(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxes(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_boxes(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalBoxBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxBytes(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_box_bytes(account)uint64'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new StateAcctParamsGetClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current StateAcctParamsGet app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): StateAcctParamsGetComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_acct_balance(account)uint64 method call against the StateAcctParamsGet contract - */ - verifyAcctBalance(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctBalance(params))) - return this - }, - /** - * Add a verify_acct_min_balance(account)uint64 method call against the StateAcctParamsGet contract - */ - verifyAcctMinBalance(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctMinBalance(params))) - return this - }, - /** - * Add a verify_acct_auth_addr(account)byte[] method call against the StateAcctParamsGet contract - */ - verifyAcctAuthAddr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctAuthAddr(params))) - return this - }, - /** - * Add a verify_acct_total_num_uint(account)uint64 method call against the StateAcctParamsGet contract - */ - verifyAcctTotalNumUint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalNumUint(params))) - return this - }, - /** - * Add a verify_acct_total_num_byte_slice(account)uint64 method call against the StateAcctParamsGet contract - */ - verifyAcctTotalNumByteSlice(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalNumByteSlice(params))) - return this - }, - /** - * Add a verify_acct_total_extra_app_pages(account)uint64 method call against the StateAcctParamsGet contract - */ - verifyAcctTotalExtraAppPages(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalExtraAppPages(params))) - return this - }, - /** - * Add a verify_acct_total_apps_created(account)uint64 method call against the StateAcctParamsGet contract - */ - verifyAcctTotalAppsCreated(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAppsCreated(params))) - return this - }, - /** - * Add a verify_acct_total_apps_opted_in(account)uint64 method call against the StateAcctParamsGet contract - */ - verifyAcctTotalAppsOptedIn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAppsOptedIn(params))) - return this - }, - /** - * Add a verify_acct_total_assets_created(account)uint64 method call against the StateAcctParamsGet contract - */ - verifyAcctTotalAssetsCreated(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAssetsCreated(params))) - return this - }, - /** - * Add a verify_acct_total_assets(account)uint64 method call against the StateAcctParamsGet contract - */ - verifyAcctTotalAssets(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAssets(params))) - return this - }, - /** - * Add a verify_acct_total_boxes(account)uint64 method call against the StateAcctParamsGet contract - */ - verifyAcctTotalBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalBoxes(params))) - return this - }, - /** - * Add a verify_acct_total_box_bytes(account)uint64 method call against the StateAcctParamsGet contract - */ - verifyAcctTotalBoxBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalBoxBytes(params))) - return this - }, - /** - * Add a clear state call to the StateAcctParamsGet contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as StateAcctParamsGetComposer - } -} -export type StateAcctParamsGetComposer = { - /** - * Calls the verify_acct_balance(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctBalance(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_balance(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_min_balance(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctMinBalance(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_min_balance(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_auth_addr(account)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctAuthAddr(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_auth_addr(account)byte[]'] | undefined]> - - /** - * Calls the verify_acct_total_num_uint(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalNumUint(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_num_uint(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_num_byte_slice(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalNumByteSlice(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_num_byte_slice(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_extra_app_pages(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalExtraAppPages(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_extra_app_pages(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_apps_created(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalAppsCreated(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_apps_created(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_apps_opted_in(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalAppsOptedIn(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_apps_opted_in(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_assets_created(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalAssetsCreated(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_assets_created(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_assets(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalAssets(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_assets(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_boxes(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalBoxes(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_boxes(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_box_bytes(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalBoxBytes(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_box_bytes(account)uint64'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the StateAcctParamsGet smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): StateAcctParamsGetComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): StateAcctParamsGetComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type StateAcctParamsGetComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGetContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGetContract.ts deleted file mode 100644 index 01c1c8f..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGetContract.ts +++ /dev/null @@ -1,1526 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"StateAcctParamsGetContract","structs":{},"methods":[{"name":"verify_acct_balance","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_min_balance","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_auth_addr","args":[{"type":"account","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_num_uint","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_num_byte_slice","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_extra_app_pages","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_apps_created","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_apps_opted_in","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_assets_created","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_assets","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_boxes","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_box_bytes","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_incentive_eligible","args":[{"type":"account","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_last_heartbeat","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_last_proposed","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[171,225],"errorMessage":"account funded"},{"pc":[175],"errorMessage":"expected Account balance to match"},{"pc":[229],"errorMessage":"expected Account min_balance to match"},{"pc":[166,220,273,301,330,359,388,417,446,475,504,533,562,598,627],"errorMessage":"expected funded by index to match"},{"pc":[190],"errorMessage":"expected op.balance by index to match"},{"pc":[181],"errorMessage":"expected op.balance to match"},{"pc":[244],"errorMessage":"expected op.min_balance by index to match"},{"pc":[235],"errorMessage":"expected op.min_balance to match"},{"pc":[164,218,271,299,328,357,386,415,444,473,502,531,560,596,625],"errorMessage":"expected value by index to match"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNAogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NWY1YjQzZTQgMHg3M2RjOTNjNyAweDU2MjZkZmViIDB4ZGM4YTI1YmYgMHgxOThlYmQ4YyAweDIzMDFhYjI2IDB4OWY2OGZjYTYgMHhhOTc1YzJkMSAweGQxZTA0ODAxIDB4YjY5NjZiZTUgMHgxOTVkNTQxOCAweDZhZGFlM2YxIDB4ZGY4Y2ZlZTUgMHg2YWQ3MGQyMSAweDE3MzVmZDIyIC8vIG1ldGhvZCAidmVyaWZ5X2FjY3RfYmFsYW5jZShhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfbWluX2JhbGFuY2UoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X2F1dGhfYWRkcihhY2NvdW50KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50KGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4oYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2JveGVzKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X2luY2VudGl2ZV9lbGlnaWJsZShhY2NvdW50KWJvb2wiLCBtZXRob2QgInZlcmlmeV9hY2N0X2xhc3RfaGVhcnRiZWF0KGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF9sYXN0X3Byb3Bvc2VkKGFjY291bnQpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X2FjY3RfYmFsYW5jZSB2ZXJpZnlfYWNjdF9taW5fYmFsYW5jZSB2ZXJpZnlfYWNjdF9hdXRoX2FkZHIgdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQgdmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2UgdmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzIHZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZCB2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX29wdGVkX2luIHZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkIHZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0cyB2ZXJpZnlfYWNjdF90b3RhbF9ib3hlcyB2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMgdmVyaWZ5X2FjY3RfaW5jZW50aXZlX2VsaWdpYmxlIHZlcmlmeV9hY2N0X2xhc3RfaGVhcnRiZWF0IHZlcmlmeV9hY2N0X2xhc3RfcHJvcG9zZWQKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyMjoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2JhbGFuY2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjcKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYmFsYW5jZShhKQogICAgZHVwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYmFsYW5jZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYS5iYWxhbmNlLCAiZXhwZWN0ZWQgQWNjb3VudCBiYWxhbmNlIHRvIG1hdGNoIgogICAgZGlnIDEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBBY2NvdW50IGJhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMgogICAgLy8gYXNzZXJ0IHZhbHVlID09IGFsZ29weS5vcC5iYWxhbmNlKGEpLCAiZXhwZWN0ZWQgb3AuYmFsYW5jZSB0byBtYXRjaCIKICAgIHN3YXAKICAgIGJhbGFuY2UKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG9wLmJhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzMtMzUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhbGdvcHkub3AuYmFsYW5jZSgKICAgIC8vICAgICBfZ2V0XzFzdF9yZWZfaW5kZXgoKQogICAgLy8gKSwgImV4cGVjdGVkIG9wLmJhbGFuY2UgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBiYWxhbmNlCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvcC5iYWxhbmNlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF9taW5fYmFsYW5jZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X21pbl9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDAKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbWluX2JhbGFuY2UoYSkKICAgIGR1cAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQxCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X21pbl9iYWxhbmNlKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDIKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhLm1pbl9iYWxhbmNlLCAiZXhwZWN0ZWQgQWNjb3VudCBtaW5fYmFsYW5jZSB0byBtYXRjaCIKICAgIGRpZyAxCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgQWNjb3VudCBtaW5fYmFsYW5jZSB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYWxnb3B5Lm9wLm1pbl9iYWxhbmNlKGEpLCAiZXhwZWN0ZWQgb3AubWluX2JhbGFuY2UgdG8gbWF0Y2giCiAgICBzd2FwCiAgICBtaW5fYmFsYW5jZQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgb3AubWluX2JhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDYtNDgKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhbGdvcHkub3AubWluX2JhbGFuY2UoCiAgICAvLyAgICAgX2dldF8xc3RfcmVmX2luZGV4KCkKICAgIC8vICksICJleHBlY3RlZCBvcC5taW5fYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaCIKICAgIG1pbl9iYWxhbmNlCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvcC5taW5fYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfYXV0aF9hZGRyW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfYXV0aF9hZGRyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTMKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYXV0aF9hZGRyKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEF1dGhBZGRyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2F1dGhfYWRkcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QXV0aEFkZHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTYKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9udW1fdWludChhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbE51bVVpbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfbnVtX3VpbnQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtVWludAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwLTcyCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlKAogICAgLy8gICAgIF9nZXRfMXN0X3JlZl9pbmRleCgpCiAgICAvLyApCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3OQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxFeHRyYUFwcFBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjgwLTgyCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlcygKICAgIC8vICAgICBfZ2V0XzFzdF9yZWZfaW5kZXgoKQogICAgLy8gKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEV4dHJhQXBwUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo4MwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6ODQKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNDcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjkwCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBcHBzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5MgogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hcHBzX29wdGVkX2luKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXBwc09wdGVkSW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXBwc19vcHRlZF9pbihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBcHBzT3B0ZWRJbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMDAKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTA1CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXNzZXRzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMDYtMTA4CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKAogICAgLy8gICAgIF9nZXRfMXN0X3JlZl9pbmRleCgpCiAgICAvLyApCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXNzZXRzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTEwCiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExNQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hc3NldHMoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTE2CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0cyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMTcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExOAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTIzCiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveGVzKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI0CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveGVzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEJveGVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjYKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTMxCiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveF9ieXRlcyhhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEJveEJ5dGVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9ib3hfYnl0ZXMoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94Qnl0ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2luY2VudGl2ZV9lbGlnaWJsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X2luY2VudGl2ZV9lbGlnaWJsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfaW5jZW50aXZlX2VsaWdpYmxlKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEluY2VudGl2ZUVsaWdpYmxlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE0MAogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9pbmNlbnRpdmVfZWxpZ2libGUoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEluY2VudGl2ZUVsaWdpYmxlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTQxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDIKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIHB1c2hpbnQgMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfbGFzdF9oZWFydGJlYXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF9sYXN0X2hlYXJ0YmVhdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDcKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbGFzdF9oZWFydGJlYXQoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TGFzdEhlYXJ0YmVhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbGFzdF9oZWFydGJlYXQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdExhc3RIZWFydGJlYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDkKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1MAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2xhc3RfcHJvcG9zZWRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF9sYXN0X3Byb3Bvc2VkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1NQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9sYXN0X3Byb3Bvc2VkKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdExhc3RQcm9wb3NlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTYKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbGFzdF9wcm9wb3NlZChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TGFzdFByb3Bvc2VkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTU3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTgKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyABASYBBBUffHUxG0EAeDEZFEQxGESCDwRfW0PkBHPck8cEVibf6wTciiW/BBmOvYwEIwGrJgSfaPymBKl1wtEE0eBIAQS2lmvlBBldVBgEatrj8QTfjP7lBGrXDSEEFzX9IjYaAI4PAAkAPwB1AJEArgDLAOgBBQEiAT8BXAF5AZYBugHXADEZFDEYFBBDNhoBF8AcSXMANhoBF3MASwNPAhJEEkRLAXMAREsBEkRMYEsBEkQ2GgEXYEsBEkQWKExQsCJDNhoBF8AcSXMBNhoBF3MBSwNPAhJEEkRLAXMBREsBEkRMeEsBEkQ2GgEXeEsBEkQWKExQsCJDNhoBF8AccwI2GgEXcwJLA08CEkQSRChMULAiQzYaARfAHHMDNhoBF3MDSwNPAhJEEkQWKExQsCJDNhoBF8AccwQ2GgEXcwRLA08CEkQSRBYoTFCwIkM2GgEXwBxzBTYaARdzBUsDTwISRBJEFihMULAiQzYaARfAHHMGNhoBF3MGSwNPAhJEEkQWKExQsCJDNhoBF8Accwc2GgEXcwdLA08CEkQSRBYoTFCwIkM2GgEXwBxzCDYaARdzCEsDTwISRBJEFihMULAiQzYaARfAHHMJNhoBF3MJSwNPAhJEEkQWKExQsCJDNhoBF8Accwo2GgEXcwpLA08CEkQSRBYoTFCwIkM2GgEXwBxzCzYaARdzC0sDTwISRBJEFihMULAiQzYaARfAHHMMNhoBF3MMSwNPAhJEEkSAAQCBAE8CVChMULAiQzYaARfAHHMONhoBF3MOSwNPAhJEEkQWKExQsCJDNhoBF8Accw02GgEXcw1LA08CEkQSRBYoTFCwIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the StateAcctParamsGetContract contract - */ -export type StateAcctParamsGetContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify_acct_balance(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_min_balance(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_auth_addr(account)address': { - a: Uint8Array | string - } - 'verify_acct_total_num_uint(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_num_byte_slice(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_extra_app_pages(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_apps_created(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_apps_opted_in(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_assets_created(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_assets(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_boxes(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_total_box_bytes(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_incentive_eligible(account)bool': { - a: Uint8Array | string - } - 'verify_acct_last_heartbeat(account)uint64': { - a: Uint8Array | string - } - 'verify_acct_last_proposed(account)uint64': { - a: Uint8Array | string - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify_acct_balance(account)uint64': [a: Uint8Array | string] - 'verify_acct_min_balance(account)uint64': [a: Uint8Array | string] - 'verify_acct_auth_addr(account)address': [a: Uint8Array | string] - 'verify_acct_total_num_uint(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_num_byte_slice(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_extra_app_pages(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_apps_created(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_apps_opted_in(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_assets_created(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_assets(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_boxes(account)uint64': [a: Uint8Array | string] - 'verify_acct_total_box_bytes(account)uint64': [a: Uint8Array | string] - 'verify_acct_incentive_eligible(account)bool': [a: Uint8Array | string] - 'verify_acct_last_heartbeat(account)uint64': [a: Uint8Array | string] - 'verify_acct_last_proposed(account)uint64': [a: Uint8Array | string] - } -} - -/** - * The return type for each method - */ -export type StateAcctParamsGetContractReturns = { - 'verify_acct_balance(account)uint64': bigint - 'verify_acct_min_balance(account)uint64': bigint - 'verify_acct_auth_addr(account)address': string - 'verify_acct_total_num_uint(account)uint64': bigint - 'verify_acct_total_num_byte_slice(account)uint64': bigint - 'verify_acct_total_extra_app_pages(account)uint64': bigint - 'verify_acct_total_apps_created(account)uint64': bigint - 'verify_acct_total_apps_opted_in(account)uint64': bigint - 'verify_acct_total_assets_created(account)uint64': bigint - 'verify_acct_total_assets(account)uint64': bigint - 'verify_acct_total_boxes(account)uint64': bigint - 'verify_acct_total_box_bytes(account)uint64': bigint - 'verify_acct_incentive_eligible(account)bool': boolean - 'verify_acct_last_heartbeat(account)uint64': bigint - 'verify_acct_last_proposed(account)uint64': bigint -} - -/** - * Defines the types of available calls and state of the StateAcctParamsGetContract smart contract. - */ -export type StateAcctParamsGetContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify_acct_balance(account)uint64' | 'verify_acct_balance', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_balance(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_balance(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_balance(account)uint64'] - }> - & Record<'verify_acct_min_balance(account)uint64' | 'verify_acct_min_balance', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_min_balance(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_min_balance(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_min_balance(account)uint64'] - }> - & Record<'verify_acct_auth_addr(account)address' | 'verify_acct_auth_addr', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_auth_addr(account)address'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_auth_addr(account)address'] - returns: StateAcctParamsGetContractReturns['verify_acct_auth_addr(account)address'] - }> - & Record<'verify_acct_total_num_uint(account)uint64' | 'verify_acct_total_num_uint', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_num_uint(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_num_uint(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_total_num_uint(account)uint64'] - }> - & Record<'verify_acct_total_num_byte_slice(account)uint64' | 'verify_acct_total_num_byte_slice', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_num_byte_slice(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_num_byte_slice(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_total_num_byte_slice(account)uint64'] - }> - & Record<'verify_acct_total_extra_app_pages(account)uint64' | 'verify_acct_total_extra_app_pages', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_extra_app_pages(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_extra_app_pages(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_total_extra_app_pages(account)uint64'] - }> - & Record<'verify_acct_total_apps_created(account)uint64' | 'verify_acct_total_apps_created', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_apps_created(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_apps_created(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_total_apps_created(account)uint64'] - }> - & Record<'verify_acct_total_apps_opted_in(account)uint64' | 'verify_acct_total_apps_opted_in', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_apps_opted_in(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_apps_opted_in(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_total_apps_opted_in(account)uint64'] - }> - & Record<'verify_acct_total_assets_created(account)uint64' | 'verify_acct_total_assets_created', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_assets_created(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_assets_created(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_total_assets_created(account)uint64'] - }> - & Record<'verify_acct_total_assets(account)uint64' | 'verify_acct_total_assets', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_assets(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_assets(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_total_assets(account)uint64'] - }> - & Record<'verify_acct_total_boxes(account)uint64' | 'verify_acct_total_boxes', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_boxes(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_boxes(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_total_boxes(account)uint64'] - }> - & Record<'verify_acct_total_box_bytes(account)uint64' | 'verify_acct_total_box_bytes', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_box_bytes(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_box_bytes(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_total_box_bytes(account)uint64'] - }> - & Record<'verify_acct_incentive_eligible(account)bool' | 'verify_acct_incentive_eligible', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_incentive_eligible(account)bool'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_incentive_eligible(account)bool'] - returns: StateAcctParamsGetContractReturns['verify_acct_incentive_eligible(account)bool'] - }> - & Record<'verify_acct_last_heartbeat(account)uint64' | 'verify_acct_last_heartbeat', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_last_heartbeat(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_last_heartbeat(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_last_heartbeat(account)uint64'] - }> - & Record<'verify_acct_last_proposed(account)uint64' | 'verify_acct_last_proposed', { - argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_last_proposed(account)uint64'] - argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_last_proposed(account)uint64'] - returns: StateAcctParamsGetContractReturns['verify_acct_last_proposed(account)uint64'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type StateAcctParamsGetContractSignatures = keyof StateAcctParamsGetContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type StateAcctParamsGetContractNonVoidMethodSignatures = keyof StateAcctParamsGetContractTypes['methods'] extends infer T ? T extends keyof StateAcctParamsGetContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the StateAcctParamsGetContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = StateAcctParamsGetContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the StateAcctParamsGetContract smart contract to the method's return type - */ -export type MethodReturn = StateAcctParamsGetContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type StateAcctParamsGetContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type StateAcctParamsGetContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: StateAcctParamsGetContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAcctParamsGetContract smart contract - */ -export abstract class StateAcctParamsGetContractParamsFactory { - /** - * Constructs a no op call for the verify_acct_balance(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctBalance(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_balance(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_min_balance(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctMinBalance(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_min_balance(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_auth_addr(account)address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctAuthAddr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_auth_addr(account)address' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_num_uint(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalNumUint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_num_uint(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_num_byte_slice(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalNumByteSlice(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_num_byte_slice(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_extra_app_pages(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalExtraAppPages(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_extra_app_pages(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_apps_created(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalAppsCreated(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_apps_created(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_apps_opted_in(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalAppsOptedIn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_apps_opted_in(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_assets_created(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalAssetsCreated(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_assets_created(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_assets(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalAssets(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_assets(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_boxes(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_boxes(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_total_box_bytes(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctTotalBoxBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_total_box_bytes(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_incentive_eligible(account)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctIncentiveEligible(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_incentive_eligible(account)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_last_heartbeat(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctLastHeartbeat(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_last_heartbeat(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_acct_last_proposed(account)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAcctLastProposed(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_acct_last_proposed(account)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } -} - -/** - * A factory to create and deploy one or more instance of the StateAcctParamsGetContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class StateAcctParamsGetContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `StateAcctParamsGetContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new StateAcctParamsGetContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new StateAcctParamsGetContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the StateAcctParamsGetContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: StateAcctParamsGetContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new StateAcctParamsGetContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAcctParamsGetContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAcctParamsGetContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAcctParamsGetContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new StateAcctParamsGetContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the StateAcctParamsGetContract smart contract - */ -export class StateAcctParamsGetContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `StateAcctParamsGetContractClient` - * - * @param appClient An `AppClient` instance which has been created with the StateAcctParamsGetContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `StateAcctParamsGetContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `StateAcctParamsGetContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new StateAcctParamsGetContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `StateAcctParamsGetContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new StateAcctParamsGetContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the StateAcctParamsGetContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctBalance(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_min_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctMinBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctMinBalance(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_auth_addr(account)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctAuthAddr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctAuthAddr(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumUint(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumByteSlice(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalExtraAppPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalExtraAppPages(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalAppsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsCreated(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalAppsOptedIn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsOptedIn(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalAssetsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssetsCreated(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalAssets: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssets(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxes(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctTotalBoxBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxBytes(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_incentive_eligible(account)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctIncentiveEligible: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctIncentiveEligible(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_heartbeat(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctLastHeartbeat: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastHeartbeat(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_proposed(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAcctLastProposed: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastProposed(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the StateAcctParamsGetContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctBalance(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_min_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctMinBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctMinBalance(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_auth_addr(account)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctAuthAddr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctAuthAddr(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumUint(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumByteSlice(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalExtraAppPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalExtraAppPages(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalAppsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsCreated(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalAppsOptedIn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsOptedIn(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalAssetsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssetsCreated(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalAssets: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssets(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxes(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctTotalBoxBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxBytes(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_incentive_eligible(account)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctIncentiveEligible: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctIncentiveEligible(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_heartbeat(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctLastHeartbeat: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastHeartbeat(params)) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_proposed(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAcctLastProposed: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastProposed(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the StateAcctParamsGetContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctBalance: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctBalance(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_balance(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_min_balance(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctMinBalance: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctMinBalance(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_min_balance(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_auth_addr(account)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctAuthAddr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctAuthAddr(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_auth_addr(account)address'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalNumUint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumUint(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_num_uint(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalNumByteSlice: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumByteSlice(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_num_byte_slice(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalExtraAppPages: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalExtraAppPages(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_extra_app_pages(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalAppsCreated: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsCreated(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_apps_created(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalAppsOptedIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsOptedIn(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_apps_opted_in(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalAssetsCreated: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssetsCreated(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_assets_created(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalAssets: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssets(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_assets(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxes(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_boxes(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctTotalBoxBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxBytes(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_box_bytes(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_incentive_eligible(account)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctIncentiveEligible: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctIncentiveEligible(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_incentive_eligible(account)bool'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_heartbeat(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctLastHeartbeat: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastHeartbeat(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_last_heartbeat(account)uint64'])} - }, - - /** - * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_proposed(account)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAcctLastProposed: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastProposed(params)) - return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_last_proposed(account)uint64'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new StateAcctParamsGetContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current StateAcctParamsGetContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): StateAcctParamsGetContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_acct_balance(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctBalance(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctBalance(params))) - return this - }, - /** - * Add a verify_acct_min_balance(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctMinBalance(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctMinBalance(params))) - return this - }, - /** - * Add a verify_acct_auth_addr(account)address method call against the StateAcctParamsGetContract contract - */ - verifyAcctAuthAddr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctAuthAddr(params))) - return this - }, - /** - * Add a verify_acct_total_num_uint(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctTotalNumUint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalNumUint(params))) - return this - }, - /** - * Add a verify_acct_total_num_byte_slice(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctTotalNumByteSlice(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalNumByteSlice(params))) - return this - }, - /** - * Add a verify_acct_total_extra_app_pages(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctTotalExtraAppPages(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalExtraAppPages(params))) - return this - }, - /** - * Add a verify_acct_total_apps_created(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctTotalAppsCreated(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAppsCreated(params))) - return this - }, - /** - * Add a verify_acct_total_apps_opted_in(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctTotalAppsOptedIn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAppsOptedIn(params))) - return this - }, - /** - * Add a verify_acct_total_assets_created(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctTotalAssetsCreated(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAssetsCreated(params))) - return this - }, - /** - * Add a verify_acct_total_assets(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctTotalAssets(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAssets(params))) - return this - }, - /** - * Add a verify_acct_total_boxes(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctTotalBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalBoxes(params))) - return this - }, - /** - * Add a verify_acct_total_box_bytes(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctTotalBoxBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalBoxBytes(params))) - return this - }, - /** - * Add a verify_acct_incentive_eligible(account)bool method call against the StateAcctParamsGetContract contract - */ - verifyAcctIncentiveEligible(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctIncentiveEligible(params))) - return this - }, - /** - * Add a verify_acct_last_heartbeat(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctLastHeartbeat(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctLastHeartbeat(params))) - return this - }, - /** - * Add a verify_acct_last_proposed(account)uint64 method call against the StateAcctParamsGetContract contract - */ - verifyAcctLastProposed(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctLastProposed(params))) - return this - }, - /** - * Add a clear state call to the StateAcctParamsGetContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as StateAcctParamsGetContractComposer - } -} -export type StateAcctParamsGetContractComposer = { - /** - * Calls the verify_acct_balance(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctBalance(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_balance(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_min_balance(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctMinBalance(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_min_balance(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_auth_addr(account)address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctAuthAddr(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_auth_addr(account)address'] | undefined]> - - /** - * Calls the verify_acct_total_num_uint(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalNumUint(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_num_uint(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_num_byte_slice(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalNumByteSlice(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_num_byte_slice(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_extra_app_pages(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalExtraAppPages(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_extra_app_pages(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_apps_created(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalAppsCreated(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_apps_created(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_apps_opted_in(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalAppsOptedIn(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_apps_opted_in(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_assets_created(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalAssetsCreated(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_assets_created(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_assets(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalAssets(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_assets(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_boxes(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalBoxes(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_boxes(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_total_box_bytes(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctTotalBoxBytes(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_box_bytes(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_incentive_eligible(account)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctIncentiveEligible(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_incentive_eligible(account)bool'] | undefined]> - - /** - * Calls the verify_acct_last_heartbeat(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctLastHeartbeat(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_last_heartbeat(account)uint64'] | undefined]> - - /** - * Calls the verify_acct_last_proposed(account)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAcctLastProposed(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_last_proposed(account)uint64'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the StateAcctParamsGetContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): StateAcctParamsGetContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): StateAcctParamsGetContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type StateAcctParamsGetContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalContract.ts deleted file mode 100644 index fc6b74f..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalContract.ts +++ /dev/null @@ -1,1018 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"StateAppGlobalContract","structs":{},"methods":[{"name":"verify_get_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_uint64","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_ex_bytes","args":[{"type":"uint64","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"(byte[],bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_ex_uint64","args":[{"type":"uint64","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"(uint64,bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_delete","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_put_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_put_bytes","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":1,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"global_uint64":{"keyType":"AVMString","valueType":"AVMUint64","key":"Z2xvYmFsX3VpbnQ2NA=="},"global_bytes":{"keyType":"AVMString","valueType":"AVMBytes","key":"Z2xvYmFsX2J5dGVz"}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQ1CiAgICAvLyBjbGFzcyBTdGF0ZUFwcEdsb2JhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxNgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4YTk5N2ExODcgMHg0ZGI4YWE0MSAweDBjMWY1NmE3IDB4YWZkZGIwODggMHg5M2E4NTJlMSAweDM2OTk2NDUxIDB4MzkyMGE1N2IgLy8gbWV0aG9kICJ2ZXJpZnlfZ2V0X2J5dGVzKGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9nZXRfdWludDY0KGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfYnl0ZXModWludDY0LGJ5dGVbXSkoYnl0ZVtdLGJvb2wpIiwgbWV0aG9kICJ2ZXJpZnlfZ2V0X2V4X3VpbnQ2NCh1aW50NjQsYnl0ZVtdKSh1aW50NjQsYm9vbCkiLCBtZXRob2QgInZlcmlmeV9kZWxldGUoYnl0ZVtdKXZvaWQiLCBtZXRob2QgInZlcmlmeV9wdXRfdWludDY0KGJ5dGVbXSx1aW50NjQpdm9pZCIsIG1ldGhvZCAidmVyaWZ5X3B1dF9ieXRlcyhieXRlW10sYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfZ2V0X2J5dGVzIHZlcmlmeV9nZXRfdWludDY0IHZlcmlmeV9nZXRfZXhfYnl0ZXMgdmVyaWZ5X2dldF9leF91aW50NjQgdmVyaWZ5X2RlbGV0ZSB2ZXJpZnlfcHV0X3VpbnQ2NCB2ZXJpZnlfcHV0X2J5dGVzCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTY6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9nZXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDU5CiAgICAvLyB2YWx1ZSA9IG9wLkFwcEdsb2JhbC5nZXRfYnl0ZXMoYSkKICAgIGFwcF9nbG9iYWxfZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDY0CiAgICAvLyB2YWx1ZSA9IG9wLkFwcEdsb2JhbC5nZXRfdWludDY0KGEpCiAgICBhcHBfZ2xvYmFsX2dldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF9leF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2OQogICAgLy8gcmV0dXJuIG9wLkFwcEdsb2JhbC5nZXRfZXhfYnl0ZXMoYSwgYikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfZXhfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDczCiAgICAvLyByZXR1cm4gb3AuQXBwR2xvYmFsLmdldF9leF91aW50NjQoYSwgYikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgc3dhcAogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9kZWxldGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGVsZXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDc3CiAgICAvLyBvcC5BcHBHbG9iYWwuZGVsZXRlKGEpCiAgICBhcHBfZ2xvYmFsX2RlbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfcHV0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgxCiAgICAvLyBvcC5BcHBHbG9iYWwucHV0KGEsIGIpCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfcHV0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3B1dF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODUKICAgIC8vIG9wLkFwcEdsb2JhbC5wdXQoYSwgYikKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmAgQVH3x1AQAxG0EAQDEZFEQxGESCBwSpl6GHBE24qkEEDB9WpwSv3bCIBJOoUuEENplkUQQ5IKV7NhoAjgcACQAeACwAVABtAHYAgwAxGRQxGBQQQzYaAVcCAGRJFRZXBgJMUChMULAiQzYaAVcCAGQWKExQsCJDNhoBFzYaAlcCAGVLARUWVwYCTwJQKSNPA1SAAgADTFBMUChMULAiQzYaARc2GgJXAgBlTBYpI08DVFAoTFCwIkM2GgFXAgBpIkM2GgFXAgA2GgIXZyJDNhoBVwIANhoCVwIAZyJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the StateAppGlobalContract contract - */ -export type StateAppGlobalContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify_get_bytes(byte[])byte[]': { - a: Uint8Array - } - 'verify_get_uint64(byte[])uint64': { - a: Uint8Array - } - 'verify_get_ex_bytes(uint64,byte[])(byte[],bool)': { - a: bigint | number - b: Uint8Array - } - 'verify_get_ex_uint64(uint64,byte[])(uint64,bool)': { - a: bigint | number - b: Uint8Array - } - 'verify_delete(byte[])void': { - a: Uint8Array - } - 'verify_put_uint64(byte[],uint64)void': { - a: Uint8Array - b: bigint | number - } - 'verify_put_bytes(byte[],byte[])void': { - a: Uint8Array - b: Uint8Array - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify_get_bytes(byte[])byte[]': [a: Uint8Array] - 'verify_get_uint64(byte[])uint64': [a: Uint8Array] - 'verify_get_ex_bytes(uint64,byte[])(byte[],bool)': [a: bigint | number, b: Uint8Array] - 'verify_get_ex_uint64(uint64,byte[])(uint64,bool)': [a: bigint | number, b: Uint8Array] - 'verify_delete(byte[])void': [a: Uint8Array] - 'verify_put_uint64(byte[],uint64)void': [a: Uint8Array, b: bigint | number] - 'verify_put_bytes(byte[],byte[])void': [a: Uint8Array, b: Uint8Array] - } -} - -/** - * The return type for each method - */ -export type StateAppGlobalContractReturns = { - 'verify_get_bytes(byte[])byte[]': Uint8Array - 'verify_get_uint64(byte[])uint64': bigint - 'verify_get_ex_bytes(uint64,byte[])(byte[],bool)': [Uint8Array, boolean] - 'verify_get_ex_uint64(uint64,byte[])(uint64,bool)': [bigint, boolean] - 'verify_delete(byte[])void': void - 'verify_put_uint64(byte[],uint64)void': void - 'verify_put_bytes(byte[],byte[])void': void -} - -/** - * Defines the types of available calls and state of the StateAppGlobalContract smart contract. - */ -export type StateAppGlobalContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify_get_bytes(byte[])byte[]' | 'verify_get_bytes', { - argsObj: StateAppGlobalContractArgs['obj']['verify_get_bytes(byte[])byte[]'] - argsTuple: StateAppGlobalContractArgs['tuple']['verify_get_bytes(byte[])byte[]'] - returns: StateAppGlobalContractReturns['verify_get_bytes(byte[])byte[]'] - }> - & Record<'verify_get_uint64(byte[])uint64' | 'verify_get_uint64', { - argsObj: StateAppGlobalContractArgs['obj']['verify_get_uint64(byte[])uint64'] - argsTuple: StateAppGlobalContractArgs['tuple']['verify_get_uint64(byte[])uint64'] - returns: StateAppGlobalContractReturns['verify_get_uint64(byte[])uint64'] - }> - & Record<'verify_get_ex_bytes(uint64,byte[])(byte[],bool)' | 'verify_get_ex_bytes', { - argsObj: StateAppGlobalContractArgs['obj']['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'] - argsTuple: StateAppGlobalContractArgs['tuple']['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'] - returns: StateAppGlobalContractReturns['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'] - }> - & Record<'verify_get_ex_uint64(uint64,byte[])(uint64,bool)' | 'verify_get_ex_uint64', { - argsObj: StateAppGlobalContractArgs['obj']['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'] - argsTuple: StateAppGlobalContractArgs['tuple']['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'] - returns: StateAppGlobalContractReturns['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'] - }> - & Record<'verify_delete(byte[])void' | 'verify_delete', { - argsObj: StateAppGlobalContractArgs['obj']['verify_delete(byte[])void'] - argsTuple: StateAppGlobalContractArgs['tuple']['verify_delete(byte[])void'] - returns: StateAppGlobalContractReturns['verify_delete(byte[])void'] - }> - & Record<'verify_put_uint64(byte[],uint64)void' | 'verify_put_uint64', { - argsObj: StateAppGlobalContractArgs['obj']['verify_put_uint64(byte[],uint64)void'] - argsTuple: StateAppGlobalContractArgs['tuple']['verify_put_uint64(byte[],uint64)void'] - returns: StateAppGlobalContractReturns['verify_put_uint64(byte[],uint64)void'] - }> - & Record<'verify_put_bytes(byte[],byte[])void' | 'verify_put_bytes', { - argsObj: StateAppGlobalContractArgs['obj']['verify_put_bytes(byte[],byte[])void'] - argsTuple: StateAppGlobalContractArgs['tuple']['verify_put_bytes(byte[],byte[])void'] - returns: StateAppGlobalContractReturns['verify_put_bytes(byte[],byte[])void'] - }> - /** - * Defines the shape of the state of the application. - */ - state: { - global: { - keys: { - globalUint64: bigint - globalBytes: BinaryState - } - maps: {} - } - } -} - -/** - * Defines the possible abi call signatures. - */ -export type StateAppGlobalContractSignatures = keyof StateAppGlobalContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type StateAppGlobalContractNonVoidMethodSignatures = keyof StateAppGlobalContractTypes['methods'] extends infer T ? T extends keyof StateAppGlobalContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the StateAppGlobalContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = StateAppGlobalContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the StateAppGlobalContract smart contract to the method's return type - */ -export type MethodReturn = StateAppGlobalContractTypes['methods'][TSignature]['returns'] - -/** - * Defines the shape of the keyed global state of the application. - */ -export type GlobalKeysState = StateAppGlobalContractTypes['state']['global']['keys'] - - -/** - * Defines supported create method params for this smart contract - */ -export type StateAppGlobalContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type StateAppGlobalContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: StateAppGlobalContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppGlobalContract smart contract - */ -export abstract class StateAppGlobalContractParamsFactory { - /** - * Constructs a no op call for the verify_get_bytes(byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyGetBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_get_bytes(byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_get_uint64(byte[])uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyGetUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_get_uint64(byte[])uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_get_ex_bytes(uint64,byte[])(byte[],bool) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyGetExBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_get_ex_bytes(uint64,byte[])(byte[],bool)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_get_ex_uint64(uint64,byte[])(uint64,bool) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyGetExUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_get_ex_uint64(uint64,byte[])(uint64,bool)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_delete(byte[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyDelete(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_delete(byte[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_put_uint64(byte[],uint64)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyPutUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_put_uint64(byte[],uint64)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_put_bytes(byte[],byte[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyPutBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_put_bytes(byte[],byte[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } -} - -/** - * A factory to create and deploy one or more instance of the StateAppGlobalContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class StateAppGlobalContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `StateAppGlobalContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new StateAppGlobalContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new StateAppGlobalContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the StateAppGlobalContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: StateAppGlobalContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new StateAppGlobalContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppGlobalContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppGlobalContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppGlobalContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new StateAppGlobalContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the StateAppGlobalContract smart contract - */ -export class StateAppGlobalContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `StateAppGlobalContractClient` - * - * @param appClient An `AppClient` instance which has been created with the StateAppGlobalContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `StateAppGlobalContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `StateAppGlobalContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new StateAppGlobalContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `StateAppGlobalContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new StateAppGlobalContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the StateAppGlobalContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_bytes(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyGetBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyGetBytes(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_uint64(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyGetUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyGetUint64(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_bytes(uint64,byte[])(byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyGetExBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyGetExBytes(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_uint64(uint64,byte[])(uint64,bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyGetExUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyGetExUint64(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_delete(byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyDelete: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyDelete(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_uint64(byte[],uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyPutUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyPutUint64(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_bytes(byte[],byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyPutBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyPutBytes(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the StateAppGlobalContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_bytes(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyGetBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyGetBytes(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_uint64(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyGetUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyGetUint64(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_bytes(uint64,byte[])(byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyGetExBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyGetExBytes(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_uint64(uint64,byte[])(uint64,bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyGetExUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyGetExUint64(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_delete(byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyDelete: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyDelete(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_uint64(byte[],uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyPutUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyPutUint64(params)) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_bytes(byte[],byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyPutBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyPutBytes(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the StateAppGlobalContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_bytes(byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyGetBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyGetBytes(params)) - return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_get_bytes(byte[])byte[]'])} - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_uint64(byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyGetUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyGetUint64(params)) - return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_get_uint64(byte[])uint64'])} - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_bytes(uint64,byte[])(byte[],bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyGetExBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyGetExBytes(params)) - return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'])} - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_uint64(uint64,byte[])(uint64,bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyGetExUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyGetExUint64(params)) - return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'])} - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_delete(byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyDelete: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyDelete(params)) - return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_delete(byte[])void'])} - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_uint64(byte[],uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyPutUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyPutUint64(params)) - return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_put_uint64(byte[],uint64)void'])} - }, - - /** - * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_bytes(byte[],byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyPutBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyPutBytes(params)) - return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_put_bytes(byte[],byte[])void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new StateAppGlobalContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current StateAppGlobalContract app - */ - state = { - /** - * Methods to access global state for the current StateAppGlobalContract app - */ - global: { - /** - * Get all current keyed values from global state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.global.getAll() - return { - globalUint64: result.global_uint64, - globalBytes: new BinaryStateValue(result.global_bytes), - } - }, - /** - * Get the current value of the global_uint64 key in global state - */ - globalUint64: async (): Promise => { return (await this.appClient.state.global.getValue("global_uint64")) as bigint | undefined }, - /** - * Get the current value of the global_bytes key in global state - */ - globalBytes: async (): Promise => { return new BinaryStateValue((await this.appClient.state.global.getValue("global_bytes")) as Uint8Array | undefined) }, - }, - } - - public newGroup(composerConfig?: TransactionComposerConfig): StateAppGlobalContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_get_bytes(byte[])byte[] method call against the StateAppGlobalContract contract - */ - verifyGetBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetBytes(params))) - return this - }, - /** - * Add a verify_get_uint64(byte[])uint64 method call against the StateAppGlobalContract contract - */ - verifyGetUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetUint64(params))) - return this - }, - /** - * Add a verify_get_ex_bytes(uint64,byte[])(byte[],bool) method call against the StateAppGlobalContract contract - */ - verifyGetExBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetExBytes(params))) - return this - }, - /** - * Add a verify_get_ex_uint64(uint64,byte[])(uint64,bool) method call against the StateAppGlobalContract contract - */ - verifyGetExUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetExUint64(params))) - return this - }, - /** - * Add a verify_delete(byte[])void method call against the StateAppGlobalContract contract - */ - verifyDelete(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyDelete(params))) - return this - }, - /** - * Add a verify_put_uint64(byte[],uint64)void method call against the StateAppGlobalContract contract - */ - verifyPutUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyPutUint64(params))) - return this - }, - /** - * Add a verify_put_bytes(byte[],byte[])void method call against the StateAppGlobalContract contract - */ - verifyPutBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyPutBytes(params))) - return this - }, - /** - * Add a clear state call to the StateAppGlobalContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as StateAppGlobalContractComposer - } -} -export type StateAppGlobalContractComposer = { - /** - * Calls the verify_get_bytes(byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyGetBytes(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_get_bytes(byte[])byte[]'] | undefined]> - - /** - * Calls the verify_get_uint64(byte[])uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyGetUint64(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_get_uint64(byte[])uint64'] | undefined]> - - /** - * Calls the verify_get_ex_bytes(uint64,byte[])(byte[],bool) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyGetExBytes(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'] | undefined]> - - /** - * Calls the verify_get_ex_uint64(uint64,byte[])(uint64,bool) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyGetExUint64(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'] | undefined]> - - /** - * Calls the verify_delete(byte[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyDelete(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_delete(byte[])void'] | undefined]> - - /** - * Calls the verify_put_uint64(byte[],uint64)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyPutUint64(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_put_uint64(byte[],uint64)void'] | undefined]> - - /** - * Calls the verify_put_bytes(byte[],byte[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyPutBytes(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_put_bytes(byte[],byte[])void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the StateAppGlobalContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): StateAppGlobalContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppGlobalContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type StateAppGlobalContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalExContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalExContract.ts deleted file mode 100644 index cf78371..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalExContract.ts +++ /dev/null @@ -1,551 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"StateAppGlobalExContract","structs":{},"methods":[],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":2,"bytes":4},"local":{"ints":0,"bytes":0}},"keys":{"global":{"global_uint64":{"keyType":"AVMString","valueType":"AVMUint64","key":"Z2xvYmFsX3VpbnQ2NA=="},"global_bytes":{"keyType":"AVMString","valueType":"AVMBytes","key":"Z2xvYmFsX2J5dGVz"},"global_uint64_explicit":{"keyType":"AVMString","valueType":"AVMUint64","key":"Z2xvYmFsX3VpbnQ2NF9leHBsaWNpdA=="},"global_bytes_explicit":{"keyType":"AVMString","valueType":"AVMBytes","key":"Z2xvYmFsX2J5dGVzX2V4cGxpY2l0"},"global_arc4_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"Z2xvYmFsX2FyYzRfYnl0ZXM="},"global_arc4_bytes_explicit":{"keyType":"AVMString","valueType":"byte[]","key":"Z2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQ="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDMxCiAgICAvLyBrZXk9Imdsb2JhbF91aW50NjQiLAogICAgcHVzaGJ5dGVzICJnbG9iYWxfdWludDY0IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzMAogICAgLy8gVUludDY0KDIpLAogICAgcHVzaGludCAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDI5LTQzMgogICAgLy8gc2VsZi5nbG9iYWxfdWludDY0ID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgVUludDY0KDIpLAogICAgLy8gICAgIGtleT0iZ2xvYmFsX3VpbnQ2NCIsCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzNQogICAgLy8ga2V5PSJnbG9iYWxfYnl0ZXMiLAogICAgcHVzaGJ5dGVzICJnbG9iYWxfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM0CiAgICAvLyBCeXRlcyhiImR1bW15X2J5dGVzIiksCiAgICBieXRlY18wIC8vIDB4NjQ3NTZkNmQ3OTVmNjI3OTc0NjU3MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzMy00MzYKICAgIC8vIHNlbGYuZ2xvYmFsX2J5dGVzID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgQnl0ZXMoYiJkdW1teV9ieXRlcyIpLAogICAgLy8gICAgIGtleT0iZ2xvYmFsX2J5dGVzIiwKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM3CiAgICAvLyBzZWxmLmdsb2JhbF91aW50NjRfZXhwbGljaXQgPSBhbGdvcHkuVUludDY0KDIpCiAgICBwdXNoYnl0ZXMgImdsb2JhbF91aW50NjRfZXhwbGljaXQiCiAgICBwdXNoaW50IDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM4CiAgICAvLyBzZWxmLmdsb2JhbF9ieXRlc19leHBsaWNpdCA9IGFsZ29weS5CeXRlcyhiImR1bW15X2J5dGVzIikKICAgIHB1c2hieXRlcyAiZ2xvYmFsX2J5dGVzX2V4cGxpY2l0IgogICAgYnl0ZWNfMCAvLyAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQwCiAgICAvLyBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIiksIGtleT0iZ2xvYmFsX2FyYzRfYnl0ZXMiCiAgICBwdXNoYnl0ZXMgImdsb2JhbF9hcmM0X2J5dGVzIgogICAgYnl0ZWNfMSAvLyAweDAwMTA2NDc1NmQ2ZDc5NWY2MTcyNjMzNDVmNjI3OTc0NjU3MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzOS00NDEKICAgIC8vIHNlbGYuZ2xvYmFsX2FyYzRfYnl0ZXMgPSBHbG9iYWxTdGF0ZSgKICAgIC8vICAgICBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIiksIGtleT0iZ2xvYmFsX2FyYzRfYnl0ZXMiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ0MgogICAgLy8gc2VsZi5nbG9iYWxfYXJjNF9ieXRlc19leHBsaWNpdCA9IGFsZ29weS5hcmM0LkR5bmFtaWNCeXRlcyhiImR1bW15X2FyYzRfYnl0ZXMiKQogICAgcHVzaGJ5dGVzICJnbG9iYWxfYXJjNF9ieXRlc19leHBsaWNpdCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDAKICAgIC8vIGFsZ29weS5hcmM0LkR5bmFtaWNCeXRlcyhiImR1bW15X2FyYzRfYnl0ZXMiKSwga2V5PSJnbG9iYWxfYXJjNF9ieXRlcyIKICAgIGJ5dGVjXzEgLy8gMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDIKICAgIC8vIHNlbGYuZ2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQgPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIikKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjcKICAgIC8vIGNsYXNzIFN0YXRlQXBwR2xvYmFsRXhDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgICEKICAgIGFzc2VydAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyYCC2R1bW15X2J5dGVzEgAQZHVtbXlfYXJjNF9ieXRlczEYQACJgA1nbG9iYWxfdWludDY0gQJngAxnbG9iYWxfYnl0ZXMoZ4AWZ2xvYmFsX3VpbnQ2NF9leHBsaWNpdIECZ4AVZ2xvYmFsX2J5dGVzX2V4cGxpY2l0KGeAEWdsb2JhbF9hcmM0X2J5dGVzKWeAGmdsb2JhbF9hcmM0X2J5dGVzX2V4cGxpY2l0KWcxGxREMRkUMRgUEEM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the StateAppGlobalExContract contract - */ -export type StateAppGlobalExContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - } -} - -/** - * The return type for each method - */ -export type StateAppGlobalExContractReturns = { -} - -/** - * Defines the types of available calls and state of the StateAppGlobalExContract smart contract. - */ -export type StateAppGlobalExContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: {} - /** - * Defines the shape of the state of the application. - */ - state: { - global: { - keys: { - globalUint64: bigint - globalBytes: BinaryState - globalUint64Explicit: bigint - globalBytesExplicit: BinaryState - globalArc4Bytes: Uint8Array - globalArc4BytesExplicit: Uint8Array - } - maps: {} - } - } -} - -/** - * Defines the possible abi call signatures. - */ -export type StateAppGlobalExContractSignatures = keyof StateAppGlobalExContractTypes['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the StateAppGlobalExContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = StateAppGlobalExContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the StateAppGlobalExContract smart contract to the method's return type - */ -export type MethodReturn = StateAppGlobalExContractTypes['methods'][TSignature]['returns'] - -/** - * Defines the shape of the keyed global state of the application. - */ -export type GlobalKeysState = StateAppGlobalExContractTypes['state']['global']['keys'] - - -/** - * Defines supported create method params for this smart contract - */ -export type StateAppGlobalExContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type StateAppGlobalExContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: StateAppGlobalExContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppGlobalExContract smart contract - */ -export abstract class StateAppGlobalExContractParamsFactory { -} - -/** - * A factory to create and deploy one or more instance of the StateAppGlobalExContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class StateAppGlobalExContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `StateAppGlobalExContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new StateAppGlobalExContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new StateAppGlobalExContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the StateAppGlobalExContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: StateAppGlobalExContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new StateAppGlobalExContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppGlobalExContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppGlobalExContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppGlobalExContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new StateAppGlobalExContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the StateAppGlobalExContract smart contract - */ -export class StateAppGlobalExContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `StateAppGlobalExContractClient` - * - * @param appClient An `AppClient` instance which has been created with the StateAppGlobalExContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `StateAppGlobalExContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `StateAppGlobalExContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new StateAppGlobalExContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `StateAppGlobalExContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new StateAppGlobalExContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the StateAppGlobalExContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the StateAppGlobalExContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the StateAppGlobalExContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new StateAppGlobalExContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current StateAppGlobalExContract app - */ - state = { - /** - * Methods to access global state for the current StateAppGlobalExContract app - */ - global: { - /** - * Get all current keyed values from global state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.global.getAll() - return { - globalUint64: result.global_uint64, - globalBytes: new BinaryStateValue(result.global_bytes), - globalUint64Explicit: result.global_uint64_explicit, - globalBytesExplicit: new BinaryStateValue(result.global_bytes_explicit), - globalArc4Bytes: result.global_arc4_bytes, - globalArc4BytesExplicit: result.global_arc4_bytes_explicit, - } - }, - /** - * Get the current value of the global_uint64 key in global state - */ - globalUint64: async (): Promise => { return (await this.appClient.state.global.getValue("global_uint64")) as bigint | undefined }, - /** - * Get the current value of the global_bytes key in global state - */ - globalBytes: async (): Promise => { return new BinaryStateValue((await this.appClient.state.global.getValue("global_bytes")) as Uint8Array | undefined) }, - /** - * Get the current value of the global_uint64_explicit key in global state - */ - globalUint64Explicit: async (): Promise => { return (await this.appClient.state.global.getValue("global_uint64_explicit")) as bigint | undefined }, - /** - * Get the current value of the global_bytes_explicit key in global state - */ - globalBytesExplicit: async (): Promise => { return new BinaryStateValue((await this.appClient.state.global.getValue("global_bytes_explicit")) as Uint8Array | undefined) }, - /** - * Get the current value of the global_arc4_bytes key in global state - */ - globalArc4Bytes: async (): Promise => { return (await this.appClient.state.global.getValue("global_arc4_bytes")) as Uint8Array | undefined }, - /** - * Get the current value of the global_arc4_bytes_explicit key in global state - */ - globalArc4BytesExplicit: async (): Promise => { return (await this.appClient.state.global.getValue("global_arc4_bytes_explicit")) as Uint8Array | undefined }, - }, - } - - public newGroup(composerConfig?: TransactionComposerConfig): StateAppGlobalExContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a clear state call to the StateAppGlobalExContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as StateAppGlobalExContractComposer - } -} -export type StateAppGlobalExContractComposer = { - /** - * Makes a clear_state call to an existing instance of the StateAppGlobalExContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): StateAppGlobalExContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppGlobalExContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type StateAppGlobalExContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalContract.ts deleted file mode 100644 index be9dae8..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalContract.ts +++ /dev/null @@ -1,1197 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"StateAppLocalContract","structs":{},"methods":[{"name":"opt_in","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["OptIn"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_bytes","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_uint64","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_ex_bytes","args":[{"type":"address","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_ex_uint64","args":[{"type":"address","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_delete","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_exists","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_put_uint64","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_put_bytes","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":1,"bytes":1}},"keys":{"global":{},"local":{"local_uint64":{"keyType":"AVMString","valueType":"AVMUint64","key":"bG9jYWxfdWludDY0"},"local_bytes":{"keyType":"AVMString","valueType":"AVMBytes","key":"bG9jYWxfYnl0ZXM="}},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM3MgogICAgLy8gY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxOQogICAgcHVzaGJ5dGVzIDB4MzBjNmQ1OGEgLy8gbWV0aG9kICJvcHRfaW4oKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX29wdF9pbl9yb3V0ZUA1CgptYWluX3N3aXRjaF9jYXNlX25leHRANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNzIKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4YTg4MzAyZmUgMHg0OWI3ZGRmOSAweGMwNzhiZWFkIDB4YTUyZjk5MmIgMHg4YzU2YWQ5MCAweDRjN2FkODIzIDB4Y2FhN2I4NjQgMHgyNGY5ZjA4NSAvLyBtZXRob2QgInZlcmlmeV9nZXRfYnl0ZXMoYWRkcmVzcyxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZ2V0X3VpbnQ2NChhZGRyZXNzLGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfYnl0ZXMoYWRkcmVzcyx1aW50NjQsYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2dldF9leF91aW50NjQoYWRkcmVzcyx1aW50NjQsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2RlbGV0ZShhZGRyZXNzLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfZXhpc3RzKGFkZHJlc3MsYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9wdXRfdWludDY0KGFkZHJlc3MsYnl0ZVtdLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfcHV0X2J5dGVzKGFkZHJlc3MsYnl0ZVtdLGJ5dGVbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X2dldF9ieXRlcyB2ZXJpZnlfZ2V0X3VpbnQ2NCB2ZXJpZnlfZ2V0X2V4X2J5dGVzIHZlcmlmeV9nZXRfZXhfdWludDY0IHZlcmlmeV9kZWxldGUgdmVyaWZ5X2V4aXN0cyB2ZXJpZnlfcHV0X3VpbnQ2NCB2ZXJpZnlfcHV0X2J5dGVzCiAgICBlcnIKCm1haW5fb3B0X2luX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gT3B0SW4KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBvcHRfaW4KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3Qub3B0X2luW3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4NgogICAgLy8gc2VsZi5sb2NhbF9ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IEJ5dGVzKGIiZHVtbXlfYnl0ZXMiKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBwdXNoYnl0ZXNzICJsb2NhbF9ieXRlcyIgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzg3CiAgICAvLyBzZWxmLmxvY2FsX3VpbnQ2NFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IFVJbnQ2NCg5OTkpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIHB1c2hieXRlcyAibG9jYWxfdWludDY0IgogICAgcHVzaGludCA5OTkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9nZXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzkxCiAgICAvLyB2YWx1ZSA9IG9wLkFwcExvY2FsLmdldF9ieXRlcyhhLCBiKQogICAgYXBwX2xvY2FsX2dldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzk2CiAgICAvLyB2YWx1ZSA9IG9wLkFwcExvY2FsLmdldF91aW50NjQoYSwgYikKICAgIGFwcF9sb2NhbF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF9leF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gdmFsdWUsIF92YWwgPSBvcC5BcHBMb2NhbC5nZXRfZXhfYnl0ZXMoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfZXhfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDA2CiAgICAvLyB2YWx1ZSwgX3ZhbCA9IG9wLkFwcExvY2FsLmdldF9leF91aW50NjQoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9kZWxldGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGVsZXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDExCiAgICAvLyBvcC5BcHBMb2NhbC5kZWxldGUoYSwgYikKICAgIGFwcF9sb2NhbF9kZWwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZXhpc3RzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4aXN0czoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQxNQogICAgLy8gX3ZhbHVlLCBleGlzdHMgPSBvcC5BcHBMb2NhbC5nZXRfZXhfdWludDY0KGEsIDAsIGIpCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAogICAgYXBwX2xvY2FsX2dldF9leAogICAgYnVyeSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X3B1dF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfcHV0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQyMAogICAgLy8gb3AuQXBwTG9jYWwucHV0KGEsIGIsIGMpCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X3B1dF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDI0CiAgICAvLyBvcC5BcHBMb2NhbC5wdXQoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmAQQVH3x1MRtBAF+ABDDG1Yo2GgCOAQBHMRkURDEYRIIIBKiDAv4ESbfd+QTAeL6tBKUvmSsEjFatkARMetgjBMqnuGQEJPnwhTYaAI4IAEcAXwBwAI0AowCvAMoA2gAxGSISMRgQREIACDEZFDEYFBBDMgmCAgtsb2NhbF9ieXRlcwtkdW1teV9ieXRlc2YyCYAMbG9jYWxfdWludDY0gecHZiJDNhoBNhoCVwIAYkkVFlcGAkxQKExQsCJDNhoBNhoCVwIAYhYoTFCwIkM2GgE2GgIXNhoDVwIAY0hJFRZXBgJMUChMULAiQzYaATYaAhc2GgNXAgBjSBYoTFCwIkM2GgE2GgJXAgBoIkM2GgE2GgJXAgAjTGNFAYABACNPAlQoTFCwIkM2GgE2GgJXAgA2GgMXZiJDNhoBNhoCVwIANhoDVwIAZiJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the StateAppLocalContract contract - */ -export type StateAppLocalContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'opt_in()void': Record - 'verify_get_bytes(address,byte[])byte[]': { - a: string - b: Uint8Array - } - 'verify_get_uint64(address,byte[])uint64': { - a: string - b: Uint8Array - } - 'verify_get_ex_bytes(address,uint64,byte[])byte[]': { - a: string - b: bigint | number - c: Uint8Array - } - 'verify_get_ex_uint64(address,uint64,byte[])uint64': { - a: string - b: bigint | number - c: Uint8Array - } - 'verify_delete(address,byte[])void': { - a: string - b: Uint8Array - } - 'verify_exists(address,byte[])bool': { - a: string - b: Uint8Array - } - 'verify_put_uint64(address,byte[],uint64)void': { - a: string - b: Uint8Array - c: bigint | number - } - 'verify_put_bytes(address,byte[],byte[])void': { - a: string - b: Uint8Array - c: Uint8Array - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'opt_in()void': [] - 'verify_get_bytes(address,byte[])byte[]': [a: string, b: Uint8Array] - 'verify_get_uint64(address,byte[])uint64': [a: string, b: Uint8Array] - 'verify_get_ex_bytes(address,uint64,byte[])byte[]': [a: string, b: bigint | number, c: Uint8Array] - 'verify_get_ex_uint64(address,uint64,byte[])uint64': [a: string, b: bigint | number, c: Uint8Array] - 'verify_delete(address,byte[])void': [a: string, b: Uint8Array] - 'verify_exists(address,byte[])bool': [a: string, b: Uint8Array] - 'verify_put_uint64(address,byte[],uint64)void': [a: string, b: Uint8Array, c: bigint | number] - 'verify_put_bytes(address,byte[],byte[])void': [a: string, b: Uint8Array, c: Uint8Array] - } -} - -/** - * The return type for each method - */ -export type StateAppLocalContractReturns = { - 'opt_in()void': void - 'verify_get_bytes(address,byte[])byte[]': Uint8Array - 'verify_get_uint64(address,byte[])uint64': bigint - 'verify_get_ex_bytes(address,uint64,byte[])byte[]': Uint8Array - 'verify_get_ex_uint64(address,uint64,byte[])uint64': bigint - 'verify_delete(address,byte[])void': void - 'verify_exists(address,byte[])bool': boolean - 'verify_put_uint64(address,byte[],uint64)void': void - 'verify_put_bytes(address,byte[],byte[])void': void -} - -/** - * Defines the types of available calls and state of the StateAppLocalContract smart contract. - */ -export type StateAppLocalContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'opt_in()void' | 'opt_in', { - argsObj: StateAppLocalContractArgs['obj']['opt_in()void'] - argsTuple: StateAppLocalContractArgs['tuple']['opt_in()void'] - returns: StateAppLocalContractReturns['opt_in()void'] - }> - & Record<'verify_get_bytes(address,byte[])byte[]' | 'verify_get_bytes', { - argsObj: StateAppLocalContractArgs['obj']['verify_get_bytes(address,byte[])byte[]'] - argsTuple: StateAppLocalContractArgs['tuple']['verify_get_bytes(address,byte[])byte[]'] - returns: StateAppLocalContractReturns['verify_get_bytes(address,byte[])byte[]'] - }> - & Record<'verify_get_uint64(address,byte[])uint64' | 'verify_get_uint64', { - argsObj: StateAppLocalContractArgs['obj']['verify_get_uint64(address,byte[])uint64'] - argsTuple: StateAppLocalContractArgs['tuple']['verify_get_uint64(address,byte[])uint64'] - returns: StateAppLocalContractReturns['verify_get_uint64(address,byte[])uint64'] - }> - & Record<'verify_get_ex_bytes(address,uint64,byte[])byte[]' | 'verify_get_ex_bytes', { - argsObj: StateAppLocalContractArgs['obj']['verify_get_ex_bytes(address,uint64,byte[])byte[]'] - argsTuple: StateAppLocalContractArgs['tuple']['verify_get_ex_bytes(address,uint64,byte[])byte[]'] - returns: StateAppLocalContractReturns['verify_get_ex_bytes(address,uint64,byte[])byte[]'] - }> - & Record<'verify_get_ex_uint64(address,uint64,byte[])uint64' | 'verify_get_ex_uint64', { - argsObj: StateAppLocalContractArgs['obj']['verify_get_ex_uint64(address,uint64,byte[])uint64'] - argsTuple: StateAppLocalContractArgs['tuple']['verify_get_ex_uint64(address,uint64,byte[])uint64'] - returns: StateAppLocalContractReturns['verify_get_ex_uint64(address,uint64,byte[])uint64'] - }> - & Record<'verify_delete(address,byte[])void' | 'verify_delete', { - argsObj: StateAppLocalContractArgs['obj']['verify_delete(address,byte[])void'] - argsTuple: StateAppLocalContractArgs['tuple']['verify_delete(address,byte[])void'] - returns: StateAppLocalContractReturns['verify_delete(address,byte[])void'] - }> - & Record<'verify_exists(address,byte[])bool' | 'verify_exists', { - argsObj: StateAppLocalContractArgs['obj']['verify_exists(address,byte[])bool'] - argsTuple: StateAppLocalContractArgs['tuple']['verify_exists(address,byte[])bool'] - returns: StateAppLocalContractReturns['verify_exists(address,byte[])bool'] - }> - & Record<'verify_put_uint64(address,byte[],uint64)void' | 'verify_put_uint64', { - argsObj: StateAppLocalContractArgs['obj']['verify_put_uint64(address,byte[],uint64)void'] - argsTuple: StateAppLocalContractArgs['tuple']['verify_put_uint64(address,byte[],uint64)void'] - returns: StateAppLocalContractReturns['verify_put_uint64(address,byte[],uint64)void'] - }> - & Record<'verify_put_bytes(address,byte[],byte[])void' | 'verify_put_bytes', { - argsObj: StateAppLocalContractArgs['obj']['verify_put_bytes(address,byte[],byte[])void'] - argsTuple: StateAppLocalContractArgs['tuple']['verify_put_bytes(address,byte[],byte[])void'] - returns: StateAppLocalContractReturns['verify_put_bytes(address,byte[],byte[])void'] - }> - /** - * Defines the shape of the state of the application. - */ - state: { - local: { - keys: { - localUint64: bigint - localBytes: BinaryState - } - maps: {} - } - } -} - -/** - * Defines the possible abi call signatures. - */ -export type StateAppLocalContractSignatures = keyof StateAppLocalContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type StateAppLocalContractNonVoidMethodSignatures = keyof StateAppLocalContractTypes['methods'] extends infer T ? T extends keyof StateAppLocalContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the StateAppLocalContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = StateAppLocalContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the StateAppLocalContract smart contract to the method's return type - */ -export type MethodReturn = StateAppLocalContractTypes['methods'][TSignature]['returns'] - -/** - * Defines the shape of the keyed local state of the application. - */ -export type LocalKeysState = StateAppLocalContractTypes['state']['local']['keys'] - - -/** - * Defines supported create method params for this smart contract - */ -export type StateAppLocalContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type StateAppLocalContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: StateAppLocalContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppLocalContract smart contract - */ -export abstract class StateAppLocalContractParamsFactory { - /** - * Gets available optIn ABI call param factories - */ - static get optIn() { - return { - /** - * Constructs opt-in ABI call params for the StateAppLocalContract smart contract using the opt_in()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - optIn(params: CallParams): AppClientMethodCallParams { - return { - ...params, - method: 'opt_in()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - }, - } - } - - /** - * Constructs a no op call for the verify_get_bytes(address,byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyGetBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_get_bytes(address,byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_get_uint64(address,byte[])uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyGetUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_get_uint64(address,byte[])uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_get_ex_bytes(address,uint64,byte[])byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyGetExBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_get_ex_bytes(address,uint64,byte[])byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_get_ex_uint64(address,uint64,byte[])uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyGetExUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_get_ex_uint64(address,uint64,byte[])uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_delete(address,byte[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyDelete(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_delete(address,byte[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_exists(address,byte[])bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyExists(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_exists(address,byte[])bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_put_uint64(address,byte[],uint64)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyPutUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_put_uint64(address,byte[],uint64)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } - /** - * Constructs a no op call for the verify_put_bytes(address,byte[],byte[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyPutBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_put_bytes(address,byte[],byte[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], - } - } -} - -/** - * A factory to create and deploy one or more instance of the StateAppLocalContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class StateAppLocalContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `StateAppLocalContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new StateAppLocalContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new StateAppLocalContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the StateAppLocalContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: StateAppLocalContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new StateAppLocalContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppLocalContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppLocalContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppLocalContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new StateAppLocalContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the StateAppLocalContract smart contract - */ -export class StateAppLocalContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `StateAppLocalContractClient` - * - * @param appClient An `AppClient` instance which has been created with the StateAppLocalContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `StateAppLocalContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `StateAppLocalContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new StateAppLocalContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `StateAppLocalContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new StateAppLocalContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the StateAppLocalContract smart contract using the `opt_in()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The optIn params - */ - optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { - return this.appClient.params.optIn(StateAppLocalContractParamsFactory.optIn.optIn(params)) - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the StateAppLocalContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_bytes(address,byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyGetBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyGetBytes(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_uint64(address,byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyGetUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyGetUint64(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_bytes(address,uint64,byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyGetExBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyGetExBytes(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_uint64(address,uint64,byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyGetExUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyGetExUint64(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_delete(address,byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyDelete: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyDelete(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_exists(address,byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyExists: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyExists(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_put_uint64(address,byte[],uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyPutUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyPutUint64(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_put_bytes(address,byte[],byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyPutBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyPutBytes(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the StateAppLocalContract smart contract using the `opt_in()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The optIn transaction - */ - optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { - return this.appClient.createTransaction.optIn(StateAppLocalContractParamsFactory.optIn.optIn(params)) - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the StateAppLocalContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_bytes(address,byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyGetBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyGetBytes(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_uint64(address,byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyGetUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyGetUint64(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_bytes(address,uint64,byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyGetExBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyGetExBytes(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_uint64(address,uint64,byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyGetExUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyGetExUint64(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_delete(address,byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyDelete: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyDelete(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_exists(address,byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyExists: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyExists(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_put_uint64(address,byte[],uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyPutUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyPutUint64(params)) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_put_bytes(address,byte[],byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyPutBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyPutBytes(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the StateAppLocalContract smart contract using the `opt_in()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The optIn result - */ - optIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { - const result = await this.appClient.send.optIn(StateAppLocalContractParamsFactory.optIn.optIn(params)) - return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['opt_in()void'])} - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the StateAppLocalContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_bytes(address,byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyGetBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyGetBytes(params)) - return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_get_bytes(address,byte[])byte[]'])} - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_uint64(address,byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyGetUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyGetUint64(params)) - return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_get_uint64(address,byte[])uint64'])} - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_bytes(address,uint64,byte[])byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyGetExBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyGetExBytes(params)) - return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_get_ex_bytes(address,uint64,byte[])byte[]'])} - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_uint64(address,uint64,byte[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyGetExUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyGetExUint64(params)) - return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_get_ex_uint64(address,uint64,byte[])uint64'])} - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_delete(address,byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyDelete: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyDelete(params)) - return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_delete(address,byte[])void'])} - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_exists(address,byte[])bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyExists: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyExists(params)) - return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_exists(address,byte[])bool'])} - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_put_uint64(address,byte[],uint64)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyPutUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyPutUint64(params)) - return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_put_uint64(address,byte[],uint64)void'])} - }, - - /** - * Makes a call to the StateAppLocalContract smart contract using the `verify_put_bytes(address,byte[],byte[])void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyPutBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyPutBytes(params)) - return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_put_bytes(address,byte[],byte[])void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new StateAppLocalContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current StateAppLocalContract app - */ - state = { - /** - * Methods to access local state for the current StateAppLocalContract app - */ - local: (address: string | Address) => { - const encodedAddress = typeof address === 'string' ? address : encodeAddress(address.publicKey) - return { - /** - * Get all current keyed values from local state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.local(encodedAddress).getAll() - return { - localUint64: result.local_uint64, - localBytes: new BinaryStateValue(result.local_bytes), - } - }, - /** - * Get the current value of the local_uint64 key in local state - */ - localUint64: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("local_uint64")) as bigint | undefined }, - /** - * Get the current value of the local_bytes key in local state - */ - localBytes: async (): Promise => { return new BinaryStateValue((await this.appClient.state.local(encodedAddress).getValue("local_bytes")) as Uint8Array | undefined) }, - } - }, - } - - public newGroup(composerConfig?: TransactionComposerConfig): StateAppLocalContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_get_bytes(address,byte[])byte[] method call against the StateAppLocalContract contract - */ - verifyGetBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetBytes(params))) - return this - }, - /** - * Add a verify_get_uint64(address,byte[])uint64 method call against the StateAppLocalContract contract - */ - verifyGetUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetUint64(params))) - return this - }, - /** - * Add a verify_get_ex_bytes(address,uint64,byte[])byte[] method call against the StateAppLocalContract contract - */ - verifyGetExBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetExBytes(params))) - return this - }, - /** - * Add a verify_get_ex_uint64(address,uint64,byte[])uint64 method call against the StateAppLocalContract contract - */ - verifyGetExUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetExUint64(params))) - return this - }, - /** - * Add a verify_delete(address,byte[])void method call against the StateAppLocalContract contract - */ - verifyDelete(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyDelete(params))) - return this - }, - /** - * Add a verify_exists(address,byte[])bool method call against the StateAppLocalContract contract - */ - verifyExists(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExists(params))) - return this - }, - /** - * Add a verify_put_uint64(address,byte[],uint64)void method call against the StateAppLocalContract contract - */ - verifyPutUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyPutUint64(params))) - return this - }, - /** - * Add a verify_put_bytes(address,byte[],byte[])void method call against the StateAppLocalContract contract - */ - verifyPutBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyPutBytes(params))) - return this - }, - get optIn() { - return { - optIn: (params: CallParams) => { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn.optIn(params))) - return this - }, - } - }, - /** - * Add a clear state call to the StateAppLocalContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as StateAppLocalContractComposer - } -} -export type StateAppLocalContractComposer = { - /** - * Calls the verify_get_bytes(address,byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyGetBytes(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_get_bytes(address,byte[])byte[]'] | undefined]> - - /** - * Calls the verify_get_uint64(address,byte[])uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyGetUint64(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_get_uint64(address,byte[])uint64'] | undefined]> - - /** - * Calls the verify_get_ex_bytes(address,uint64,byte[])byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyGetExBytes(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_get_ex_bytes(address,uint64,byte[])byte[]'] | undefined]> - - /** - * Calls the verify_get_ex_uint64(address,uint64,byte[])uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyGetExUint64(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_get_ex_uint64(address,uint64,byte[])uint64'] | undefined]> - - /** - * Calls the verify_delete(address,byte[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyDelete(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_delete(address,byte[])void'] | undefined]> - - /** - * Calls the verify_exists(address,byte[])bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyExists(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_exists(address,byte[])bool'] | undefined]> - - /** - * Calls the verify_put_uint64(address,byte[],uint64)void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyPutUint64(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_put_uint64(address,byte[],uint64)void'] | undefined]> - - /** - * Calls the verify_put_bytes(address,byte[],byte[])void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyPutBytes(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_put_bytes(address,byte[],byte[])void'] | undefined]> - - /** - * Gets available optIn methods - */ - readonly optIn: { - /** - * Opts the user into an existing instance of the StateAppLocalContract smart contract using the opt_in()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - optIn(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['opt_in()void'] | undefined]> - } - - /** - * Makes a clear_state call to an existing instance of the StateAppLocalContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): StateAppLocalContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppLocalContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type StateAppLocalContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalExContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalExContract.ts deleted file mode 100644 index 53a53bd..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalExContract.ts +++ /dev/null @@ -1,635 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"StateAppLocalExContract","structs":{},"methods":[{"name":"opt_in","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["OptIn"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":1,"bytes":2}},"keys":{"global":{},"local":{"local_uint64":{"keyType":"AVMString","valueType":"AVMUint64","key":"bG9jYWxfdWludDY0"},"local_bytes":{"keyType":"AVMString","valueType":"AVMBytes","key":"bG9jYWxfYnl0ZXM="},"local_arc4_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"bG9jYWxfYXJjNF9ieXRlcw=="}},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNDYKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxFeENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA3CiAgICBwdXNoYnl0ZXMgMHgzMGM2ZDU4YSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2luX3JvdXRlQDUKICAgIGVycgoKbWFpbl9vcHRfaW5fcm91dGVANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgMSAvLyBPcHRJbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIG9wdF9pbgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA3OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbEV4Q29udHJhY3Qub3B0X2luW3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM2NQogICAgLy8gc2VsZi5sb2NhbF9ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IEJ5dGVzKGIiZHVtbXlfYnl0ZXNfZnJvbV9leHRlcm5hbF9jb250cmFjdCIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIHB1c2hieXRlc3MgImxvY2FsX2J5dGVzIiAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzM1ZjY2NzI2ZjZkNWY2NTc4NzQ2NTcyNmU2MTZjNWY2MzZmNmU3NDcyNjE2Mzc0CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzY2CiAgICAvLyBzZWxmLmxvY2FsX3VpbnQ2NFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IFVJbnQ2NCg5OSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgcHVzaGJ5dGVzICJsb2NhbF91aW50NjQiCiAgICBwdXNoaW50IDk5CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzY3CiAgICAvLyBzZWxmLmxvY2FsX2FyYzRfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjctMzY5CiAgICAvLyBzZWxmLmxvY2FsX2FyYzRfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoCiAgICAvLyAgICAgYiJkdW1teV9hcmM0X2J5dGVzIgogICAgLy8gKQogICAgcHVzaGJ5dGVzcyAibG9jYWxfYXJjNF9ieXRlcyIgMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAagAQwxtWKNhoAjgEAAQAxGYEBEjEYEERCAAgxGRQxGBQQQzIJggILbG9jYWxfYnl0ZXMiZHVtbXlfYnl0ZXNfZnJvbV9leHRlcm5hbF9jb250cmFjdGYyCYAMbG9jYWxfdWludDY0gWNmMgmCAhBsb2NhbF9hcmM0X2J5dGVzEgAQZHVtbXlfYXJjNF9ieXRlc2aBAUM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the StateAppLocalExContract contract - */ -export type StateAppLocalExContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'opt_in()void': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'opt_in()void': [] - } -} - -/** - * The return type for each method - */ -export type StateAppLocalExContractReturns = { - 'opt_in()void': void -} - -/** - * Defines the types of available calls and state of the StateAppLocalExContract smart contract. - */ -export type StateAppLocalExContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'opt_in()void' | 'opt_in', { - argsObj: StateAppLocalExContractArgs['obj']['opt_in()void'] - argsTuple: StateAppLocalExContractArgs['tuple']['opt_in()void'] - returns: StateAppLocalExContractReturns['opt_in()void'] - }> - /** - * Defines the shape of the state of the application. - */ - state: { - local: { - keys: { - localUint64: bigint - localBytes: BinaryState - localArc4Bytes: Uint8Array - } - maps: {} - } - } -} - -/** - * Defines the possible abi call signatures. - */ -export type StateAppLocalExContractSignatures = keyof StateAppLocalExContractTypes['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the StateAppLocalExContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = StateAppLocalExContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the StateAppLocalExContract smart contract to the method's return type - */ -export type MethodReturn = StateAppLocalExContractTypes['methods'][TSignature]['returns'] - -/** - * Defines the shape of the keyed local state of the application. - */ -export type LocalKeysState = StateAppLocalExContractTypes['state']['local']['keys'] - - -/** - * Defines supported create method params for this smart contract - */ -export type StateAppLocalExContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type StateAppLocalExContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: StateAppLocalExContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppLocalExContract smart contract - */ -export abstract class StateAppLocalExContractParamsFactory { - /** - * Gets available optIn ABI call param factories - */ - static get optIn() { - return { - /** - * Constructs opt-in ABI call params for the StateAppLocalExContract smart contract using the opt_in()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - optIn(params: CallParams): AppClientMethodCallParams { - return { - ...params, - method: 'opt_in()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - }, - } - } - -} - -/** - * A factory to create and deploy one or more instance of the StateAppLocalExContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class StateAppLocalExContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `StateAppLocalExContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new StateAppLocalExContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new StateAppLocalExContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the StateAppLocalExContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: StateAppLocalExContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new StateAppLocalExContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppLocalExContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppLocalExContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppLocalExContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new StateAppLocalExContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the StateAppLocalExContract smart contract - */ -export class StateAppLocalExContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `StateAppLocalExContractClient` - * - * @param appClient An `AppClient` instance which has been created with the StateAppLocalExContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `StateAppLocalExContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `StateAppLocalExContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new StateAppLocalExContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `StateAppLocalExContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new StateAppLocalExContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the StateAppLocalExContract smart contract using the `opt_in()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The optIn params - */ - optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { - return this.appClient.params.optIn(StateAppLocalExContractParamsFactory.optIn.optIn(params)) - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the StateAppLocalExContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the StateAppLocalExContract smart contract using the `opt_in()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The optIn transaction - */ - optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { - return this.appClient.createTransaction.optIn(StateAppLocalExContractParamsFactory.optIn.optIn(params)) - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the StateAppLocalExContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the StateAppLocalExContract smart contract using the `opt_in()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The optIn result - */ - optIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { - const result = await this.appClient.send.optIn(StateAppLocalExContractParamsFactory.optIn.optIn(params)) - return {...result, return: result.return as unknown as (undefined | StateAppLocalExContractReturns['opt_in()void'])} - }, - - }, - - /** - * Makes a clear_state call to an existing instance of the StateAppLocalExContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new StateAppLocalExContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current StateAppLocalExContract app - */ - state = { - /** - * Methods to access local state for the current StateAppLocalExContract app - */ - local: (address: string | Address) => { - const encodedAddress = typeof address === 'string' ? address : encodeAddress(address.publicKey) - return { - /** - * Get all current keyed values from local state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.local(encodedAddress).getAll() - return { - localUint64: result.local_uint64, - localBytes: new BinaryStateValue(result.local_bytes), - localArc4Bytes: result.local_arc4_bytes, - } - }, - /** - * Get the current value of the local_uint64 key in local state - */ - localUint64: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("local_uint64")) as bigint | undefined }, - /** - * Get the current value of the local_bytes key in local state - */ - localBytes: async (): Promise => { return new BinaryStateValue((await this.appClient.state.local(encodedAddress).getValue("local_bytes")) as Uint8Array | undefined) }, - /** - * Get the current value of the local_arc4_bytes key in local state - */ - localArc4Bytes: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("local_arc4_bytes")) as Uint8Array | undefined }, - } - }, - } - - public newGroup(composerConfig?: TransactionComposerConfig): StateAppLocalExContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - get optIn() { - return { - optIn: (params: CallParams) => { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn.optIn(params))) - return this - }, - } - }, - /** - * Add a clear state call to the StateAppLocalExContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as StateAppLocalExContractComposer - } -} -export type StateAppLocalExContractComposer = { - /** - * Gets available optIn methods - */ - readonly optIn: { - /** - * Opts the user into an existing instance of the StateAppLocalExContract smart contract using the opt_in()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - optIn(params?: CallParams): StateAppLocalExContractComposer<[...TReturns, StateAppLocalExContractReturns['opt_in()void'] | undefined]> - } - - /** - * Makes a clear_state call to an existing instance of the StateAppLocalExContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): StateAppLocalExContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppLocalExContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type StateAppLocalExContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppParamsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppParamsContract.ts deleted file mode 100644 index 182a6a4..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppParamsContract.ts +++ /dev/null @@ -1,1112 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"StateAppParamsContract","structs":{},"methods":[{"name":"verify_app_params_get_approval_program","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_clear_state_program","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_global_num_uint","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_global_num_byte_slice","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_local_num_uint","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_local_num_byte_slice","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_extra_program_pages","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_creator","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_address","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[121,155,189,216,243,270,297,324,350],"errorMessage":"expected exists by index to match"},{"pc":[119,153,187,214,241,268,295,322,348],"errorMessage":"expected value by index to match"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzIKICAgIC8vIGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhiOWQxM2MxYiAweGU1YzNjODg5IDB4ZWU0ZTdiMmEgMHg3ZmEyMzRjYiAweDE5Zjc3NDM5IDB4OTJjNTcyYWEgMHhhZTljNmVmYiAweGUzNmVkNzA1IDB4OGM2NmE4NDIgLy8gbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYXBwcm92YWxfcHJvZ3JhbSh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbSh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV91aW50KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZSh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlcyh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvcih1aW50NjQpYWRkcmVzcyIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FkZHJlc3ModWludDY0KWFkZHJlc3MiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYXBwcm92YWxfcHJvZ3JhbSB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbSB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50IHZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV91aW50IHZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZSB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlcyB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvciB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzcwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfYXBwcm92YWxfcHJvZ3JhbVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzUKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FwcHJvdmFsX3Byb2dyYW0oYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFwcHJvdmFsUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FwcHJvdmFsX3Byb2dyYW0oX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBcHByb3ZhbFByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3OAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NsZWFyX3N0YXRlX3Byb2dyYW1bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgzCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9jbGVhcl9zdGF0ZV9wcm9ncmFtKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDbGVhclN0YXRlUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODQKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2NsZWFyX3N0YXRlX3Byb2dyYW0oX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDbGVhclN0YXRlUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjg2CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkxCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX3VpbnQoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEdsb2JhbE51bVVpbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkyCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX3VpbnQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1VaW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOTQKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5OQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfZ2xvYmFsX251bV9ieXRlX3NsaWNlKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzAwCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDEKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwMgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwNwogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfbG9jYWxfbnVtX3VpbnQoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcExvY2FsTnVtVWludAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDgKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2xvY2FsX251bV91aW50KF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1VaW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzA5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTUKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2xvY2FsX251bV9ieXRlX3NsaWNlKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2xvY2FsX251bV9ieXRlX3NsaWNlKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxOAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjMKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2V4dHJhX3Byb2dyYW1fcGFnZXMoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyNAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFwcFBhcmFtc0dldC5hcHBfZXh0cmFfcHJvZ3JhbV9wYWdlcyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzI1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjYKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NyZWF0b3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzMxCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9jcmVhdG9yKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDcmVhdG9yCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzMgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFwcFBhcmFtc0dldC5hcHBfY3JlYXRvcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzNAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMzkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FkZHJlc3MoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQwCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9hZGRyZXNzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQyCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyABASYBBBUffHUxG0EATjEZFEQxGESCCQS50TwbBOXDyIkE7k57KgR/ojTLBBn3dDkEksVyqgSunG77BONu1wUEjGaoQjYaAI4JAAkAKwBNAGgAgwCeALkA1ADuADEZFDEYFBBDNhoBF3IANhoBF3IASwNPAhJEEkRJFRZXBgJMUChMULAiQzYaARdyATYaARdyAUsDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcgI2GgEXcgJLA08CEkQSRBYoTFCwIkM2GgEXcgM2GgEXcgNLA08CEkQSRBYoTFCwIkM2GgEXcgQ2GgEXcgRLA08CEkQSRBYoTFCwIkM2GgEXcgU2GgEXcgVLA08CEkQSRBYoTFCwIkM2GgEXcgY2GgEXcgZLA08CEkQSRBYoTFCwIkM2GgEXcgc2GgEXcgdLA08CEkQSRChMULAiQzYaARdyCDYaARdyCEsDTwISRBJEKExQsCJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the StateAppParamsContract contract - */ -export type StateAppParamsContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify_app_params_get_approval_program(uint64)byte[]': { - a: bigint | number - } - 'verify_app_params_get_clear_state_program(uint64)byte[]': { - a: bigint | number - } - 'verify_app_params_get_global_num_uint(uint64)uint64': { - a: bigint | number - } - 'verify_app_params_get_global_num_byte_slice(uint64)uint64': { - a: bigint | number - } - 'verify_app_params_get_local_num_uint(uint64)uint64': { - a: bigint | number - } - 'verify_app_params_get_local_num_byte_slice(uint64)uint64': { - a: bigint | number - } - 'verify_app_params_get_extra_program_pages(uint64)uint64': { - a: bigint | number - } - 'verify_app_params_get_creator(uint64)address': { - a: bigint | number - } - 'verify_app_params_get_address(uint64)address': { - a: bigint | number - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify_app_params_get_approval_program(uint64)byte[]': [a: bigint | number] - 'verify_app_params_get_clear_state_program(uint64)byte[]': [a: bigint | number] - 'verify_app_params_get_global_num_uint(uint64)uint64': [a: bigint | number] - 'verify_app_params_get_global_num_byte_slice(uint64)uint64': [a: bigint | number] - 'verify_app_params_get_local_num_uint(uint64)uint64': [a: bigint | number] - 'verify_app_params_get_local_num_byte_slice(uint64)uint64': [a: bigint | number] - 'verify_app_params_get_extra_program_pages(uint64)uint64': [a: bigint | number] - 'verify_app_params_get_creator(uint64)address': [a: bigint | number] - 'verify_app_params_get_address(uint64)address': [a: bigint | number] - } -} - -/** - * The return type for each method - */ -export type StateAppParamsContractReturns = { - 'verify_app_params_get_approval_program(uint64)byte[]': Uint8Array - 'verify_app_params_get_clear_state_program(uint64)byte[]': Uint8Array - 'verify_app_params_get_global_num_uint(uint64)uint64': bigint - 'verify_app_params_get_global_num_byte_slice(uint64)uint64': bigint - 'verify_app_params_get_local_num_uint(uint64)uint64': bigint - 'verify_app_params_get_local_num_byte_slice(uint64)uint64': bigint - 'verify_app_params_get_extra_program_pages(uint64)uint64': bigint - 'verify_app_params_get_creator(uint64)address': string - 'verify_app_params_get_address(uint64)address': string -} - -/** - * Defines the types of available calls and state of the StateAppParamsContract smart contract. - */ -export type StateAppParamsContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify_app_params_get_approval_program(uint64)byte[]' | 'verify_app_params_get_approval_program', { - argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_approval_program(uint64)byte[]'] - argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_approval_program(uint64)byte[]'] - returns: StateAppParamsContractReturns['verify_app_params_get_approval_program(uint64)byte[]'] - }> - & Record<'verify_app_params_get_clear_state_program(uint64)byte[]' | 'verify_app_params_get_clear_state_program', { - argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_clear_state_program(uint64)byte[]'] - argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_clear_state_program(uint64)byte[]'] - returns: StateAppParamsContractReturns['verify_app_params_get_clear_state_program(uint64)byte[]'] - }> - & Record<'verify_app_params_get_global_num_uint(uint64)uint64' | 'verify_app_params_get_global_num_uint', { - argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_global_num_uint(uint64)uint64'] - argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_global_num_uint(uint64)uint64'] - returns: StateAppParamsContractReturns['verify_app_params_get_global_num_uint(uint64)uint64'] - }> - & Record<'verify_app_params_get_global_num_byte_slice(uint64)uint64' | 'verify_app_params_get_global_num_byte_slice', { - argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_global_num_byte_slice(uint64)uint64'] - argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_global_num_byte_slice(uint64)uint64'] - returns: StateAppParamsContractReturns['verify_app_params_get_global_num_byte_slice(uint64)uint64'] - }> - & Record<'verify_app_params_get_local_num_uint(uint64)uint64' | 'verify_app_params_get_local_num_uint', { - argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_local_num_uint(uint64)uint64'] - argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_local_num_uint(uint64)uint64'] - returns: StateAppParamsContractReturns['verify_app_params_get_local_num_uint(uint64)uint64'] - }> - & Record<'verify_app_params_get_local_num_byte_slice(uint64)uint64' | 'verify_app_params_get_local_num_byte_slice', { - argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_local_num_byte_slice(uint64)uint64'] - argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_local_num_byte_slice(uint64)uint64'] - returns: StateAppParamsContractReturns['verify_app_params_get_local_num_byte_slice(uint64)uint64'] - }> - & Record<'verify_app_params_get_extra_program_pages(uint64)uint64' | 'verify_app_params_get_extra_program_pages', { - argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_extra_program_pages(uint64)uint64'] - argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_extra_program_pages(uint64)uint64'] - returns: StateAppParamsContractReturns['verify_app_params_get_extra_program_pages(uint64)uint64'] - }> - & Record<'verify_app_params_get_creator(uint64)address' | 'verify_app_params_get_creator', { - argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_creator(uint64)address'] - argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_creator(uint64)address'] - returns: StateAppParamsContractReturns['verify_app_params_get_creator(uint64)address'] - }> - & Record<'verify_app_params_get_address(uint64)address' | 'verify_app_params_get_address', { - argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_address(uint64)address'] - argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_address(uint64)address'] - returns: StateAppParamsContractReturns['verify_app_params_get_address(uint64)address'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type StateAppParamsContractSignatures = keyof StateAppParamsContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type StateAppParamsContractNonVoidMethodSignatures = keyof StateAppParamsContractTypes['methods'] extends infer T ? T extends keyof StateAppParamsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the StateAppParamsContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = StateAppParamsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the StateAppParamsContract smart contract to the method's return type - */ -export type MethodReturn = StateAppParamsContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type StateAppParamsContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type StateAppParamsContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: StateAppParamsContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppParamsContract smart contract - */ -export abstract class StateAppParamsContractParamsFactory { - /** - * Constructs a no op call for the verify_app_params_get_approval_program(uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAppParamsGetApprovalProgram(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_app_params_get_approval_program(uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_app_params_get_clear_state_program(uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAppParamsGetClearStateProgram(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_app_params_get_clear_state_program(uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_app_params_get_global_num_uint(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAppParamsGetGlobalNumUint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_app_params_get_global_num_uint(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_app_params_get_global_num_byte_slice(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAppParamsGetGlobalNumByteSlice(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_app_params_get_global_num_byte_slice(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_app_params_get_local_num_uint(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAppParamsGetLocalNumUint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_app_params_get_local_num_uint(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_app_params_get_local_num_byte_slice(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAppParamsGetLocalNumByteSlice(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_app_params_get_local_num_byte_slice(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_app_params_get_extra_program_pages(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAppParamsGetExtraProgramPages(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_app_params_get_extra_program_pages(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_app_params_get_creator(uint64)address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAppParamsGetCreator(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_app_params_get_creator(uint64)address' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_app_params_get_address(uint64)address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAppParamsGetAddress(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_app_params_get_address(uint64)address' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } -} - -/** - * A factory to create and deploy one or more instance of the StateAppParamsContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class StateAppParamsContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `StateAppParamsContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new StateAppParamsContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new StateAppParamsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the StateAppParamsContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: StateAppParamsContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new StateAppParamsContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppParamsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppParamsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAppParamsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new StateAppParamsContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the StateAppParamsContract smart contract - */ -export class StateAppParamsContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `StateAppParamsContractClient` - * - * @param appClient An `AppClient` instance which has been created with the StateAppParamsContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `StateAppParamsContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `StateAppParamsContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new StateAppParamsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `StateAppParamsContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new StateAppParamsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the StateAppParamsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_approval_program(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAppParamsGetApprovalProgram: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetApprovalProgram(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_clear_state_program(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAppParamsGetClearStateProgram: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetClearStateProgram(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_uint(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAppParamsGetGlobalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumUint(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_byte_slice(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAppParamsGetGlobalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumByteSlice(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_uint(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAppParamsGetLocalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumUint(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_byte_slice(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAppParamsGetLocalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumByteSlice(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_extra_program_pages(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAppParamsGetExtraProgramPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetExtraProgramPages(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_creator(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAppParamsGetCreator: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetCreator(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_address(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAppParamsGetAddress: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetAddress(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the StateAppParamsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_approval_program(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAppParamsGetApprovalProgram: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetApprovalProgram(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_clear_state_program(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAppParamsGetClearStateProgram: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetClearStateProgram(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_uint(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAppParamsGetGlobalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumUint(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_byte_slice(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAppParamsGetGlobalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumByteSlice(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_uint(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAppParamsGetLocalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumUint(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_byte_slice(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAppParamsGetLocalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumByteSlice(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_extra_program_pages(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAppParamsGetExtraProgramPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetExtraProgramPages(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_creator(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAppParamsGetCreator: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetCreator(params)) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_address(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAppParamsGetAddress: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetAddress(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the StateAppParamsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_approval_program(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAppParamsGetApprovalProgram: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetApprovalProgram(params)) - return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_approval_program(uint64)byte[]'])} - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_clear_state_program(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAppParamsGetClearStateProgram: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetClearStateProgram(params)) - return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_clear_state_program(uint64)byte[]'])} - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_uint(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAppParamsGetGlobalNumUint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumUint(params)) - return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_global_num_uint(uint64)uint64'])} - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_byte_slice(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAppParamsGetGlobalNumByteSlice: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumByteSlice(params)) - return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_global_num_byte_slice(uint64)uint64'])} - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_uint(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAppParamsGetLocalNumUint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumUint(params)) - return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_local_num_uint(uint64)uint64'])} - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_byte_slice(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAppParamsGetLocalNumByteSlice: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumByteSlice(params)) - return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_local_num_byte_slice(uint64)uint64'])} - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_extra_program_pages(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAppParamsGetExtraProgramPages: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetExtraProgramPages(params)) - return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_extra_program_pages(uint64)uint64'])} - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_creator(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAppParamsGetCreator: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetCreator(params)) - return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_creator(uint64)address'])} - }, - - /** - * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_address(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAppParamsGetAddress: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetAddress(params)) - return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_address(uint64)address'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new StateAppParamsContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current StateAppParamsContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): StateAppParamsContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_app_params_get_approval_program(uint64)byte[] method call against the StateAppParamsContract contract - */ - verifyAppParamsGetApprovalProgram(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetApprovalProgram(params))) - return this - }, - /** - * Add a verify_app_params_get_clear_state_program(uint64)byte[] method call against the StateAppParamsContract contract - */ - verifyAppParamsGetClearStateProgram(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetClearStateProgram(params))) - return this - }, - /** - * Add a verify_app_params_get_global_num_uint(uint64)uint64 method call against the StateAppParamsContract contract - */ - verifyAppParamsGetGlobalNumUint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetGlobalNumUint(params))) - return this - }, - /** - * Add a verify_app_params_get_global_num_byte_slice(uint64)uint64 method call against the StateAppParamsContract contract - */ - verifyAppParamsGetGlobalNumByteSlice(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetGlobalNumByteSlice(params))) - return this - }, - /** - * Add a verify_app_params_get_local_num_uint(uint64)uint64 method call against the StateAppParamsContract contract - */ - verifyAppParamsGetLocalNumUint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetLocalNumUint(params))) - return this - }, - /** - * Add a verify_app_params_get_local_num_byte_slice(uint64)uint64 method call against the StateAppParamsContract contract - */ - verifyAppParamsGetLocalNumByteSlice(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetLocalNumByteSlice(params))) - return this - }, - /** - * Add a verify_app_params_get_extra_program_pages(uint64)uint64 method call against the StateAppParamsContract contract - */ - verifyAppParamsGetExtraProgramPages(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetExtraProgramPages(params))) - return this - }, - /** - * Add a verify_app_params_get_creator(uint64)address method call against the StateAppParamsContract contract - */ - verifyAppParamsGetCreator(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetCreator(params))) - return this - }, - /** - * Add a verify_app_params_get_address(uint64)address method call against the StateAppParamsContract contract - */ - verifyAppParamsGetAddress(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetAddress(params))) - return this - }, - /** - * Add a clear state call to the StateAppParamsContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as StateAppParamsContractComposer - } -} -export type StateAppParamsContractComposer = { - /** - * Calls the verify_app_params_get_approval_program(uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAppParamsGetApprovalProgram(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_approval_program(uint64)byte[]'] | undefined]> - - /** - * Calls the verify_app_params_get_clear_state_program(uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAppParamsGetClearStateProgram(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_clear_state_program(uint64)byte[]'] | undefined]> - - /** - * Calls the verify_app_params_get_global_num_uint(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAppParamsGetGlobalNumUint(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_global_num_uint(uint64)uint64'] | undefined]> - - /** - * Calls the verify_app_params_get_global_num_byte_slice(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAppParamsGetGlobalNumByteSlice(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_global_num_byte_slice(uint64)uint64'] | undefined]> - - /** - * Calls the verify_app_params_get_local_num_uint(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAppParamsGetLocalNumUint(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_local_num_uint(uint64)uint64'] | undefined]> - - /** - * Calls the verify_app_params_get_local_num_byte_slice(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAppParamsGetLocalNumByteSlice(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_local_num_byte_slice(uint64)uint64'] | undefined]> - - /** - * Calls the verify_app_params_get_extra_program_pages(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAppParamsGetExtraProgramPages(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_extra_program_pages(uint64)uint64'] | undefined]> - - /** - * Calls the verify_app_params_get_creator(uint64)address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAppParamsGetCreator(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_creator(uint64)address'] | undefined]> - - /** - * Calls the verify_app_params_get_address(uint64)address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAppParamsGetAddress(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_address(uint64)address'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the StateAppParamsContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): StateAppParamsContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppParamsContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type StateAppParamsContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetHoldingContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetHoldingContract.ts deleted file mode 100644 index c46961a..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetHoldingContract.ts +++ /dev/null @@ -1,631 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"StateAssetHoldingContract","structs":{},"methods":[{"name":"verify_asset_holding_get","args":[{"type":"address","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_frozen_get","args":[{"type":"address","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gY2xhc3MgU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4OGY1MjM1YjQgMHhkZTdhMzlmNiAvLyBtZXRob2QgInZlcmlmeV9hc3NldF9ob2xkaW5nX2dldChhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hc3NldF9mcm96ZW5fZ2V0KGFkZHJlc3MsdWludDY0KWJvb2wiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXQgdmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXQKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdC52ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2NQogICAgLy8gYmFsYW5jZSwgX3ZhbCA9IG9wLkFzc2V0SG9sZGluZ0dldC5hc3NldF9iYWxhbmNlKGEsIGIpCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRIb2xkaW5nQ29udHJhY3QudmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfZnJvemVuX2dldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcwCiAgICAvLyBmcm96ZW4sIF92YWwgPSBvcC5Bc3NldEhvbGRpbmdHZXQuYXNzZXRfZnJvemVuKGEsIGIpCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEZyb3plbgogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIHB1c2hpbnQgMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyYBBBUffHUxG0EAHTEZFEQxGESCAgSPUjW0BN56OfY2GgCOAgAJABsAMRkUMRgUEEM2GgE2GgIXcABIFihMULCBAUM2GgE2GgIXcAFIgAEAgQBPAlQoTFCwgQFD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the StateAssetHoldingContract contract - */ -export type StateAssetHoldingContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify_asset_holding_get(address,uint64)uint64': { - a: string - b: bigint | number - } - 'verify_asset_frozen_get(address,uint64)bool': { - a: string - b: bigint | number - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify_asset_holding_get(address,uint64)uint64': [a: string, b: bigint | number] - 'verify_asset_frozen_get(address,uint64)bool': [a: string, b: bigint | number] - } -} - -/** - * The return type for each method - */ -export type StateAssetHoldingContractReturns = { - 'verify_asset_holding_get(address,uint64)uint64': bigint - 'verify_asset_frozen_get(address,uint64)bool': boolean -} - -/** - * Defines the types of available calls and state of the StateAssetHoldingContract smart contract. - */ -export type StateAssetHoldingContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify_asset_holding_get(address,uint64)uint64' | 'verify_asset_holding_get', { - argsObj: StateAssetHoldingContractArgs['obj']['verify_asset_holding_get(address,uint64)uint64'] - argsTuple: StateAssetHoldingContractArgs['tuple']['verify_asset_holding_get(address,uint64)uint64'] - returns: StateAssetHoldingContractReturns['verify_asset_holding_get(address,uint64)uint64'] - }> - & Record<'verify_asset_frozen_get(address,uint64)bool' | 'verify_asset_frozen_get', { - argsObj: StateAssetHoldingContractArgs['obj']['verify_asset_frozen_get(address,uint64)bool'] - argsTuple: StateAssetHoldingContractArgs['tuple']['verify_asset_frozen_get(address,uint64)bool'] - returns: StateAssetHoldingContractReturns['verify_asset_frozen_get(address,uint64)bool'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type StateAssetHoldingContractSignatures = keyof StateAssetHoldingContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type StateAssetHoldingContractNonVoidMethodSignatures = keyof StateAssetHoldingContractTypes['methods'] extends infer T ? T extends keyof StateAssetHoldingContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the StateAssetHoldingContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = StateAssetHoldingContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the StateAssetHoldingContract smart contract to the method's return type - */ -export type MethodReturn = StateAssetHoldingContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type StateAssetHoldingContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type StateAssetHoldingContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: StateAssetHoldingContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAssetHoldingContract smart contract - */ -export abstract class StateAssetHoldingContractParamsFactory { - /** - * Constructs a no op call for the verify_asset_holding_get(address,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetHoldingGet(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_holding_get(address,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } - /** - * Constructs a no op call for the verify_asset_frozen_get(address,uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetFrozenGet(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_frozen_get(address,uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], - } - } -} - -/** - * A factory to create and deploy one or more instance of the StateAssetHoldingContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class StateAssetHoldingContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `StateAssetHoldingContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new StateAssetHoldingContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new StateAssetHoldingContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the StateAssetHoldingContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: StateAssetHoldingContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new StateAssetHoldingContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAssetHoldingContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAssetHoldingContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAssetHoldingContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new StateAssetHoldingContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the StateAssetHoldingContract smart contract - */ -export class StateAssetHoldingContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `StateAssetHoldingContractClient` - * - * @param appClient An `AppClient` instance which has been created with the StateAssetHoldingContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `StateAssetHoldingContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `StateAssetHoldingContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new StateAssetHoldingContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `StateAssetHoldingContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new StateAssetHoldingContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the StateAssetHoldingContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_holding_get(address,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetHoldingGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetHoldingContractParamsFactory.verifyAssetHoldingGet(params)) - }, - - /** - * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_frozen_get(address,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetFrozenGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetHoldingContractParamsFactory.verifyAssetFrozenGet(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the StateAssetHoldingContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_holding_get(address,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetHoldingGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetHoldingContractParamsFactory.verifyAssetHoldingGet(params)) - }, - - /** - * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_frozen_get(address,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetFrozenGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetHoldingContractParamsFactory.verifyAssetFrozenGet(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the StateAssetHoldingContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_holding_get(address,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetHoldingGet: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetHoldingContractParamsFactory.verifyAssetHoldingGet(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetHoldingContractReturns['verify_asset_holding_get(address,uint64)uint64'])} - }, - - /** - * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_frozen_get(address,uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetFrozenGet: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetHoldingContractParamsFactory.verifyAssetFrozenGet(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetHoldingContractReturns['verify_asset_frozen_get(address,uint64)bool'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new StateAssetHoldingContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current StateAssetHoldingContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): StateAssetHoldingContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_asset_holding_get(address,uint64)uint64 method call against the StateAssetHoldingContract contract - */ - verifyAssetHoldingGet(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetHoldingGet(params))) - return this - }, - /** - * Add a verify_asset_frozen_get(address,uint64)bool method call against the StateAssetHoldingContract contract - */ - verifyAssetFrozenGet(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetFrozenGet(params))) - return this - }, - /** - * Add a clear state call to the StateAssetHoldingContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as StateAssetHoldingContractComposer - } -} -export type StateAssetHoldingContractComposer = { - /** - * Calls the verify_asset_holding_get(address,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetHoldingGet(params?: CallParams): StateAssetHoldingContractComposer<[...TReturns, StateAssetHoldingContractReturns['verify_asset_holding_get(address,uint64)uint64'] | undefined]> - - /** - * Calls the verify_asset_frozen_get(address,uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetFrozenGet(params?: CallParams): StateAssetHoldingContractComposer<[...TReturns, StateAssetHoldingContractReturns['verify_asset_frozen_get(address,uint64)bool'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the StateAssetHoldingContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): StateAssetHoldingContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): StateAssetHoldingContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type StateAssetHoldingContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetParamsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetParamsContract.ts deleted file mode 100644 index b627ecf..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetParamsContract.ts +++ /dev/null @@ -1,1319 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"StateAssetParamsContract","structs":{},"methods":[{"name":"verify_asset_params_get_total","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_decimals","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_default_frozen","args":[{"type":"uint64","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_unit_name","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_name","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_url","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_metadata_hash","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_manager","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_reserve","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_freeze","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_clawback","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_creator","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[142,169,196,230,264,298,332,366,392,418,444,470],"errorMessage":"expected exists by index to match"},{"pc":[140,167,194,228,262,296,330,364,390,416,442,468],"errorMessage":"expected value by index to match"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzQKICAgIC8vIGNsYXNzIFN0YXRlQXNzZXRQYXJhbXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGYwNWRhN2E0IDB4YzBlOWMzMTUgMHhkODUyODI3MyAweGY0NDY4YWQ5IDB4MjI5ZDEyZjcgMHhkZjUzNGY3YiAweGUwNTBiNWE5IDB4OGIyYTJkNTggMHhlZTE1YzRmNyAweDE1NzU0NGZmIDB4MTA0OTJjMDcgMHg1MjI5ZmEzNyAvLyBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3RvdGFsKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlY2ltYWxzKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlZmF1bHRfZnJvemVuKHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWUodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbmFtZSh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmwodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaCh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyKHVpbnQ2NClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9yZXNlcnZlKHVpbnQ2NClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemUodWludDY0KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NsYXdiYWNrKHVpbnQ2NClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jcmVhdG9yKHVpbnQ2NClhZGRyZXNzIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWwgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVjaW1hbHMgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVmYXVsdF9mcm96ZW4gdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdW5pdF9uYW1lIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X25hbWUgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdXJsIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21ldGFkYXRhX2hhc2ggdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWFuYWdlciB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9yZXNlcnZlIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2ZyZWV6ZSB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jbGF3YmFjayB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jcmVhdG9yCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF90b3RhbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTc3CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfdG90YWwoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzgKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF90b3RhbChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3OQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTgwCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVjaW1hbHNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWNpbWFsczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTg1CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfZGVjaW1hbHMoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9kZWNpbWFscyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVmYXVsdF9mcm96ZW5bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTkzCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfZGVmYXVsdF9mcm96ZW4oYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWZhdWx0RnJvemVuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2RlZmF1bHRfZnJvemVuKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlZmF1bHRGcm96ZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxOTUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHB1c2hieXRlcyAweDAwCiAgICBwdXNoaW50IDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3VuaXRfbmFtZShhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3VuaXRfbmFtZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjA0CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X25hbWVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9uYW1lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9uYW1lKGEpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTAKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9uYW1lKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTEKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxMgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmw6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxNwogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3VybChhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTgKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF91cmwoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjE5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21ldGFkYXRhX2hhc2g6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X21ldGFkYXRhX2hhc2goYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNZXRhZGF0YUhhc2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjI2CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbWV0YWRhdGFfaGFzaChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNZXRhZGF0YUhhc2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWFuYWdlcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjMzCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbWFuYWdlcihhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1hbmFnZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjM0CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbWFuYWdlcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjM1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzYKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9yZXNlcnZlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfcmVzZXJ2ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQxCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfcmVzZXJ2ZShhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFJlc2VydmUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQyCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfcmVzZXJ2ZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRSZXNlcnZlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDQKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2ZyZWV6ZShhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldEZyZWV6ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTAKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9mcmVlemUoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTIKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jbGF3YmFja1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NsYXdiYWNrOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTcKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9jbGF3YmFjayhhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NsYXdiYWNrKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjU5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jcmVhdG9yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY3JlYXRvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjY1CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjY2CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjY3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjgKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyABASYBBBUffHUxG0EAYzEZFEQxGESCDATwXaekBMDpwxUE2FKCcwT0RorZBCKdEvcE31NPewTgULWpBIsqLVgE7hXE9wQVdUT/BBBJLAcEUin6NzYaAI4MAAkAJAA/AGEAgwClAMcA6QEDAR0BNwFRADEZFDEYFBBDNhoBF3EANhoBF3EASwNPAhJEEkQWKExQsCJDNhoBF3EBNhoBF3EBSwNPAhJEEkQWKExQsCJDNhoBF3ECNhoBF3ECSwNPAhJEEkSAAQCBAE8CVChMULAiQzYaARdxAzYaARdxA0sDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcQQ2GgEXcQRLA08CEkQSREkVFlcGAkxQKExQsCJDNhoBF3EFNhoBF3EFSwNPAhJEEkRJFRZXBgJMUChMULAiQzYaARdxBjYaARdxBksDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcQc2GgEXcQdLA08CEkQSRChMULAiQzYaARdxCDYaARdxCEsDTwISRBJEKExQsCJDNhoBF3EJNhoBF3EJSwNPAhJEEkQoTFCwIkM2GgEXcQo2GgEXcQpLA08CEkQSRChMULAiQzYaARdxCzYaARdxC0sDTwISRBJEKExQsCJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the StateAssetParamsContract contract - */ -export type StateAssetParamsContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify_asset_params_get_total(uint64)uint64': { - a: bigint | number - } - 'verify_asset_params_get_decimals(uint64)uint64': { - a: bigint | number - } - 'verify_asset_params_get_default_frozen(uint64)bool': { - a: bigint | number - } - 'verify_asset_params_get_unit_name(uint64)byte[]': { - a: bigint | number - } - 'verify_asset_params_get_name(uint64)byte[]': { - a: bigint | number - } - 'verify_asset_params_get_url(uint64)byte[]': { - a: bigint | number - } - 'verify_asset_params_get_metadata_hash(uint64)byte[]': { - a: bigint | number - } - 'verify_asset_params_get_manager(uint64)address': { - a: bigint | number - } - 'verify_asset_params_get_reserve(uint64)address': { - a: bigint | number - } - 'verify_asset_params_get_freeze(uint64)address': { - a: bigint | number - } - 'verify_asset_params_get_clawback(uint64)address': { - a: bigint | number - } - 'verify_asset_params_get_creator(uint64)address': { - a: bigint | number - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify_asset_params_get_total(uint64)uint64': [a: bigint | number] - 'verify_asset_params_get_decimals(uint64)uint64': [a: bigint | number] - 'verify_asset_params_get_default_frozen(uint64)bool': [a: bigint | number] - 'verify_asset_params_get_unit_name(uint64)byte[]': [a: bigint | number] - 'verify_asset_params_get_name(uint64)byte[]': [a: bigint | number] - 'verify_asset_params_get_url(uint64)byte[]': [a: bigint | number] - 'verify_asset_params_get_metadata_hash(uint64)byte[]': [a: bigint | number] - 'verify_asset_params_get_manager(uint64)address': [a: bigint | number] - 'verify_asset_params_get_reserve(uint64)address': [a: bigint | number] - 'verify_asset_params_get_freeze(uint64)address': [a: bigint | number] - 'verify_asset_params_get_clawback(uint64)address': [a: bigint | number] - 'verify_asset_params_get_creator(uint64)address': [a: bigint | number] - } -} - -/** - * The return type for each method - */ -export type StateAssetParamsContractReturns = { - 'verify_asset_params_get_total(uint64)uint64': bigint - 'verify_asset_params_get_decimals(uint64)uint64': bigint - 'verify_asset_params_get_default_frozen(uint64)bool': boolean - 'verify_asset_params_get_unit_name(uint64)byte[]': Uint8Array - 'verify_asset_params_get_name(uint64)byte[]': Uint8Array - 'verify_asset_params_get_url(uint64)byte[]': Uint8Array - 'verify_asset_params_get_metadata_hash(uint64)byte[]': Uint8Array - 'verify_asset_params_get_manager(uint64)address': string - 'verify_asset_params_get_reserve(uint64)address': string - 'verify_asset_params_get_freeze(uint64)address': string - 'verify_asset_params_get_clawback(uint64)address': string - 'verify_asset_params_get_creator(uint64)address': string -} - -/** - * Defines the types of available calls and state of the StateAssetParamsContract smart contract. - */ -export type StateAssetParamsContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify_asset_params_get_total(uint64)uint64' | 'verify_asset_params_get_total', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_total(uint64)uint64'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_total(uint64)uint64'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_total(uint64)uint64'] - }> - & Record<'verify_asset_params_get_decimals(uint64)uint64' | 'verify_asset_params_get_decimals', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_decimals(uint64)uint64'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_decimals(uint64)uint64'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_decimals(uint64)uint64'] - }> - & Record<'verify_asset_params_get_default_frozen(uint64)bool' | 'verify_asset_params_get_default_frozen', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_default_frozen(uint64)bool'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_default_frozen(uint64)bool'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_default_frozen(uint64)bool'] - }> - & Record<'verify_asset_params_get_unit_name(uint64)byte[]' | 'verify_asset_params_get_unit_name', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_unit_name(uint64)byte[]'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_unit_name(uint64)byte[]'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_unit_name(uint64)byte[]'] - }> - & Record<'verify_asset_params_get_name(uint64)byte[]' | 'verify_asset_params_get_name', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_name(uint64)byte[]'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_name(uint64)byte[]'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_name(uint64)byte[]'] - }> - & Record<'verify_asset_params_get_url(uint64)byte[]' | 'verify_asset_params_get_url', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_url(uint64)byte[]'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_url(uint64)byte[]'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_url(uint64)byte[]'] - }> - & Record<'verify_asset_params_get_metadata_hash(uint64)byte[]' | 'verify_asset_params_get_metadata_hash', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_metadata_hash(uint64)byte[]'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_metadata_hash(uint64)byte[]'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_metadata_hash(uint64)byte[]'] - }> - & Record<'verify_asset_params_get_manager(uint64)address' | 'verify_asset_params_get_manager', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_manager(uint64)address'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_manager(uint64)address'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_manager(uint64)address'] - }> - & Record<'verify_asset_params_get_reserve(uint64)address' | 'verify_asset_params_get_reserve', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_reserve(uint64)address'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_reserve(uint64)address'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_reserve(uint64)address'] - }> - & Record<'verify_asset_params_get_freeze(uint64)address' | 'verify_asset_params_get_freeze', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_freeze(uint64)address'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_freeze(uint64)address'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_freeze(uint64)address'] - }> - & Record<'verify_asset_params_get_clawback(uint64)address' | 'verify_asset_params_get_clawback', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_clawback(uint64)address'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_clawback(uint64)address'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_clawback(uint64)address'] - }> - & Record<'verify_asset_params_get_creator(uint64)address' | 'verify_asset_params_get_creator', { - argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_creator(uint64)address'] - argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_creator(uint64)address'] - returns: StateAssetParamsContractReturns['verify_asset_params_get_creator(uint64)address'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type StateAssetParamsContractSignatures = keyof StateAssetParamsContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type StateAssetParamsContractNonVoidMethodSignatures = keyof StateAssetParamsContractTypes['methods'] extends infer T ? T extends keyof StateAssetParamsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the StateAssetParamsContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = StateAssetParamsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the StateAssetParamsContract smart contract to the method's return type - */ -export type MethodReturn = StateAssetParamsContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type StateAssetParamsContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type StateAssetParamsContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: StateAssetParamsContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAssetParamsContract smart contract - */ -export abstract class StateAssetParamsContractParamsFactory { - /** - * Constructs a no op call for the verify_asset_params_get_total(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetTotal(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_total(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_asset_params_get_decimals(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetDecimals(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_decimals(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_asset_params_get_default_frozen(uint64)bool ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetDefaultFrozen(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_default_frozen(uint64)bool' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_asset_params_get_unit_name(uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetUnitName(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_unit_name(uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_asset_params_get_name(uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetName(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_name(uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_asset_params_get_url(uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetUrl(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_url(uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_asset_params_get_metadata_hash(uint64)byte[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetMetadataHash(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_metadata_hash(uint64)byte[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_asset_params_get_manager(uint64)address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetManager(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_manager(uint64)address' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_asset_params_get_reserve(uint64)address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetReserve(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_reserve(uint64)address' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_asset_params_get_freeze(uint64)address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetFreeze(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_freeze(uint64)address' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_asset_params_get_clawback(uint64)address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetClawback(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_clawback(uint64)address' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } - /** - * Constructs a no op call for the verify_asset_params_get_creator(uint64)address ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verifyAssetParamsGetCreator(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify_asset_params_get_creator(uint64)address' as const, - args: Array.isArray(params.args) ? params.args : [params.args.a], - } - } -} - -/** - * A factory to create and deploy one or more instance of the StateAssetParamsContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class StateAssetParamsContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `StateAssetParamsContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new StateAssetParamsContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new StateAssetParamsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the StateAssetParamsContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: StateAssetParamsContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new StateAssetParamsContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAssetParamsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAssetParamsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateAssetParamsContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new StateAssetParamsContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the StateAssetParamsContract smart contract - */ -export class StateAssetParamsContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `StateAssetParamsContractClient` - * - * @param appClient An `AppClient` instance which has been created with the StateAssetParamsContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `StateAssetParamsContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `StateAssetParamsContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new StateAssetParamsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `StateAssetParamsContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new StateAssetParamsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the StateAssetParamsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_total(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetTotal: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetTotal(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_decimals(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetDecimals: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDecimals(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_default_frozen(uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetDefaultFrozen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDefaultFrozen(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_unit_name(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetUnitName: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUnitName(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_name(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetName: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetName(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_url(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetUrl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUrl(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_metadata_hash(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetMetadataHash: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetMetadataHash(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_manager(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetManager: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetManager(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_reserve(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetReserve: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetReserve(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_freeze(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetFreeze: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetFreeze(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_clawback(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetClawback: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetClawback(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_creator(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verifyAssetParamsGetCreator: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetCreator(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the StateAssetParamsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_total(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetTotal: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetTotal(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_decimals(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetDecimals: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDecimals(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_default_frozen(uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetDefaultFrozen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDefaultFrozen(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_unit_name(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetUnitName: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUnitName(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_name(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetName: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetName(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_url(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetUrl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUrl(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_metadata_hash(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetMetadataHash: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetMetadataHash(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_manager(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetManager: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetManager(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_reserve(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetReserve: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetReserve(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_freeze(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetFreeze: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetFreeze(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_clawback(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetClawback: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetClawback(params)) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_creator(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verifyAssetParamsGetCreator: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetCreator(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the StateAssetParamsContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_total(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetTotal: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetTotal(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_total(uint64)uint64'])} - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_decimals(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetDecimals: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDecimals(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_decimals(uint64)uint64'])} - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_default_frozen(uint64)bool` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetDefaultFrozen: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDefaultFrozen(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_default_frozen(uint64)bool'])} - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_unit_name(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetUnitName: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUnitName(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_unit_name(uint64)byte[]'])} - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_name(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetName: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetName(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_name(uint64)byte[]'])} - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_url(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetUrl: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUrl(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_url(uint64)byte[]'])} - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_metadata_hash(uint64)byte[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetMetadataHash: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetMetadataHash(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_metadata_hash(uint64)byte[]'])} - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_manager(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetManager: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetManager(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_manager(uint64)address'])} - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_reserve(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetReserve: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetReserve(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_reserve(uint64)address'])} - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_freeze(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetFreeze: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetFreeze(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_freeze(uint64)address'])} - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_clawback(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetClawback: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetClawback(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_clawback(uint64)address'])} - }, - - /** - * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_creator(uint64)address` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verifyAssetParamsGetCreator: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetCreator(params)) - return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_creator(uint64)address'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new StateAssetParamsContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current StateAssetParamsContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): StateAssetParamsContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify_asset_params_get_total(uint64)uint64 method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetTotal(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetTotal(params))) - return this - }, - /** - * Add a verify_asset_params_get_decimals(uint64)uint64 method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetDecimals(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetDecimals(params))) - return this - }, - /** - * Add a verify_asset_params_get_default_frozen(uint64)bool method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetDefaultFrozen(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetDefaultFrozen(params))) - return this - }, - /** - * Add a verify_asset_params_get_unit_name(uint64)byte[] method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetUnitName(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetUnitName(params))) - return this - }, - /** - * Add a verify_asset_params_get_name(uint64)byte[] method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetName(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetName(params))) - return this - }, - /** - * Add a verify_asset_params_get_url(uint64)byte[] method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetUrl(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetUrl(params))) - return this - }, - /** - * Add a verify_asset_params_get_metadata_hash(uint64)byte[] method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetMetadataHash(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetMetadataHash(params))) - return this - }, - /** - * Add a verify_asset_params_get_manager(uint64)address method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetManager(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetManager(params))) - return this - }, - /** - * Add a verify_asset_params_get_reserve(uint64)address method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetReserve(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetReserve(params))) - return this - }, - /** - * Add a verify_asset_params_get_freeze(uint64)address method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetFreeze(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetFreeze(params))) - return this - }, - /** - * Add a verify_asset_params_get_clawback(uint64)address method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetClawback(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetClawback(params))) - return this - }, - /** - * Add a verify_asset_params_get_creator(uint64)address method call against the StateAssetParamsContract contract - */ - verifyAssetParamsGetCreator(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetCreator(params))) - return this - }, - /** - * Add a clear state call to the StateAssetParamsContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as StateAssetParamsContractComposer - } -} -export type StateAssetParamsContractComposer = { - /** - * Calls the verify_asset_params_get_total(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetTotal(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_total(uint64)uint64'] | undefined]> - - /** - * Calls the verify_asset_params_get_decimals(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetDecimals(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_decimals(uint64)uint64'] | undefined]> - - /** - * Calls the verify_asset_params_get_default_frozen(uint64)bool ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetDefaultFrozen(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_default_frozen(uint64)bool'] | undefined]> - - /** - * Calls the verify_asset_params_get_unit_name(uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetUnitName(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_unit_name(uint64)byte[]'] | undefined]> - - /** - * Calls the verify_asset_params_get_name(uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetName(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_name(uint64)byte[]'] | undefined]> - - /** - * Calls the verify_asset_params_get_url(uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetUrl(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_url(uint64)byte[]'] | undefined]> - - /** - * Calls the verify_asset_params_get_metadata_hash(uint64)byte[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetMetadataHash(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_metadata_hash(uint64)byte[]'] | undefined]> - - /** - * Calls the verify_asset_params_get_manager(uint64)address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetManager(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_manager(uint64)address'] | undefined]> - - /** - * Calls the verify_asset_params_get_reserve(uint64)address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetReserve(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_reserve(uint64)address'] | undefined]> - - /** - * Calls the verify_asset_params_get_freeze(uint64)address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetFreeze(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_freeze(uint64)address'] | undefined]> - - /** - * Calls the verify_asset_params_get_clawback(uint64)address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetClawback(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_clawback(uint64)address'] | undefined]> - - /** - * Calls the verify_asset_params_get_creator(uint64)address ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verifyAssetParamsGetCreator(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_creator(uint64)address'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the StateAssetParamsContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): StateAssetParamsContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): StateAssetParamsContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type StateAssetParamsContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateMutations.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateMutations.ts deleted file mode 100644 index 01c58bc..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/StateMutations.ts +++ /dev/null @@ -1,880 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"StateMutations","structs":{},"methods":[{"name":"append","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"modify","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get","args":[],"returns":{"type":"(uint64,string)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":3},"local":{"ints":0,"bytes":1}},"keys":{"global":{"no_proxy":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"bm9fcHJveHk="},"glob_assign":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"Z2xvYl9hc3NpZ24="},"glob":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"Z2xvYg=="}},"local":{"loc":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"bG9j"}},"box":{"box":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"Ym94"}}},"maps":{"global":{},"local":{},"box":{"map":{"keyType":"address","valueType":"(uint64,string)[]","prefix":"bWFw"}}}},"bareActions":{"create":["NoOp"],"call":["OptIn"]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[526,795,931],"errorMessage":"check self.box exists"},{"pc":[481,684,921],"errorMessage":"check self.glob exists"},{"pc":[440,577,916],"errorMessage":"check self.glob_assign exists"},{"pc":[506,742,928],"errorMessage":"check self.loc exists for account"},{"pc":[553,855,938],"errorMessage":"check self.map entry exists"},{"pc":[460,630,912],"errorMessage":"check self.no_proxy exists"},{"pc":[962],"errorMessage":"expected box == no_proxy"},{"pc":[950],"errorMessage":"expected global == no_proxy"},{"pc":[944],"errorMessage":"expected global assign == no_proxy"},{"pc":[956],"errorMessage":"expected local == no_proxy"},{"pc":[966],"errorMessage":"expected map == no_proxy"},{"pc":[593,619,646,672,700,726,758,784,811,837,871,897],"errorMessage":"index access is out of bounds"},{"pc":[585,638,692,750,803,863],"errorMessage":"invalid array length header"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA4CiAgICBieXRlY2Jsb2NrICJib3giICJub19wcm94eSIgMHgwMDAwICJnbG9iX2Fzc2lnbiIgImdsb2IiICJsb2MiIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YSAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0ICJtYXAiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MjQKICAgIC8vIHNlbGYubm9fcHJveHkgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weToyMgogICAgLy8gY2xhc3MgU3RhdGVNdXRhdGlvbnMoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AxMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NTI2ZThiYmYgMHg5NWZlZjEzZCAweDBjMjk0NDRiIC8vIG1ldGhvZCAiYXBwZW5kKCl2b2lkIiwgbWV0aG9kICJtb2RpZnkoKXZvaWQiLCBtZXRob2QgImdldCgpKHVpbnQ2NCxzdHJpbmcpW10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhcHBlbmQgbW9kaWZ5IGdldAogICAgZXJyCgptYWluX2JhcmVfcm91dGluZ0AxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weToyMgogICAgLy8gY2xhc3MgU3RhdGVNdXRhdGlvbnMoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHN3aXRjaCBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDEzIG1haW5fb3B0X2luQDE0CiAgICBlcnIKCm1haW5fb3B0X2luQDE0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMxCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18zIC8vICJnbG9iX2Fzc2lnbiIKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM0CiAgICAvLyBzZWxmLmdsb2IudmFsdWUgPSBNeUFycmF5KCkKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzMKICAgIC8vIHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzQKICAgIC8vIHNlbGYuZ2xvYi52YWx1ZSA9IE15QXJyYXkoKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNQogICAgLy8gc2VsZi5ib3gudmFsdWUgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM1CiAgICAvLyBzZWxmLmJveC52YWx1ZSA9IE15QXJyYXkoKQogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM2CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgdHhuIFNlbmRlcgogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM2CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM3CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM3CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMxCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMzoKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQoYXJyYXlfaXRlbXNfY291bnQ6IHVpbnQ2NCwgYXJyYXlfaGVhZF9hbmRfdGFpbDogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0LCBuZXdfaGVhZF9hbmRfdGFpbDogYnl0ZXMpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQ6CiAgICBwcm90byA0IDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzAgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQoc291cmNlOiBieXRlcywgbmV3X2l0ZW06IGJ5dGVzLCBpbmRleDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBzdWJzdHJpbmcgMCAyCiAgICBkdXAKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAyCiAgICBkaWcgMQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA1CiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZHVwCiAgICBkaWcgNAogICAgLQogICAgY292ZXIgNgogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGNvdmVyIDYKICAgIGRpZyA0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA1CiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgc3dhcAoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDUKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgMgogICAgc3dhcAogICAgcmVwbGFjZTMKICAgIGZyYW1lX2J1cnkgMwogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNQogICAgYiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU11dGF0aW9ucy5zdGF0ZW11dGF0aW9ucy5TdGF0ZU11dGF0aW9ucy5hcHBlbmRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBlbmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDIKICAgIC8vIGFyciA9IHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUuY29weSgpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYl9hc3NpZ24gZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDMKICAgIC8vIGFyci5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIGJ5dGVjIDYgLy8gMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMGEwMDAzNjI2MTdhCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ1CiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gYXJyLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ2CiAgICAvLyBzZWxmLm5vX3Byb3h5LmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vX3Byb3h5IGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQzCiAgICAvLyBhcnIuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBieXRlYyA2IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ2CiAgICAvLyBzZWxmLm5vX3Byb3h5LmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0NwogICAgLy8gc2VsZi5nbG9iLnZhbHVlLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYiBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0NwogICAgLy8gc2VsZi5nbG9iLnZhbHVlLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ4CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImxvYyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxvYyBleGlzdHMgZm9yIGFjY291bnQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0OAogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl0uYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgc3dhcAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ5CiAgICAvLyBzZWxmLmJveC52YWx1ZS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveCBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0OQogICAgLy8gc2VsZi5ib3gudmFsdWUuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18wIC8vICJib3giCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTAKICAgIC8vIHNlbGYubWFwW1R4bi5zZW5kZXJdLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hcCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1MAogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0uYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVNdXRhdGlvbnMuc3RhdGVtdXRhdGlvbnMuU3RhdGVNdXRhdGlvbnMubW9kaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKbW9kaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU2CiAgICAvLyBhcnIgPSBzZWxmLmdsb2JfYXNzaWduLnZhbHVlLmNvcHkoKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImdsb2JfYXNzaWduIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JfYXNzaWduIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU3CiAgICAvLyBhcnJbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NwogICAgLy8gYXJyWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU4CiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gYXJyLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYwCiAgICAvLyBzZWxmLm5vX3Byb3h5WzBdLmJheiA9IG1vZGlmaWVkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAibm9fcHJveHkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9fcHJveHkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NAogICAgLy8gbW9kaWZpZWQgPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgYnl0ZWMgNyAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjAKICAgIC8vIHNlbGYubm9fcHJveHlbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGNvbmNhdAogICAgc3dhcAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBieXRlY18xIC8vICJub19wcm94eSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjEKICAgIC8vIHNlbGYuZ2xvYi52YWx1ZVswXS5iYXogPSBtb2RpZmllZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYiBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MQogICAgLy8gc2VsZi5nbG9iLnZhbHVlWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNCAvLyAiZ2xvYiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjIKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdWzBdLmJheiA9IG1vZGlmaWVkCiAgICB0eG4gU2VuZGVyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJsb2MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sb2MgZXhpc3RzIGZvciBhY2NvdW50CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NAogICAgLy8gbW9kaWZpZWQgPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgYnl0ZWMgNyAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjIKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgc3dhcAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYzCiAgICAvLyBzZWxmLmJveC52YWx1ZVswXS5iYXogPSBtb2RpZmllZAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTQKICAgIC8vIG1vZGlmaWVkID0gYXJjNC5TdHJpbmcoIm1vZGlmaWVkIikKICAgIGJ5dGVjIDcgLy8gMHgwMDA4NmQ2ZjY0Njk2NjY5NjU2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYzCiAgICAvLyBzZWxmLmJveC52YWx1ZVswXS5iYXogPSBtb2RpZmllZAogICAgY29uY2F0CiAgICBzd2FwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjY0CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXVswXS5iYXogPSBtb2RpZmllZAogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hcCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2NAogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl1bMF0uYmF6ID0gbW9kaWZpZWQKICAgIGNvbmNhdAogICAgc3dhcAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU11dGF0aW9ucy5zdGF0ZW11dGF0aW9ucy5TdGF0ZU11dGF0aW9ucy5nZXRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjgKICAgIC8vIGEwID0gc2VsZi5ub19wcm94eS5jb3B5KCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJub19wcm94eSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub19wcm94eSBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2OQogICAgLy8gYTEgPSBzZWxmLmdsb2JfYXNzaWduLnZhbHVlLmNvcHkoKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImdsb2JfYXNzaWduIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JfYXNzaWduIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjcwCiAgICAvLyBhMiA9IHNlbGYuZ2xvYi52YWx1ZS5jb3B5KCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJnbG9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2IgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzEKICAgIC8vIGEzID0gc2VsZi5sb2NbVHhuLnNlbmRlcl0uY29weSgpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubG9jIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjcyCiAgICAvLyBhNCA9IHNlbGYuYm94LnZhbHVlLmNvcHkoKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjczCiAgICAvLyBhNSA9IHNlbGYubWFwW1R4bi5zZW5kZXJdLmNvcHkoKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXAgZW50cnkgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzUKICAgIC8vIGFzc2VydCBhMCA9PSBhMSwgImV4cGVjdGVkIGdsb2JhbCBhc3NpZ24gPT0gbm9fcHJveHkiCiAgICBkaWcgNQogICAgdW5jb3ZlciA1CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGdsb2JhbCBhc3NpZ24gPT0gbm9fcHJveHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3NgogICAgLy8gYXNzZXJ0IGEwID09IGEyLCAiZXhwZWN0ZWQgZ2xvYmFsID09IG5vX3Byb3h5IgogICAgZGlnIDQKICAgIHVuY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgPT0gbm9fcHJveHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3NwogICAgLy8gYXNzZXJ0IGEwID09IGEzLCAiZXhwZWN0ZWQgbG9jYWwgPT0gbm9fcHJveHkiCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxvY2FsID09IG5vX3Byb3h5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzgKICAgIC8vIGFzc2VydCBhMCA9PSBhNCwgImV4cGVjdGVkIGJveCA9PSBub19wcm94eSIKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYm94ID09IG5vX3Byb3h5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzkKICAgIC8vIGFzc2VydCBhMCA9PSBhNSwgImV4cGVjdGVkIG1hcCA9PSBub19wcm94eSIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG1hcCA9PSBub19wcm94eQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAAECCCYJA2JveAhub19wcm94eQIAAAtnbG9iX2Fzc2lnbgRnbG9iA2xvYxEAAgAAAAAAAAABAAoAA2JhegoACG1vZGlmaWVkA21hcDEYQAADKSpnMRtBACQxGRREMRhEggMEUm6LvwSV/vE9BAwpREs2GgCOAwE2Ab8DDgAxGY0CACMAAQAxGEQrKmcnBCpnKLxIKCq/MQAnBSpmJwgxAFBJvEgqvyNDMRgUQ4oEAYAASYv+JAuL/CQLIosEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAIowEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiYoDAYv9UQACSReL/VcCAIv/JAtLAUxZi/8jCCQLSwJLAVlLAxVLBYv/CSMJSwFPA08CTUlLBAlOBov+FU4GSwQiTwVSi/5QTwRPAk8DUlBOAkwkC0yLBYsEDEEAIIsDSYsFSU4DWYsCCIsBCRZXBgJLAkxdjAMkCIwFQv/YiwCLA1CMAIkiK2VESSJZTFcCACMnBoj+6StMZyIpZURJIllMVwIAIycGiP7VKUxnIicEZURJIllMVwIAIycGiP7AJwRMZzEASSInBWNESSJZTFcCACMnBoj+pycFTGYovkRJIllMVwIAIycGiP6TKLxIKEy/JwgxAFBJvkRJIllMVwIAIycGiP54SwG8SL8jQyIrZURJVwIASwEiWUsBIllLASMJSwMVSwQkWU8CTU8DTgJSSSVZIkxYJwdQTEQiiP7AK0xnIillRElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/ospTGciJwRlRElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/lUnBExnMQBJIicFY0RJVwIASwEiWUsBIllLASMJSwMVSwQkWU8CTU8DTgJSSSVZIkxYJwdQTEQiiP4bJwVMZii+RElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/eYovEgoTL8nCDEAUEm+RElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/apLAbxIvyNDIillRCIrZUQiJwRlRDEAIicFY0QovkQnCDEAUL5ESwVPBRJESwRPBBJESwNPAxJESwJPAhJESwESRIAEFR98dUxQsCND","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the StateMutations contract - */ -export type StateMutationsArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'append()void': Record - 'modify()void': Record - 'get()(uint64,string)[]': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'append()void': [] - 'modify()void': [] - 'get()(uint64,string)[]': [] - } -} - -/** - * The return type for each method - */ -export type StateMutationsReturns = { - 'append()void': void - 'modify()void': void - 'get()(uint64,string)[]': [bigint, string][] -} - -/** - * Defines the types of available calls and state of the StateMutations smart contract. - */ -export type StateMutationsTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'append()void' | 'append', { - argsObj: StateMutationsArgs['obj']['append()void'] - argsTuple: StateMutationsArgs['tuple']['append()void'] - returns: StateMutationsReturns['append()void'] - }> - & Record<'modify()void' | 'modify', { - argsObj: StateMutationsArgs['obj']['modify()void'] - argsTuple: StateMutationsArgs['tuple']['modify()void'] - returns: StateMutationsReturns['modify()void'] - }> - & Record<'get()(uint64,string)[]' | 'get', { - argsObj: StateMutationsArgs['obj']['get()(uint64,string)[]'] - argsTuple: StateMutationsArgs['tuple']['get()(uint64,string)[]'] - returns: StateMutationsReturns['get()(uint64,string)[]'] - }> - /** - * Defines the shape of the state of the application. - */ - state: { - global: { - keys: { - noProxy: [bigint, string][] - globAssign: [bigint, string][] - glob: [bigint, string][] - } - maps: {} - } - local: { - keys: { - loc: [bigint, string][] - } - maps: {} - } - box: { - keys: { - box: [bigint, string][] - } - maps: { - map: Map - } - } - } -} - -/** - * Defines the possible abi call signatures. - */ -export type StateMutationsSignatures = keyof StateMutationsTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type StateMutationsNonVoidMethodSignatures = keyof StateMutationsTypes['methods'] extends infer T ? T extends keyof StateMutationsTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the StateMutations smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = StateMutationsTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the StateMutations smart contract to the method's return type - */ -export type MethodReturn = StateMutationsTypes['methods'][TSignature]['returns'] - -/** - * Defines the shape of the keyed global state of the application. - */ -export type GlobalKeysState = StateMutationsTypes['state']['global']['keys'] - -/** - * Defines the shape of the keyed local state of the application. - */ -export type LocalKeysState = StateMutationsTypes['state']['local']['keys'] - -/** - * Defines the shape of the keyed box state of the application. - */ -export type BoxKeysState = StateMutationsTypes['state']['box']['keys'] - - -/** - * Defines supported create method params for this smart contract - */ -export type StateMutationsCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type StateMutationsDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: StateMutationsCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateMutations smart contract - */ -export abstract class StateMutationsParamsFactory { - /** - * Constructs a no op call for the append()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static append(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'append()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the modify()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static modify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'modify()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } - /** - * Constructs a no op call for the get()(uint64,string)[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static get(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get()(uint64,string)[]' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } -} - -/** - * A factory to create and deploy one or more instance of the StateMutations smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class StateMutationsFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `StateMutationsFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new StateMutationsClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new StateMutationsClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the StateMutations smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: StateMutationsDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new StateMutationsClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateMutations smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateMutations smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StateMutations smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new StateMutationsClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the StateMutations smart contract - */ -export class StateMutationsClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `StateMutationsClient` - * - * @param appClient An `AppClient` instance which has been created with the StateMutations app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `StateMutationsClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `StateMutationsClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new StateMutationsClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `StateMutationsClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new StateMutationsClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the StateMutations smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The optIn result - */ - bare: (params?: Expand) => { - return this.appClient.params.bare.optIn(params) - }, - }, - - /** - * Makes a clear_state call to an existing instance of the StateMutations smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the StateMutations smart contract using the `append()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - append: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(StateMutationsParamsFactory.append(params)) - }, - - /** - * Makes a call to the StateMutations smart contract using the `modify()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - modify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(StateMutationsParamsFactory.modify(params)) - }, - - /** - * Makes a call to the StateMutations smart contract using the `get()(uint64,string)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - get: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(StateMutationsParamsFactory.get(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the StateMutations smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The optIn result - */ - bare: (params?: Expand) => { - return this.appClient.createTransaction.bare.optIn(params) - }, - }, - - /** - * Makes a clear_state call to an existing instance of the StateMutations smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the StateMutations smart contract using the `append()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - append: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(StateMutationsParamsFactory.append(params)) - }, - - /** - * Makes a call to the StateMutations smart contract using the `modify()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - modify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(StateMutationsParamsFactory.modify(params)) - }, - - /** - * Makes a call to the StateMutations smart contract using the `get()(uint64,string)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - get: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(StateMutationsParamsFactory.get(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available optIn methods - */ - optIn: { - /** - * Opts the user into an existing instance of the StateMutations smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The optIn result - */ - bare: (params?: Expand) => { - return this.appClient.send.bare.optIn(params) - }, - }, - - /** - * Makes a clear_state call to an existing instance of the StateMutations smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the StateMutations smart contract using the `append()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - append: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(StateMutationsParamsFactory.append(params)) - return {...result, return: result.return as unknown as (undefined | StateMutationsReturns['append()void'])} - }, - - /** - * Makes a call to the StateMutations smart contract using the `modify()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - modify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(StateMutationsParamsFactory.modify(params)) - return {...result, return: result.return as unknown as (undefined | StateMutationsReturns['modify()void'])} - }, - - /** - * Makes a call to the StateMutations smart contract using the `get()(uint64,string)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - get: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(StateMutationsParamsFactory.get(params)) - return {...result, return: result.return as unknown as (undefined | StateMutationsReturns['get()(uint64,string)[]'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new StateMutationsClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current StateMutations app - */ - state = { - /** - * Methods to access global state for the current StateMutations app - */ - global: { - /** - * Get all current keyed values from global state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.global.getAll() - return { - noProxy: result.no_proxy, - globAssign: result.glob_assign, - glob: result.glob, - } - }, - /** - * Get the current value of the no_proxy key in global state - */ - noProxy: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.global.getValue("no_proxy")) as [bigint, string][] | undefined }, - /** - * Get the current value of the glob_assign key in global state - */ - globAssign: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.global.getValue("glob_assign")) as [bigint, string][] | undefined }, - /** - * Get the current value of the glob key in global state - */ - glob: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.global.getValue("glob")) as [bigint, string][] | undefined }, - }, - /** - * Methods to access local state for the current StateMutations app - */ - local: (address: string | Address) => { - const encodedAddress = typeof address === 'string' ? address : encodeAddress(address.publicKey) - return { - /** - * Get all current keyed values from local state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.local(encodedAddress).getAll() - return { - loc: result.loc, - } - }, - /** - * Get the current value of the loc key in local state - */ - loc: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.local(encodedAddress).getValue("loc")) as [bigint, string][] | undefined }, - } - }, - /** - * Methods to access box state for the current StateMutations app - */ - box: { - /** - * Get all current keyed values from box state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.box.getAll() - return { - box: result.box, - } - }, - /** - * Get the current value of the box key in box state - */ - box: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.box.getValue("box")) as [bigint, string][] | undefined }, - /** - * Get values from the map map in box state - */ - map: { - /** - * Get all current values of the map map in box state - */ - getMap: async (): Promise> => { return (await this.appClient.state.box.getMap("map")) as Map }, - /** - * Get a current value of the map map by key from box state - */ - value: async (key: string): Promise<[bigint, string][] | undefined> => { return await this.appClient.state.box.getMapValue("map", key) as [bigint, string][] | undefined }, - }, - }, - } - - public newGroup(composerConfig?: TransactionComposerConfig): StateMutationsComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a append()void method call against the StateMutations contract - */ - append(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.append(params))) - return this - }, - /** - * Add a modify()void method call against the StateMutations contract - */ - modify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.modify(params))) - return this - }, - /** - * Add a get()(uint64,string)[] method call against the StateMutations contract - */ - get(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.get(params))) - return this - }, - get optIn() { - return { - bare: (params?: AppClientBareCallParams ) => { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.optIn.bare(params))) - return this - }, - } - }, - /** - * Add a clear state call to the StateMutations contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as StateMutationsComposer - } -} -export type StateMutationsComposer = { - /** - * Calls the append()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - append(params?: CallParams): StateMutationsComposer<[...TReturns, StateMutationsReturns['append()void'] | undefined]> - - /** - * Calls the modify()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - modify(params?: CallParams): StateMutationsComposer<[...TReturns, StateMutationsReturns['modify()void'] | undefined]> - - /** - * Calls the get()(uint64,string)[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - get(params?: CallParams): StateMutationsComposer<[...TReturns, StateMutationsReturns['get()(uint64,string)[]'] | undefined]> - - /** - * Gets available optIn methods - */ - readonly optIn: { - /** - * Opts the user into an existing instance of the StateMutations smart contract using a bare call. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - bare(params?: AppClientBareCallParams ): StateMutationsComposer - } - - /** - * Makes a clear_state call to an existing instance of the StateMutations smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): StateMutationsComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): StateMutationsComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type StateMutationsComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StaticSizeContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StaticSizeContract.ts deleted file mode 100644 index a0eb9be..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/StaticSizeContract.ts +++ /dev/null @@ -1,1009 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"StaticSizeContract","structs":{},"methods":[{"name":"test_array","args":[{"type":"uint64","name":"x1"},{"type":"uint64","name":"y1"},{"type":"uint64","name":"x2"},{"type":"uint64","name":"y2"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_extend_from_tuple","args":[{"type":"((uint64,uint64),(uint64,uint64))","name":"some_more"}],"returns":{"type":"(uint64,uint64)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_extend_from_arc4_tuple","args":[{"type":"((uint64,uint64),(uint64,uint64))","name":"some_more"}],"returns":{"type":"(uint64,uint64)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_bool_array","args":[{"type":"uint64","name":"length"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_arc4_conversion","args":[{"type":"uint64","name":"length"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"sum_array","args":[{"type":"uint64[]","name":"arc4_arr"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_arc4_bool","args":[],"returns":{"type":"bool[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":1,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{"count":{"keyType":"AVMString","valueType":"AVMUint64","key":"Y291bnQ="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[1188,1205,1215],"errorMessage":"check self.count exists"},{"pc":[1033],"errorMessage":"expected 3 bytes"},{"pc":[750,761,861,1026,1115],"errorMessage":"expected correct length"},{"pc":[1053,1128],"errorMessage":"expected correct value at 0"},{"pc":[1073,1141],"errorMessage":"expected correct value at 1"},{"pc":[1154],"errorMessage":"expected correct value at 2"},{"pc":[1166],"errorMessage":"expected correct value at 3"},{"pc":[403,478,517,637,665,784,883,1035,1056,1117,1130,1143,1155],"errorMessage":"index access is out of bounds"},{"pc":[653,1018],"errorMessage":"invalid array length header"},{"pc":[729,753,840,908,999,1098],"errorMessage":"max array length exceeded"},{"pc":[283,342,377],"errorMessage":"overflow"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAxNiAxNDQKICAgIGJ5dGVjYmxvY2sgMHggMHgxNTFmN2M3NSAiY291bnQiIDB4MDAgMHgwMDAwCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjM5CiAgICAvLyBzZWxmLmNvdW50ID0gVUludDY0KDApCiAgICBieXRlY18yIC8vICJjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjM3CiAgICAvLyBjbGFzcyBTdGF0aWNTaXplQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDI4ZDdjMWI4IDB4ZmE5Y2I5NzMgMHg2MDM5YTI0MCAweGY4ZmQ2OGE3IDB4MWYwMjhkYjEgMHgwOTZiM2E1OSAweDhkNmUzYTI1IC8vIG1ldGhvZCAidGVzdF9hcnJheSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2V4dGVuZF9mcm9tX3R1cGxlKCgodWludDY0LHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQpKSkodWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAidGVzdF9leHRlbmRfZnJvbV9hcmM0X3R1cGxlKCgodWludDY0LHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQpKSkodWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAidGVzdF9ib29sX2FycmF5KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRlc3RfYXJjNF9jb252ZXJzaW9uKHVpbnQ2NCl1aW50NjRbXSIsIG1ldGhvZCAic3VtX2FycmF5KHVpbnQ2NFtdKXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9hcmM0X2Jvb2woKWJvb2xbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHRlc3RfYXJyYXkgdGVzdF9leHRlbmRfZnJvbV90dXBsZSB0ZXN0X2V4dGVuZF9mcm9tX2FyYzRfdHVwbGUgdGVzdF9ib29sX2FycmF5IHRlc3RfYXJjNF9jb252ZXJzaW9uIHN1bV9hcnJheSB0ZXN0X2FyYzRfYm9vbAogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9iaXRzKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIHJlYWRfc3RlcDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYml0czoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiAyCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwbiAyCiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAtNAogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgY292ZXIgMgogICAgc3dhcAogICAgcHVzaGludCA3CiAgICArCiAgICBpbnRjXzIgLy8gOAogICAgLwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNwogICAgKwogICAgaW50Y18yIC8vIDgKICAgIC8KICAgIGR1cAogICAgY292ZXIgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl9pZl9lbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgLQogICAgYnplcm8KICAgIGZyYW1lX2RpZyA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgNAoKZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl9pZl9lbHNlQDI6CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDE2CiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBmcmFtZV9idXJ5IDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfd2hpbGVfdG9wQDM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfYWZ0ZXJfd2hpbGVANQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBnZXRiaXQKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX3doaWxlX3RvcEAzCgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX3doaWxlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC50ZXN0X2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcnJheToKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDMKICAgIC8vIHNlbGYuY291bnQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQ2CiAgICAvLyBQb2ludCh4PWFyYzQuVUludDY0KCksIHk9VUludDY0KCksIG90aGVyPXNlbGYueHRyYSgpKSwKICAgIGNhbGxzdWIgeHRyYQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0NwogICAgLy8gUG9pbnQoeD14MSwgeT15MSwgb3RoZXI9c2VsZi54dHJhKCkpLAogICAgY2FsbHN1YiB4dHJhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQ4CiAgICAvLyBQb2ludCh4PXgyLCB5PXkyLCBvdGhlcj1zZWxmLnh0cmEoKSksCiAgICBjYWxsc3ViIHh0cmEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDQtNTAKICAgIC8vIHBhdGggPSBSZWZlcmVuY2VBcnJheSgKICAgIC8vICAgICAoCiAgICAvLyAgICAgICAgIFBvaW50KHg9YXJjNC5VSW50NjQoKSwgeT1VSW50NjQoKSwgb3RoZXI9c2VsZi54dHJhKCkpLAogICAgLy8gICAgICAgICBQb2ludCh4PXgxLCB5PXkxLCBvdGhlcj1zZWxmLnh0cmEoKSksCiAgICAvLyAgICAgICAgIFBvaW50KHg9eDIsIHk9eTIsIG90aGVyPXNlbGYueHRyYSgpKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICBkaWcgMTEKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgcHVzaGludCA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMTIKICAgIGRpZyAxCiAgICBifAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTQKICAgIGl0b2IKICAgIHVuY292ZXIgMTUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgZGlnIDkKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgdW5jb3ZlciA5CiAgICBkaWcgNAogICAgYnwKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgdW5jb3ZlciA4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIGJ8CiAgICBjb25jYXQKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjUxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjUxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBkdXAKICAgIHB1c2hpbnQgMwogICAgPAogICAgYnogdGVzdF9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1MgogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuYiA9PSBpICsgMQogICAgZHVwMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjIDQgLy8gMTQ0CiAgICAqCiAgICBpbnRjIDQgLy8gMTQ0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGV4dHJhY3QgMTYgMTI4CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1MwogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuZC5mb28gPT0gaSArIDIKICAgIHN3YXAKICAgIGV4dHJhY3QgNDggMTYKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIHVuY292ZXIgMwogICAgcHVzaGludCAyCiAgICArCiAgICBpdG9iCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1NAogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuZC5iYXIgPT0gKGkgKyAxKSAqIChpICsgMSkKICAgIGV4dHJhY3QgOCA4CiAgICBkaWcgMQogICAgZGlnIDIKICAgICoKICAgIGl0b2IKICAgIGI9PQogICAgYXNzZXJ0CiAgICBidXJ5IDEKICAgIGIgdGVzdF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1NgogICAgLy8gQm94KEltbXV0YWJsZUFycmF5W1BvaW50XSwga2V5PSJhIikudmFsdWUgPSBwYXRoLmZyZWV6ZSgpCiAgICBkdXAKICAgIGxlbgogICAgaW50YyA0IC8vIDE0NAogICAgLwogICAgZHVwCiAgICBidXJ5IDEwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzICJhIgogICAgYm94X2RlbAogICAgcG9wCiAgICBwdXNoYnl0ZXMgImEiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2OAogICAgLy8gbGFzdF9wb2ludCA9IHBhdGhbMF0KICAgIGV4dHJhY3QgMCAxNDQgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIGJ1cnkgMTAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2OQogICAgLy8gbGVuZ3RoID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTcwCiAgICAvLyBmb3IgcG9pbnRfaWR4IGluIHVyYW5nZSgxLCBwYXRoLmxlbmd0aCk6CiAgICBpbnRjXzEgLy8gMQogICAgYnVyeSAzCgp0ZXN0X2FycmF5X2Zvcl9oZWFkZXJANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTcwCiAgICAvLyBmb3IgcG9pbnRfaWR4IGluIHVyYW5nZSgxLCBwYXRoLmxlbmd0aCk6CiAgICBkaWcgMgogICAgZGlnIDgKICAgIDwKICAgIGJ6IHRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDE1CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzEKICAgIC8vIHBvaW50ID0gcGF0aFtwb2ludF9pZHhdCiAgICBkaWcgMwogICAgaW50YyA0IC8vIDE0NAogICAgKgogICAgaW50YyA0IC8vIDE0NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXBuIDIKICAgIGV4dHJhY3QgMCA4CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzIKICAgIC8vIGlmIHBvaW50LnggPCBsYXN0X3BvaW50Lng6CiAgICBkaWcgMTAKICAgIGI8CiAgICBieiB0ZXN0X2FycmF5X2Vsc2VfYm9keUAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzMKICAgIC8vIGR4ID0gbGFzdF9wb2ludC54LmFzX3VpbnQ2NCgpIC0gcG9pbnQueC5hc191aW50NjQoKQogICAgZGlnIDEwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2OAogICAgLy8gbGFzdF9wb2ludCA9IHBhdGhbMF0KICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3MwogICAgLy8gZHggPSBsYXN0X3BvaW50LnguYXNfdWludDY0KCkgLSBwb2ludC54LmFzX3VpbnQ2NCgpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzEKICAgIC8vIHBvaW50ID0gcGF0aFtwb2ludF9pZHhdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzMKICAgIC8vIGR4ID0gbGFzdF9wb2ludC54LmFzX3VpbnQ2NCgpIC0gcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIGJ1cnkgNwoKdGVzdF9hcnJheV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzYKICAgIC8vIGlmIHBvaW50LnkgPCBsYXN0X3BvaW50Lnk6CiAgICBkaWcgMwogICAgZGlnIDYKICAgIDwKICAgIGJ6IHRlc3RfYXJyYXlfZWxzZV9ib2R5QDEzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3NwogICAgLy8gZHkgPSBsYXN0X3BvaW50LnkgLSBwb2ludC55CiAgICBkaWcgNQogICAgZGlnIDQKICAgIC0KCnRlc3RfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTgwCiAgICAvLyBsZW5ndGggKz0gb3Auc3FydChkeCAqIGR4ICsgZHkgKiBkeSkKICAgIGRpZyA3CiAgICBkdXAKICAgICoKICAgIHN3YXAKICAgIGR1cAogICAgKgogICAgKwogICAgc3FydAogICAgZGlnIDUKICAgICsKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzAKICAgIC8vIGZvciBwb2ludF9pZHggaW4gdXJhbmdlKDEsIHBhdGgubGVuZ3RoKToKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAzCiAgICBiIHRlc3RfYXJyYXlfZm9yX2hlYWRlckA3Cgp0ZXN0X2FycmF5X2Vsc2VfYm9keUAxMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTc5CiAgICAvLyBkeSA9IHBvaW50LnkgLSBsYXN0X3BvaW50LnkKICAgIGRpZyAzCiAgICBkaWcgNgogICAgLQogICAgYiB0ZXN0X2FycmF5X2FmdGVyX2lmX2Vsc2VAMTQKCnRlc3RfYXJyYXlfZWxzZV9ib2R5QDEwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzEKICAgIC8vIHBvaW50ID0gcGF0aFtwb2ludF9pZHhdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzUKICAgIC8vIGR4ID0gcG9pbnQueC5hc191aW50NjQoKSAtIGxhc3RfcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjgKICAgIC8vIGxhc3RfcG9pbnQgPSBwYXRoWzBdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzUKICAgIC8vIGR4ID0gcG9pbnQueC5hc191aW50NjQoKSAtIGxhc3RfcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIGJ1cnkgNwogICAgYiB0ZXN0X2FycmF5X2FmdGVyX2lmX2Vsc2VAMTEKCnRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyA0CiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QudGVzdF9leHRlbmRfZnJvbV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZXh0ZW5kX2Zyb21fdHVwbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgMTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMTYgMTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjIKICAgIC8vIGFyci5leHRlbmQoc29tZV9tb3JlKQogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2MwogICAgLy8gbGFzdCA9IGFyclstMV0KICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMTYKICAgIC8KICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyAxNgogICAgKgogICAgZGlnIDIKICAgIHN3YXAKICAgIGludGNfMyAvLyAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY0CiAgICAvLyBhc3NlcnQgbGFzdCA9PSBzb21lX21vcmVbMV0KICAgIGR1cAogICAgdW5jb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY1CiAgICAvLyByZXN1bHQgPSBhcnIuZnJlZXplKCkKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2NgogICAgLy8gYXNzZXJ0IHJlc3VsdFstMV0gPT0gbGFzdAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDE2CiAgICAqCiAgICBpbnRjXzMgLy8gMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfZXh0ZW5kX2Zyb21fYXJjNF90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZXh0ZW5kX2Zyb21fYXJjNF90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojc1CiAgICAvLyByZXR1cm4gYXJyLmZyZWV6ZSgpCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDE2CiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfYm9vbF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYm9vbF9hcnJheToKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3OQogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbYm9vbF0oKQogICAgYnl0ZWNfMCAvLyAweAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGludGNfMSAvLyAxCgp0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjgzCiAgICAvLyBhcnIuYXBwZW5kKGkgJSAyID09IDApCiAgICBkdXBuIDIKICAgIHB1c2hpbnQgMgogICAgJQogICAgIQogICAgZGlnIDQKICAgIHN3YXAKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMgogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojg0CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGgsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGxlbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6ODcKICAgIC8vIGFycjIuZXh0ZW5kKGFycikKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4OAogICAgLy8gYXNzZXJ0IGFycjIubGVuZ3RoID09IGxlbmd0aCAqIDIsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDIKICAgICoKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6OTAKICAgIC8vIGNvdW50ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjkxCiAgICAvLyBmb3IgdmFsIGluIGFycjoKICAgIGxlbgogICAgYnVyeSA3CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1Cgp0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5MQogICAgLy8gZm9yIHZhbCBpbiBhcnI6CiAgICBkaWcgNAogICAgZGlnIDcKICAgIDwKICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9mb3JAMTEKICAgIGRpZyAyCiAgICBkaWcgNQogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5MgogICAgLy8gaWYgdmFsOgogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5MwogICAgLy8gY291bnQgKz0gMQogICAgZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDYKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDk6CiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiB0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckA2Cgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfZm9yQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyA1CiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QudGVzdF9hcmM0X2NvbnZlcnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY29udmVyc2lvbjoKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5OAogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbYXJjNC5VSW50NjRdKCkKICAgIGJ5dGVjXzAgLy8gMHgKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTAxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMSwgbGVuZ3RoICsgMSk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaW50Y18xIC8vIDEKCnRlc3RfYXJjNF9jb252ZXJzaW9uX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTAxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMSwgbGVuZ3RoICsgMSk6CiAgICBkdXAKICAgIGRpZyAyCiAgICA8CiAgICBieiB0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDIKICAgIC8vIGFyci5hcHBlbmQoYXJjNC5VSW50NjQoaSkpCiAgICBkdXBuIDIKICAgIGl0b2IKICAgIGRpZyA0CiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDEKICAgIC8vIGZvciBpIGluIHVyYW5nZSgxLCBsZW5ndGggKyAxKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9hcmM0X2NvbnZlcnNpb25fZm9yX2hlYWRlckAyCgp0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9mb3JANToKICAgIGRpZyAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwMwogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gbGVuZ3RoLCAiZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgiCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBkdXAKICAgIGJ1cnkgOAogICAgZGlnIDQKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTA0CiAgICAvLyBjb3VudCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9hcmM0X2NvbnZlcnNpb25fZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDUKICAgIC8vIGZvciB2YWwgaW4gYXJyOgogICAgZGlnIDQKICAgIGRpZyA3CiAgICA8CiAgICBieiB0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9mb3JAMTEKICAgIGRpZyAyCiAgICBkaWcgNQogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTA2CiAgICAvLyBpZiB2YWw6CiAgICBieXRlY18wIC8vIDB4CiAgICBiIT0KICAgIGJ6IHRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDcKICAgIC8vIGNvdW50ICs9IDEKICAgIGRpZyA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA2Cgp0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9pZl9lbHNlQDk6CiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiB0ZXN0X2FyYzRfY29udmVyc2lvbl9mb3JfaGVhZGVyQDYKCnRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2ZvckAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTA5CiAgICAvLyBhcmM0X2FyciA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSgpCiAgICBieXRlYyA0IC8vIDB4MDAwMAogICAgZGlnIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTEwCiAgICAvLyBhcmM0X2Fyci5leHRlbmQoYXJyKQogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC5zdW1fYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgpzdW1fYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTE3CiAgICAvLyBhcnIuZXh0ZW5kKGFyYzRfYXJyKQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMTkKICAgIC8vIHRvdGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjAKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgIC8KICAgIGludGNfMCAvLyAwCgpzdW1fYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjAKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IHN1bV9hcnJheV9hZnRlcl9mb3JANQogICAgZGlnIDMKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEyMQogICAgLy8gdG90YWwgKz0gaXRlbS5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA0CiAgICArCiAgICBidXJ5IDQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgc3VtX2FycmF5X2Zvcl9oZWFkZXJAMgoKc3VtX2FycmF5X2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0MgogICAgLy8gYXJyLmFwcGVuZChhcmM0LkJvb2woVHhuLnNlbmRlciA9PSBUeG4ucmVjZWl2ZXIpKQogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICA9PQogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQzCiAgICAvLyBhcnIuYXBwZW5kKGFyYzQuQm9vbChUeG4uc2VuZGVyICE9IFR4bi5yZWNlaXZlcikpCiAgICB0eG4gU2VuZGVyCiAgICB0eG4gUmVjZWl2ZXIKICAgICE9CiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ2CiAgICAvLyBkeW5fYXJyLmV4dGVuZChhcnIpCiAgICBsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ1CiAgICAvLyBkeW5fYXJyID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5Cb29sXSgpCiAgICBieXRlYyA0IC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDYKICAgIC8vIGR5bl9hcnIuZXh0ZW5kKGFycikKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDcKICAgIC8vIGFzc2VydCBkeW5fYXJyLmxlbmd0aCA9PSAyLCAiZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgiCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGR1cAogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0OAogICAgLy8gYXNzZXJ0IGR5bl9hcnIuYnl0ZXMubGVuZ3RoID09IDMsICJleHBlY3RlZCAzIGJ5dGVzIgogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDMgYnl0ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ5CiAgICAvLyBhc3NlcnQgZHluX2FyclswXSA9PSAoVHhuLnNlbmRlciA9PSBUeG4ucmVjZWl2ZXIpLCAiZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAwIgogICAgZHVwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMTYKICAgIGdldGJpdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgPT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE1MAogICAgLy8gYXNzZXJ0IGR5bl9hcnJbMV0gPT0gKFR4bi5zZW5kZXIgIT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMSIKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hpbnQgMTcKICAgIGdldGJpdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxCiAgICBpbnRjXzAgLy8gMAoKdGVzdF9hcmM0X2Jvb2xfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTMtMTU1CiAgICAvLyAjIG5vdGU6IG5vdCBzdXBwb3J0ZWQgY3VycmVudGx5CiAgICAvLyAjIGFycjIuZXh0ZW5kKGR5bl9hcnJheSkKICAgIC8vIGZvciBiIGluIGR5bl9hcnI6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2FyYzRfYm9vbF9hZnRlcl9mb3JANQogICAgZHVwbiAyCiAgICBpbnRjXzMgLy8gMTYKICAgICsKICAgIGRpZyA1CiAgICBzd2FwCiAgICBnZXRiaXQKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTYKICAgIC8vIGFycjIuYXBwZW5kKGIpCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FyYzRfYm9vbF9mb3JfaGVhZGVyQDIKCnRlc3RfYXJjNF9ib29sX2FmdGVyX2ZvckA1OgogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTU3CiAgICAvLyBhc3NlcnQgYXJyMi5sZW5ndGggPT0gNCwgImV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoIgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTgKICAgIC8vIGFzc2VydCBhcnIyWzBdID09IChUeG4uc2VuZGVyID09IFR4bi5yZWNlaXZlciksICJleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDAiCiAgICBkdXAKICAgIGV4dHJhY3QgMCAxIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICA9PQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTU5CiAgICAvLyBhc3NlcnQgYXJyMlsxXSA9PSAoVHhuLnNlbmRlciAhPSBUeG4ucmVjZWl2ZXIpLCAiZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxIgogICAgZHVwCiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2MAogICAgLy8gYXNzZXJ0IGFycjJbMl0gPT0gKFR4bi5zZW5kZXIgPT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMiIKICAgIGR1cAogICAgZXh0cmFjdCAyIDEgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG4gU2VuZGVyCiAgICB0eG4gUmVjZWl2ZXIKICAgID09CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjEKICAgIC8vIGFzc2VydCBhcnIyWzNdID09IChUeG4uc2VuZGVyICE9IFR4bi5yZWNlaXZlciksICJleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDMiCiAgICBleHRyYWN0IDMgMSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAzCiAgICBkaWcgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjMKICAgIC8vIHJldHVybiBhcnIuZnJlZXplKCkKICAgIGR1cAogICAgbGVuCiAgICBieXRlYyA0IC8vIDB4MDAwMAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYml0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QueHRyYSgpIC0+IHVpbnQ2NCwgdWludDY0LCBieXRlcywgYnl0ZXMsIGJ5dGVzOgp4dHJhOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjYKICAgIC8vIHNlbGYuY291bnQgKz0gMQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEyOAogICAgLy8gYT1UeG4ubnVtX2FwcF9hcmdzLAogICAgdHhuIE51bUFwcEFyZ3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTMwCiAgICAvLyBjPVR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEzMQogICAgLy8gZD1zZWxmLm1vcmUoKSwKICAgIGNhbGxzdWIgbW9yZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMzIKICAgIC8vIGU9QmlnVUludChzZWxmLmNvdW50KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3VudCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTI3LTEzMwogICAgLy8gcmV0dXJuIFh0cmEoCiAgICAvLyAgICAgYT1UeG4ubnVtX2FwcF9hcmdzLAogICAgLy8gICAgIGI9c2VsZi5jb3VudCwKICAgIC8vICAgICBjPVR4bi5zZW5kZXIsCiAgICAvLyAgICAgZD1zZWxmLm1vcmUoKSwKICAgIC8vICAgICBlPUJpZ1VJbnQoc2VsZi5jb3VudCksCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0Lm1vcmUoKSAtPiBieXRlczoKbW9yZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTM3CiAgICAvLyByZXR1cm4gTW9yZShmb289YXJjNC5VSW50NjQoc2VsZi5jb3VudCArIDEpLCBiYXI9YXJjNC5VSW50NjQoc2VsZi5jb3VudCAqIHNlbGYuY291bnQpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50IGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZGlnIDEKICAgIHVuY292ZXIgMgogICAgKgogICAgaXRvYgogICAgY29uY2F0CiAgICByZXRzdWIK","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAFAAEIEJABJgUABBUffHUFY291bnQBAAIAADEYQAADKiJnMRtBAEAxGRREMRhEggcEKNfBuAT6nLlzBGA5okAE+P1opwQfAo2xBAlrOlkEjW46JTYaAI4HAIEB+QI8Ak8CxgM4A2sAMRkUMRgUEEOKBAEoRwKL/CJZRwKL/ghJFlcGAIv8TFwATgJMgQcIJApJTwKBBwgkCklOAgxBAAyLBosFCa+LBExQjAQijACLAyUISYwCi/4IjAGLAosBDEEAIIv9iwBJTgJTiwSLAklOA08CVIwEIwiMAov/CIwAQv/YiwSMAIkiSShHBTYaATYaAhc2GgM2GgQXKiJniAOfiAOciAOZTw4WTw4WUE8NUE8MUEsLFYFADkSBQK9PDEsBq08CTFCAEAAAAAAAAAAAAAAAAAAAAABMUE8OFk8PTFBPDBZPDBZQTwtQTwpQSwkVgUAORE8JSwSrUFBQTwcWTwhMUE8HFk8HFlBPBlBPBVBLBBWBQA5ETwRPBKtQUFAiSYEDDEEAOUpJTgIhBAshBFhXEIBJJFtLAiMITEsBEkRMVzAQSVcACE8DgQIIFqhEVwgISwFLAgsWqERFAUL/wEsBSRUhBApJRQoWVwYCSwFQgAFhvEiAAWFMv1cAkElFC0lXAAhFCiRbRQYiRQUjRQNLAksIDEEAXEsBSwMhBAshBFhHAlcACEwkW0UGSwqkQQA2SwoiW0wiWwlFB0sDSwYMQQAcSwVLBAlLB0kLTEkLCJJLBQhFBUsCIwhFA0L/sEsDSwYJQv/hIltLCiJbCUUHQv/ISwQWKUxQsCNDNhoBSVcAEExXEBBMSwFQSRUlCkkjCSULSwJMJVhJTwQSREwWVwYCTwJQSSJZIwlLAVcCAEwlCyVYTwISRClMULAjQzYaAUkVJQoWVwYCTFApTFCwI0MoRwI2GgEXSShMIwgjSUsCDEEAGEcCgQIYFEsETCsiTwJUUEUEIwhFAUL/4UsCRwIVSwZJTgQSREsBUBVPAoECCxJEIkUHFUUHIkUFSwRLBwxBABpLAksFI1giU0EABksFIwhFBksEIwhFBUL/3ksFFilMULAjQyhHAjYaARdJKEwjCCNJSwIMQQAQRwIWSwRMUEUEIwhFAUL/6UsCFSQKSUUISwQSRCJFBiJFBUsESwcMQQAcSwJLBSQLJFgoqUEABksFIwhFBksEIwhFBUL/3CcESwNQSVcCABUkChZXBgJcAClMULAjQzYaAVcCAEkiTBUkCiJJSwIMQQAWSwNLAUlOAiQLW0sECEUEIwhFAUL/40sCFilMULAjQzEAMQcSKyJPAlQxADEHEysiTwJUUEcCFScESwJPAiSI/HxJTgJJIllJTgNJgQISREsBFYEDEkRJREsBJVMrIk8CVCJTMQAxBxISRCMNRIERUysiTwJUIlMxADEHExJEIklLAwxBABpHAiUISwVMUysiTwJUSwNMUEUDIwhFAUL/30sBSRWBBBJESVcAASJTMQAxBxISRElXAQEiUzEAMQcTEkRJVwIBIlMxADEHEhJEVwMBIlMxADEHExJESwRJFScETgIkiPvWKUxQsCNDIiplRCMIKksBZzEbMQCIAAoiKmVEFk8DTgSJIiplREkjCBZLAU8CCxZQiQ==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the StaticSizeContract contract - */ -export type StaticSizeContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'test_array(uint64,uint64,uint64,uint64)uint64': { - x1: bigint | number - y1: bigint | number - x2: bigint | number - y2: bigint | number - } - 'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': { - someMore: [[bigint | number, bigint | number], [bigint | number, bigint | number]] - } - 'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': { - someMore: [[bigint | number, bigint | number], [bigint | number, bigint | number]] - } - 'test_bool_array(uint64)uint64': { - length: bigint | number - } - 'test_arc4_conversion(uint64)uint64[]': { - length: bigint | number - } - 'sum_array(uint64[])uint64': { - arc4Arr: bigint[] | number[] - } - 'test_arc4_bool()bool[]': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'test_array(uint64,uint64,uint64,uint64)uint64': [x1: bigint | number, y1: bigint | number, x2: bigint | number, y2: bigint | number] - 'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': [someMore: [[bigint | number, bigint | number], [bigint | number, bigint | number]]] - 'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': [someMore: [[bigint | number, bigint | number], [bigint | number, bigint | number]]] - 'test_bool_array(uint64)uint64': [length: bigint | number] - 'test_arc4_conversion(uint64)uint64[]': [length: bigint | number] - 'sum_array(uint64[])uint64': [arc4Arr: bigint[] | number[]] - 'test_arc4_bool()bool[]': [] - } -} - -/** - * The return type for each method - */ -export type StaticSizeContractReturns = { - 'test_array(uint64,uint64,uint64,uint64)uint64': bigint - 'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': [bigint, bigint][] - 'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': [bigint, bigint][] - 'test_bool_array(uint64)uint64': bigint - 'test_arc4_conversion(uint64)uint64[]': bigint[] - 'sum_array(uint64[])uint64': bigint - 'test_arc4_bool()bool[]': boolean[] -} - -/** - * Defines the types of available calls and state of the StaticSizeContract smart contract. - */ -export type StaticSizeContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'test_array(uint64,uint64,uint64,uint64)uint64' | 'test_array', { - argsObj: StaticSizeContractArgs['obj']['test_array(uint64,uint64,uint64,uint64)uint64'] - argsTuple: StaticSizeContractArgs['tuple']['test_array(uint64,uint64,uint64,uint64)uint64'] - returns: StaticSizeContractReturns['test_array(uint64,uint64,uint64,uint64)uint64'] - }> - & Record<'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]' | 'test_extend_from_tuple', { - argsObj: StaticSizeContractArgs['obj']['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] - argsTuple: StaticSizeContractArgs['tuple']['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] - returns: StaticSizeContractReturns['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] - }> - & Record<'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]' | 'test_extend_from_arc4_tuple', { - argsObj: StaticSizeContractArgs['obj']['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] - argsTuple: StaticSizeContractArgs['tuple']['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] - returns: StaticSizeContractReturns['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] - }> - & Record<'test_bool_array(uint64)uint64' | 'test_bool_array', { - argsObj: StaticSizeContractArgs['obj']['test_bool_array(uint64)uint64'] - argsTuple: StaticSizeContractArgs['tuple']['test_bool_array(uint64)uint64'] - returns: StaticSizeContractReturns['test_bool_array(uint64)uint64'] - }> - & Record<'test_arc4_conversion(uint64)uint64[]' | 'test_arc4_conversion', { - argsObj: StaticSizeContractArgs['obj']['test_arc4_conversion(uint64)uint64[]'] - argsTuple: StaticSizeContractArgs['tuple']['test_arc4_conversion(uint64)uint64[]'] - returns: StaticSizeContractReturns['test_arc4_conversion(uint64)uint64[]'] - }> - & Record<'sum_array(uint64[])uint64' | 'sum_array', { - argsObj: StaticSizeContractArgs['obj']['sum_array(uint64[])uint64'] - argsTuple: StaticSizeContractArgs['tuple']['sum_array(uint64[])uint64'] - returns: StaticSizeContractReturns['sum_array(uint64[])uint64'] - }> - & Record<'test_arc4_bool()bool[]' | 'test_arc4_bool', { - argsObj: StaticSizeContractArgs['obj']['test_arc4_bool()bool[]'] - argsTuple: StaticSizeContractArgs['tuple']['test_arc4_bool()bool[]'] - returns: StaticSizeContractReturns['test_arc4_bool()bool[]'] - }> - /** - * Defines the shape of the state of the application. - */ - state: { - global: { - keys: { - count: bigint - } - maps: {} - } - } -} - -/** - * Defines the possible abi call signatures. - */ -export type StaticSizeContractSignatures = keyof StaticSizeContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type StaticSizeContractNonVoidMethodSignatures = keyof StaticSizeContractTypes['methods'] extends infer T ? T extends keyof StaticSizeContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the StaticSizeContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = StaticSizeContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the StaticSizeContract smart contract to the method's return type - */ -export type MethodReturn = StaticSizeContractTypes['methods'][TSignature]['returns'] - -/** - * Defines the shape of the keyed global state of the application. - */ -export type GlobalKeysState = StaticSizeContractTypes['state']['global']['keys'] - - -/** - * Defines supported create method params for this smart contract - */ -export type StaticSizeContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type StaticSizeContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: StaticSizeContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the StaticSizeContract smart contract - */ -export abstract class StaticSizeContractParamsFactory { - /** - * Constructs a no op call for the test_array(uint64,uint64,uint64,uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_array(uint64,uint64,uint64,uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.x1, params.args.y1, params.args.x2, params.args.y2], - } - } - /** - * Constructs a no op call for the test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testExtendFromTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.someMore], - } - } - /** - * Constructs a no op call for the test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testExtendFromArc4Tuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.someMore], - } - } - /** - * Constructs a no op call for the test_bool_array(uint64)uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testBoolArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_bool_array(uint64)uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.length], - } - } - /** - * Constructs a no op call for the test_arc4_conversion(uint64)uint64[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testArc4Conversion(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_arc4_conversion(uint64)uint64[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.length], - } - } - /** - * Constructs a no op call for the sum_array(uint64[])uint64 ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static sumArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'sum_array(uint64[])uint64' as const, - args: Array.isArray(params.args) ? params.args : [params.args.arc4Arr], - } - } - /** - * Constructs a no op call for the test_arc4_bool()bool[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_arc4_bool()bool[]' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } -} - -/** - * A factory to create and deploy one or more instance of the StaticSizeContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class StaticSizeContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `StaticSizeContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new StaticSizeContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new StaticSizeContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the StaticSizeContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: StaticSizeContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new StaticSizeContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StaticSizeContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StaticSizeContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the StaticSizeContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new StaticSizeContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the StaticSizeContract smart contract - */ -export class StaticSizeContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `StaticSizeContractClient` - * - * @param appClient An `AppClient` instance which has been created with the StaticSizeContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `StaticSizeContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `StaticSizeContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new StaticSizeContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `StaticSizeContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new StaticSizeContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the StaticSizeContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_array(uint64,uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StaticSizeContractParamsFactory.testArray(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testExtendFromTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StaticSizeContractParamsFactory.testExtendFromTuple(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testExtendFromArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StaticSizeContractParamsFactory.testExtendFromArc4Tuple(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_bool_array(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testBoolArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StaticSizeContractParamsFactory.testBoolArray(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_arc4_conversion(uint64)uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testArc4Conversion: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StaticSizeContractParamsFactory.testArc4Conversion(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `sum_array(uint64[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - sumArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.params.call(StaticSizeContractParamsFactory.sumArray(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_arc4_bool()bool[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(StaticSizeContractParamsFactory.testArc4Bool(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the StaticSizeContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_array(uint64,uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testArray(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testExtendFromTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testExtendFromTuple(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testExtendFromArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testExtendFromArc4Tuple(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_bool_array(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testBoolArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testBoolArray(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_arc4_conversion(uint64)uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testArc4Conversion: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testArc4Conversion(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `sum_array(uint64[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - sumArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { - return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.sumArray(params)) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_arc4_bool()bool[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testArc4Bool(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the StaticSizeContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_array(uint64,uint64,uint64,uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testArray(params)) - return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_array(uint64,uint64,uint64,uint64)uint64'])} - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testExtendFromTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testExtendFromTuple(params)) - return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'])} - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testExtendFromArc4Tuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testExtendFromArc4Tuple(params)) - return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'])} - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_bool_array(uint64)uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testBoolArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testBoolArray(params)) - return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_bool_array(uint64)uint64'])} - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_arc4_conversion(uint64)uint64[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testArc4Conversion: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testArc4Conversion(params)) - return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_arc4_conversion(uint64)uint64[]'])} - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `sum_array(uint64[])uint64` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - sumArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { - const result = await this.appClient.send.call(StaticSizeContractParamsFactory.sumArray(params)) - return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['sum_array(uint64[])uint64'])} - }, - - /** - * Makes a call to the StaticSizeContract smart contract using the `test_arc4_bool()bool[]` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testArc4Bool(params)) - return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_arc4_bool()bool[]'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new StaticSizeContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current StaticSizeContract app - */ - state = { - /** - * Methods to access global state for the current StaticSizeContract app - */ - global: { - /** - * Get all current keyed values from global state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.global.getAll() - return { - count: result.count, - } - }, - /** - * Get the current value of the count key in global state - */ - count: async (): Promise => { return (await this.appClient.state.global.getValue("count")) as bigint | undefined }, - }, - } - - public newGroup(composerConfig?: TransactionComposerConfig): StaticSizeContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a test_array(uint64,uint64,uint64,uint64)uint64 method call against the StaticSizeContract contract - */ - testArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testArray(params))) - return this - }, - /** - * Add a test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] method call against the StaticSizeContract contract - */ - testExtendFromTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testExtendFromTuple(params))) - return this - }, - /** - * Add a test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] method call against the StaticSizeContract contract - */ - testExtendFromArc4Tuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testExtendFromArc4Tuple(params))) - return this - }, - /** - * Add a test_bool_array(uint64)uint64 method call against the StaticSizeContract contract - */ - testBoolArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBoolArray(params))) - return this - }, - /** - * Add a test_arc4_conversion(uint64)uint64[] method call against the StaticSizeContract contract - */ - testArc4Conversion(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testArc4Conversion(params))) - return this - }, - /** - * Add a sum_array(uint64[])uint64 method call against the StaticSizeContract contract - */ - sumArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sumArray(params))) - return this - }, - /** - * Add a test_arc4_bool()bool[] method call against the StaticSizeContract contract - */ - testArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testArc4Bool(params))) - return this - }, - /** - * Add a clear state call to the StaticSizeContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as StaticSizeContractComposer - } -} -export type StaticSizeContractComposer = { - /** - * Calls the test_array(uint64,uint64,uint64,uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testArray(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_array(uint64,uint64,uint64,uint64)uint64'] | undefined]> - - /** - * Calls the test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testExtendFromTuple(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] | undefined]> - - /** - * Calls the test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testExtendFromArc4Tuple(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] | undefined]> - - /** - * Calls the test_bool_array(uint64)uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testBoolArray(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_bool_array(uint64)uint64'] | undefined]> - - /** - * Calls the test_arc4_conversion(uint64)uint64[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testArc4Conversion(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_arc4_conversion(uint64)uint64[]'] | undefined]> - - /** - * Calls the sum_array(uint64[])uint64 ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - sumArray(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['sum_array(uint64[])uint64'] | undefined]> - - /** - * Calls the test_arc4_bool()bool[] ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testArc4Bool(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_arc4_bool()bool[]'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the StaticSizeContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): StaticSizeContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): StaticSizeContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type StaticSizeContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/TuplesContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/TuplesContract.ts deleted file mode 100644 index 1e2fe54..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/TuplesContract.ts +++ /dev/null @@ -1,558 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"TuplesContract","structs":{},"methods":[{"name":"test_tuple_with_primitive_type","args":[],"returns":{"type":"(uint64,bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9UdXBsZXMvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgVHVwbGVzQ29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHg3MjI5ZDc5YSAvLyBtZXRob2QgInRlc3RfdHVwbGVfd2l0aF9wcmltaXRpdmVfdHlwZSgpKHVpbnQ2NCxib29sKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdF90dXBsZV93aXRoX3ByaW1pdGl2ZV90eXBlX3JvdXRlQDMKICAgIGVycgoKbWFpbl90ZXN0X3R1cGxlX3dpdGhfcHJpbWl0aXZlX3R5cGVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9UdXBsZXMvY29udHJhY3QucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDAwMDA4MAogICAgbG9nCiAgICBwdXNoaW50IDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAogARyKdeaNhoAjgEAAQAxGRQxGBBEgA0VH3x1AAAAAAAAAACAsIEBQzEZFDEYFBBD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the TuplesContract contract - */ -export type TuplesContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'test_tuple_with_primitive_type()(uint64,bool)': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'test_tuple_with_primitive_type()(uint64,bool)': [] - } -} - -/** - * The return type for each method - */ -export type TuplesContractReturns = { - 'test_tuple_with_primitive_type()(uint64,bool)': [bigint, boolean] -} - -/** - * Defines the types of available calls and state of the TuplesContract smart contract. - */ -export type TuplesContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'test_tuple_with_primitive_type()(uint64,bool)' | 'test_tuple_with_primitive_type', { - argsObj: TuplesContractArgs['obj']['test_tuple_with_primitive_type()(uint64,bool)'] - argsTuple: TuplesContractArgs['tuple']['test_tuple_with_primitive_type()(uint64,bool)'] - returns: TuplesContractReturns['test_tuple_with_primitive_type()(uint64,bool)'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type TuplesContractSignatures = keyof TuplesContractTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type TuplesContractNonVoidMethodSignatures = keyof TuplesContractTypes['methods'] extends infer T ? T extends keyof TuplesContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the TuplesContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = TuplesContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the TuplesContract smart contract to the method's return type - */ -export type MethodReturn = TuplesContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type TuplesContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type TuplesContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: TuplesContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the TuplesContract smart contract - */ -export abstract class TuplesContractParamsFactory { - /** - * Constructs a no op call for the test_tuple_with_primitive_type()(uint64,bool) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static testTupleWithPrimitiveType(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'test_tuple_with_primitive_type()(uint64,bool)' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } -} - -/** - * A factory to create and deploy one or more instance of the TuplesContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class TuplesContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `TuplesContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new TuplesContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new TuplesContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the TuplesContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: TuplesContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new TuplesContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the TuplesContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the TuplesContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the TuplesContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new TuplesContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the TuplesContract smart contract - */ -export class TuplesContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `TuplesContractClient` - * - * @param appClient An `AppClient` instance which has been created with the TuplesContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `TuplesContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `TuplesContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new TuplesContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `TuplesContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new TuplesContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the TuplesContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the TuplesContract smart contract using the `test_tuple_with_primitive_type()(uint64,bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - testTupleWithPrimitiveType: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(TuplesContractParamsFactory.testTupleWithPrimitiveType(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the TuplesContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the TuplesContract smart contract using the `test_tuple_with_primitive_type()(uint64,bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - testTupleWithPrimitiveType: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(TuplesContractParamsFactory.testTupleWithPrimitiveType(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the TuplesContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the TuplesContract smart contract using the `test_tuple_with_primitive_type()(uint64,bool)` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - testTupleWithPrimitiveType: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(TuplesContractParamsFactory.testTupleWithPrimitiveType(params)) - return {...result, return: result.return as unknown as (undefined | TuplesContractReturns['test_tuple_with_primitive_type()(uint64,bool)'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new TuplesContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current TuplesContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): TuplesContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a test_tuple_with_primitive_type()(uint64,bool) method call against the TuplesContract contract - */ - testTupleWithPrimitiveType(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testTupleWithPrimitiveType(params))) - return this - }, - /** - * Add a clear state call to the TuplesContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as TuplesContractComposer - } -} -export type TuplesContractComposer = { - /** - * Calls the test_tuple_with_primitive_type()(uint64,bool) ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - testTupleWithPrimitiveType(params?: CallParams): TuplesContractComposer<[...TReturns, TuplesContractReturns['test_tuple_with_primitive_type()(uint64,bool)'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the TuplesContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): TuplesContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): TuplesContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type TuplesContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/VerifierContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/VerifierContract.ts deleted file mode 100644 index 9633b90..0000000 --- a/examples/p-py/projects/p-py-frontend/src/contracts/VerifierContract.ts +++ /dev/null @@ -1,554 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^10 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' -import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' -import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' -import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' -import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' -import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' - -export const APP_SPEC: Arc56Contract = {"name":"VerifierContract","structs":{},"methods":[{"name":"verify","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[56],"errorMessage":"Txn must be pay"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvdmVyaWZpZXIucHk6MTEKICAgIC8vIGNsYXNzIFZlcmlmaWVyQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweDY1YTlhZWNjIC8vIG1ldGhvZCAidmVyaWZ5KCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl92ZXJpZnlfcm91dGVAMwogICAgZXJyCgptYWluX3ZlcmlmeV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC92ZXJpZmllci5weToxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiB2ZXJpZnkKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLmR5bmFtaWNfaXR4bl9ncm91cC52ZXJpZmllci5WZXJpZmllckNvbnRyYWN0LnZlcmlmeVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvdmVyaWZpZXIucHk6MTQKICAgIC8vIGZvciBpIGluIHVyYW5nZShUeG4uZ3JvdXBfaW5kZXgpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIHB1c2hpbnQgMAoKdmVyaWZ5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvdmVyaWZpZXIucHk6MTQKICAgIC8vIGZvciBpIGluIHVyYW5nZShUeG4uZ3JvdXBfaW5kZXgpOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogdmVyaWZ5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL3ZlcmlmaWVyLnB5OjE2CiAgICAvLyBhc3NlcnQgdHhuLnR5cGUgPT0gVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQsICJUeG4gbXVzdCBiZSBwYXkiCiAgICBkdXBuIDIKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIFR4biBtdXN0IGJlIHBheQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC92ZXJpZmllci5weToxNAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKFR4bi5ncm91cF9pbmRleCk6CiAgICBwdXNoaW50IDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB2ZXJpZnlfZm9yX2hlYWRlckAyCgp2ZXJpZnlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL3ZlcmlmaWVyLnB5OjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgARlqa7MNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEMxFoEASUsCDEEAEEcCOBCBARJEgQEIRQFC/+mBAUM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -/** - * The argument types for the VerifierContract contract - */ -export type VerifierContractArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'verify()void': Record - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'verify()void': [] - } -} - -/** - * The return type for each method - */ -export type VerifierContractReturns = { - 'verify()void': void -} - -/** - * Defines the types of available calls and state of the VerifierContract smart contract. - */ -export type VerifierContractTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'verify()void' | 'verify', { - argsObj: VerifierContractArgs['obj']['verify()void'] - argsTuple: VerifierContractArgs['tuple']['verify()void'] - returns: VerifierContractReturns['verify()void'] - }> -} - -/** - * Defines the possible abi call signatures. - */ -export type VerifierContractSignatures = keyof VerifierContractTypes['methods'] -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the VerifierContract smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = VerifierContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the VerifierContract smart contract to the method's return type - */ -export type MethodReturn = VerifierContractTypes['methods'][TSignature]['returns'] - - -/** - * Defines supported create method params for this smart contract - */ -export type VerifierContractCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type VerifierContractDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: VerifierContractCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the VerifierContract smart contract - */ -export abstract class VerifierContractParamsFactory { - /** - * Constructs a no op call for the verify()void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static verify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'verify()void' as const, - args: Array.isArray(params.args) ? params.args : [], - } - } -} - -/** - * A factory to create and deploy one or more instance of the VerifierContract smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class VerifierContractFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `VerifierContractFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new VerifierContractClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new VerifierContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the VerifierContract smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: VerifierContractDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new VerifierContractClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the VerifierContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the VerifierContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the VerifierContract smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new VerifierContractClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the VerifierContract smart contract - */ -export class VerifierContractClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `VerifierContractClient` - * - * @param appClient An `AppClient` instance which has been created with the VerifierContract app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `VerifierContractClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Returns a new `VerifierContractClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new VerifierContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `VerifierContractClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new VerifierContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the VerifierContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the VerifierContract smart contract using the `verify()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - verify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.params.call(VerifierContractParamsFactory.verify(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the VerifierContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the VerifierContract smart contract using the `verify()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - verify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - return this.appClient.createTransaction.call(VerifierContractParamsFactory.verify(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the VerifierContract smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the VerifierContract smart contract using the `verify()void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - verify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { - const result = await this.appClient.send.call(VerifierContractParamsFactory.verify(params)) - return {...result, return: result.return as unknown as (undefined | VerifierContractReturns['verify()void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new VerifierContractClient(this.appClient.clone(params)) - } - - /** - * Methods to access state for the current VerifierContract app - */ - state = { - } - - public newGroup(composerConfig?: TransactionComposerConfig): VerifierContractComposer { - const client = this - const composer = this.algorand.newGroup(composerConfig) - let promiseChain:Promise = Promise.resolve() - return { - /** - * Add a verify()void method call against the VerifierContract contract - */ - verify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verify(params))) - return this - }, - /** - * Add a clear state call to the VerifierContract contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map(val => val.returnValue) - } - } - } as unknown as VerifierContractComposer - } -} -export type VerifierContractComposer = { - /** - * Calls the verify()void ABI method. - * - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - verify(params?: CallParams): VerifierContractComposer<[...TReturns, VerifierContractReturns['verify()void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the VerifierContract smart contract. - * - * @param params Any additional parameters for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): VerifierContractComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): VerifierContractComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type VerifierContractComposerResults = Expand - diff --git a/examples/p-py/projects/p-py-frontend/src/interfaces/network.ts b/examples/p-py/projects/p-py-frontend/src/interfaces/network.ts deleted file mode 100644 index fdb97ae..0000000 --- a/examples/p-py/projects/p-py-frontend/src/interfaces/network.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/network-client' - -export interface AlgoViteClientConfig extends AlgoClientConfig { - /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ - server: string - /** The port to use e.g. 4001, 443, etc. */ - port: string | number - /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string - /** String representing current Algorand Network type (testnet/mainnet and etc) */ - network: string -} - -export interface AlgoViteKMDConfig extends AlgoClientConfig { - /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ - server: string - /** The port to use e.g. 4001, 443, etc. */ - port: string | number - /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string - /** KMD wallet name */ - wallet: string - /** KMD wallet password */ - password: string -} diff --git a/examples/p-py/projects/p-py-frontend/src/main.tsx b/examples/p-py/projects/p-py-frontend/src/main.tsx deleted file mode 100644 index adf72ec..0000000 --- a/examples/p-py/projects/p-py-frontend/src/main.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App' -import './styles/main.css' -import ErrorBoundary from './components/ErrorBoundary' - -ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - - - - - , -) diff --git a/examples/p-py/projects/p-py-frontend/src/styles/main.css b/examples/p-py/projects/p-py-frontend/src/styles/main.css deleted file mode 100644 index b5c61c9..0000000 --- a/examples/p-py/projects/p-py-frontend/src/styles/main.css +++ /dev/null @@ -1,3 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/examples/p-py/projects/p-py-frontend/src/utils/ellipseAddress.spec.tsx b/examples/p-py/projects/p-py-frontend/src/utils/ellipseAddress.spec.tsx deleted file mode 100644 index 2cbff10..0000000 --- a/examples/p-py/projects/p-py-frontend/src/utils/ellipseAddress.spec.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { ellipseAddress } from './ellipseAddress' - -describe('ellipseAddress', () => { - it('should return ellipsed address with specified width', () => { - const address = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' - const result = ellipseAddress(address, 4) - expect(result).toBe('aaaa...aaaa') - }) - - it('should return empty string when address is empty', () => { - const address = '' - const result = ellipseAddress(address) - expect(result).toBe('') - }) -}) diff --git a/examples/p-py/projects/p-py-frontend/src/utils/ellipseAddress.ts b/examples/p-py/projects/p-py-frontend/src/utils/ellipseAddress.ts deleted file mode 100644 index db97e48..0000000 --- a/examples/p-py/projects/p-py-frontend/src/utils/ellipseAddress.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function ellipseAddress(address: string | null, width = 6): string { - return address ? `${address.slice(0, width)}...${address.slice(-width)}` : (address ?? '') -} diff --git a/examples/p-py/projects/p-py-frontend/src/utils/network/getAlgoClientConfigs.ts b/examples/p-py/projects/p-py-frontend/src/utils/network/getAlgoClientConfigs.ts deleted file mode 100644 index b5121f8..0000000 --- a/examples/p-py/projects/p-py-frontend/src/utils/network/getAlgoClientConfigs.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { AlgoViteClientConfig, AlgoViteKMDConfig } from '../../interfaces/network' - -export function getAlgodConfigFromViteEnvironment(): AlgoViteClientConfig { - if (!import.meta.env.VITE_ALGOD_SERVER) { - throw new Error('Attempt to get default algod configuration without specifying VITE_ALGOD_SERVER in the environment variables') - } - - return { - server: import.meta.env.VITE_ALGOD_SERVER, - port: import.meta.env.VITE_ALGOD_PORT, - token: import.meta.env.VITE_ALGOD_TOKEN, - network: import.meta.env.VITE_ALGOD_NETWORK, - } -} - -export function getIndexerConfigFromViteEnvironment(): AlgoViteClientConfig { - if (!import.meta.env.VITE_INDEXER_SERVER) { - throw new Error('Attempt to get default algod configuration without specifying VITE_INDEXER_SERVER in the environment variables') - } - - return { - server: import.meta.env.VITE_INDEXER_SERVER, - port: import.meta.env.VITE_INDEXER_PORT, - token: import.meta.env.VITE_INDEXER_TOKEN, - network: import.meta.env.VITE_ALGOD_NETWORK, - } -} - -export function getKmdConfigFromViteEnvironment(): AlgoViteKMDConfig { - if (!import.meta.env.VITE_KMD_SERVER) { - throw new Error('Attempt to get default kmd configuration without specifying VITE_KMD_SERVER in the environment variables') - } - - return { - server: import.meta.env.VITE_KMD_SERVER, - port: import.meta.env.VITE_KMD_PORT, - token: import.meta.env.VITE_KMD_TOKEN, - wallet: import.meta.env.VITE_KMD_WALLET, - password: import.meta.env.VITE_KMD_PASSWORD, - } -} diff --git a/examples/p-py/projects/p-py-frontend/src/vite-env.d.ts b/examples/p-py/projects/p-py-frontend/src/vite-env.d.ts deleted file mode 100644 index 67c2d30..0000000 --- a/examples/p-py/projects/p-py-frontend/src/vite-env.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -/// - -interface ImportMetaEnv { - readonly VITE_ENVIRONMENT: string - - readonly VITE_ALGOD_TOKEN: string - readonly VITE_ALGOD_SERVER: string - readonly VITE_ALGOD_PORT: string - readonly VITE_ALGOD_NETWORK: string - - readonly VITE_INDEXER_TOKEN: string - readonly VITE_INDEXER_SERVER: string - readonly VITE_INDEXER_PORT: string - - readonly VITE_KMD_TOKEN: string - readonly VITE_KMD_SERVER: string - readonly VITE_KMD_PORT: string - readonly VITE_KMD_PASSWORD: string - readonly VITE_KMD_WALLET: string -} - -interface ImportMeta { - readonly env: ImportMetaEnv -} diff --git a/examples/p-py/projects/p-py-frontend/tailwind.config.cjs b/examples/p-py/projects/p-py-frontend/tailwind.config.cjs deleted file mode 100644 index eaaba6c..0000000 --- a/examples/p-py/projects/p-py-frontend/tailwind.config.cjs +++ /dev/null @@ -1,12 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -module.exports = { - content: ['./src/**/*.{js,ts,jsx,tsx}'], - theme: { - extend: {}, - }, - daisyui: { - themes: ['lofi'], - logs: false, - }, - plugins: [require('daisyui')], -} diff --git a/examples/p-py/projects/p-py-frontend/tests/example.spec.ts b/examples/p-py/projects/p-py-frontend/tests/example.spec.ts deleted file mode 100644 index a62aae4..0000000 --- a/examples/p-py/projects/p-py-frontend/tests/example.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { algorandFixture } from '@algorandfoundation/algokit-utils/testing' -import { expect, test } from '@playwright/test' - -const localnet = algorandFixture() - -test.beforeEach(async ({ page }) => { - await localnet.newScope() - await page.goto('http://localhost:5173/') -}) - -test('has title', async ({ page }) => { - // Expect a title "to contain" a substring. - await expect(page).toHaveTitle('AlgoKit React Template') -}) - -test('get started link', async ({ page }) => { - await expect(page.getByTestId('getting-started')).toHaveText('Getting started') -}) - -test('authentication and dummy payment transaction', async ({ page }) => { - page.on('dialog', async (dialog) => { - dialog.message() === 'KMD password' ? await dialog.accept() : await dialog.dismiss() - }) - - // 1. Must be able to connect to a KMD wallet provider - await page.getByTestId('connect-wallet').click() - await page.getByTestId('kmd-connect').click() - await page.getByTestId('close-wallet-modal').click() - - // 2. Must be able to send a dummy payment transaction - await page.getByTestId('transactions-demo').click() - - await page.getByTestId('receiver-address').fill(localnet.context.testAccount.toString()) - await page.getByTestId('send-algo').click() - - // 3. Must be able to see a notification that the transaction was sent - const notification = await page.getByText('Transaction sent:') - await notification.waitFor() - expect(notification).toBeTruthy() -}) diff --git a/examples/p-py/projects/p-py-frontend/tsconfig.json b/examples/p-py/projects/p-py-frontend/tsconfig.json deleted file mode 100644 index 855bfc3..0000000 --- a/examples/p-py/projects/p-py-frontend/tsconfig.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, - "module": "ESNext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, - "declaration": true /* Generates corresponding '.d.ts' file. */, - "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, - "sourceMap": true /* Generates corresponding '.map' file. */, - "strict": true /* Enable all strict type-checking options. */, - "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, - "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, - "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, - "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, - "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */, - "skipLibCheck": true /* Skip type checking of declaration files. */, - "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, - "allowJs": false, - "allowSyntheticDefaultImports": true, - "moduleResolution": "Bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - "outDir": "./dist/" - }, - "include": [ - "src/**/*.ts", - "src/**/*.tsx", - "vite.config.js", - "src/utils/ellipseAddress.spec.tsx", - "src/utils/ellipseAddress.spec.tsx", - "src/main.tsx", - ], - "references": [ - { - "path": "./tsconfig.node.json" - } - ] -} diff --git a/examples/p-py/projects/p-py-frontend/tsconfig.node.json b/examples/p-py/projects/p-py-frontend/tsconfig.node.json deleted file mode 100644 index e32f207..0000000 --- a/examples/p-py/projects/p-py-frontend/tsconfig.node.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "module": "NodeNext", - "moduleResolution": "NodeNext", - "allowSyntheticDefaultImports": true - }, - "include": ["vite.config.ts"] -} diff --git a/examples/p-py/projects/p-py-frontend/vite.config.ts b/examples/p-py/projects/p-py-frontend/vite.config.ts deleted file mode 100644 index e42dc7c..0000000 --- a/examples/p-py/projects/p-py-frontend/vite.config.ts +++ /dev/null @@ -1,15 +0,0 @@ -import react from '@vitejs/plugin-react' -import { defineConfig } from 'vite' -import { nodePolyfills } from 'vite-plugin-node-polyfills' - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [ - react(), - nodePolyfills({ - globals: { - Buffer: true, - }, - }), - ], -}) diff --git a/examples/p-tls/.algokit/.copier-answers.yml b/examples/p-tls/.algokit/.copier-answers.yml index b563fb3..84d7ec4 100644 --- a/examples/p-tls/.algokit/.copier-answers.yml +++ b/examples/p-tls/.algokit/.copier-answers.yml @@ -1,6 +1,6 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 2.1.8-8-g954a453 -_src_path: .. +_commit: 2.1.8-11-g7668422 +_src_path: /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template author_email: None author_name: None cloud_provider: netlify diff --git a/examples/p-tls/.algokit/generators/create-devcontainer/copier.yaml b/examples/p-tls/.algokit/generators/create-devcontainer/copier.yaml deleted file mode 100644 index e98f334..0000000 --- a/examples/p-tls/.algokit/generators/create-devcontainer/copier.yaml +++ /dev/null @@ -1,4 +0,0 @@ -_tasks: - - "echo '==== Successfully generated new .devcontainer.json file 🚀 ===='" - -_templates_suffix: ".j2" diff --git a/examples/p-tls/.algokit/generators/create-devcontainer/devcontainer.json b/examples/p-tls/.algokit/generators/create-devcontainer/devcontainer.json deleted file mode 100644 index 6452c65..0000000 --- a/examples/p-tls/.algokit/generators/create-devcontainer/devcontainer.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "forwardPorts": [4001, 4002, 8980, 5173], - "portsAttributes": { - "4001": { - "label": "algod" - }, - "4002": { - "label": "kmd" - }, - "8980": { - "label": "indexer" - }, - "5173": { - "label": "vite" - } - }, - "postCreateCommand": "mkdir -p ~/.config/algokit && pipx install algokit && sudo chown -R codespace:codespace ~/.config/algokit", - "postStartCommand": "for i in {1..5}; do algokit localnet status > /dev/null 2>&1 && break || sleep 30; algokit localnet reset; done" -} diff --git a/examples/p-tls/.editorconfig b/examples/p-tls/.editorconfig deleted file mode 100644 index 5e550a1..0000000 --- a/examples/p-tls/.editorconfig +++ /dev/null @@ -1,10 +0,0 @@ -[*] -charset = utf-8 -insert_final_newline = true -end_of_line = lf -indent_style = space -indent_size = 2 -tab_width = 2 -max_line_length = 140 -trim_trailing_whitespace = true -single_quote = true diff --git a/examples/p-tls/.gitattributes b/examples/p-tls/.gitattributes deleted file mode 100644 index 6313b56..0000000 --- a/examples/p-tls/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text=auto eol=lf diff --git a/examples/p-tls/.github/workflows/p-tls-frontend-cd.yaml b/examples/p-tls/.github/workflows/p-tls-frontend-cd.yaml deleted file mode 100644 index e964778..0000000 --- a/examples/p-tls/.github/workflows/p-tls-frontend-cd.yaml +++ /dev/null @@ -1,36 +0,0 @@ -name: Release p-tls-frontend - -on: - workflow_call: -permissions: - contents: read - packages: read - -jobs: - - deploy: - runs-on: ubuntu-latest - name: Deploy to Netlify - environment: frontend-prod - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Setup node - uses: actions/setup-node@v3 - with: - node-version: 18 - - - name: Install algokit - run: pipx install algokit - - - name: Bootstrap dependencies - run: algokit project bootstrap all --project-name 'p-tls-frontend' - - - name: Publish to Netlify - env: - NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} - NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - run: algokit project run ci-deploy-netlify - \ No newline at end of file diff --git a/examples/p-tls/.github/workflows/p-tls-frontend-ci.yaml b/examples/p-tls/.github/workflows/p-tls-frontend-ci.yaml deleted file mode 100644 index 22ded3e..0000000 --- a/examples/p-tls/.github/workflows/p-tls-frontend-ci.yaml +++ /dev/null @@ -1,47 +0,0 @@ -name: Validate p-tls-frontend - -on: - - workflow_call: - - -jobs: - validate: - runs-on: 'ubuntu-latest' - steps: - - name: Check out repository - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup node - uses: actions/setup-node@v3 - with: - node-version: 18 - - - name: Install poetry - run: pipx install poetry - - - name: Set up Python 3.12 - uses: actions/setup-python@v5 - with: - python-version: "3.12" - cache: "poetry" - - - name: Install algokit - run: pipx install algokit - - - name: Install dependencies - run: algokit project bootstrap all --project-name 'p-tls-frontend' - - - - name: Run linters - run: algokit project run lint --project-name 'p-tls-frontend' - - - - name: Run unit tests - run: algokit project run test --project-name 'p-tls-frontend' - - - - name: Build - run: algokit project run build --project-name 'p-tls-frontend' diff --git a/examples/p-tls/.gitignore b/examples/p-tls/.gitignore deleted file mode 100644 index 4105eb2..0000000 --- a/examples/p-tls/.gitignore +++ /dev/null @@ -1,170 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -#pdm.lock -# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it -# in version control. -# https://pdm.fming.dev/#use-with-ide -.pdm.toml - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Ruff (linter) -.ruff_cache/ - -# Cython debug symbols -cython_debug/ - -# PyCharm -.idea/ -!.idea/runConfigurations - -# macOS -.DS_Store - -# Received approval test files -*.received.* - -# NPM -node_modules - diff --git a/examples/p-tls/copy_files.sh b/examples/p-tls/copy_files.sh new file mode 100644 index 0000000..749b01f --- /dev/null +++ b/examples/p-tls/copy_files.sh @@ -0,0 +1,23 @@ + +#!/bin/bash +# Script to copy required files to the frontend project +# Usage: ./copy_files.sh + + +project_name="$1" +frontend_root="./projects/${project_name}-frontend" + +# Ensure directories exist +mkdir -p "${frontend_root}/src/components" + +# Copy files +cp "./inject_content/Home.tsx" "${frontend_root}/src/Home.tsx" +cp "./inject_content/AppCalls.tsx" "${frontend_root}/src/components/AppCalls.tsx" + +echo "Template completed successfully!" +# remove inject_content folder +rm -rf "./inject_content" +# self destruct the file +rm -f "$0" + + diff --git a/examples/p-tls/projects/p-tls-frontend/src/components/AppCalls.tsx b/examples/p-tls/inject_content/AppCalls.tsx similarity index 100% rename from examples/p-tls/projects/p-tls-frontend/src/components/AppCalls.tsx rename to examples/p-tls/inject_content/AppCalls.tsx diff --git a/examples/p-tls/projects/p-tls-frontend/src/Home.tsx b/examples/p-tls/inject_content/Home.tsx similarity index 100% rename from examples/p-tls/projects/p-tls-frontend/src/Home.tsx rename to examples/p-tls/inject_content/Home.tsx diff --git a/examples/p-tls/projects/.gitkeep b/examples/p-tls/projects/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/examples/p-tls/projects/p-tls-contracts/.algokit.toml b/examples/p-tls/projects/p-tls-contracts/.algokit.toml deleted file mode 100644 index 795d662..0000000 --- a/examples/p-tls/projects/p-tls-contracts/.algokit.toml +++ /dev/null @@ -1,15 +0,0 @@ -[algokit] -min_version = "v2.0.0" - -[project] -type = 'contract' -name = 'p-tls-contracts' -artifacts = 'contracts/artifacts' - -[project.run] -build = { commands = [ - 'npm run build', -], description = 'Build all smart contracts in the project' } -test = { commands = [ - 'npm run test', -], description = 'Run smart contract tests' } diff --git a/examples/p-tls/projects/p-tls-contracts/.eslintrc.js b/examples/p-tls/projects/p-tls-contracts/.eslintrc.js deleted file mode 100644 index 0fede66..0000000 --- a/examples/p-tls/projects/p-tls-contracts/.eslintrc.js +++ /dev/null @@ -1,56 +0,0 @@ -module.exports = { - env: { - browser: true, - es2021: true, - }, - extends: [ - 'airbnb-base', - 'plugin:import/errors', - 'plugin:import/warnings', - 'plugin:import/typescript', - 'plugin:prettier/recommended', - ], - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - }, - plugins: ['@typescript-eslint'], - rules: { - '@typescript-eslint/no-explicit-any': 'error', - '@typescript-eslint/ban-ts-comment': 'warn', - 'import/prefer-default-export': 'off', - 'import/extensions': [ - 'error', - 'ignorePackages', - { - js: 'never', - jsx: 'never', - ts: 'never', - tsx: 'never', - }, - ], - 'import/no-extraneous-dependencies': [ - 'error', - { - devDependencies: ['**/*.test.ts'], - }, - ], - }, - overrides: [ - { - files: ['*.algo.ts'], - rules: { - 'import/no-extraneous-dependencies': 'off', - 'object-shorthand': 'off', - 'class-methods-use-this': 'off', - 'no-undef': 'off', - 'max-classes-per-file': 'off', - 'no-bitwise': 'off', - 'operator-assignment': 'off', - 'prefer-template': 'off', - 'prefer-destructuring': 'off', - }, - }, - ], -}; diff --git a/examples/p-tls/projects/p-tls-contracts/.gitignore b/examples/p-tls/projects/p-tls-contracts/.gitignore deleted file mode 100644 index 40b878d..0000000 --- a/examples/p-tls/projects/p-tls-contracts/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/ \ No newline at end of file diff --git a/examples/p-tls/projects/p-tls-contracts/.prettierrc.toml b/examples/p-tls/projects/p-tls-contracts/.prettierrc.toml deleted file mode 100644 index d979519..0000000 --- a/examples/p-tls/projects/p-tls-contracts/.prettierrc.toml +++ /dev/null @@ -1,6 +0,0 @@ -# .prettierrc.toml -trailingComma = "es5" -tabWidth = 2 -semi = true -singleQuote = true -printWidth = 120 \ No newline at end of file diff --git a/examples/p-tls/projects/p-tls-contracts/.vscode/extensions.json b/examples/p-tls/projects/p-tls-contracts/.vscode/extensions.json deleted file mode 100644 index c582379..0000000 --- a/examples/p-tls/projects/p-tls-contracts/.vscode/extensions.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "recommendations": [ - "dbaeumer.vscode-eslint", - ] - } \ No newline at end of file diff --git a/examples/p-tls/projects/p-tls-contracts/.vscode/settings.json b/examples/p-tls/projects/p-tls-contracts/.vscode/settings.json deleted file mode 100644 index 99a5c70..0000000 --- a/examples/p-tls/projects/p-tls-contracts/.vscode/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit" - }, -} \ No newline at end of file diff --git a/examples/p-tls/projects/p-tls-contracts/README.md b/examples/p-tls/projects/p-tls-contracts/README.md deleted file mode 100644 index 6800947..0000000 --- a/examples/p-tls/projects/p-tls-contracts/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# TEALScript Project - -## Documentation - -For TEALScript documentation, go to https://tealscript.algo.xyz - -## Usage - -### Algokit - -This template assumes you have a local network running on your machine. The easiet way to setup a local network is with [algokit](https://github.com/algorandfoundation/algokit-cli). If you don't have Algokit or its dependencies installed locally you can open this repository in a GitHub codespace via https://codespaces.new and choosing this repo. - -### Build Contract - -`npm run build` will compile the contract to TEAL and generate an ABI and appspec JSON in [./contracts/artifacts](./contracts/artifacts/) and a algokit TypeScript client in [./contracts/clients](./contracts/clients/). - -`npm run compile-contract` or `npm run generate-client` can be used to compile the contract or generate the contract seperately. - -### Run Tests - -`npm run test` will execute the tests defined in [./\_\_test\_\_](./__test__) - -### Lint - -`npm run lint` will lint the contracts and tests with ESLint. diff --git a/examples/p-tls/projects/p-tls-contracts/__test__/Calculator.test.ts b/examples/p-tls/projects/p-tls-contracts/__test__/Calculator.test.ts deleted file mode 100644 index 6c94ecc..0000000 --- a/examples/p-tls/projects/p-tls-contracts/__test__/Calculator.test.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { describe, test, expect, beforeAll, beforeEach } from '@jest/globals'; -import { algorandFixture } from '@algorandfoundation/algokit-utils/testing'; -import { Config } from '@algorandfoundation/algokit-utils'; -import { CalculatorClient, CalculatorFactory } from '../contracts/clients/CalculatorClient'; - -const fixture = algorandFixture(); -Config.configure({ populateAppCallResources: true }); - -let appClient: CalculatorClient; - -describe('Calculator', () => { - beforeEach(fixture.beforeEach); - - beforeAll(async () => { - await fixture.beforeEach(); - const { testAccount } = fixture.context; - const { algorand } = fixture; - - const factory = new CalculatorFactory({ - algorand, - defaultSender: testAccount.addr, - }); - - const createResult = await factory.send.create.createApplication(); - appClient = createResult.appClient; - }); - - test('sum', async () => { - const a = 13; - const b = 37; - const sum = await appClient.send.doMath({ args: { a, b, operation: 'sum' } }); - expect(sum.return).toBe(BigInt(a + b)); - }); - - test('difference', async () => { - const a = 13; - const b = 37; - const diff = await appClient.send.doMath({ args: { a, b, operation: 'difference' } }); - expect(diff.return).toBe(BigInt(a >= b ? a - b : b - a)); - }); - - test('hello', async () => { - const hello = await appClient.send.hello({ args: { name: 'world!' } }); - expect(hello.return).toBe('Hello, world!'); - }); -}); diff --git a/examples/p-tls/projects/p-tls-contracts/contracts/Calculator.algo.ts b/examples/p-tls/projects/p-tls-contracts/contracts/Calculator.algo.ts deleted file mode 100644 index 9b36280..0000000 --- a/examples/p-tls/projects/p-tls-contracts/contracts/Calculator.algo.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Contract } from '@algorandfoundation/tealscript'; - -export class Calculator extends Contract { - /** - * Calculates the sum of two numbers - * - * @param a - * @param b - * @returns The sum of a and b - */ - private getSum(a: uint64, b: uint64): uint64 { - return a + b; - } - - /** - * Calculates the difference between two numbers - * - * @param a - * @param b - * @returns The difference between a and b. - */ - private getDifference(a: uint64, b: uint64): uint64 { - return a >= b ? a - b : b - a; - } - - /** - * A method that takes two numbers and does either addition or subtraction - * - * @param a The first uint64 - * @param b The second uint64 - * @param operation The operation to perform. Can be either 'sum' or 'difference' - * - * @returns The result of the operation - */ - doMath(a: uint64, b: uint64, operation: string): uint64 { - let result: uint64; - - if (operation === 'sum') { - result = this.getSum(a, b); - } else if (operation === 'difference') { - result = this.getDifference(a, b); - } else throw Error('Invalid operation'); - - return result; - } - - /** - * A demonstration method used in the AlgoKit fullstack template. - * Greets the user by name. - * - * @param name The name of the user to greet. - * @returns A greeting message to the user. - */ - hello(name: string): string { - return 'Hello, ' + name; - } -} diff --git a/examples/p-tls/projects/p-tls-contracts/contracts/clients/.gitkeep b/examples/p-tls/projects/p-tls-contracts/contracts/clients/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/examples/p-tls/projects/p-tls-contracts/jest.config.js b/examples/p-tls/projects/p-tls-contracts/jest.config.js deleted file mode 100644 index 6f5ef4e..0000000 --- a/examples/p-tls/projects/p-tls-contracts/jest.config.js +++ /dev/null @@ -1,6 +0,0 @@ -/** @type {import('ts-jest').JestConfigWithTsJest} */ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - testTimeout: 60000 -}; diff --git a/examples/p-tls/projects/p-tls-contracts/package.json b/examples/p-tls/projects/p-tls-contracts/package.json deleted file mode 100644 index 5bffbdd..0000000 --- a/examples/p-tls/projects/p-tls-contracts/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "p-tls-contracts", - "version": "0.0.0", - "license": "MIT", - "scripts": { - "generate-client": "algokit generate client contracts/artifacts/ --language typescript --output contracts/clients/{contract_name}Client.ts", - "compile-contract": "tealscript contracts/*.algo.ts contracts/artifacts", - "generate-components": "algokit-generate-component contracts/artifacts/Calculator.arc32.json contracts/artifacts/components", - "build": "npm run compile-contract && npm run generate-client", - "test": "npm run build && jest", - "lint": "eslint . --ext .ts", - "fix": "eslint . --ext .ts --fix" - }, - "dependencies": { - "@algorandfoundation/algokit-utils": "^7.0.0", - "algosdk": ">=2.9.0 <3.0" - }, - "devDependencies": { - "@algorandfoundation/algokit-client-generator": "^4.0.0", - "@algorandfoundation/tealscript": "latest", - "@jest/globals": "^29.5.0", - "@joe-p/algokit-generate-component": "^0.2.0", - "@typescript-eslint/eslint-plugin": "^5.13.0", - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^7.32.0 || ^8.2.0", - "eslint-config-airbnb-base": "^15.0.0", - "eslint-config-airbnb-typescript": "^17.0.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-prettier": "^5.0.1", - "jest": "^29.5.0", - "prettier": "^3.0.3", - "ts-jest": "^29.1.0", - "typescript": "5.0.2" - } -} diff --git a/examples/p-tls/projects/p-tls-contracts/tsconfig.json b/examples/p-tls/projects/p-tls-contracts/tsconfig.json deleted file mode 100644 index 5e3106d..0000000 --- a/examples/p-tls/projects/p-tls-contracts/tsconfig.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "compilerOptions": { - /* Visit https://aka.ms/tsconfig to read more about this file */ - - /* Projects */ - // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ - // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ - // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ - // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ - // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ - // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ - - /* Language and Environment */ - "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ - // "jsx": "preserve", /* Specify what JSX code is generated. */ - "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ - // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ - // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ - // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ - // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ - // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ - // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ - // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ - // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ - - /* Modules */ - "module": "commonjs", /* Specify what module code is generated. */ - // "rootDir": "./", /* Specify the root folder within your source files. */ - // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ - // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ - // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ - // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ - // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ - // "types": [], /* Specify type package names to be included without being referenced in a source file. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ - // "resolveJsonModule": true, /* Enable importing .json files. */ - // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ - - /* JavaScript Support */ - // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ - // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ - // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ - - /* Emit */ - // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ - // "declarationMap": true, /* Create sourcemaps for d.ts files. */ - // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ - // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ - // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ - // "outDir": "./", /* Specify an output folder for all emitted files. */ - // "removeComments": true, /* Disable emitting comments. */ - // "noEmit": true, /* Disable emitting files from a compilation. */ - // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ - // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ - // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ - // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ - // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ - // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ - // "newLine": "crlf", /* Set the newline character for emitting files. */ - // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ - // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ - // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ - // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ - // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ - // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ - - /* Interop Constraints */ - // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ - // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ - "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ - // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ - "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ - - /* Type Checking */ - "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ - // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ - // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ - // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ - // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ - // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ - // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ - // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ - // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ - // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ - // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ - // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ - // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ - // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ - // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ - // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ - // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ - - /* Completeness */ - // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ - "skipLibCheck": true /* Skip type checking all .d.ts files. */ - } -} diff --git a/examples/p-tls/projects/p-tls-frontend/.algokit.toml b/examples/p-tls/projects/p-tls-frontend/.algokit.toml deleted file mode 100644 index 2d172f8..0000000 --- a/examples/p-tls/projects/p-tls-frontend/.algokit.toml +++ /dev/null @@ -1,17 +0,0 @@ -[algokit] -min_version = "v2.0.0" - -[project] -type = "frontend" -name = 'p-tls-frontend' -artifacts = "src/contracts" - -[project.run] -build = { commands = ['npm run build'], description = 'Build frontend' } -test = { commands = ['npm run test'], description = 'Run frontend tests' } -lint = { commands = ['npm run lint'], description = 'Lint frontend code' } -ci-deploy-netlify = { commands = [ - 'npm install --global netlify-cli@latest', - 'netlify login', - 'netlify deploy --build --prod' - ], description = 'Deploy to Netlify' } diff --git a/examples/p-tls/projects/p-tls-frontend/.algokit/.copier-answers.yml b/examples/p-tls/projects/p-tls-frontend/.algokit/.copier-answers.yml deleted file mode 100644 index 63e63d9..0000000 --- a/examples/p-tls/projects/p-tls-frontend/.algokit/.copier-answers.yml +++ /dev/null @@ -1,9 +0,0 @@ -# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 1.1.1-13-gc5abe59 -_src_path: gh:algorandfoundation/algokit-react-frontend-template -author_email: None -author_name: None -cloud_provider: netlify -preset_name: production -project_name: p-tls-frontend - diff --git a/examples/p-tls/projects/p-tls-frontend/.editorconfig b/examples/p-tls/projects/p-tls-frontend/.editorconfig deleted file mode 100644 index a83b72c..0000000 --- a/examples/p-tls/projects/p-tls-frontend/.editorconfig +++ /dev/null @@ -1,9 +0,0 @@ -[*] -charset = utf-8 -insert_final_newline = true -end_of_line = lf -indent_style = space -indent_size = 2 -tab_width = 2 -max_line_length = 140 -trim_trailing_whitespace = true diff --git a/examples/p-tls/projects/p-tls-frontend/.env.template b/examples/p-tls/projects/p-tls-frontend/.env.template deleted file mode 100644 index 5dfbb2d..0000000 --- a/examples/p-tls/projects/p-tls-frontend/.env.template +++ /dev/null @@ -1,70 +0,0 @@ -# ====================== -# LocalNet configuration -# uncomment below to use -# ====================== - -VITE_ENVIRONMENT=local - -# Algod -VITE_ALGOD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -VITE_ALGOD_SERVER=http://localhost -VITE_ALGOD_PORT=4001 -VITE_ALGOD_NETWORK=localnet - -# Indexer -VITE_INDEXER_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -VITE_INDEXER_SERVER=http://localhost -VITE_INDEXER_PORT=8980 - -# KMD -# Please note: -# 1. This is only needed for LocalNet since -# by default KMD provider is ignored on other networks. -# 2. AlgoKit LocalNet starts with a single wallet called 'unencrypted-default-wallet', -# with heaps of tokens available for testing. -VITE_KMD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -VITE_KMD_SERVER=http://localhost -VITE_KMD_PORT=4002 -VITE_KMD_WALLET="unencrypted-default-wallet" -VITE_KMD_PASSWORD="" - -# # ====================== -# # TestNet configuration: -# # uncomment below to use -# # ====================== - -# VITE_ENVIRONMENT=local - -# # Algod -# VITE_ALGOD_TOKEN="" -# VITE_ALGOD_SERVER="https://testnet-api.algonode.cloud" -# VITE_ALGOD_PORT="" -# VITE_ALGOD_NETWORK="testnet" - -# # Indexer -# VITE_INDEXER_TOKEN="" -# VITE_INDEXER_SERVER="https://testnet-idx.algonode.cloud" -# VITE_INDEXER_PORT="" - - -# # ====================== -# # MainNet configuration: -# # uncomment below to use -# # ====================== - -# VITE_ENVIRONMENT=production - -# # Algod -# VITE_ALGOD_TOKEN="" -# VITE_ALGOD_SERVER="https://mainnet-api.algonode.cloud" -# VITE_ALGOD_PORT="" -# VITE_ALGOD_NETWORK="mainnet" - -# # Indexer -# VITE_INDEXER_TOKEN="" -# VITE_INDEXER_SERVER="https://mainnet-idx.algonode.cloud" -# VITE_INDEXER_PORT="" - - -# Add your Web3Auth Client ID here if you want to test Web3Auth integration on TestNet or Mainnet -# VITE_WEB3_AUTH_CLIENT_ID="" \ No newline at end of file diff --git a/examples/p-tls/projects/p-tls-frontend/.eslintrc b/examples/p-tls/projects/p-tls-frontend/.eslintrc deleted file mode 100644 index 868fe37..0000000 --- a/examples/p-tls/projects/p-tls-frontend/.eslintrc +++ /dev/null @@ -1,27 +0,0 @@ -{ - "root": true, - "env": { - "node": true - }, - "parser": "@typescript-eslint/parser", - "plugins": ["@typescript-eslint", "prettier"], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "plugin:prettier/recommended" - ], - "rules": { - "prettier/prettier": "warn", - "no-console": "warn", - "@typescript-eslint/no-unused-vars": [ - "warn", - { - "ignoreRestSiblings": true, - "argsIgnorePattern": "^_", - "destructuredArrayIgnorePattern": "^_" - } - ], - "prefer-template": "error" - } -} diff --git a/examples/p-tls/projects/p-tls-frontend/.gitignore b/examples/p-tls/projects/p-tls-frontend/.gitignore deleted file mode 100644 index b1ce837..0000000 --- a/examples/p-tls/projects/p-tls-frontend/.gitignore +++ /dev/null @@ -1,38 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/build - - -# dotenv environment variable files -.env -env/ - -# misc -/dist -.DS_Store - - -npm-debug.log* -yarn-debug.log* -yarn-error.log* -/test-results/ -/playwright-report/ -/playwright/.cache/ - -# PyCharm -.idea -!.idea/ -.idea/* -!.idea/runConfigurations/ - -.vercel -.netlify diff --git a/examples/p-tls/projects/p-tls-frontend/.npmrc b/examples/p-tls/projects/p-tls-frontend/.npmrc deleted file mode 100644 index c42da84..0000000 --- a/examples/p-tls/projects/p-tls-frontend/.npmrc +++ /dev/null @@ -1 +0,0 @@ -engine-strict = true diff --git a/examples/p-tls/projects/p-tls-frontend/.prettierignore b/examples/p-tls/projects/p-tls-frontend/.prettierignore deleted file mode 100644 index dbda6ae..0000000 --- a/examples/p-tls/projects/p-tls-frontend/.prettierignore +++ /dev/null @@ -1,12 +0,0 @@ -# don't ever format node_modules -node_modules -# don't lint format output (make sure it's set to your correct build folder name) -dist -build -# don't format nyc coverage output -coverage -# don't format generated types -**/generated/types.d.ts -**/generated/types.ts -# don't format ide files -.idea diff --git a/examples/p-tls/projects/p-tls-frontend/.prettierrc.cjs b/examples/p-tls/projects/p-tls-frontend/.prettierrc.cjs deleted file mode 100644 index 066b8e5..0000000 --- a/examples/p-tls/projects/p-tls-frontend/.prettierrc.cjs +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - singleQuote: true, - jsxSingleQuote: false, - semi: false, - tabWidth: 2, - trailingComma: 'all', - printWidth: 140, - endOfLine: 'lf', - arrowParens: 'always', -} diff --git a/examples/p-tls/projects/p-tls-frontend/.vscode/extensions.json b/examples/p-tls/projects/p-tls-frontend/.vscode/extensions.json deleted file mode 100644 index 5c94122..0000000 --- a/examples/p-tls/projects/p-tls-frontend/.vscode/extensions.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "recommendations": [ - "EditorConfig.EditorConfig", - "dotenv.dotenv-vscode", - "esbenp.prettier-vscode", - "dbaeumer.vscode-eslint", - "krysenlo.vite-plugin-eslint-problemmatcher", - "ms-playwright.playwright", - "Orta.vscode-jest", - "bradlc.vscode-tailwindcss", - "csstools.postcss", - ] -} - diff --git a/examples/p-tls/projects/p-tls-frontend/.vscode/launch.json b/examples/p-tls/projects/p-tls-frontend/.vscode/launch.json deleted file mode 100644 index 7edaf04..0000000 --- a/examples/p-tls/projects/p-tls-frontend/.vscode/launch.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "configurations": [ - { - "type": "msedge", - "request": "launch", - "name": "Run (Edge)", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - "presentation": { - "hidden": false, - "group": "2. Web" - } - }, - { - "type": "chrome", - "request": "launch", - "name": "Run (Chrome)", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - "presentation": { - "hidden": false, - "group": "2. Web" - } - }, - { - "type": "firefox", - "request": "launch", - "name": "Run (Firefox)", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - "presentation": { - "hidden": false, - "group": "2. Web" - } - }, - { - "name": "Run dApp", - "type": "node", - "request": "launch", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "dev"], - "cwd": "${workspaceRoot}", - "console": "integratedTerminal", - "skipFiles": ["/**", "node_modules/**"], - "presentation": { - "hidden": false, - "group": "1. Run Project", - "order": 1 - } - }, - { - "name": "Run dApp (+ LocalNet)", - "type": "node", - "request": "launch", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "dev"], - "cwd": "${workspaceRoot}", - "console": "integratedTerminal", - "skipFiles": ["/**", "node_modules/**"], - "preLaunchTask": "Start AlgoKit LocalNet", - "presentation": { - "hidden": false, - "group": "1. Run Project", - "order": 1 - } - } - ] -} diff --git a/examples/p-tls/projects/p-tls-frontend/.vscode/settings.json b/examples/p-tls/projects/p-tls-frontend/.vscode/settings.json deleted file mode 100644 index f1d7017..0000000 --- a/examples/p-tls/projects/p-tls-frontend/.vscode/settings.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "editor.formatOnSave": true, - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit", - "source.organizeImports": "explicit" - }, - "dotenv.enableAutocloaking": false, - "jest.autoRun": { - "watch": false, - "onSave": "test-file" - } -} diff --git a/examples/p-tls/projects/p-tls-frontend/.vscode/tasks.json b/examples/p-tls/projects/p-tls-frontend/.vscode/tasks.json deleted file mode 100644 index d611c4f..0000000 --- a/examples/p-tls/projects/p-tls-frontend/.vscode/tasks.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "Start AlgoKit LocalNet", - "command": "algokit", - "args": ["localnet", "start"], - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "problemMatcher": [] - } - ] -} diff --git a/examples/p-tls/projects/p-tls-frontend/README.md b/examples/p-tls/projects/p-tls-frontend/README.md deleted file mode 100644 index 298fd93..0000000 --- a/examples/p-tls/projects/p-tls-frontend/README.md +++ /dev/null @@ -1,124 +0,0 @@ -# p-tls-frontend - -This starter React project has been generated using AlgoKit. See below for default getting started instructions. - -# Setup - -### Initial Setup - -#### 1. Clone the Repository -Start by cloning this repository to your local machine. - -#### 2. Install Pre-requisites -Ensure the following pre-requisites are installed and properly configured: - -- **npm**: Node package manager. Install from [Node.js Installation Guide](https://nodejs.org/en/download/). Verify with `npm -v` to see version `18.12`+. -- **AlgoKit CLI**: Essential for project setup and operations. Install the latest version from [AlgoKit CLI Installation Guide](https://github.com/algorandfoundation/algokit-cli#install). Verify installation with `algokit --version`, expecting `2.0.0` or later. - -#### 3. Bootstrap Your Local Environment -Run the following commands within the project folder: - -- **Install Project Dependencies**: With `algokit project bootstrap all`, ensure all dependencies are ready. - -### Development Workflow - -#### Terminal -Directly manage and interact with your project using AlgoKit commands: - -1. **Build Contracts**: `algokit project run build` builds react web app and links with smart contracts in workspace, if any. -2. Remaining set of command for linting, testing and deployment can be found in respective [package.json](./package.json) file and [.algokit.toml](./.algokit.toml) files. - -#### VS Code -For a seamless experience with breakpoint debugging and other features: - -1. **Open Project**: In VS Code, open the repository root. -2. **Install Extensions**: Follow prompts to install recommended extensions. -3. **Debugging**: - - Use `F5` to start debugging. - - **Windows Users**: Select the Python interpreter at `./.venv/Scripts/python.exe` via `Ctrl/Cmd + Shift + P` > `Python: Select Interpreter` before the first run. - -#### Other IDEs -While primarily optimized for VS Code, Jetbrains WebStorm has base support for this project: - -1. **Open Project**: In your JetBrains IDE, open the repository root. -2. **Automatic Setup**: The IDE should configure the Python interpreter and virtual environment. -3. **Debugging**: Use `Shift+F10` or `Ctrl+R` to start debugging. Note: Windows users may encounter issues with pre-launch tasks due to a known bug. See [JetBrains forums](https://youtrack.jetbrains.com/issue/IDEA-277486/Shell-script-configuration-cannot-run-as-before-launch-task) for workarounds. - -## AlgoKit Workspaces and Project Management -This project supports both standalone and monorepo setups through AlgoKit workspaces. Leverage [`algokit project run`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md) commands for efficient monorepo project orchestration and management across multiple projects within a workspace. - -> Please note, by default frontend is pre configured to run against Algorand LocalNet. If you want to run against TestNet or MainNet, comment out the current environment variable and uncomment the relevant one in [`.env`](.env) file that is created after running bootstrap command and based on [`.env.template`](.env.template). - -### Continuous Integration - -This project uses [GitHub Actions](https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions) to define CI workflows, which are located in the [.github/workflows](`../../.github/workflows`) folder. - -For pull requests and pushes to `main` branch against this repository the following checks are automatically performed by GitHub Actions: - -- `install`: Installs dependencies using `npm` -- `lint`: Lints the codebase using `ESLint` -- `build`: Builds the codebase using `vite` - -> Please note, if you instantiated the project via `algokit init` without explicitly specifying the `--no-workspace` flag, we will automatically attempt to move the contents of the `.github` folder to the root of the workspace. - -### Continuous Deployment - -The project template provides base Github Actions workflows for continuous deployment to [Netlify](https://www.netlify.com/) or [Vercel](https://vercel.com/). These workflows are located in the [`.github/workflows`](./.github/workflows) folder. - -**Please note**: when configuring the github repository for the first time. Depending on selected provider you will need to set the provider secrets in the repository settings. Default setup provided by the template allows you to manage the secrets via environment variables and secrets on your github repository. - - -#### Setting up environment variables and secrets for webapp deployment - -For Vercel: -1. Retrieve your [Vercel Access Token](https://vercel.com/support/articles/how-do-i-use-a-vercel-api-access-token) -2. Install the [Vercel CLI](https://vercel.com/cli) and run `vercel login` -3. Inside your folder, run `vercel link` to create a new Vercel project -4. Inside the generated `.vercel` folder, save the `projectId` and `orgId` from the `project.json` -5. Inside GitHub, add `VERCEL_TOKEN`, `VERCEL_ORG_ID`, and `VERCEL_PROJECT_ID` as [secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets). -6. Create an .env file containing ENV vars for the project (pointing to testnet or mainnet), drag and drop the .env file to upload initial batch of default environment variables to your vercel project. -7. Upon invocation, CD pipeline will pull the VITE_ prefixed environment variables, build the project and deploy to the specified environment. - -For Netlify: -1. Retrieve your [Netlify Access Token](https://docs.netlify.com/cli/get-started/#obtain-a-token-in-the-netlify-ui) -2. Inside your folder run `netlify login` -3. Inside your folder run `netlify sites:create` to create a new site, obtain NETLIFY_SITE_ID from the output -4. Inside GitHub, add `NETLIFY_AUTH_TOKEN` and `NETLIFY_SITE_ID` as [secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets). -5. Define the VITE_ prefixed environment variables in netlify environment variables under site settings. -6. Upon invocation, CD pipeline will build the project and deploy to the specified environment. - -> If you prefer alternative deployment methods, you can modify the relevant workflow files from the [`.github/workflows`](./.github/workflows) folder or modify deploy scripts in `.algokit.toml`. - - -# Algorand Wallet integrations - -The template comes with [`use-wallet`](https://github.com/txnlab/use-wallet) integration, which provides a React hook for connecting to an Algorand wallet providers. The following wallet providers are included by default: -- LocalNet: -- - [KMD/Local Wallet](https://github.com/TxnLab/use-wallet#kmd-algorand-key-management-daemon) - Algorand's Key Management Daemon (KMD) is a service that manages Algorand private keys and signs transactions. Works best with AlgoKit LocalNet and allows you to easily test and interact with your dApps locally. -- TestNet and others: -- - [Pera Wallet](https://perawallet.app). -- - [Defly Wallet](https://defly.app). -- - [Exodus Wallet](https://www.exodus.com). -- - [Daffi Wallet](https://www.daffi.me). - -Refer to official [`use-wallet`](https://github.com/txnlab/use-wallet) documentation for detailed guidelines on how to integrate with other wallet providers (such as WalletConnect v2). Too see implementation details on the use wallet hook and initialization of extra wallet providers refer to [`App.tsx`](./src/App.tsx). - -# Tools - -This project makes use of React and Tailwind to provider a base project configuration to develop frontends for your Algorand dApps and interactions with smart contracts. The following tools are in use: - -- [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-ts) - Various TypeScript utilities to simplify interactions with Algorand and AlgoKit. -- [React](https://reactjs.org/) - A JavaScript library for building user interfaces. -- [Tailwind CSS](https://tailwindcss.com/) - A utility-first CSS framework for rapidly building custom designs. -- [daisyUI](https://daisyui.com/) - A component library for Tailwind CSS. -- [use-wallet](https://github.com/txnlab/use-wallet) - A React hook for connecting to an Algorand wallet providers. -- [npm](https://www.npmjs.com/): Node.js package manager -- [jest](https://jestjs.io/): JavaScript testing framework -- [playwright](https://playwright.dev/): Browser automation library -- [Prettier](https://prettier.io/): Opinionated code formatter -- [ESLint](https://eslint.org/): Tool for identifying and reporting on patterns in JavaScript -- Github Actions workflows for build validation -It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. -# Integrating with smart contracts and application clients - -Refer to the detailed guidance on [integrating with smart contracts and application clients](./src/contracts/README.md). In essence, for any smart contract codebase generated with AlgoKit or other tools that produce compile contracts into ARC34 compliant app specifications, you can use the `algokit generate` command to generate TypeScript or Python typed client. Once generated simply drag and drop the generated client into `./src/contracts` and import it into your React components as you see fit. diff --git a/examples/p-tls/projects/p-tls-frontend/index.html b/examples/p-tls/projects/p-tls-frontend/index.html deleted file mode 100644 index 5a2ef4f..0000000 --- a/examples/p-tls/projects/p-tls-frontend/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - AlgoKit React Template - - -
- - - diff --git a/examples/p-tls/projects/p-tls-frontend/jest.config.ts b/examples/p-tls/projects/p-tls-frontend/jest.config.ts deleted file mode 100644 index 28a8c3d..0000000 --- a/examples/p-tls/projects/p-tls-frontend/jest.config.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { Config } from '@jest/types' - -const config: Config.InitialOptions = { - preset: 'ts-jest', - testEnvironment: 'node', - testMatch: ['**/*.spec.ts', '**/*.spec.tsx'], - moduleDirectories: ['node_modules', 'src'], - transform: { - '': [ - 'ts-jest', - { - tsconfig: 'tsconfig.test.json', - }, - ], - }, - coveragePathIgnorePatterns: ['tests'], - testPathIgnorePatterns: ['/tests/'], - } - -export default config diff --git a/examples/p-tls/projects/p-tls-frontend/package.json b/examples/p-tls/projects/p-tls-frontend/package.json deleted file mode 100644 index 82161d0..0000000 --- a/examples/p-tls/projects/p-tls-frontend/package.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "name": "p-tls-frontend", - "version": "0.1.0", - "author": { - "name": "None", - "email": "None" - }, - "private": true, - "type": "module", - "engines": { - "node": ">=20.0", - "npm": ">=9.0" - }, - "devDependencies": { - "@algorandfoundation/algokit-client-generator": "^7.0.0-alpha.5", - "@types/node": "^18.17.14", - "@types/react": "^18.2.11", - "@types/react-dom": "^18.2.4", - "@vitejs/plugin-react": "^4.2.1", - "autoprefixer": "^10.4.14", - "eslint": "^8.56.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.1.3", - "@typescript-eslint/eslint-plugin": "^7.0.2", - "@typescript-eslint/parser": "^7.0.2", - "postcss": "^8.4.24", - "tailwindcss": "3.3.2", - "ts-jest": "^29.1.1", - "@types/jest": "29.5.2", - "ts-node": "^10.9.1", - "typescript": "^5.1.6", - "@playwright/test": "^1.35.0", - "playwright": "^1.35.0", - "vite": "^5.0.0", - "vite-plugin-node-polyfills": "^0.22.0" - }, - "dependencies": { - "@algorandfoundation/algokit-utils": "^10.0.0-alpha.40", - "@blockshake/defly-connect": "^1.2.1", - "@perawallet/connect": "^1.4.1", - "@txnlab/use-wallet": "^4.6.0", - "@txnlab/use-wallet-react": "^4.6.0", - "@web3auth/modal": "^9.7.0", - "daisyui": "^4.0.0", - "notistack": "^3.0.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "tslib": "^2.6.2" - }, - "scripts": { - "generate:app-clients": "algokit project link --all", - "dev": "npm run generate:app-clients && vite", - "build": "npm run generate:app-clients && tsc && vite build", - "test": "jest --coverage --passWithNoTests", - "playwright:test": "playwright test", - "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "lint:fix": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0 --fix", - "preview": "vite preview" - }, - "eslintConfig": { - "extends": [ - "react-app/jest", - "react-app" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "overrides": { - "ws@>7.0.0 <7.5.9": "7.5.10" - } -} diff --git a/examples/p-tls/projects/p-tls-frontend/playwright.config.ts b/examples/p-tls/projects/p-tls-frontend/playwright.config.ts deleted file mode 100644 index d7cbca6..0000000 --- a/examples/p-tls/projects/p-tls-frontend/playwright.config.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { defineConfig, devices } from '@playwright/test' - -/** - * Read environment variables from file. - * https://github.com/motdotla/dotenv - */ -// require('dotenv').config(); - -/** - * See https://playwright.dev/docs/test-configuration. - */ -export default defineConfig({ - testDir: './tests', - /* Run tests in files in parallel */ - fullyParallel: true, - /* Fail the build on CI if you accidentally left test.only in the source code. */ - forbidOnly: !!process.env.CI, - /* Retry on CI only */ - retries: process.env.CI ? 2 : 0, - /* Opt out of parallel tests on CI. */ - workers: process.env.CI ? 1 : undefined, - /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: 'html', - /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ - use: { - /* Base URL to use in actions like `await page.goto('/')`. */ - // baseURL: 'http://127.0.0.1:3000', - - /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ - trace: 'on-first-retry', - testIdAttribute: 'data-test-id', - }, - - /* Configure projects for major browsers */ - projects: [ - { - name: 'chromium', - use: { ...devices['Desktop Chrome'] }, - }, - - { - name: 'firefox', - use: { ...devices['Desktop Firefox'] }, - }, - - /* Test against mobile viewports. */ - // { - // name: 'Mobile Chrome', - // use: { ...devices['Pixel 5'] }, - // }, - // { - // name: 'Mobile Safari', - // use: { ...devices['iPhone 12'] }, - // }, - - /* Test against branded browsers. */ - // { - // name: 'Microsoft Edge', - // use: { ...devices['Desktop Edge'], channel: 'msedge' }, - // }, - // { - // name: 'Google Chrome', - // use: { ..devices['Desktop Chrome'], channel: 'chrome' }, - // }, - ], - - /* Run your local dev server before starting the tests */ - webServer: { - command: 'npm run dev', - url: 'http://localhost:5173', - reuseExistingServer: !process.env.CI, - }, -}) diff --git a/examples/p-tls/projects/p-tls-frontend/postcss.config.cjs b/examples/p-tls/projects/p-tls-frontend/postcss.config.cjs deleted file mode 100644 index 33ad091..0000000 --- a/examples/p-tls/projects/p-tls-frontend/postcss.config.cjs +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -} diff --git a/examples/p-tls/projects/p-tls-frontend/public/index.html b/examples/p-tls/projects/p-tls-frontend/public/index.html deleted file mode 100644 index 0d3a3a5..0000000 --- a/examples/p-tls/projects/p-tls-frontend/public/index.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - React App - - - -
- - - diff --git a/examples/p-tls/projects/p-tls-frontend/public/robots.txt b/examples/p-tls/projects/p-tls-frontend/public/robots.txt deleted file mode 100644 index e9e57dc..0000000 --- a/examples/p-tls/projects/p-tls-frontend/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * -Disallow: diff --git a/examples/p-tls/projects/p-tls-frontend/src/App.tsx b/examples/p-tls/projects/p-tls-frontend/src/App.tsx deleted file mode 100644 index f346006..0000000 --- a/examples/p-tls/projects/p-tls-frontend/src/App.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { SupportedWallet, WalletId, WalletManager, WalletProvider } from '@txnlab/use-wallet-react' -import { SnackbarProvider } from 'notistack' -import Home from './Home' -import { getAlgodConfigFromViteEnvironment, getKmdConfigFromViteEnvironment } from './utils/network/getAlgoClientConfigs' - -let supportedWallets: SupportedWallet[] -if (import.meta.env.VITE_ALGOD_NETWORK === 'localnet') { - const kmdConfig = getKmdConfigFromViteEnvironment() - supportedWallets = [ - { - id: WalletId.KMD, - options: { - baseServer: kmdConfig.server, - token: String(kmdConfig.token), - port: String(kmdConfig.port), - }, - }, - ] -} else { - supportedWallets = [ - { id: WalletId.DEFLY }, - { id: WalletId.PERA }, - { id: WalletId.EXODUS }, - // If you are interested in WalletConnect v2 provider - // refer to https://github.com/TxnLab/use-wallet for detailed integration instructions - ] -} - -export default function App() { - const algodConfig = getAlgodConfigFromViteEnvironment() - - const walletManager = new WalletManager({ - wallets: supportedWallets, - defaultNetwork: algodConfig.network, - networks: { - [algodConfig.network]: { - algod: { - baseServer: algodConfig.server, - port: algodConfig.port, - token: String(algodConfig.token), - }, - }, - }, - options: { - resetNetwork: true, - }, - }) - - return ( - - - - - - ) -} diff --git a/examples/p-tls/projects/p-tls-frontend/src/assets/logo.svg b/examples/p-tls/projects/p-tls-frontend/src/assets/logo.svg deleted file mode 100644 index 7169476..0000000 --- a/examples/p-tls/projects/p-tls-frontend/src/assets/logo.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/examples/p-tls/projects/p-tls-frontend/src/components/Account.tsx b/examples/p-tls/projects/p-tls-frontend/src/components/Account.tsx deleted file mode 100644 index 081ce47..0000000 --- a/examples/p-tls/projects/p-tls-frontend/src/components/Account.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { useWallet } from '@txnlab/use-wallet-react' -import { useMemo } from 'react' -import { ellipseAddress } from '../utils/ellipseAddress' -import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' - -const Account = () => { - const { activeAddress } = useWallet() - const algoConfig = getAlgodConfigFromViteEnvironment() - - const networkName = useMemo(() => { - return algoConfig.network === '' ? 'localnet' : algoConfig.network.toLocaleLowerCase() - }, [algoConfig.network]) - - return ( -
- ) -} - -export default Account diff --git a/examples/p-tls/projects/p-tls-frontend/src/components/ConnectWallet.tsx b/examples/p-tls/projects/p-tls-frontend/src/components/ConnectWallet.tsx deleted file mode 100644 index 8ff01dc..0000000 --- a/examples/p-tls/projects/p-tls-frontend/src/components/ConnectWallet.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import { useWallet, Wallet, WalletId } from '@txnlab/use-wallet-react' -import Account from './Account' - -interface ConnectWalletInterface { - openModal: boolean - closeModal: () => void -} - -const ConnectWallet = ({ openModal, closeModal }: ConnectWalletInterface) => { - const { wallets, activeAddress } = useWallet() - - const isKmd = (wallet: Wallet) => wallet.id === WalletId.KMD - - return ( - -
-

Select wallet provider

- -
- {activeAddress && ( - <> - -
- - )} - - {!activeAddress && - wallets?.map((wallet) => ( - - ))} -
- -
- - {activeAddress && ( - - )} -
- -
- ) -} -export default ConnectWallet diff --git a/examples/p-tls/projects/p-tls-frontend/src/components/ErrorBoundary.tsx b/examples/p-tls/projects/p-tls-frontend/src/components/ErrorBoundary.tsx deleted file mode 100644 index 435bf61..0000000 --- a/examples/p-tls/projects/p-tls-frontend/src/components/ErrorBoundary.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import React, { ReactNode } from 'react' - -interface ErrorBoundaryProps { - children: ReactNode -} - -interface ErrorBoundaryState { - hasError: boolean - error: Error | null -} - -class ErrorBoundary extends React.Component { - constructor(props: ErrorBoundaryProps) { - super(props) - this.state = { hasError: false, error: null } - } - - static getDerivedStateFromError(error: Error): ErrorBoundaryState { - // Update state so the next render will show the fallback UI. - return { hasError: true, error: error } - } - - render(): ReactNode { - if (this.state.hasError) { - // You can render any custom fallback UI - return ( -
-
-
-

Error occured

-

- {this.state.error?.message.includes('Attempt to get default algod configuration') - ? 'Please make sure to set up your environment variables correctly. Create a .env file based on .env.template and fill in the required values. This controls the network and credentials for connections with Algod and Indexer.' - : this.state.error?.message} -

-
-
-
- ) - } - - return this.props.children - } -} - -export default ErrorBoundary diff --git a/examples/p-tls/projects/p-tls-frontend/src/components/Transact.tsx b/examples/p-tls/projects/p-tls-frontend/src/components/Transact.tsx deleted file mode 100644 index 3f8191d..0000000 --- a/examples/p-tls/projects/p-tls-frontend/src/components/Transact.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { algo, AlgorandClient } from '@algorandfoundation/algokit-utils' -import { encodeTransactionRaw } from '@algorandfoundation/algokit-utils/transact' -import { useWallet } from '@txnlab/use-wallet-react' -import { useSnackbar } from 'notistack' -import { useState } from 'react' -import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' - -interface TransactInterface { - openModal: boolean - setModalState: (value: boolean) => void -} - -const Transact = ({ openModal, setModalState }: TransactInterface) => { - const [loading, setLoading] = useState(false) - const [receiverAddress, setReceiverAddress] = useState('') - - const algodConfig = getAlgodConfigFromViteEnvironment() - const algorand = AlgorandClient.fromConfig({ algodConfig }) - - const { enqueueSnackbar } = useSnackbar() - - const { signTransactions, activeAddress } = useWallet() - - const handleSubmitAlgo = async () => { - setLoading(true) - - if (!signTransactions || !activeAddress) { - enqueueSnackbar('Please connect wallet first', { variant: 'warning' }) - return - } - - try { - enqueueSnackbar('Sending transaction...', { variant: 'info' }) - const result = await algorand.send.payment({ - signer: async (txnGroup, indexesToSign) => { - const encoded = txnGroup.map((txn) => encodeTransactionRaw(txn)) - const signed = await signTransactions(encoded, indexesToSign) - return signed.filter((s): s is Uint8Array => s !== null) - }, - sender: activeAddress, - receiver: receiverAddress, - amount: algo(1), - }) - enqueueSnackbar(`Transaction sent: ${result.txIds[0]}`, { variant: 'success' }) - setReceiverAddress('') - } catch (e) { - enqueueSnackbar('Failed to send transaction', { variant: 'error' }) - } - - setLoading(false) - } - - return ( - -
-

Send payment transaction

-
- { - setReceiverAddress(e.target.value) - }} - /> -
- - -
-
-
- ) -} - -export default Transact diff --git a/examples/p-tls/projects/p-tls-frontend/src/contracts/README.md b/examples/p-tls/projects/p-tls-frontend/src/contracts/README.md deleted file mode 100644 index 04629b1..0000000 --- a/examples/p-tls/projects/p-tls-frontend/src/contracts/README.md +++ /dev/null @@ -1,14 +0,0 @@ -## How to connect my web app with Algorand smart contracts? - -The following folder is reserved for the Algorand Application Clients. The clients are used to interact with instances of Algorand Smart Contracts (ASC1s) deployed on-chain. - -To integrate this react frontend template with your smart contracts codebase, perform the following steps: - -1. Generate the typed client using `algokit generate client -l typescript -o {path/to/this/folder}` or using the dedicated `link` command `algokit project link` (ensure to invoke it from the root of this react project). Using the `link` command is especially useful within workspaces that have multiple contract projects. -2. The generated typescript client should be ready to be imported and used in this react frontend template, making it a full fledged dApp. - -> Please note, by default this template defines `"generate:app-clients": "algokit project link --all"` which is a shortcut to automatically link TEAL code from all `contract` projects in the workspace as typed clients into the `frontend` project that is invoking the `link` command. Refer to [documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/link.md) to read more about `link` command. - -## **How to interact with the smart contract?** - -The generated client provides a set of functions that can be used to interact with the ABI (Application Binary Interface) compliant Algorand smart contract. For example, if the smart contract has a function called `hello`, the generated client will have a function called `hello` that can be used to interact with the smart contract. Refer to a [full-stack end-to-end starter template](https://github.com/algorandfoundation/algokit-fullstack-template) for a reference example on invoking and interacting with typescript typed clients generated. diff --git a/examples/p-tls/projects/p-tls-frontend/src/interfaces/network.ts b/examples/p-tls/projects/p-tls-frontend/src/interfaces/network.ts deleted file mode 100644 index fdb97ae..0000000 --- a/examples/p-tls/projects/p-tls-frontend/src/interfaces/network.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/network-client' - -export interface AlgoViteClientConfig extends AlgoClientConfig { - /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ - server: string - /** The port to use e.g. 4001, 443, etc. */ - port: string | number - /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string - /** String representing current Algorand Network type (testnet/mainnet and etc) */ - network: string -} - -export interface AlgoViteKMDConfig extends AlgoClientConfig { - /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ - server: string - /** The port to use e.g. 4001, 443, etc. */ - port: string | number - /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string - /** KMD wallet name */ - wallet: string - /** KMD wallet password */ - password: string -} diff --git a/examples/p-tls/projects/p-tls-frontend/src/main.tsx b/examples/p-tls/projects/p-tls-frontend/src/main.tsx deleted file mode 100644 index adf72ec..0000000 --- a/examples/p-tls/projects/p-tls-frontend/src/main.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App' -import './styles/main.css' -import ErrorBoundary from './components/ErrorBoundary' - -ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - - - - - , -) diff --git a/examples/p-tls/projects/p-tls-frontend/src/styles/main.css b/examples/p-tls/projects/p-tls-frontend/src/styles/main.css deleted file mode 100644 index b5c61c9..0000000 --- a/examples/p-tls/projects/p-tls-frontend/src/styles/main.css +++ /dev/null @@ -1,3 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/examples/p-tls/projects/p-tls-frontend/src/utils/ellipseAddress.spec.tsx b/examples/p-tls/projects/p-tls-frontend/src/utils/ellipseAddress.spec.tsx deleted file mode 100644 index 2cbff10..0000000 --- a/examples/p-tls/projects/p-tls-frontend/src/utils/ellipseAddress.spec.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { ellipseAddress } from './ellipseAddress' - -describe('ellipseAddress', () => { - it('should return ellipsed address with specified width', () => { - const address = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' - const result = ellipseAddress(address, 4) - expect(result).toBe('aaaa...aaaa') - }) - - it('should return empty string when address is empty', () => { - const address = '' - const result = ellipseAddress(address) - expect(result).toBe('') - }) -}) diff --git a/examples/p-tls/projects/p-tls-frontend/src/utils/ellipseAddress.ts b/examples/p-tls/projects/p-tls-frontend/src/utils/ellipseAddress.ts deleted file mode 100644 index db97e48..0000000 --- a/examples/p-tls/projects/p-tls-frontend/src/utils/ellipseAddress.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function ellipseAddress(address: string | null, width = 6): string { - return address ? `${address.slice(0, width)}...${address.slice(-width)}` : (address ?? '') -} diff --git a/examples/p-tls/projects/p-tls-frontend/src/utils/network/getAlgoClientConfigs.ts b/examples/p-tls/projects/p-tls-frontend/src/utils/network/getAlgoClientConfigs.ts deleted file mode 100644 index b5121f8..0000000 --- a/examples/p-tls/projects/p-tls-frontend/src/utils/network/getAlgoClientConfigs.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { AlgoViteClientConfig, AlgoViteKMDConfig } from '../../interfaces/network' - -export function getAlgodConfigFromViteEnvironment(): AlgoViteClientConfig { - if (!import.meta.env.VITE_ALGOD_SERVER) { - throw new Error('Attempt to get default algod configuration without specifying VITE_ALGOD_SERVER in the environment variables') - } - - return { - server: import.meta.env.VITE_ALGOD_SERVER, - port: import.meta.env.VITE_ALGOD_PORT, - token: import.meta.env.VITE_ALGOD_TOKEN, - network: import.meta.env.VITE_ALGOD_NETWORK, - } -} - -export function getIndexerConfigFromViteEnvironment(): AlgoViteClientConfig { - if (!import.meta.env.VITE_INDEXER_SERVER) { - throw new Error('Attempt to get default algod configuration without specifying VITE_INDEXER_SERVER in the environment variables') - } - - return { - server: import.meta.env.VITE_INDEXER_SERVER, - port: import.meta.env.VITE_INDEXER_PORT, - token: import.meta.env.VITE_INDEXER_TOKEN, - network: import.meta.env.VITE_ALGOD_NETWORK, - } -} - -export function getKmdConfigFromViteEnvironment(): AlgoViteKMDConfig { - if (!import.meta.env.VITE_KMD_SERVER) { - throw new Error('Attempt to get default kmd configuration without specifying VITE_KMD_SERVER in the environment variables') - } - - return { - server: import.meta.env.VITE_KMD_SERVER, - port: import.meta.env.VITE_KMD_PORT, - token: import.meta.env.VITE_KMD_TOKEN, - wallet: import.meta.env.VITE_KMD_WALLET, - password: import.meta.env.VITE_KMD_PASSWORD, - } -} diff --git a/examples/p-tls/projects/p-tls-frontend/src/vite-env.d.ts b/examples/p-tls/projects/p-tls-frontend/src/vite-env.d.ts deleted file mode 100644 index 67c2d30..0000000 --- a/examples/p-tls/projects/p-tls-frontend/src/vite-env.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -/// - -interface ImportMetaEnv { - readonly VITE_ENVIRONMENT: string - - readonly VITE_ALGOD_TOKEN: string - readonly VITE_ALGOD_SERVER: string - readonly VITE_ALGOD_PORT: string - readonly VITE_ALGOD_NETWORK: string - - readonly VITE_INDEXER_TOKEN: string - readonly VITE_INDEXER_SERVER: string - readonly VITE_INDEXER_PORT: string - - readonly VITE_KMD_TOKEN: string - readonly VITE_KMD_SERVER: string - readonly VITE_KMD_PORT: string - readonly VITE_KMD_PASSWORD: string - readonly VITE_KMD_WALLET: string -} - -interface ImportMeta { - readonly env: ImportMetaEnv -} diff --git a/examples/p-tls/projects/p-tls-frontend/tailwind.config.cjs b/examples/p-tls/projects/p-tls-frontend/tailwind.config.cjs deleted file mode 100644 index eaaba6c..0000000 --- a/examples/p-tls/projects/p-tls-frontend/tailwind.config.cjs +++ /dev/null @@ -1,12 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -module.exports = { - content: ['./src/**/*.{js,ts,jsx,tsx}'], - theme: { - extend: {}, - }, - daisyui: { - themes: ['lofi'], - logs: false, - }, - plugins: [require('daisyui')], -} diff --git a/examples/p-tls/projects/p-tls-frontend/tests/example.spec.ts b/examples/p-tls/projects/p-tls-frontend/tests/example.spec.ts deleted file mode 100644 index a62aae4..0000000 --- a/examples/p-tls/projects/p-tls-frontend/tests/example.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { algorandFixture } from '@algorandfoundation/algokit-utils/testing' -import { expect, test } from '@playwright/test' - -const localnet = algorandFixture() - -test.beforeEach(async ({ page }) => { - await localnet.newScope() - await page.goto('http://localhost:5173/') -}) - -test('has title', async ({ page }) => { - // Expect a title "to contain" a substring. - await expect(page).toHaveTitle('AlgoKit React Template') -}) - -test('get started link', async ({ page }) => { - await expect(page.getByTestId('getting-started')).toHaveText('Getting started') -}) - -test('authentication and dummy payment transaction', async ({ page }) => { - page.on('dialog', async (dialog) => { - dialog.message() === 'KMD password' ? await dialog.accept() : await dialog.dismiss() - }) - - // 1. Must be able to connect to a KMD wallet provider - await page.getByTestId('connect-wallet').click() - await page.getByTestId('kmd-connect').click() - await page.getByTestId('close-wallet-modal').click() - - // 2. Must be able to send a dummy payment transaction - await page.getByTestId('transactions-demo').click() - - await page.getByTestId('receiver-address').fill(localnet.context.testAccount.toString()) - await page.getByTestId('send-algo').click() - - // 3. Must be able to see a notification that the transaction was sent - const notification = await page.getByText('Transaction sent:') - await notification.waitFor() - expect(notification).toBeTruthy() -}) diff --git a/examples/p-tls/projects/p-tls-frontend/tsconfig.json b/examples/p-tls/projects/p-tls-frontend/tsconfig.json deleted file mode 100644 index 855bfc3..0000000 --- a/examples/p-tls/projects/p-tls-frontend/tsconfig.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, - "module": "ESNext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, - "declaration": true /* Generates corresponding '.d.ts' file. */, - "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, - "sourceMap": true /* Generates corresponding '.map' file. */, - "strict": true /* Enable all strict type-checking options. */, - "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, - "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, - "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, - "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, - "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */, - "skipLibCheck": true /* Skip type checking of declaration files. */, - "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, - "allowJs": false, - "allowSyntheticDefaultImports": true, - "moduleResolution": "Bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - "outDir": "./dist/" - }, - "include": [ - "src/**/*.ts", - "src/**/*.tsx", - "vite.config.js", - "src/utils/ellipseAddress.spec.tsx", - "src/utils/ellipseAddress.spec.tsx", - "src/main.tsx", - ], - "references": [ - { - "path": "./tsconfig.node.json" - } - ] -} diff --git a/examples/p-tls/projects/p-tls-frontend/tsconfig.node.json b/examples/p-tls/projects/p-tls-frontend/tsconfig.node.json deleted file mode 100644 index e32f207..0000000 --- a/examples/p-tls/projects/p-tls-frontend/tsconfig.node.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "module": "NodeNext", - "moduleResolution": "NodeNext", - "allowSyntheticDefaultImports": true - }, - "include": ["vite.config.ts"] -} diff --git a/examples/p-tls/projects/p-tls-frontend/vite.config.ts b/examples/p-tls/projects/p-tls-frontend/vite.config.ts deleted file mode 100644 index e42dc7c..0000000 --- a/examples/p-tls/projects/p-tls-frontend/vite.config.ts +++ /dev/null @@ -1,15 +0,0 @@ -import react from '@vitejs/plugin-react' -import { defineConfig } from 'vite' -import { nodePolyfills } from 'vite-plugin-node-polyfills' - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [ - react(), - nodePolyfills({ - globals: { - Buffer: true, - }, - }), - ], -}) diff --git a/examples/p-ts/.algokit/.copier-answers.yml b/examples/p-ts/.algokit/.copier-answers.yml index ca1e034..133142c 100644 --- a/examples/p-ts/.algokit/.copier-answers.yml +++ b/examples/p-ts/.algokit/.copier-answers.yml @@ -1,6 +1,6 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 2.1.8-8-g954a453 -_src_path: .. +_commit: 2.1.8-11-g7668422 +_src_path: /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template author_email: None author_name: None cloud_provider: netlify diff --git a/examples/p-ts/.algokit/generators/create-devcontainer/copier.yaml b/examples/p-ts/.algokit/generators/create-devcontainer/copier.yaml deleted file mode 100644 index e98f334..0000000 --- a/examples/p-ts/.algokit/generators/create-devcontainer/copier.yaml +++ /dev/null @@ -1,4 +0,0 @@ -_tasks: - - "echo '==== Successfully generated new .devcontainer.json file 🚀 ===='" - -_templates_suffix: ".j2" diff --git a/examples/p-ts/.algokit/generators/create-devcontainer/devcontainer.json b/examples/p-ts/.algokit/generators/create-devcontainer/devcontainer.json deleted file mode 100644 index 6452c65..0000000 --- a/examples/p-ts/.algokit/generators/create-devcontainer/devcontainer.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "forwardPorts": [4001, 4002, 8980, 5173], - "portsAttributes": { - "4001": { - "label": "algod" - }, - "4002": { - "label": "kmd" - }, - "8980": { - "label": "indexer" - }, - "5173": { - "label": "vite" - } - }, - "postCreateCommand": "mkdir -p ~/.config/algokit && pipx install algokit && sudo chown -R codespace:codespace ~/.config/algokit", - "postStartCommand": "for i in {1..5}; do algokit localnet status > /dev/null 2>&1 && break || sleep 30; algokit localnet reset; done" -} diff --git a/examples/p-ts/.editorconfig b/examples/p-ts/.editorconfig deleted file mode 100644 index 5e550a1..0000000 --- a/examples/p-ts/.editorconfig +++ /dev/null @@ -1,10 +0,0 @@ -[*] -charset = utf-8 -insert_final_newline = true -end_of_line = lf -indent_style = space -indent_size = 2 -tab_width = 2 -max_line_length = 140 -trim_trailing_whitespace = true -single_quote = true diff --git a/examples/p-ts/.gitattributes b/examples/p-ts/.gitattributes deleted file mode 100644 index 6313b56..0000000 --- a/examples/p-ts/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text=auto eol=lf diff --git a/examples/p-ts/.github/workflows/p-ts-contracts-cd.yaml b/examples/p-ts/.github/workflows/p-ts-contracts-cd.yaml deleted file mode 100644 index 9a5bb9c..0000000 --- a/examples/p-ts/.github/workflows/p-ts-contracts-cd.yaml +++ /dev/null @@ -1,45 +0,0 @@ -name: Release p-ts-contracts - -on: - workflow_call: - -jobs: - deploy-testnet: - runs-on: "ubuntu-latest" - - environment: contract-testnet - steps: - - name: Checkout source code - uses: actions/checkout@v4 - - - name: Use Node.js 22.x - uses: actions/setup-node@v4 - with: - node-version: '22.x' - cache: 'npm' - cache-dependency-path: '**/package-lock.json' - - - name: Set up Python 3.12 - uses: actions/setup-python@v5 - with: - python-version: "3.12" - - - name: Install algokit - run: pipx install algokit - - - name: Bootstrap dependencies - run: algokit project bootstrap all --project-name 'p-ts-contracts' - - - name: Configure git - shell: bash - run: | - # set git user and email as test invoke git - git config --global user.email "actions@github.com" && git config --global user.name "github-actions" - - - name: Deploy to testnet - run: algokit project deploy testnet --project-name 'p-ts-contracts' - env: - # This is the account that becomes the creator of the contract - DEPLOYER_MNEMONIC: ${{ secrets.DEPLOYER_MNEMONIC }} - # The dispenser account is used to ensure the deployer account is funded - DISPENSER_MNEMONIC: ${{ secrets.DISPENSER_MNEMONIC }} diff --git a/examples/p-ts/.github/workflows/p-ts-contracts-ci.yaml b/examples/p-ts/.github/workflows/p-ts-contracts-ci.yaml deleted file mode 100644 index 1af199f..0000000 --- a/examples/p-ts/.github/workflows/p-ts-contracts-ci.yaml +++ /dev/null @@ -1,72 +0,0 @@ -name: Validate p-ts-contracts - -on: - workflow_call: - -jobs: - validate: - runs-on: "ubuntu-latest" - steps: - - name: Checkout source code - uses: actions/checkout@v4 - - - name: Use Node.js 22.x - uses: actions/setup-node@v4 - with: - node-version: '22.x' - cache: 'npm' - cache-dependency-path: "**/package-lock.json" - - - name: Set up Python 3.12 - uses: actions/setup-python@v5 - with: - python-version: "3.12" - - - name: Install algokit - run: pipx install algokit - - - name: Start LocalNet - run: algokit localnet start - - - name: Bootstrap dependencies - run: algokit project bootstrap all --project-name 'p-ts-contracts' - - - name: Configure git - shell: bash - run: | - # set git user and email as test invoke git - git config --global user.email "actions@github.com" && git config --global user.name "github-actions" - - - - name: Audit dependencies - run: algokit project run audit --project-name 'p-ts-contracts' - - - - - name: Lint and format - run: algokit project run lint --project-name 'p-ts-contracts' - - - - - name: Run tests - shell: bash - run: | - set -o pipefail - algokit project run test --project-name 'p-ts-contracts' - - - - name: Build smart contracts - run: algokit project run build --project-name 'p-ts-contracts' - - - name: Scan TEAL files for issues - run: algokit project run audit-teal --project-name 'p-ts-contracts' - - # # Uncomment to enable TEAL static analysis with snapshoting using Tealer package - # # Would first require running locally using audit-teal command and committing the snapshots into source control - # # Please note, tealer has a known bug that may result in large snapshot file sizes, track resolution here: - # # https://github.com/crytic/tealer/issues/101 - # - name: Check output stability of the smart contracts - # run: algokit project run ci-teal-diff --project-name 'p-ts-contracts' - - - name: Run deployer against LocalNet - run: algokit project deploy localnet --project-name 'p-ts-contracts' diff --git a/examples/p-ts/.github/workflows/p-ts-frontend-cd.yaml b/examples/p-ts/.github/workflows/p-ts-frontend-cd.yaml deleted file mode 100644 index 07e75a3..0000000 --- a/examples/p-ts/.github/workflows/p-ts-frontend-cd.yaml +++ /dev/null @@ -1,36 +0,0 @@ -name: Release p-ts-frontend - -on: - workflow_call: -permissions: - contents: read - packages: read - -jobs: - - deploy: - runs-on: ubuntu-latest - name: Deploy to Netlify - environment: frontend-prod - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Setup node - uses: actions/setup-node@v3 - with: - node-version: 18 - - - name: Install algokit - run: pipx install algokit - - - name: Bootstrap dependencies - run: algokit project bootstrap all --project-name 'p-ts-frontend' - - - name: Publish to Netlify - env: - NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} - NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - run: algokit project run ci-deploy-netlify - \ No newline at end of file diff --git a/examples/p-ts/.github/workflows/p-ts-frontend-ci.yaml b/examples/p-ts/.github/workflows/p-ts-frontend-ci.yaml deleted file mode 100644 index ae1ffdb..0000000 --- a/examples/p-ts/.github/workflows/p-ts-frontend-ci.yaml +++ /dev/null @@ -1,47 +0,0 @@ -name: Validate p-ts-frontend - -on: - - workflow_call: - - -jobs: - validate: - runs-on: 'ubuntu-latest' - steps: - - name: Check out repository - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup node - uses: actions/setup-node@v3 - with: - node-version: 18 - - - name: Install poetry - run: pipx install poetry - - - name: Set up Python 3.12 - uses: actions/setup-python@v5 - with: - python-version: "3.12" - cache: "poetry" - - - name: Install algokit - run: pipx install algokit - - - name: Install dependencies - run: algokit project bootstrap all --project-name 'p-ts-frontend' - - - - name: Run linters - run: algokit project run lint --project-name 'p-ts-frontend' - - - - name: Run unit tests - run: algokit project run test --project-name 'p-ts-frontend' - - - - name: Build - run: algokit project run build --project-name 'p-ts-frontend' diff --git a/examples/p-ts/.gitignore b/examples/p-ts/.gitignore deleted file mode 100644 index 4105eb2..0000000 --- a/examples/p-ts/.gitignore +++ /dev/null @@ -1,170 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -#pdm.lock -# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it -# in version control. -# https://pdm.fming.dev/#use-with-ide -.pdm.toml - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Ruff (linter) -.ruff_cache/ - -# Cython debug symbols -cython_debug/ - -# PyCharm -.idea/ -!.idea/runConfigurations - -# macOS -.DS_Store - -# Received approval test files -*.received.* - -# NPM -node_modules - diff --git a/examples/p-ts/copy_files.sh b/examples/p-ts/copy_files.sh new file mode 100644 index 0000000..749b01f --- /dev/null +++ b/examples/p-ts/copy_files.sh @@ -0,0 +1,23 @@ + +#!/bin/bash +# Script to copy required files to the frontend project +# Usage: ./copy_files.sh + + +project_name="$1" +frontend_root="./projects/${project_name}-frontend" + +# Ensure directories exist +mkdir -p "${frontend_root}/src/components" + +# Copy files +cp "./inject_content/Home.tsx" "${frontend_root}/src/Home.tsx" +cp "./inject_content/AppCalls.tsx" "${frontend_root}/src/components/AppCalls.tsx" + +echo "Template completed successfully!" +# remove inject_content folder +rm -rf "./inject_content" +# self destruct the file +rm -f "$0" + + diff --git a/examples/p-ts/projects/p-ts-frontend/src/components/AppCalls.tsx b/examples/p-ts/inject_content/AppCalls.tsx similarity index 100% rename from examples/p-ts/projects/p-ts-frontend/src/components/AppCalls.tsx rename to examples/p-ts/inject_content/AppCalls.tsx diff --git a/examples/p-ts/projects/p-ts-frontend/src/Home.tsx b/examples/p-ts/inject_content/Home.tsx similarity index 100% rename from examples/p-ts/projects/p-ts-frontend/src/Home.tsx rename to examples/p-ts/inject_content/Home.tsx diff --git a/examples/p-ts/projects/.gitkeep b/examples/p-ts/projects/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit.toml b/examples/p-ts/projects/p-ts-contracts/.algokit.toml deleted file mode 100644 index ee84255..0000000 --- a/examples/p-ts/projects/p-ts-contracts/.algokit.toml +++ /dev/null @@ -1,56 +0,0 @@ -[algokit] -min_version = "v2.6.0" - -[generate.smart-contract] -description = "Generate a new smart contract for existing project" -path = ".algokit/generators/create_contract" - -[generate.env-file] -description = "Generate a new generic or Algorand network specific .env file" -path = ".algokit/generators/create_env_file" - -[project] -type = 'contract' -name = 'p-ts-contracts' -artifacts = 'smart_contracts/artifacts' - -[project.deploy] -command = "npm run deploy:ci" - -[project.deploy.testnet] -environment_secrets = [ - "DEPLOYER_MNEMONIC", - "DISPENSER_MNEMONIC", -] - -[project.deploy.mainnet] -environment_secrets = [ - "DEPLOYER_MNEMONIC", - "DISPENSER_MNEMONIC", -] - -[project.run] -# Commands intended for use locally and in CI -build = { commands = [ - 'npm run build', -], description = 'Build all smart contracts in the project' } -test = { commands = [ - 'npm run test', -], description = 'Run smart contract tests using vitest' } -audit = { commands = [ - 'npm run audit', -], description = 'Audit with better-npm-audit' } -lint = { commands = [ - 'npm run lint', - 'npm run format', -], description = 'Perform linting' } -audit-teal = { commands = [ - # 🚨 IMPORTANT 🚨: For strict TEAL validation, remove --exclude statements. The default starter contract is not for production. Ensure thorough testing and adherence to best practices in smart contract development. This is not a replacement for a professional audit. - 'algokit task analyze smart_contracts/artifacts --recursive --force --exclude rekey-to --exclude is-updatable --exclude missing-fee-check --exclude is-deletable --exclude can-close-asset --exclude can-close-account --exclude unprotected-deletable --exclude unprotected-updatable', -], description = 'Audit TEAL files' } - -# Commands intented for CI only, prefixed with `ci-` by convention -ci-teal-diff = { commands = [ - 'git add -N ./smart_contracts/artifacts', - 'git diff --exit-code --minimal ./smart_contracts/artifacts', -], description = 'Check TEAL files for differences' } diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/.copier-answers.yml b/examples/p-ts/projects/p-ts-contracts/.algokit/.copier-answers.yml deleted file mode 100644 index 3022c90..0000000 --- a/examples/p-ts/projects/p-ts-contracts/.algokit/.copier-answers.yml +++ /dev/null @@ -1,9 +0,0 @@ -# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 0.3.7-16-g0ed1ece -_src_path: gh:algorandfoundation/algokit-typescript-template -author_email: None -author_name: None -contract_name: hello_world -preset_name: production -project_name: p-ts-contracts - diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/copier.yaml b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/copier.yaml deleted file mode 100644 index 82f2c4a..0000000 --- a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/copier.yaml +++ /dev/null @@ -1,15 +0,0 @@ -_tasks: - - "echo '==== Successfully initialized new smart contract 🚀 ===='" - -contract_name: - type: str - help: Name of your new contract. - placeholder: "my-new-contract" - default: "my-new-contract" - -include_tests: - type: bool - help: Should we include testing files? - default: 'yes' - -_templates_suffix: ".j2" diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.algo.ts.j2 b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.algo.ts.j2 deleted file mode 100644 index 344c1a1..0000000 --- a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.algo.ts.j2 +++ /dev/null @@ -1,7 +0,0 @@ -import { Contract } from '@algorandfoundation/algorand-typescript' - -export class {{ contract_name.split('_')|map('capitalize')|join }} extends Contract { - {% if preset_name != 'starter' %}public {% endif %}hello(name: string): string { - return `Hello, ${name}` - } -} diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 deleted file mode 100644 index b1c76dd..0000000 --- a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 +++ /dev/null @@ -1,33 +0,0 @@ -import { AlgorandClient } from '@algorandfoundation/algokit-utils' -import { {{ contract_name.split('_')|map('capitalize')|join }}Factory } from '../artifacts/{{ contract_name }}/{{ contract_name.split('_')|map('capitalize')|join }}Client' - -// Below is a showcase of various deployment options you can use in TypeScript Client -export async function deploy() { - console.log('=== Deploying {{ contract_name.split('_')|map('capitalize')|join }} ===') - - const algorand = AlgorandClient.fromEnvironment() - const deployer = await algorand.account.fromEnvironment('DEPLOYER') - - const factory = algorand.client.getTypedAppFactory({{ contract_name.split('_')|map('capitalize')|join }}Factory, { - defaultSender: deployer.addr, - }) - - const { appClient, result } = await factory.deploy({ onUpdate: 'append', onSchemaBreak: 'append' }) - - // If app was just created fund the app account - if (['create', 'replace'].includes(result.operationPerformed)) { - await algorand.send.payment({ - amount: (1).algo(), - sender: deployer.addr, - receiver: appClient.appAddress, - }) - } - - const method = 'hello' - const response = await appClient.send.hello({ - args: { name: 'world' }, - }) - console.log( - `Called ${method} on ${appClient.appClient.appName} (${appClient.appClient.appId}) with name = world, received: ${response.return}`, - ) -} diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 deleted file mode 100644 index b94556a..0000000 --- a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 +++ /dev/null @@ -1,35 +0,0 @@ -import { Config, Address } from '@algorandfoundation/algokit-utils' -import { algorandFixture } from '@algorandfoundation/algokit-utils/testing' -import { beforeAll, beforeEach, describe, expect, test } from 'vitest' -import { {{ contract_name.split('_')|map('capitalize')|join }}Factory } from '../artifacts/{{ contract_name }}/{{ contract_name.split('_')|map('capitalize')|join }}Client' - -describe('{{ contract_name.split('_')|map('capitalize')|join }} contract', () => { - const localnet = algorandFixture() - beforeAll(() => { - Config.configure({ - debug: true, - // traceAll: true, - }) - }) - beforeEach(localnet.newScope) - - const deploy = async (account: Address) => { - const factory = localnet.algorand.client.getTypedAppFactory({{ contract_name.split('_')|map('capitalize')|join }}Factory, { - defaultSender: account, - }) - - const { appClient } = await factory.deploy({ onUpdate: 'append', onSchemaBreak: 'append' }) - return { client: appClient } - } - - test('says hello', async () => { - const { testAccount } = localnet.context - const { client } = await deploy(testAccount) - - const result = await client.send.hello({ args: { name: 'World' } }) - - expect(result.return).toBe('Hello World') - }) - -}) - diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.spec.ts{% endif %}.j2 b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.spec.ts{% endif %}.j2 deleted file mode 100644 index e7a7414..0000000 --- a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.spec.ts{% endif %}.j2 +++ /dev/null @@ -1,14 +0,0 @@ -import { TestExecutionContext } from '@algorandfoundation/algorand-typescript-testing' -import { describe, expect, it } from 'vitest' -import { {{ contract_name.split('_')|map('capitalize')|join }} } from './contract.algo' - -describe('{{ contract_name.split('_')|map('capitalize')|join }} contract', () => { - const ctx = new TestExecutionContext() - it('Logs the returned value when sayHello is called', () => { - const contract = ctx.contract.create({{ contract_name.split('_')|map('capitalize')|join }}) - - const result = contract.hello('Sally') - - expect(result).toBe('Hello Sally') - }) -}) diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/copier.yaml b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/copier.yaml deleted file mode 100644 index afa2cac..0000000 --- a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/copier.yaml +++ /dev/null @@ -1,49 +0,0 @@ -_tasks: - - "echo '==== Successfully generated new .env file 🚀 ===='" - -target_network: - type: str - help: Name of your target network. - choices: - - mainnet - - testnet - - localnet - - custom - default: "localnet" - when: "{{ not use_generic_env }}" - -custom_network_name: - type: str - help: Name of your custom Algorand network. - placeholder: "custom" - when: "{{ not use_generic_env and target_network == 'custom' }}" - -is_localnet: - type: bool - help: Whether to deploy on localnet. - placeholder: "true" - default: "{{ target_network == 'localnet' and not use_generic_env }}" - when: 'false' - -is_testnet: - type: bool - help: Whether to deploy on testnet. - placeholder: "true" - default: "{{ target_network == 'testnet' and not use_generic_env }}" - when: 'false' - -is_mainnet: - type: bool - help: Whether to deploy on mainnet. - placeholder: "true" - default: "{{ target_network == 'mainnet' and not use_generic_env }}" - when: 'false' - -is_customnet: - type: bool - help: Whether to deploy on custom network. - placeholder: "true" - default: "{{ target_network == 'custom' and not use_generic_env }}" - when: 'false' - -_templates_suffix: ".j2" diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} deleted file mode 100644 index cfc9f21..0000000 --- a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} +++ /dev/null @@ -1,7 +0,0 @@ -# this file contains algorand network settings for interacting with testnet via algonode -ALGOD_TOKEN={YOUR_ALGOD_TOKEN} -ALGOD_SERVER={YOUR_ALGOD_SERVER_URL} -ALGOD_PORT={YOUR_ALGOD_PORT} -INDEXER_TOKEN={YOUR_INDEXER_TOKEN} -INDEXER_SERVER={YOUR_INDEXER_SERVER_URL} -INDEXER_PORT={YOUR_INDEXER_PORT} diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} deleted file mode 100644 index fcbf442..0000000 --- a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} +++ /dev/null @@ -1,7 +0,0 @@ -# this file should contain environment variables specific to algokit localnet -ALGOD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -ALGOD_SERVER=http://localhost -ALGOD_PORT=4001 -INDEXER_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -INDEXER_SERVER=http://localhost -INDEXER_PORT=8980 diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} deleted file mode 100644 index bb9a787..0000000 --- a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} +++ /dev/null @@ -1,3 +0,0 @@ -# this file contains algorand network settings for interacting with testnet via algonode -ALGOD_SERVER=https://mainnet-api.algonode.cloud -INDEXER_SERVER=https://mainnet-idx.algonode.cloud diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} deleted file mode 100644 index eeea43d..0000000 --- a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} +++ /dev/null @@ -1,3 +0,0 @@ -# this file contains algorand network settings for interacting with testnet via algonode -ALGOD_SERVER=https://testnet-api.algonode.cloud -INDEXER_SERVER=https://testnet-idx.algonode.cloud diff --git a/examples/p-ts/projects/p-ts-contracts/.editorconfig b/examples/p-ts/projects/p-ts-contracts/.editorconfig deleted file mode 100644 index 0a71b07..0000000 --- a/examples/p-ts/projects/p-ts-contracts/.editorconfig +++ /dev/null @@ -1,7 +0,0 @@ -root=true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -insert_final_newline = true diff --git a/examples/p-ts/projects/p-ts-contracts/.gitignore b/examples/p-ts/projects/p-ts-contracts/.gitignore deleted file mode 100644 index 25494bf..0000000 --- a/examples/p-ts/projects/p-ts-contracts/.gitignore +++ /dev/null @@ -1,62 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -# Dependency directories -node_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# Editor/OS directories and files -.DS_Store -*.suo - -# IntelliJ family -.idea -!.idea/ -.idea/* -!.idea/runConfigurations/ - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* - -# Compiled code -dist/ -build/ - -# Coverage report -coverage - -# dotenv environment variable files -.env -.env.development.local -.env.test.local -.env.production.local -.env.local - -# Received approval test files -*.received.* - -# AlgoKit -debug_traces/ -.algokit/static-analysis/ # Replace with .algokit/static-analysis/tealer/ to enable snapshot checks in CI -.algokit/sources diff --git a/examples/p-ts/projects/p-ts-contracts/.npmrc b/examples/p-ts/projects/p-ts-contracts/.npmrc deleted file mode 100644 index c42da84..0000000 --- a/examples/p-ts/projects/p-ts-contracts/.npmrc +++ /dev/null @@ -1 +0,0 @@ -engine-strict = true diff --git a/examples/p-ts/projects/p-ts-contracts/.prettierignore b/examples/p-ts/projects/p-ts-contracts/.prettierignore deleted file mode 100644 index 8ca71b1..0000000 --- a/examples/p-ts/projects/p-ts-contracts/.prettierignore +++ /dev/null @@ -1,13 +0,0 @@ -# don't ever format node_modules -node_modules -# don't lint format output (make sure it's set to your correct build folder name) -dist -build -# don't format nyc coverage output -coverage -# don't format generated types -**/generated/types.d.ts -**/generated/types.ts -# don't format ide files -.idea -smart_contracts/artifacts diff --git a/examples/p-ts/projects/p-ts-contracts/.prettierrc.js b/examples/p-ts/projects/p-ts-contracts/.prettierrc.js deleted file mode 100644 index a31787e..0000000 --- a/examples/p-ts/projects/p-ts-contracts/.prettierrc.js +++ /dev/null @@ -1,4 +0,0 @@ -export default { - singleQuote: true, - jsxSingleQuote: true, -} diff --git a/examples/p-ts/projects/p-ts-contracts/.tours/getting-started-with-your-algokit-project.tour b/examples/p-ts/projects/p-ts-contracts/.tours/getting-started-with-your-algokit-project.tour deleted file mode 100644 index a9ea37c..0000000 --- a/examples/p-ts/projects/p-ts-contracts/.tours/getting-started-with-your-algokit-project.tour +++ /dev/null @@ -1,56 +0,0 @@ -{ - "$schema": "https://aka.ms/codetour-schema", - "title": "Getting Started with Your AlgoKit Project", - "steps": [ - { - "file": "README.md", - "description": "Welcome to your brand new AlgoKit template-based project. In this tour, we will guide you through the main features and capabilities included in the template.", - "line": 3 - }, - { - "file": "README.md", - "description": "Start by ensuring you have followed the setup of pre-requisites.", - "line": 9 - }, - { - "file": ".algokit.toml", - "description": "This is the main configuration file used by algokit-cli to manage the project. The default template includes a starter 'Hello World' contract that is deployed via the `algokit-utils` package. To create a new smart contract, you can use the [`algokit generate`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md) command and invoke a pre-bundled generator template by running `algokit generate smart-contract` (see how it is defined in the `.algokit.toml`, you can create your own generators if needed). This action will create a new folder in the `smart_contracts` directory, named after your project. Each folder contains a `contract.algo.ts` file, which is the entry point for your contract implementation, and `deployConfig.ts` file, that perform the deployment of the contract. Additionally you can define custom commands to run (similar to `npm` scripts), see definitions under `[project]` section in `.algokit.toml`.", - "line": 1 - }, - { - "file": "smart_contracts/hello_world/deploy-config.ts", - "description": "The default deployment scripts invoke a sample method on the starter contract that demonstrates how to interact with your deployed Algorand on-chain applications using the [`AlgoKit Typed Clients`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md#1-typed-clients) feature. The invocation if deploy is aliased in `.algokit.toml` file, allowing simple deployments via `algokit project deploy` command.", - "line": 32 - }, - { - "file": "smart_contracts/hello_world/contact.spec.ts", - "description": "The default tests provided demonstrate an example of setting up in-memory fast unit tests with the Algorand TypeScript testing library that mocks AVM functionality.", - "line": 5 - }, - { - "file": "smart_contracts/hello_world/contact.e2e.spec.ts", - "description": "The default tests provided demonstrate an example of setting up an end-to-end test with fixtures, and testing smart contract calls against a LocalNet network via an AlgoKit typed client.", - "line": 7 - }, - { - "file": ".env.localnet.template", - "description": "Environment files are a crucial mechanism that allows you to set up the [`algokit deploy`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/deploy.md) feature to simplify deploying your contracts in CI/CD environments (please note we still recommend careful evaluation when it comes to deployment to MainNet). Clone the file and remove the `.template` suffix to apply the changes to deployment scripts and launch configurations. The network prefix `localnet|testnet|mainnet` is primarily optimized for `algokit deploy`. The order of loading the variables is `.env.{network}` < `.env`.", - "line": 2 - }, - { - "file": ".vscode/launch.json", - "description": "Refer to the pre-bundled Visual Studio launch configurations, offering various options on how to execute the build and deployment of your smart contracts. Alternatively execute `algokit project run` to see list of available custom commands.", - "line": 5 - }, - { - "file": ".vscode/extensions.json", - "description": "We highly recommend installing the recommended extensions to get the most out of this template starter project in your VSCode IDE.", - "line": 3 - }, - { - "file": "smart_contracts/index.ts", - "description": "Uncomment the following line to enable artifacts required for the [AlgoKit AVM Debugger](https://github.com/algorandfoundation/algokit-avm-vscode-debugger) that run for every single call rather than just failures. This VSCode plugin is available on the [VSCode Extension Marketplace](https://marketplace.visualstudio.com/items?itemName=algorandfoundation.algokit-avm-vscode-debugger) for every call. A new folder will be automatically created in the `.algokit` directory with source maps of all TEAL contracts in this workspace, as well as traces that will appear in a folder at the root of the workspace. You can then use the traces as entry points to trigger the debug extension. Make sure to have the `.algokit.toml` file available at the root of the workspace.", - "line": 13 - } - ] -} diff --git a/examples/p-ts/projects/p-ts-contracts/.vscode/extensions.json b/examples/p-ts/projects/p-ts-contracts/.vscode/extensions.json deleted file mode 100644 index cb71192..0000000 --- a/examples/p-ts/projects/p-ts-contracts/.vscode/extensions.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "recommendations": [ - "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode", - "vitest.explorer", - "editorconfig.editorconfig", - "vsls-contrib.codetour", - "algorandfoundation.algokit-avm-vscode-debugger" - ] -} diff --git a/examples/p-ts/projects/p-ts-contracts/.vscode/launch.json b/examples/p-ts/projects/p-ts-contracts/.vscode/launch.json deleted file mode 100644 index 093ebb1..0000000 --- a/examples/p-ts/projects/p-ts-contracts/.vscode/launch.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Build & Deploy contracts", - "type": "node", - "request": "launch", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "deploy"], - "cwd": "${workspaceFolder}/smart_contracts", - "console": "integratedTerminal", - "skipFiles": ["/**", "node_modules/**"], - "preLaunchTask": "Build contracts (+ LocalNet)", - "env": { - "ALGOD_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "ALGOD_SERVER": "http://localhost", - "ALGOD_PORT": "4001", - "INDEXER_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "INDEXER_SERVER": "http://localhost", - "INDEXER_PORT": "8980" - } - }, - { - "name": "Deploy contracts", - "type": "node", - "request": "launch", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "deploy"], - "cwd": "${workspaceFolder}/smart_contracts", - "console": "integratedTerminal", - "skipFiles": ["/**", "node_modules/**"], - "env": { - "ALGOD_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "ALGOD_SERVER": "http://localhost", - "ALGOD_PORT": "4001", - "INDEXER_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "INDEXER_SERVER": "http://localhost", - "INDEXER_PORT": "8980" - } - }, - { - "name": "Build contracts", - "request": "launch", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "build"], - "cwd": "${workspaceFolder}", - "console": "integratedTerminal", - "skipFiles": ["/**", "node_modules/**"], - }, - { - "type": "avm", - "request": "launch", - "name": "Debug AVM executions", - "simulateTraceFile": "${workspaceFolder}/${command:PickSimulateTraceFile}", - "stopOnEntry": true - } - ] -} diff --git a/examples/p-ts/projects/p-ts-contracts/.vscode/settings.json b/examples/p-ts/projects/p-ts-contracts/.vscode/settings.json deleted file mode 100644 index b60a0a2..0000000 --- a/examples/p-ts/projects/p-ts-contracts/.vscode/settings.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "files.eol": "\n", - "algorandTypeScript.languageServer.enable": true, - "editor.formatOnSave": true, - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.codeActionsOnSave": { - "source.organizeImports": "explicit" - }, - "jest.enable": false, - "files.associations": { - ".github/**/*.yml": "github-actions-workflow" - }, - "eslint.enable": true, - "eslint.validate": ["typescript"], - "eslint.options": { - "extensions": [".ts"] - }, - "eslint.workingDirectories": ["./smart_contracts"] - } diff --git a/examples/p-ts/projects/p-ts-contracts/.vscode/tasks.json b/examples/p-ts/projects/p-ts-contracts/.vscode/tasks.json deleted file mode 100644 index 55310ab..0000000 --- a/examples/p-ts/projects/p-ts-contracts/.vscode/tasks.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "Build contracts", - "type": "npm", - "script": "build", - "path": "${workspaceFolder}", - "options": { - "cwd": "${workspaceFolder}" - }, - "group": { - "kind": "build", - "isDefault": true - }, - "problemMatcher": [] - }, - { - "label": "Build contracts (+ LocalNet)", - "type": "npm", - "script": "build", - "path": "${workspaceFolder}", - "options": { - "cwd": "${workspaceFolder}" - }, - "dependsOn": "Start AlgoKit LocalNet", - "problemMatcher": [] - }, - { - "label": "Start AlgoKit LocalNet", - "command": "algokit", - "args": ["localnet", "start"], - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "problemMatcher": [] - }, - { - "label": "Stop AlgoKit LocalNet", - "command": "algokit", - "args": ["localnet", "stop"], - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "problemMatcher": [] - }, - { - "label": "Reset AlgoKit LocalNet", - "command": "algokit", - "args": ["localnet", "reset"], - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "problemMatcher": [] - }, - { - "label": "Analyze TEAL contracts with AlgoKit Tealer integration", - "command": "algokit", - "args": ["task", "analyze", "${workspaceFolder}/.algokit", "--recursive", "--force"], - "options": { - "cwd": "${workspaceFolder}" - }, - "problemMatcher": [] - } - ] -} diff --git a/examples/p-ts/projects/p-ts-contracts/README.md b/examples/p-ts/projects/p-ts-contracts/README.md deleted file mode 100644 index e457562..0000000 --- a/examples/p-ts/projects/p-ts-contracts/README.md +++ /dev/null @@ -1,157 +0,0 @@ -# p-ts-contracts - -This project has been generated using AlgoKit. See below for default getting started instructions. - -# Setup - -### Pre-requisites - -- [Nodejs 22](https://nodejs.org/en/download) or later -- [AlgoKit CLI 2.5](https://github.com/algorandfoundation/algokit-cli?tab=readme-ov-file#install) or later -- [Docker](https://www.docker.com/) (only required for LocalNet) -- [Puya Compiler 4.4.4](https://pypi.org/project/puyapy/) or later - -> For interactive tour over the codebase, download [vsls-contrib.codetour](https://marketplace.visualstudio.com/items?itemName=vsls-contrib.codetour) extension for VS Code, then open the [`.codetour.json`](./.tours/getting-started-with-your-algokit-project.tour) file in code tour extension. - -### Initial Setup - -#### 1. Clone the Repository -Start by cloning this repository to your local machine. - -#### 2. Install Pre-requisites -Ensure the following pre-requisites are installed and properly configured: - -- **Docker**: Required for running a local Algorand network. -- **AlgoKit CLI**: Essential for project setup and operations. Verify installation with `algokit --version`, expecting `2.6.0` or later. - -#### 3. Bootstrap Your Local Environment -Run the following commands within the project folder: - -- **Setup Project**: Execute `algokit project bootstrap all` to install dependencies and setup npm dependencies. -- **Configure environment**: Execute `algokit generate env-file -a target_network localnet` to create a `.env.localnet` file with default configuration for `localnet`. -- **Start LocalNet**: Use `algokit localnet start` to initiate a local Algorand network. - -### Development Workflow - -#### Terminal -Directly manage and interact with your project using AlgoKit commands: - -1. **Build Contracts**: `algokit project run build` compiles all smart contracts. You can also specify a specific contract by passing the name of the contract folder as an extra argument. -For example: `algokit project run build -- hello_world` will only build the `hello_world` contract. -2. **Deploy**: Use `algokit project deploy localnet` to deploy contracts to the local network. You can also specify a specific contract by passing the name of the contract folder as an extra argument. -For example: `algokit project deploy localnet -- hello_world` will only deploy the `hello_world` contract. - -#### VS Code -For a seamless experience with breakpoint debugging and other features: - -1. **Open Project**: In VS Code, open the repository root. -2. **Install Extensions**: Follow prompts to install recommended extensions. -3. **Debugging**: - - Use `F5` to start debugging. - -#### JetBrains IDEs -While primarily optimized for VS Code, JetBrains IDEs are supported: - -1. **Open Project**: In your JetBrains IDE, open the repository root. -2. **Automatic Setup**: The IDE should configure the Node.js environment. -3. **Debugging**: Use `Shift+F10` or `Ctrl+R` to start debugging. Note: Windows users may encounter issues with pre-launch tasks due to a known bug. See [JetBrains forums](https://youtrack.jetbrains.com/issue/IDEA-277486/Shell-script-configuration-cannot-run-as-before-launch-task) for workarounds. - -## AlgoKit Workspaces and Project Management -This project supports both standalone and monorepo setups through AlgoKit workspaces. Leverage [`algokit project run`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md) commands for efficient monorepo project orchestration and management across multiple projects within a workspace. - -## AlgoKit Generators - -This template provides a set of [algokit generators](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md) that allow you to further modify the project instantiated from the template to fit your needs, as well as giving you a base to build your own extensions to invoke via the `algokit generate` command. - -### Generate Smart Contract - -By default the template creates a single `HelloWorld` contract under hello_world folder in the `smart_contracts` directory. To add a new contract: - -1. From the root of the project (`../`) execute `algokit generate smart-contract`. This will create a new starter smart contract and deployment configuration file under `{your_contract_name}` subfolder in the `smart_contracts` directory. -2. Each contract potentially has different creation parameters and deployment steps. Hence, you need to define your deployment logic in `deploy-config.ts` file. -3. Technically, you need to reference your contract deployment logic in the `index.ts` file. However, by default, `index.ts` will auto import all TypeScript deployment files under `smart_contracts` directory. If you want to manually import specific contracts, modify the default code provided by the template in `index.ts` file. - -> Please note, above is just a suggested convention tailored for the base configuration and structure of this template. The default code supplied by the template in the `index.ts` file is tailored for the suggested convention. You are free to modify the structure and naming conventions as you see fit. - -### Generate '.env' files - -By default the template instance does not contain any env files to deploy to different networks. Using [`algokit project deploy`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/deploy.md) against `localnet` | `testnet` | `mainnet` will use default values for `algod` and `indexer` unless overwritten via `.env` or `.env.{target_network}`. - -To generate a new `.env` or `.env.{target_network}` file, run `algokit generate env-file` - -### Debugging Smart Contracts - -This project is optimized to work with AlgoKit AVM Debugger extension. To activate it: - -Refer to the commented header in the `index.ts` file in the `smart_contracts` folder.Since you have opted in to include VSCode launch configurations in your project, you can also use the `Debug TEAL via AlgoKit AVM Debugger` launch configuration to interactively select an available trace file and launch the debug session for your smart contract. - - -For information on using and setting up the `AlgoKit AVM Debugger` VSCode extension refer [here](https://github.com/algorandfoundation/algokit-avm-vscode-debugger). To install the extension from the VSCode Marketplace, use the following link: [AlgoKit AVM Debugger extension](https://marketplace.visualstudio.com/items?itemName=algorandfoundation.algokit-avm-vscode-debugger).### Continuous Integration / Continuous Deployment (CI/CD) - -This project uses [GitHub Actions](https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions) to define CI/CD workflows, which are located in the [.github/workflows](`../../.github/workflows`) folder. - -> Please note, if you instantiated the project with --workspace flag in `algokit init` it will automatically attempt to move the contents of the `.github` folder to the root of the workspace. - -### AlgoKit Workspaces - -To define custom `algokit project run` commands refer to [documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md). This allows orchestration of commands spanning across multiple projects within an algokit workspace based project (monorepo). - -#### Setting up GitHub for CI/CD workflow and TestNet deployment - - 1. Every time you have a change to your smart contract, and when you first initialize the project you need to [build the contract](#initial-setup) and then commit the `smart_contracts/artifacts` folder so the [output stability](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/articles/output_stability.md) tests pass - 2. Decide what values you want to use for the `allowUpdate` and `allowDelete` parameters specified in [`deploy-config.ts`](./smart_contracts/hello_world/deploy-config.ts). - When deploying to LocalNet these values are both set to `true` for convenience. But for non-LocalNet networks - they are more conservative and use `false` - These default values will allow the smart contract to be deployed initially, but will not allow the app to be updated or deleted if is changed and the build will instead fail. - To help you decide it may be helpful to read the [AlgoKit Utils app deployment documentation](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/docs/capabilities/app-deploy.md) or the [AlgoKit smart contract deployment architecture](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/architecture-decisions/2023-01-12_smart-contract-deployment.md#upgradeable-and-deletable-contracts). - 3. Create a [Github Environment](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#creating-an-environment) named `Test`. - Note: If you have a private repository and don't have GitHub Enterprise then Environments won't work and you'll need to convert the GitHub Action to use a different approach. Ignore this step if you picked `Starter` preset. - 4. Create or obtain a mnemonic for an Algorand account for use on TestNet to deploy apps, referred to as the `DEPLOYER` account. - 5. Store the mnemonic as a [secret](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#environment-secrets) `DEPLOYER_MNEMONIC` - in the Test environment created in step 3. - 6. The account used to deploy the smart contract will require enough funds to create the app, and also fund it. There are two approaches available here: - * Either, ensure the account is funded outside of CI/CD. - In Testnet, funds can be obtained by using the [Algorand TestNet dispenser](https://bank.testnet.algorand.network/) and we recommend provisioning 50 ALGOs. - * Or, fund the account as part of the CI/CD process by using a `DISPENSER_MNEMONIC` GitHub Environment secret to point to a separate `DISPENSER` account that you maintain ALGOs in (similarly, you need to provision ALGOs into this account using the [TestNet dispenser](https://bank.testnet.algorand.network/)). - -#### Continuous Integration - -For pull requests and pushes to `main` branch against this repository the following checks are automatically performed by GitHub Actions: - - NPM dependencies are audited using [better-npm-audit](https://github.com/jeemok/better-npm-audit#readme) - - Code formatting is performed using [Prettier](https://prettier.io/) - - Linting is checked using [ESLint](https://eslint.org/) -- The base framework for testing is [vitest](https://vitest.dev/), and the project includes two separate kinds of tests: -- - `Algorand TypeScript` smart contract unit tests, that are run using [`algorand-typescript-testing`](https://github.com/algorandfoundation/algorand-typescript-testing), which are executed in a Node.js intepreter emulating major AVM behaviour -- - End-to-end (e2e) `AppClient` tests that are run against `algokit localnet` and test the behaviour in a real network environment - - Smart contract artifacts are built - - Smart contract artifacts are checked for [output stability](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/articles/output_stability.md). - - Smart contract is deployed to a AlgoKit LocalNet instance - -> NOTE: By default smart contract artifacts are compiled with `--debug-level` set to 0, to change this, modify the compiler invocation under the `build` script in `package.json` - -#### Continuous Deployment - -For pushes to `main` branch, after the above checks pass, the following deployment actions are performed: - - The smart contract(s) are deployed to TestNet using [AlgoNode](https://algonode.io). - -> Please note deployment is also performed via `algokit deploy` command which can be invoked both via CI as seen on this project, or locally. For more information on how to use `algokit deploy` please see [AlgoKit documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/deploy.md). - -# Tools - -This project makes use of Algorand TypeScript to build Algorand smart contracts. The following tools are in use: - -- [Algorand](https://www.algorand.com/) - Layer 1 Blockchain; [Developer portal](https://dev.algorand.co/), [Why Algorand?](https://dev.algorand.co/getting-started/why-algorand/) -- [AlgoKit](https://github.com/algorandfoundation/algokit-cli) - One-stop shop tool for developers building on the Algorand network; [docs](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/algokit.md), [intro tutorial](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/tutorials/intro.md) -- [Algorand TypeScript](https://github.com/algorandfoundation/puya-ts/) - A semantically and syntactically compatible, typed TypeScript language that works with standard TypeScript tooling and allows you to express smart contracts (apps) and smart signatures (logic signatures) for deployment on the Algorand Virtual Machine (AVM); [docs](https://github.com/algorandfoundation/puya-ts/), [examples](https://github.com/algorandfoundation/puya-ts/tree/main/examples) -- [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-ts) - A set of core Algorand utilities that make it easier to build solutions on Algorand. -- [NPM](https://www.npmjs.com/): TypeScript packaging and dependency management. -- [TypeScript](https://www.typescriptlang.org/): Strongly typed programming language that builds on JavaScript -- [tsx](https://github.com/wclr/tsx): TypeScript development execution environment- [Prettier](https://prettier.io/): A code formatter.- [ESLint](https://eslint.org/): A JavaScript / TypeScript linter. -- [vitest](https://vitest.dev/): Automated testing. -- [better-npm-audit](https://github.com/jeemok/better-npm-audit#readme): Tool for scanning JavaScript / TypeScript environments for packages with known vulnerabilities. - - -It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. - - - diff --git a/examples/p-ts/projects/p-ts-contracts/eslint.config.mjs b/examples/p-ts/projects/p-ts-contracts/eslint.config.mjs deleted file mode 100644 index 4d2428a..0000000 --- a/examples/p-ts/projects/p-ts-contracts/eslint.config.mjs +++ /dev/null @@ -1,18 +0,0 @@ -import eslint from '@eslint/js' -import tseslint from 'typescript-eslint' -import globals from 'globals' - -export default tseslint.config( - eslint.configs.recommended, - tseslint.configs.recommended, - { - languageOptions: { - globals: { - ...globals.node, - }, - }, - rules: { - '@typescript-eslint/explicit-member-accessibility': 'warn', - }, - }, -); diff --git a/examples/p-ts/projects/p-ts-contracts/package.json b/examples/p-ts/projects/p-ts-contracts/package.json deleted file mode 100644 index a4bc636..0000000 --- a/examples/p-ts/projects/p-ts-contracts/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "smart_contracts", - "version": "1.0.0", - "description": "Smart contract deployer", - "main": "smart_contracts/index.ts", - "type": "module", - "scripts": { - "build": "algokit compile ts smart_contracts --output-source-map --out-dir artifacts && algokit generate client smart_contracts/artifacts --output {app_spec_dir}/{contract_name}Client.ts", - "deploy": "tsx watch -r dotenv/config smart_contracts/index.ts", - "deploy:ci": "tsx -r dotenv/config smart_contracts/index.ts", - "lint": "eslint smart_contracts", - "lint:fix": "eslint smart_contracts --fix", - "audit": "better-npm-audit audit", - "format": "prettier --write .", - "test": "vitest run --coverage", - "test:watch": "vitest watch", - "check-types": "tsc --noEmit" - }, - "engines": { - "node": ">=22.0", - "npm": ">=9.0" - }, - "dependencies": { - "@algorandfoundation/algorand-typescript": "^1.0.1" - }, - "devDependencies": { - "@algorandfoundation/algokit-client-generator": "^7.0.0-alpha.5", - "@algorandfoundation/algokit-utils": "^10.0.0-alpha.40", - "@algorandfoundation/algokit-utils-debug": "^2.0.0-alpha.2", - "@algorandfoundation/puya-ts": "^1.0.1", - "@rollup/plugin-typescript": "^12.1.2", - "@tsconfig/node22": "^22.0.0", - "better-npm-audit": "^3.11.0", - "dotenv": "^16.4.7", - "eslint": "^9.18.0", - "@eslint/js": "^9.18.0", - "typescript-eslint": "^8.19.1", - "prettier": "^3.4.2", - "tsx": "^4.19.3", - "@algorandfoundation/algorand-typescript-testing": "^1.0.1", - "vitest": "^2.1.8", - "@vitest/coverage-v8": "^2.1.8", - "typescript": "^5.7.3" - }, - "overrides": { - "esbuild": "0.25.0" - } -} diff --git a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.spec.ts b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.spec.ts deleted file mode 100644 index 664eb72..0000000 --- a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.spec.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { TestExecutionContext } from '@algorandfoundation/algorand-typescript-testing' -import { describe, expect, it } from 'vitest' -import { HelloWorld } from './contract.algo' - -describe('HelloWorld contract', () => { - const ctx = new TestExecutionContext() - it('Logs the returned value when sayHello is called', () => { - const contract = ctx.contract.create(HelloWorld) - - const result = contract.hello('Sally') - - expect(result).toBe('Hello, Sally') - }) -}) diff --git a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.ts b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.ts deleted file mode 100644 index 5e2fcfe..0000000 --- a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Contract } from '@algorandfoundation/algorand-typescript' - -export class HelloWorld extends Contract { - public hello(name: string): string { - return `Hello, ${name}` - } -} diff --git a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.e2e.spec.ts b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.e2e.spec.ts deleted file mode 100644 index 5a19a9a..0000000 --- a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.e2e.spec.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Config, Address } from '@algorandfoundation/algokit-utils' -import { registerDebugEventHandlers } from '@algorandfoundation/algokit-utils-debug' -import { algorandFixture } from '@algorandfoundation/algokit-utils/testing' -import { beforeAll, beforeEach, describe, expect, test } from 'vitest' -import { HelloWorldFactory } from '../artifacts/hello_world/HelloWorldClient' - -describe('HelloWorld contract', () => { - const localnet = algorandFixture() - beforeAll(() => { - Config.configure({ - debug: true, - // traceAll: true, - }) - registerDebugEventHandlers() - }) - beforeEach(localnet.newScope) - - const deploy = async (account: Address) => { - const factory = localnet.algorand.client.getTypedAppFactory(HelloWorldFactory, { - defaultSender: account, - }) - - const { appClient } = await factory.deploy({ - onUpdate: 'append', - onSchemaBreak: 'append', - }) - return { client: appClient } - } - - test('says hello', async () => { - const { testAccount } = localnet.context - const { client } = await deploy(testAccount) - - const result = await client.send.hello({ args: { name: 'World' } }) - - expect(result.return).toBe('Hello, World') - }) - - test('simulate says hello with correct budget consumed', async () => { - const { testAccount } = localnet.context - const { client } = await deploy(testAccount) - const result = await client - .newGroup() - .hello({ args: { name: 'World' } }) - .hello({ args: { name: 'Jane' } }) - .simulate() - - expect(result.returns[0]).toBe('Hello, World') - expect(result.returns[1]).toBe('Hello, Jane') - expect(result.simulateResponse.txnGroups[0].appBudgetConsumed).toBeLessThan(100) - }) -}) diff --git a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/deploy-config.ts b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/deploy-config.ts deleted file mode 100644 index 6cf7f14..0000000 --- a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/deploy-config.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { AlgorandClient } from '@algorandfoundation/algokit-utils' -import { HelloWorldFactory } from '../artifacts/hello_world/HelloWorldClient' - -// Below is a showcase of various deployment options you can use in TypeScript Client -export async function deploy() { - console.log('=== Deploying HelloWorld ===') - - const algorand = AlgorandClient.fromEnvironment() - const deployer = await algorand.account.fromEnvironment('DEPLOYER') - - const factory = algorand.client.getTypedAppFactory(HelloWorldFactory, { - defaultSender: deployer.addr, - }) - - const { appClient, result } = await factory.deploy({ onUpdate: 'append', onSchemaBreak: 'append' }) - - // If app was just created fund the app account - if (['create', 'replace'].includes(result.operationPerformed)) { - await algorand.send.payment({ - amount: (1).algo(), - sender: deployer.addr, - receiver: appClient.appAddress, - }) - } - - const method = 'hello' - const response = await appClient.send.hello({ - args: { name: 'world' }, - }) - console.log( - `Called ${method} on ${appClient.appClient.appName} (${appClient.appClient.appId}) with name = world, received: ${response.return}`, - ) -} diff --git a/examples/p-ts/projects/p-ts-contracts/smart_contracts/index.ts b/examples/p-ts/projects/p-ts-contracts/smart_contracts/index.ts deleted file mode 100644 index d643cd8..0000000 --- a/examples/p-ts/projects/p-ts-contracts/smart_contracts/index.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Config } from '@algorandfoundation/algokit-utils' -import { registerDebugEventHandlers } from '@algorandfoundation/algokit-utils-debug' -import { consoleLogger } from '@algorandfoundation/algokit-utils/logging' -import * as fs from 'node:fs' -import * as path from 'node:path' -import { fileURLToPath } from 'node:url' - -// Uncomment the traceAll option to enable auto generation of AVM Debugger compliant sourceMap and simulation trace file for all AVM calls. -// Learn more about using AlgoKit AVM Debugger to debug your TEAL source codes and inspect various kinds of Algorand transactions in atomic groups -> https://github.com/algorandfoundation/algokit-avm-vscode-Debugger - -Config.configure({ - logger: consoleLogger, - debug: true, - // traceAll: true, -}) -registerDebugEventHandlers() - -// base directory -const baseDir = path.dirname(fileURLToPath(import.meta.url)) - -// function to validate and dynamically import a module -async function importDeployerIfExists(dir: string) { - const deployerPath = path.resolve(dir, 'deploy-config') - if (fs.existsSync(deployerPath + '.ts') || fs.existsSync(deployerPath + '.js')) { - const deployer = await import(deployerPath) - return { ...deployer, name: path.basename(dir) } - } - return null -} - -// get a list of all deployers from the subdirectories -async function getDeployers() { - const directories = fs - .readdirSync(baseDir, { withFileTypes: true }) - .filter((dirent) => dirent.isDirectory()) - .map((dirent) => path.resolve(baseDir, dirent.name)) - - const deployers = await Promise.all(directories.map(importDeployerIfExists)) - return deployers.filter((deployer) => deployer !== null) // Filter out null values -} - -// execute all the deployers -(async () => { - const contractName = process.argv.length > 2 ? process.argv[2] : undefined - const contractDeployers = await getDeployers() - - const filteredDeployers = contractName - ? contractDeployers.filter((deployer) => deployer.name === contractName) - : contractDeployers - - if (contractName && filteredDeployers.length === 0) { - console.warn(`No deployer found for contract name: ${contractName}`) - return - } - - for (const deployer of filteredDeployers) { - try { - await deployer.deploy() - } catch (e) { - console.error(`Error deploying ${deployer.name}:`, e) - } - } -})() diff --git a/examples/p-ts/projects/p-ts-contracts/tsconfig.json b/examples/p-ts/projects/p-ts-contracts/tsconfig.json deleted file mode 100644 index 6cc09d9..0000000 --- a/examples/p-ts/projects/p-ts-contracts/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "@tsconfig/node22/tsconfig.json", - "compilerOptions": { - "noEmit": true, - "target": "ES2023", - "module": "ESNext", - "lib": ["ES2023"], - "moduleResolution": "Bundler", - "resolveJsonModule": true, - "esModuleInterop": true - }, - "include": ["**/*.ts", "**/*.mts"], - "exclude": ["node_modules"] -} diff --git a/examples/p-ts/projects/p-ts-contracts/vitest.config.mts b/examples/p-ts/projects/p-ts-contracts/vitest.config.mts deleted file mode 100644 index 644b9cc..0000000 --- a/examples/p-ts/projects/p-ts-contracts/vitest.config.mts +++ /dev/null @@ -1,21 +0,0 @@ -import { puyaTsTransformer } from '@algorandfoundation/algorand-typescript-testing/vitest-transformer' -import typescript from '@rollup/plugin-typescript' -import { defineConfig } from 'vitest/config' - -export default defineConfig({ - esbuild: {}, - test: { - testTimeout: 10000, - coverage: { - provider: 'v8', - }, - }, - plugins: [ - typescript({ - tsconfig: './tsconfig.json', - transformers: { - before: [puyaTsTransformer], - }, - }), - ], -}) diff --git a/examples/p-ts/projects/p-ts-frontend/.algokit.toml b/examples/p-ts/projects/p-ts-frontend/.algokit.toml deleted file mode 100644 index 73ac309..0000000 --- a/examples/p-ts/projects/p-ts-frontend/.algokit.toml +++ /dev/null @@ -1,17 +0,0 @@ -[algokit] -min_version = "v2.0.0" - -[project] -type = "frontend" -name = 'p-ts-frontend' -artifacts = "src/contracts" - -[project.run] -build = { commands = ['npm run build'], description = 'Build frontend' } -test = { commands = ['npm run test'], description = 'Run frontend tests' } -lint = { commands = ['npm run lint'], description = 'Lint frontend code' } -ci-deploy-netlify = { commands = [ - 'npm install --global netlify-cli@latest', - 'netlify login', - 'netlify deploy --build --prod' - ], description = 'Deploy to Netlify' } diff --git a/examples/p-ts/projects/p-ts-frontend/.algokit/.copier-answers.yml b/examples/p-ts/projects/p-ts-frontend/.algokit/.copier-answers.yml deleted file mode 100644 index 5636d7d..0000000 --- a/examples/p-ts/projects/p-ts-frontend/.algokit/.copier-answers.yml +++ /dev/null @@ -1,9 +0,0 @@ -# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 1.1.1-13-gc5abe59 -_src_path: gh:algorandfoundation/algokit-react-frontend-template -author_email: None -author_name: None -cloud_provider: netlify -preset_name: production -project_name: p-ts-frontend - diff --git a/examples/p-ts/projects/p-ts-frontend/.editorconfig b/examples/p-ts/projects/p-ts-frontend/.editorconfig deleted file mode 100644 index a83b72c..0000000 --- a/examples/p-ts/projects/p-ts-frontend/.editorconfig +++ /dev/null @@ -1,9 +0,0 @@ -[*] -charset = utf-8 -insert_final_newline = true -end_of_line = lf -indent_style = space -indent_size = 2 -tab_width = 2 -max_line_length = 140 -trim_trailing_whitespace = true diff --git a/examples/p-ts/projects/p-ts-frontend/.env.template b/examples/p-ts/projects/p-ts-frontend/.env.template deleted file mode 100644 index 5dfbb2d..0000000 --- a/examples/p-ts/projects/p-ts-frontend/.env.template +++ /dev/null @@ -1,70 +0,0 @@ -# ====================== -# LocalNet configuration -# uncomment below to use -# ====================== - -VITE_ENVIRONMENT=local - -# Algod -VITE_ALGOD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -VITE_ALGOD_SERVER=http://localhost -VITE_ALGOD_PORT=4001 -VITE_ALGOD_NETWORK=localnet - -# Indexer -VITE_INDEXER_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -VITE_INDEXER_SERVER=http://localhost -VITE_INDEXER_PORT=8980 - -# KMD -# Please note: -# 1. This is only needed for LocalNet since -# by default KMD provider is ignored on other networks. -# 2. AlgoKit LocalNet starts with a single wallet called 'unencrypted-default-wallet', -# with heaps of tokens available for testing. -VITE_KMD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -VITE_KMD_SERVER=http://localhost -VITE_KMD_PORT=4002 -VITE_KMD_WALLET="unencrypted-default-wallet" -VITE_KMD_PASSWORD="" - -# # ====================== -# # TestNet configuration: -# # uncomment below to use -# # ====================== - -# VITE_ENVIRONMENT=local - -# # Algod -# VITE_ALGOD_TOKEN="" -# VITE_ALGOD_SERVER="https://testnet-api.algonode.cloud" -# VITE_ALGOD_PORT="" -# VITE_ALGOD_NETWORK="testnet" - -# # Indexer -# VITE_INDEXER_TOKEN="" -# VITE_INDEXER_SERVER="https://testnet-idx.algonode.cloud" -# VITE_INDEXER_PORT="" - - -# # ====================== -# # MainNet configuration: -# # uncomment below to use -# # ====================== - -# VITE_ENVIRONMENT=production - -# # Algod -# VITE_ALGOD_TOKEN="" -# VITE_ALGOD_SERVER="https://mainnet-api.algonode.cloud" -# VITE_ALGOD_PORT="" -# VITE_ALGOD_NETWORK="mainnet" - -# # Indexer -# VITE_INDEXER_TOKEN="" -# VITE_INDEXER_SERVER="https://mainnet-idx.algonode.cloud" -# VITE_INDEXER_PORT="" - - -# Add your Web3Auth Client ID here if you want to test Web3Auth integration on TestNet or Mainnet -# VITE_WEB3_AUTH_CLIENT_ID="" \ No newline at end of file diff --git a/examples/p-ts/projects/p-ts-frontend/.eslintrc b/examples/p-ts/projects/p-ts-frontend/.eslintrc deleted file mode 100644 index 868fe37..0000000 --- a/examples/p-ts/projects/p-ts-frontend/.eslintrc +++ /dev/null @@ -1,27 +0,0 @@ -{ - "root": true, - "env": { - "node": true - }, - "parser": "@typescript-eslint/parser", - "plugins": ["@typescript-eslint", "prettier"], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "plugin:prettier/recommended" - ], - "rules": { - "prettier/prettier": "warn", - "no-console": "warn", - "@typescript-eslint/no-unused-vars": [ - "warn", - { - "ignoreRestSiblings": true, - "argsIgnorePattern": "^_", - "destructuredArrayIgnorePattern": "^_" - } - ], - "prefer-template": "error" - } -} diff --git a/examples/p-ts/projects/p-ts-frontend/.gitignore b/examples/p-ts/projects/p-ts-frontend/.gitignore deleted file mode 100644 index b1ce837..0000000 --- a/examples/p-ts/projects/p-ts-frontend/.gitignore +++ /dev/null @@ -1,38 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/build - - -# dotenv environment variable files -.env -env/ - -# misc -/dist -.DS_Store - - -npm-debug.log* -yarn-debug.log* -yarn-error.log* -/test-results/ -/playwright-report/ -/playwright/.cache/ - -# PyCharm -.idea -!.idea/ -.idea/* -!.idea/runConfigurations/ - -.vercel -.netlify diff --git a/examples/p-ts/projects/p-ts-frontend/.npmrc b/examples/p-ts/projects/p-ts-frontend/.npmrc deleted file mode 100644 index c42da84..0000000 --- a/examples/p-ts/projects/p-ts-frontend/.npmrc +++ /dev/null @@ -1 +0,0 @@ -engine-strict = true diff --git a/examples/p-ts/projects/p-ts-frontend/.prettierignore b/examples/p-ts/projects/p-ts-frontend/.prettierignore deleted file mode 100644 index dbda6ae..0000000 --- a/examples/p-ts/projects/p-ts-frontend/.prettierignore +++ /dev/null @@ -1,12 +0,0 @@ -# don't ever format node_modules -node_modules -# don't lint format output (make sure it's set to your correct build folder name) -dist -build -# don't format nyc coverage output -coverage -# don't format generated types -**/generated/types.d.ts -**/generated/types.ts -# don't format ide files -.idea diff --git a/examples/p-ts/projects/p-ts-frontend/.prettierrc.cjs b/examples/p-ts/projects/p-ts-frontend/.prettierrc.cjs deleted file mode 100644 index 066b8e5..0000000 --- a/examples/p-ts/projects/p-ts-frontend/.prettierrc.cjs +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - singleQuote: true, - jsxSingleQuote: false, - semi: false, - tabWidth: 2, - trailingComma: 'all', - printWidth: 140, - endOfLine: 'lf', - arrowParens: 'always', -} diff --git a/examples/p-ts/projects/p-ts-frontend/.vscode/extensions.json b/examples/p-ts/projects/p-ts-frontend/.vscode/extensions.json deleted file mode 100644 index 5c94122..0000000 --- a/examples/p-ts/projects/p-ts-frontend/.vscode/extensions.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "recommendations": [ - "EditorConfig.EditorConfig", - "dotenv.dotenv-vscode", - "esbenp.prettier-vscode", - "dbaeumer.vscode-eslint", - "krysenlo.vite-plugin-eslint-problemmatcher", - "ms-playwright.playwright", - "Orta.vscode-jest", - "bradlc.vscode-tailwindcss", - "csstools.postcss", - ] -} - diff --git a/examples/p-ts/projects/p-ts-frontend/.vscode/launch.json b/examples/p-ts/projects/p-ts-frontend/.vscode/launch.json deleted file mode 100644 index 7edaf04..0000000 --- a/examples/p-ts/projects/p-ts-frontend/.vscode/launch.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "configurations": [ - { - "type": "msedge", - "request": "launch", - "name": "Run (Edge)", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - "presentation": { - "hidden": false, - "group": "2. Web" - } - }, - { - "type": "chrome", - "request": "launch", - "name": "Run (Chrome)", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - "presentation": { - "hidden": false, - "group": "2. Web" - } - }, - { - "type": "firefox", - "request": "launch", - "name": "Run (Firefox)", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - "presentation": { - "hidden": false, - "group": "2. Web" - } - }, - { - "name": "Run dApp", - "type": "node", - "request": "launch", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "dev"], - "cwd": "${workspaceRoot}", - "console": "integratedTerminal", - "skipFiles": ["/**", "node_modules/**"], - "presentation": { - "hidden": false, - "group": "1. Run Project", - "order": 1 - } - }, - { - "name": "Run dApp (+ LocalNet)", - "type": "node", - "request": "launch", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "dev"], - "cwd": "${workspaceRoot}", - "console": "integratedTerminal", - "skipFiles": ["/**", "node_modules/**"], - "preLaunchTask": "Start AlgoKit LocalNet", - "presentation": { - "hidden": false, - "group": "1. Run Project", - "order": 1 - } - } - ] -} diff --git a/examples/p-ts/projects/p-ts-frontend/.vscode/settings.json b/examples/p-ts/projects/p-ts-frontend/.vscode/settings.json deleted file mode 100644 index f1d7017..0000000 --- a/examples/p-ts/projects/p-ts-frontend/.vscode/settings.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "editor.formatOnSave": true, - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit", - "source.organizeImports": "explicit" - }, - "dotenv.enableAutocloaking": false, - "jest.autoRun": { - "watch": false, - "onSave": "test-file" - } -} diff --git a/examples/p-ts/projects/p-ts-frontend/.vscode/tasks.json b/examples/p-ts/projects/p-ts-frontend/.vscode/tasks.json deleted file mode 100644 index d611c4f..0000000 --- a/examples/p-ts/projects/p-ts-frontend/.vscode/tasks.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "Start AlgoKit LocalNet", - "command": "algokit", - "args": ["localnet", "start"], - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "problemMatcher": [] - } - ] -} diff --git a/examples/p-ts/projects/p-ts-frontend/README.md b/examples/p-ts/projects/p-ts-frontend/README.md deleted file mode 100644 index ae242a6..0000000 --- a/examples/p-ts/projects/p-ts-frontend/README.md +++ /dev/null @@ -1,124 +0,0 @@ -# p-ts-frontend - -This starter React project has been generated using AlgoKit. See below for default getting started instructions. - -# Setup - -### Initial Setup - -#### 1. Clone the Repository -Start by cloning this repository to your local machine. - -#### 2. Install Pre-requisites -Ensure the following pre-requisites are installed and properly configured: - -- **npm**: Node package manager. Install from [Node.js Installation Guide](https://nodejs.org/en/download/). Verify with `npm -v` to see version `18.12`+. -- **AlgoKit CLI**: Essential for project setup and operations. Install the latest version from [AlgoKit CLI Installation Guide](https://github.com/algorandfoundation/algokit-cli#install). Verify installation with `algokit --version`, expecting `2.0.0` or later. - -#### 3. Bootstrap Your Local Environment -Run the following commands within the project folder: - -- **Install Project Dependencies**: With `algokit project bootstrap all`, ensure all dependencies are ready. - -### Development Workflow - -#### Terminal -Directly manage and interact with your project using AlgoKit commands: - -1. **Build Contracts**: `algokit project run build` builds react web app and links with smart contracts in workspace, if any. -2. Remaining set of command for linting, testing and deployment can be found in respective [package.json](./package.json) file and [.algokit.toml](./.algokit.toml) files. - -#### VS Code -For a seamless experience with breakpoint debugging and other features: - -1. **Open Project**: In VS Code, open the repository root. -2. **Install Extensions**: Follow prompts to install recommended extensions. -3. **Debugging**: - - Use `F5` to start debugging. - - **Windows Users**: Select the Python interpreter at `./.venv/Scripts/python.exe` via `Ctrl/Cmd + Shift + P` > `Python: Select Interpreter` before the first run. - -#### Other IDEs -While primarily optimized for VS Code, Jetbrains WebStorm has base support for this project: - -1. **Open Project**: In your JetBrains IDE, open the repository root. -2. **Automatic Setup**: The IDE should configure the Python interpreter and virtual environment. -3. **Debugging**: Use `Shift+F10` or `Ctrl+R` to start debugging. Note: Windows users may encounter issues with pre-launch tasks due to a known bug. See [JetBrains forums](https://youtrack.jetbrains.com/issue/IDEA-277486/Shell-script-configuration-cannot-run-as-before-launch-task) for workarounds. - -## AlgoKit Workspaces and Project Management -This project supports both standalone and monorepo setups through AlgoKit workspaces. Leverage [`algokit project run`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md) commands for efficient monorepo project orchestration and management across multiple projects within a workspace. - -> Please note, by default frontend is pre configured to run against Algorand LocalNet. If you want to run against TestNet or MainNet, comment out the current environment variable and uncomment the relevant one in [`.env`](.env) file that is created after running bootstrap command and based on [`.env.template`](.env.template). - -### Continuous Integration - -This project uses [GitHub Actions](https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions) to define CI workflows, which are located in the [.github/workflows](`../../.github/workflows`) folder. - -For pull requests and pushes to `main` branch against this repository the following checks are automatically performed by GitHub Actions: - -- `install`: Installs dependencies using `npm` -- `lint`: Lints the codebase using `ESLint` -- `build`: Builds the codebase using `vite` - -> Please note, if you instantiated the project via `algokit init` without explicitly specifying the `--no-workspace` flag, we will automatically attempt to move the contents of the `.github` folder to the root of the workspace. - -### Continuous Deployment - -The project template provides base Github Actions workflows for continuous deployment to [Netlify](https://www.netlify.com/) or [Vercel](https://vercel.com/). These workflows are located in the [`.github/workflows`](./.github/workflows) folder. - -**Please note**: when configuring the github repository for the first time. Depending on selected provider you will need to set the provider secrets in the repository settings. Default setup provided by the template allows you to manage the secrets via environment variables and secrets on your github repository. - - -#### Setting up environment variables and secrets for webapp deployment - -For Vercel: -1. Retrieve your [Vercel Access Token](https://vercel.com/support/articles/how-do-i-use-a-vercel-api-access-token) -2. Install the [Vercel CLI](https://vercel.com/cli) and run `vercel login` -3. Inside your folder, run `vercel link` to create a new Vercel project -4. Inside the generated `.vercel` folder, save the `projectId` and `orgId` from the `project.json` -5. Inside GitHub, add `VERCEL_TOKEN`, `VERCEL_ORG_ID`, and `VERCEL_PROJECT_ID` as [secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets). -6. Create an .env file containing ENV vars for the project (pointing to testnet or mainnet), drag and drop the .env file to upload initial batch of default environment variables to your vercel project. -7. Upon invocation, CD pipeline will pull the VITE_ prefixed environment variables, build the project and deploy to the specified environment. - -For Netlify: -1. Retrieve your [Netlify Access Token](https://docs.netlify.com/cli/get-started/#obtain-a-token-in-the-netlify-ui) -2. Inside your folder run `netlify login` -3. Inside your folder run `netlify sites:create` to create a new site, obtain NETLIFY_SITE_ID from the output -4. Inside GitHub, add `NETLIFY_AUTH_TOKEN` and `NETLIFY_SITE_ID` as [secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets). -5. Define the VITE_ prefixed environment variables in netlify environment variables under site settings. -6. Upon invocation, CD pipeline will build the project and deploy to the specified environment. - -> If you prefer alternative deployment methods, you can modify the relevant workflow files from the [`.github/workflows`](./.github/workflows) folder or modify deploy scripts in `.algokit.toml`. - - -# Algorand Wallet integrations - -The template comes with [`use-wallet`](https://github.com/txnlab/use-wallet) integration, which provides a React hook for connecting to an Algorand wallet providers. The following wallet providers are included by default: -- LocalNet: -- - [KMD/Local Wallet](https://github.com/TxnLab/use-wallet#kmd-algorand-key-management-daemon) - Algorand's Key Management Daemon (KMD) is a service that manages Algorand private keys and signs transactions. Works best with AlgoKit LocalNet and allows you to easily test and interact with your dApps locally. -- TestNet and others: -- - [Pera Wallet](https://perawallet.app). -- - [Defly Wallet](https://defly.app). -- - [Exodus Wallet](https://www.exodus.com). -- - [Daffi Wallet](https://www.daffi.me). - -Refer to official [`use-wallet`](https://github.com/txnlab/use-wallet) documentation for detailed guidelines on how to integrate with other wallet providers (such as WalletConnect v2). Too see implementation details on the use wallet hook and initialization of extra wallet providers refer to [`App.tsx`](./src/App.tsx). - -# Tools - -This project makes use of React and Tailwind to provider a base project configuration to develop frontends for your Algorand dApps and interactions with smart contracts. The following tools are in use: - -- [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-ts) - Various TypeScript utilities to simplify interactions with Algorand and AlgoKit. -- [React](https://reactjs.org/) - A JavaScript library for building user interfaces. -- [Tailwind CSS](https://tailwindcss.com/) - A utility-first CSS framework for rapidly building custom designs. -- [daisyUI](https://daisyui.com/) - A component library for Tailwind CSS. -- [use-wallet](https://github.com/txnlab/use-wallet) - A React hook for connecting to an Algorand wallet providers. -- [npm](https://www.npmjs.com/): Node.js package manager -- [jest](https://jestjs.io/): JavaScript testing framework -- [playwright](https://playwright.dev/): Browser automation library -- [Prettier](https://prettier.io/): Opinionated code formatter -- [ESLint](https://eslint.org/): Tool for identifying and reporting on patterns in JavaScript -- Github Actions workflows for build validation -It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. -# Integrating with smart contracts and application clients - -Refer to the detailed guidance on [integrating with smart contracts and application clients](./src/contracts/README.md). In essence, for any smart contract codebase generated with AlgoKit or other tools that produce compile contracts into ARC34 compliant app specifications, you can use the `algokit generate` command to generate TypeScript or Python typed client. Once generated simply drag and drop the generated client into `./src/contracts` and import it into your React components as you see fit. diff --git a/examples/p-ts/projects/p-ts-frontend/index.html b/examples/p-ts/projects/p-ts-frontend/index.html deleted file mode 100644 index 5a2ef4f..0000000 --- a/examples/p-ts/projects/p-ts-frontend/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - AlgoKit React Template - - -
- - - diff --git a/examples/p-ts/projects/p-ts-frontend/jest.config.ts b/examples/p-ts/projects/p-ts-frontend/jest.config.ts deleted file mode 100644 index 28a8c3d..0000000 --- a/examples/p-ts/projects/p-ts-frontend/jest.config.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { Config } from '@jest/types' - -const config: Config.InitialOptions = { - preset: 'ts-jest', - testEnvironment: 'node', - testMatch: ['**/*.spec.ts', '**/*.spec.tsx'], - moduleDirectories: ['node_modules', 'src'], - transform: { - '': [ - 'ts-jest', - { - tsconfig: 'tsconfig.test.json', - }, - ], - }, - coveragePathIgnorePatterns: ['tests'], - testPathIgnorePatterns: ['/tests/'], - } - -export default config diff --git a/examples/p-ts/projects/p-ts-frontend/package.json b/examples/p-ts/projects/p-ts-frontend/package.json deleted file mode 100644 index 5db411d..0000000 --- a/examples/p-ts/projects/p-ts-frontend/package.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "name": "p-ts-frontend", - "version": "0.1.0", - "author": { - "name": "None", - "email": "None" - }, - "private": true, - "type": "module", - "engines": { - "node": ">=20.0", - "npm": ">=9.0" - }, - "devDependencies": { - "@algorandfoundation/algokit-client-generator": "^7.0.0-alpha.5", - "@types/node": "^18.17.14", - "@types/react": "^18.2.11", - "@types/react-dom": "^18.2.4", - "@vitejs/plugin-react": "^4.2.1", - "autoprefixer": "^10.4.14", - "eslint": "^8.56.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.1.3", - "@typescript-eslint/eslint-plugin": "^7.0.2", - "@typescript-eslint/parser": "^7.0.2", - "postcss": "^8.4.24", - "tailwindcss": "3.3.2", - "ts-jest": "^29.1.1", - "@types/jest": "29.5.2", - "ts-node": "^10.9.1", - "typescript": "^5.1.6", - "@playwright/test": "^1.35.0", - "playwright": "^1.35.0", - "vite": "^5.0.0", - "vite-plugin-node-polyfills": "^0.22.0" - }, - "dependencies": { - "@algorandfoundation/algokit-utils": "^10.0.0-alpha.40", - "@blockshake/defly-connect": "^1.2.1", - "@perawallet/connect": "^1.4.1", - "@txnlab/use-wallet": "^4.6.0", - "@txnlab/use-wallet-react": "^4.6.0", - "@web3auth/modal": "^9.7.0", - "daisyui": "^4.0.0", - "notistack": "^3.0.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "tslib": "^2.6.2" - }, - "scripts": { - "generate:app-clients": "algokit project link --all", - "dev": "npm run generate:app-clients && vite", - "build": "npm run generate:app-clients && tsc && vite build", - "test": "jest --coverage --passWithNoTests", - "playwright:test": "playwright test", - "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "lint:fix": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0 --fix", - "preview": "vite preview" - }, - "eslintConfig": { - "extends": [ - "react-app/jest", - "react-app" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "overrides": { - "ws@>7.0.0 <7.5.9": "7.5.10" - } -} diff --git a/examples/p-ts/projects/p-ts-frontend/playwright.config.ts b/examples/p-ts/projects/p-ts-frontend/playwright.config.ts deleted file mode 100644 index d7cbca6..0000000 --- a/examples/p-ts/projects/p-ts-frontend/playwright.config.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { defineConfig, devices } from '@playwright/test' - -/** - * Read environment variables from file. - * https://github.com/motdotla/dotenv - */ -// require('dotenv').config(); - -/** - * See https://playwright.dev/docs/test-configuration. - */ -export default defineConfig({ - testDir: './tests', - /* Run tests in files in parallel */ - fullyParallel: true, - /* Fail the build on CI if you accidentally left test.only in the source code. */ - forbidOnly: !!process.env.CI, - /* Retry on CI only */ - retries: process.env.CI ? 2 : 0, - /* Opt out of parallel tests on CI. */ - workers: process.env.CI ? 1 : undefined, - /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: 'html', - /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ - use: { - /* Base URL to use in actions like `await page.goto('/')`. */ - // baseURL: 'http://127.0.0.1:3000', - - /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ - trace: 'on-first-retry', - testIdAttribute: 'data-test-id', - }, - - /* Configure projects for major browsers */ - projects: [ - { - name: 'chromium', - use: { ...devices['Desktop Chrome'] }, - }, - - { - name: 'firefox', - use: { ...devices['Desktop Firefox'] }, - }, - - /* Test against mobile viewports. */ - // { - // name: 'Mobile Chrome', - // use: { ...devices['Pixel 5'] }, - // }, - // { - // name: 'Mobile Safari', - // use: { ...devices['iPhone 12'] }, - // }, - - /* Test against branded browsers. */ - // { - // name: 'Microsoft Edge', - // use: { ...devices['Desktop Edge'], channel: 'msedge' }, - // }, - // { - // name: 'Google Chrome', - // use: { ..devices['Desktop Chrome'], channel: 'chrome' }, - // }, - ], - - /* Run your local dev server before starting the tests */ - webServer: { - command: 'npm run dev', - url: 'http://localhost:5173', - reuseExistingServer: !process.env.CI, - }, -}) diff --git a/examples/p-ts/projects/p-ts-frontend/postcss.config.cjs b/examples/p-ts/projects/p-ts-frontend/postcss.config.cjs deleted file mode 100644 index 33ad091..0000000 --- a/examples/p-ts/projects/p-ts-frontend/postcss.config.cjs +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -} diff --git a/examples/p-ts/projects/p-ts-frontend/public/index.html b/examples/p-ts/projects/p-ts-frontend/public/index.html deleted file mode 100644 index 0d3a3a5..0000000 --- a/examples/p-ts/projects/p-ts-frontend/public/index.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - React App - - - -
- - - diff --git a/examples/p-ts/projects/p-ts-frontend/public/robots.txt b/examples/p-ts/projects/p-ts-frontend/public/robots.txt deleted file mode 100644 index e9e57dc..0000000 --- a/examples/p-ts/projects/p-ts-frontend/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * -Disallow: diff --git a/examples/p-ts/projects/p-ts-frontend/src/App.tsx b/examples/p-ts/projects/p-ts-frontend/src/App.tsx deleted file mode 100644 index f346006..0000000 --- a/examples/p-ts/projects/p-ts-frontend/src/App.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { SupportedWallet, WalletId, WalletManager, WalletProvider } from '@txnlab/use-wallet-react' -import { SnackbarProvider } from 'notistack' -import Home from './Home' -import { getAlgodConfigFromViteEnvironment, getKmdConfigFromViteEnvironment } from './utils/network/getAlgoClientConfigs' - -let supportedWallets: SupportedWallet[] -if (import.meta.env.VITE_ALGOD_NETWORK === 'localnet') { - const kmdConfig = getKmdConfigFromViteEnvironment() - supportedWallets = [ - { - id: WalletId.KMD, - options: { - baseServer: kmdConfig.server, - token: String(kmdConfig.token), - port: String(kmdConfig.port), - }, - }, - ] -} else { - supportedWallets = [ - { id: WalletId.DEFLY }, - { id: WalletId.PERA }, - { id: WalletId.EXODUS }, - // If you are interested in WalletConnect v2 provider - // refer to https://github.com/TxnLab/use-wallet for detailed integration instructions - ] -} - -export default function App() { - const algodConfig = getAlgodConfigFromViteEnvironment() - - const walletManager = new WalletManager({ - wallets: supportedWallets, - defaultNetwork: algodConfig.network, - networks: { - [algodConfig.network]: { - algod: { - baseServer: algodConfig.server, - port: algodConfig.port, - token: String(algodConfig.token), - }, - }, - }, - options: { - resetNetwork: true, - }, - }) - - return ( - - - - - - ) -} diff --git a/examples/p-ts/projects/p-ts-frontend/src/assets/logo.svg b/examples/p-ts/projects/p-ts-frontend/src/assets/logo.svg deleted file mode 100644 index 7169476..0000000 --- a/examples/p-ts/projects/p-ts-frontend/src/assets/logo.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/examples/p-ts/projects/p-ts-frontend/src/components/Account.tsx b/examples/p-ts/projects/p-ts-frontend/src/components/Account.tsx deleted file mode 100644 index 081ce47..0000000 --- a/examples/p-ts/projects/p-ts-frontend/src/components/Account.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { useWallet } from '@txnlab/use-wallet-react' -import { useMemo } from 'react' -import { ellipseAddress } from '../utils/ellipseAddress' -import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' - -const Account = () => { - const { activeAddress } = useWallet() - const algoConfig = getAlgodConfigFromViteEnvironment() - - const networkName = useMemo(() => { - return algoConfig.network === '' ? 'localnet' : algoConfig.network.toLocaleLowerCase() - }, [algoConfig.network]) - - return ( - - ) -} - -export default Account diff --git a/examples/p-ts/projects/p-ts-frontend/src/components/ConnectWallet.tsx b/examples/p-ts/projects/p-ts-frontend/src/components/ConnectWallet.tsx deleted file mode 100644 index 8ff01dc..0000000 --- a/examples/p-ts/projects/p-ts-frontend/src/components/ConnectWallet.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import { useWallet, Wallet, WalletId } from '@txnlab/use-wallet-react' -import Account from './Account' - -interface ConnectWalletInterface { - openModal: boolean - closeModal: () => void -} - -const ConnectWallet = ({ openModal, closeModal }: ConnectWalletInterface) => { - const { wallets, activeAddress } = useWallet() - - const isKmd = (wallet: Wallet) => wallet.id === WalletId.KMD - - return ( - -
-

Select wallet provider

- -
- {activeAddress && ( - <> - -
- - )} - - {!activeAddress && - wallets?.map((wallet) => ( - - ))} -
- -
- - {activeAddress && ( - - )} -
- -
- ) -} -export default ConnectWallet diff --git a/examples/p-ts/projects/p-ts-frontend/src/components/ErrorBoundary.tsx b/examples/p-ts/projects/p-ts-frontend/src/components/ErrorBoundary.tsx deleted file mode 100644 index 435bf61..0000000 --- a/examples/p-ts/projects/p-ts-frontend/src/components/ErrorBoundary.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import React, { ReactNode } from 'react' - -interface ErrorBoundaryProps { - children: ReactNode -} - -interface ErrorBoundaryState { - hasError: boolean - error: Error | null -} - -class ErrorBoundary extends React.Component { - constructor(props: ErrorBoundaryProps) { - super(props) - this.state = { hasError: false, error: null } - } - - static getDerivedStateFromError(error: Error): ErrorBoundaryState { - // Update state so the next render will show the fallback UI. - return { hasError: true, error: error } - } - - render(): ReactNode { - if (this.state.hasError) { - // You can render any custom fallback UI - return ( -
-
-
-

Error occured

-

- {this.state.error?.message.includes('Attempt to get default algod configuration') - ? 'Please make sure to set up your environment variables correctly. Create a .env file based on .env.template and fill in the required values. This controls the network and credentials for connections with Algod and Indexer.' - : this.state.error?.message} -

-
-
-
- ) - } - - return this.props.children - } -} - -export default ErrorBoundary diff --git a/examples/p-ts/projects/p-ts-frontend/src/components/Transact.tsx b/examples/p-ts/projects/p-ts-frontend/src/components/Transact.tsx deleted file mode 100644 index 3f8191d..0000000 --- a/examples/p-ts/projects/p-ts-frontend/src/components/Transact.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { algo, AlgorandClient } from '@algorandfoundation/algokit-utils' -import { encodeTransactionRaw } from '@algorandfoundation/algokit-utils/transact' -import { useWallet } from '@txnlab/use-wallet-react' -import { useSnackbar } from 'notistack' -import { useState } from 'react' -import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' - -interface TransactInterface { - openModal: boolean - setModalState: (value: boolean) => void -} - -const Transact = ({ openModal, setModalState }: TransactInterface) => { - const [loading, setLoading] = useState(false) - const [receiverAddress, setReceiverAddress] = useState('') - - const algodConfig = getAlgodConfigFromViteEnvironment() - const algorand = AlgorandClient.fromConfig({ algodConfig }) - - const { enqueueSnackbar } = useSnackbar() - - const { signTransactions, activeAddress } = useWallet() - - const handleSubmitAlgo = async () => { - setLoading(true) - - if (!signTransactions || !activeAddress) { - enqueueSnackbar('Please connect wallet first', { variant: 'warning' }) - return - } - - try { - enqueueSnackbar('Sending transaction...', { variant: 'info' }) - const result = await algorand.send.payment({ - signer: async (txnGroup, indexesToSign) => { - const encoded = txnGroup.map((txn) => encodeTransactionRaw(txn)) - const signed = await signTransactions(encoded, indexesToSign) - return signed.filter((s): s is Uint8Array => s !== null) - }, - sender: activeAddress, - receiver: receiverAddress, - amount: algo(1), - }) - enqueueSnackbar(`Transaction sent: ${result.txIds[0]}`, { variant: 'success' }) - setReceiverAddress('') - } catch (e) { - enqueueSnackbar('Failed to send transaction', { variant: 'error' }) - } - - setLoading(false) - } - - return ( - -
-

Send payment transaction

-
- { - setReceiverAddress(e.target.value) - }} - /> -
- - -
-
-
- ) -} - -export default Transact diff --git a/examples/p-ts/projects/p-ts-frontend/src/contracts/README.md b/examples/p-ts/projects/p-ts-frontend/src/contracts/README.md deleted file mode 100644 index 04629b1..0000000 --- a/examples/p-ts/projects/p-ts-frontend/src/contracts/README.md +++ /dev/null @@ -1,14 +0,0 @@ -## How to connect my web app with Algorand smart contracts? - -The following folder is reserved for the Algorand Application Clients. The clients are used to interact with instances of Algorand Smart Contracts (ASC1s) deployed on-chain. - -To integrate this react frontend template with your smart contracts codebase, perform the following steps: - -1. Generate the typed client using `algokit generate client -l typescript -o {path/to/this/folder}` or using the dedicated `link` command `algokit project link` (ensure to invoke it from the root of this react project). Using the `link` command is especially useful within workspaces that have multiple contract projects. -2. The generated typescript client should be ready to be imported and used in this react frontend template, making it a full fledged dApp. - -> Please note, by default this template defines `"generate:app-clients": "algokit project link --all"` which is a shortcut to automatically link TEAL code from all `contract` projects in the workspace as typed clients into the `frontend` project that is invoking the `link` command. Refer to [documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/link.md) to read more about `link` command. - -## **How to interact with the smart contract?** - -The generated client provides a set of functions that can be used to interact with the ABI (Application Binary Interface) compliant Algorand smart contract. For example, if the smart contract has a function called `hello`, the generated client will have a function called `hello` that can be used to interact with the smart contract. Refer to a [full-stack end-to-end starter template](https://github.com/algorandfoundation/algokit-fullstack-template) for a reference example on invoking and interacting with typescript typed clients generated. diff --git a/examples/p-ts/projects/p-ts-frontend/src/interfaces/network.ts b/examples/p-ts/projects/p-ts-frontend/src/interfaces/network.ts deleted file mode 100644 index fdb97ae..0000000 --- a/examples/p-ts/projects/p-ts-frontend/src/interfaces/network.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/network-client' - -export interface AlgoViteClientConfig extends AlgoClientConfig { - /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ - server: string - /** The port to use e.g. 4001, 443, etc. */ - port: string | number - /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string - /** String representing current Algorand Network type (testnet/mainnet and etc) */ - network: string -} - -export interface AlgoViteKMDConfig extends AlgoClientConfig { - /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ - server: string - /** The port to use e.g. 4001, 443, etc. */ - port: string | number - /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string - /** KMD wallet name */ - wallet: string - /** KMD wallet password */ - password: string -} diff --git a/examples/p-ts/projects/p-ts-frontend/src/main.tsx b/examples/p-ts/projects/p-ts-frontend/src/main.tsx deleted file mode 100644 index adf72ec..0000000 --- a/examples/p-ts/projects/p-ts-frontend/src/main.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App' -import './styles/main.css' -import ErrorBoundary from './components/ErrorBoundary' - -ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - - - - - , -) diff --git a/examples/p-ts/projects/p-ts-frontend/src/styles/main.css b/examples/p-ts/projects/p-ts-frontend/src/styles/main.css deleted file mode 100644 index b5c61c9..0000000 --- a/examples/p-ts/projects/p-ts-frontend/src/styles/main.css +++ /dev/null @@ -1,3 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/examples/p-ts/projects/p-ts-frontend/src/utils/ellipseAddress.spec.tsx b/examples/p-ts/projects/p-ts-frontend/src/utils/ellipseAddress.spec.tsx deleted file mode 100644 index 2cbff10..0000000 --- a/examples/p-ts/projects/p-ts-frontend/src/utils/ellipseAddress.spec.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { ellipseAddress } from './ellipseAddress' - -describe('ellipseAddress', () => { - it('should return ellipsed address with specified width', () => { - const address = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' - const result = ellipseAddress(address, 4) - expect(result).toBe('aaaa...aaaa') - }) - - it('should return empty string when address is empty', () => { - const address = '' - const result = ellipseAddress(address) - expect(result).toBe('') - }) -}) diff --git a/examples/p-ts/projects/p-ts-frontend/src/utils/ellipseAddress.ts b/examples/p-ts/projects/p-ts-frontend/src/utils/ellipseAddress.ts deleted file mode 100644 index db97e48..0000000 --- a/examples/p-ts/projects/p-ts-frontend/src/utils/ellipseAddress.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function ellipseAddress(address: string | null, width = 6): string { - return address ? `${address.slice(0, width)}...${address.slice(-width)}` : (address ?? '') -} diff --git a/examples/p-ts/projects/p-ts-frontend/src/utils/network/getAlgoClientConfigs.ts b/examples/p-ts/projects/p-ts-frontend/src/utils/network/getAlgoClientConfigs.ts deleted file mode 100644 index b5121f8..0000000 --- a/examples/p-ts/projects/p-ts-frontend/src/utils/network/getAlgoClientConfigs.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { AlgoViteClientConfig, AlgoViteKMDConfig } from '../../interfaces/network' - -export function getAlgodConfigFromViteEnvironment(): AlgoViteClientConfig { - if (!import.meta.env.VITE_ALGOD_SERVER) { - throw new Error('Attempt to get default algod configuration without specifying VITE_ALGOD_SERVER in the environment variables') - } - - return { - server: import.meta.env.VITE_ALGOD_SERVER, - port: import.meta.env.VITE_ALGOD_PORT, - token: import.meta.env.VITE_ALGOD_TOKEN, - network: import.meta.env.VITE_ALGOD_NETWORK, - } -} - -export function getIndexerConfigFromViteEnvironment(): AlgoViteClientConfig { - if (!import.meta.env.VITE_INDEXER_SERVER) { - throw new Error('Attempt to get default algod configuration without specifying VITE_INDEXER_SERVER in the environment variables') - } - - return { - server: import.meta.env.VITE_INDEXER_SERVER, - port: import.meta.env.VITE_INDEXER_PORT, - token: import.meta.env.VITE_INDEXER_TOKEN, - network: import.meta.env.VITE_ALGOD_NETWORK, - } -} - -export function getKmdConfigFromViteEnvironment(): AlgoViteKMDConfig { - if (!import.meta.env.VITE_KMD_SERVER) { - throw new Error('Attempt to get default kmd configuration without specifying VITE_KMD_SERVER in the environment variables') - } - - return { - server: import.meta.env.VITE_KMD_SERVER, - port: import.meta.env.VITE_KMD_PORT, - token: import.meta.env.VITE_KMD_TOKEN, - wallet: import.meta.env.VITE_KMD_WALLET, - password: import.meta.env.VITE_KMD_PASSWORD, - } -} diff --git a/examples/p-ts/projects/p-ts-frontend/src/vite-env.d.ts b/examples/p-ts/projects/p-ts-frontend/src/vite-env.d.ts deleted file mode 100644 index 67c2d30..0000000 --- a/examples/p-ts/projects/p-ts-frontend/src/vite-env.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -/// - -interface ImportMetaEnv { - readonly VITE_ENVIRONMENT: string - - readonly VITE_ALGOD_TOKEN: string - readonly VITE_ALGOD_SERVER: string - readonly VITE_ALGOD_PORT: string - readonly VITE_ALGOD_NETWORK: string - - readonly VITE_INDEXER_TOKEN: string - readonly VITE_INDEXER_SERVER: string - readonly VITE_INDEXER_PORT: string - - readonly VITE_KMD_TOKEN: string - readonly VITE_KMD_SERVER: string - readonly VITE_KMD_PORT: string - readonly VITE_KMD_PASSWORD: string - readonly VITE_KMD_WALLET: string -} - -interface ImportMeta { - readonly env: ImportMetaEnv -} diff --git a/examples/p-ts/projects/p-ts-frontend/tailwind.config.cjs b/examples/p-ts/projects/p-ts-frontend/tailwind.config.cjs deleted file mode 100644 index eaaba6c..0000000 --- a/examples/p-ts/projects/p-ts-frontend/tailwind.config.cjs +++ /dev/null @@ -1,12 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -module.exports = { - content: ['./src/**/*.{js,ts,jsx,tsx}'], - theme: { - extend: {}, - }, - daisyui: { - themes: ['lofi'], - logs: false, - }, - plugins: [require('daisyui')], -} diff --git a/examples/p-ts/projects/p-ts-frontend/tests/example.spec.ts b/examples/p-ts/projects/p-ts-frontend/tests/example.spec.ts deleted file mode 100644 index a62aae4..0000000 --- a/examples/p-ts/projects/p-ts-frontend/tests/example.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { algorandFixture } from '@algorandfoundation/algokit-utils/testing' -import { expect, test } from '@playwright/test' - -const localnet = algorandFixture() - -test.beforeEach(async ({ page }) => { - await localnet.newScope() - await page.goto('http://localhost:5173/') -}) - -test('has title', async ({ page }) => { - // Expect a title "to contain" a substring. - await expect(page).toHaveTitle('AlgoKit React Template') -}) - -test('get started link', async ({ page }) => { - await expect(page.getByTestId('getting-started')).toHaveText('Getting started') -}) - -test('authentication and dummy payment transaction', async ({ page }) => { - page.on('dialog', async (dialog) => { - dialog.message() === 'KMD password' ? await dialog.accept() : await dialog.dismiss() - }) - - // 1. Must be able to connect to a KMD wallet provider - await page.getByTestId('connect-wallet').click() - await page.getByTestId('kmd-connect').click() - await page.getByTestId('close-wallet-modal').click() - - // 2. Must be able to send a dummy payment transaction - await page.getByTestId('transactions-demo').click() - - await page.getByTestId('receiver-address').fill(localnet.context.testAccount.toString()) - await page.getByTestId('send-algo').click() - - // 3. Must be able to see a notification that the transaction was sent - const notification = await page.getByText('Transaction sent:') - await notification.waitFor() - expect(notification).toBeTruthy() -}) diff --git a/examples/p-ts/projects/p-ts-frontend/tsconfig.json b/examples/p-ts/projects/p-ts-frontend/tsconfig.json deleted file mode 100644 index 855bfc3..0000000 --- a/examples/p-ts/projects/p-ts-frontend/tsconfig.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, - "module": "ESNext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, - "declaration": true /* Generates corresponding '.d.ts' file. */, - "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, - "sourceMap": true /* Generates corresponding '.map' file. */, - "strict": true /* Enable all strict type-checking options. */, - "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, - "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, - "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, - "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, - "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */, - "skipLibCheck": true /* Skip type checking of declaration files. */, - "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, - "allowJs": false, - "allowSyntheticDefaultImports": true, - "moduleResolution": "Bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - "outDir": "./dist/" - }, - "include": [ - "src/**/*.ts", - "src/**/*.tsx", - "vite.config.js", - "src/utils/ellipseAddress.spec.tsx", - "src/utils/ellipseAddress.spec.tsx", - "src/main.tsx", - ], - "references": [ - { - "path": "./tsconfig.node.json" - } - ] -} diff --git a/examples/p-ts/projects/p-ts-frontend/tsconfig.node.json b/examples/p-ts/projects/p-ts-frontend/tsconfig.node.json deleted file mode 100644 index e32f207..0000000 --- a/examples/p-ts/projects/p-ts-frontend/tsconfig.node.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "module": "NodeNext", - "moduleResolution": "NodeNext", - "allowSyntheticDefaultImports": true - }, - "include": ["vite.config.ts"] -} diff --git a/examples/p-ts/projects/p-ts-frontend/vite.config.ts b/examples/p-ts/projects/p-ts-frontend/vite.config.ts deleted file mode 100644 index e42dc7c..0000000 --- a/examples/p-ts/projects/p-ts-frontend/vite.config.ts +++ /dev/null @@ -1,15 +0,0 @@ -import react from '@vitejs/plugin-react' -import { defineConfig } from 'vite' -import { nodePolyfills } from 'vite-plugin-node-polyfills' - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [ - react(), - nodePolyfills({ - globals: { - Buffer: true, - }, - }), - ], -}) diff --git a/examples/s-py/.algokit/.copier-answers.yml b/examples/s-py/.algokit/.copier-answers.yml index da992b7..b9b0549 100644 --- a/examples/s-py/.algokit/.copier-answers.yml +++ b/examples/s-py/.algokit/.copier-answers.yml @@ -1,6 +1,6 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 2.1.8-8-g954a453 -_src_path: .. +_commit: 2.1.8-11-g7668422 +_src_path: /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template author_email: None author_name: None contract_name: hello_world diff --git a/examples/s-py/.algokit/generators/create-devcontainer/copier.yaml b/examples/s-py/.algokit/generators/create-devcontainer/copier.yaml deleted file mode 100644 index e98f334..0000000 --- a/examples/s-py/.algokit/generators/create-devcontainer/copier.yaml +++ /dev/null @@ -1,4 +0,0 @@ -_tasks: - - "echo '==== Successfully generated new .devcontainer.json file 🚀 ===='" - -_templates_suffix: ".j2" diff --git a/examples/s-py/.algokit/generators/create-devcontainer/devcontainer.json b/examples/s-py/.algokit/generators/create-devcontainer/devcontainer.json deleted file mode 100644 index 6452c65..0000000 --- a/examples/s-py/.algokit/generators/create-devcontainer/devcontainer.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "forwardPorts": [4001, 4002, 8980, 5173], - "portsAttributes": { - "4001": { - "label": "algod" - }, - "4002": { - "label": "kmd" - }, - "8980": { - "label": "indexer" - }, - "5173": { - "label": "vite" - } - }, - "postCreateCommand": "mkdir -p ~/.config/algokit && pipx install algokit && sudo chown -R codespace:codespace ~/.config/algokit", - "postStartCommand": "for i in {1..5}; do algokit localnet status > /dev/null 2>&1 && break || sleep 30; algokit localnet reset; done" -} diff --git a/examples/s-py/.editorconfig b/examples/s-py/.editorconfig deleted file mode 100644 index 5e550a1..0000000 --- a/examples/s-py/.editorconfig +++ /dev/null @@ -1,10 +0,0 @@ -[*] -charset = utf-8 -insert_final_newline = true -end_of_line = lf -indent_style = space -indent_size = 2 -tab_width = 2 -max_line_length = 140 -trim_trailing_whitespace = true -single_quote = true diff --git a/examples/s-py/.gitattributes b/examples/s-py/.gitattributes deleted file mode 100644 index 6313b56..0000000 --- a/examples/s-py/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text=auto eol=lf diff --git a/examples/s-py/.gitignore b/examples/s-py/.gitignore deleted file mode 100644 index 4105eb2..0000000 --- a/examples/s-py/.gitignore +++ /dev/null @@ -1,170 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -#pdm.lock -# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it -# in version control. -# https://pdm.fming.dev/#use-with-ide -.pdm.toml - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Ruff (linter) -.ruff_cache/ - -# Cython debug symbols -cython_debug/ - -# PyCharm -.idea/ -!.idea/runConfigurations - -# macOS -.DS_Store - -# Received approval test files -*.received.* - -# NPM -node_modules - diff --git a/examples/s-py/copy_files.sh b/examples/s-py/copy_files.sh new file mode 100644 index 0000000..749b01f --- /dev/null +++ b/examples/s-py/copy_files.sh @@ -0,0 +1,23 @@ + +#!/bin/bash +# Script to copy required files to the frontend project +# Usage: ./copy_files.sh + + +project_name="$1" +frontend_root="./projects/${project_name}-frontend" + +# Ensure directories exist +mkdir -p "${frontend_root}/src/components" + +# Copy files +cp "./inject_content/Home.tsx" "${frontend_root}/src/Home.tsx" +cp "./inject_content/AppCalls.tsx" "${frontend_root}/src/components/AppCalls.tsx" + +echo "Template completed successfully!" +# remove inject_content folder +rm -rf "./inject_content" +# self destruct the file +rm -f "$0" + + diff --git a/examples/s-py/projects/s-py-frontend/src/components/AppCalls.tsx b/examples/s-py/inject_content/AppCalls.tsx similarity index 100% rename from examples/s-py/projects/s-py-frontend/src/components/AppCalls.tsx rename to examples/s-py/inject_content/AppCalls.tsx diff --git a/examples/s-py/projects/s-py-frontend/src/Home.tsx b/examples/s-py/inject_content/Home.tsx similarity index 100% rename from examples/s-py/projects/s-py-frontend/src/Home.tsx rename to examples/s-py/inject_content/Home.tsx diff --git a/examples/s-py/projects/.gitkeep b/examples/s-py/projects/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/examples/s-py/projects/s-py-contracts/.algokit.toml b/examples/s-py/projects/s-py-contracts/.algokit.toml deleted file mode 100644 index 57fc076..0000000 --- a/examples/s-py/projects/s-py-contracts/.algokit.toml +++ /dev/null @@ -1,46 +0,0 @@ -[algokit] -min_version = "v2.0.0" - -[generate.smart-contract] -description = "Generate a new smart contract for existing project" -path = ".algokit/generators/create_contract" - -[generate.env-file] -description = "Generate a new generic or Algorand network specific .env file" -path = ".algokit/generators/create_env_file" - -[project] -type = 'contract' -name = 's-py-contracts' -artifacts = 'smart_contracts/artifacts' - -[project.deploy] -command = "npm run deploy:ci" - -[project.deploy.testnet] -environment_secrets = [ - "DEPLOYER_MNEMONIC", -] - -[project.deploy.mainnet] -environment_secrets = [ - "DEPLOYER_MNEMONIC", -] - -[project.run] -# Commands intented for use locally and in CI -build = { commands = [ - 'poetry run python -m smart_contracts build', -], description = 'Build all smart contracts in the project' } -lint = { commands = [ -], description = 'Perform linting' } -audit-teal = { commands = [ - # 🚨 IMPORTANT 🚨: For strict TEAL validation, remove --exclude statements. The default starter contract is not for production. Ensure thorough testing and adherence to best practices in smart contract development. This is not a replacement for a professional audit. - 'algokit task analyze smart_contracts/artifacts --recursive --force --exclude rekey-to --exclude is-updatable --exclude missing-fee-check --exclude is-deletable --exclude can-close-asset --exclude can-close-account --exclude unprotected-deletable --exclude unprotected-updatable', -], description = 'Audit TEAL files' } - -# Commands intented for CI only, prefixed with `ci-` by convention -ci-teal-diff = { commands = [ - 'git add -N ./smart_contracts/artifacts', - 'git diff --exit-code --minimal ./smart_contracts/artifacts', -], description = 'Check TEAL files for differences' } diff --git a/examples/s-py/projects/s-py-contracts/.algokit/.copier-answers.yml b/examples/s-py/projects/s-py-contracts/.algokit/.copier-answers.yml deleted file mode 100644 index 820c129..0000000 --- a/examples/s-py/projects/s-py-contracts/.algokit/.copier-answers.yml +++ /dev/null @@ -1,10 +0,0 @@ -# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 1.8.1-13-g270c4a5 -_src_path: gh:algorandfoundation/algokit-python-template -author_email: None -author_name: None -contract_name: hello_world -deployment_language: typescript -preset_name: starter -project_name: s-py-contracts - diff --git a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/copier.yaml b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/copier.yaml deleted file mode 100644 index 73805de..0000000 --- a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/copier.yaml +++ /dev/null @@ -1,10 +0,0 @@ -_tasks: - - "echo '==== Successfully initialized new smart contract 🚀 ===='" - -contract_name: - type: str - help: Name of your new contract. - placeholder: "my-new-contract" - default: "my-new-contract" - -_templates_suffix: ".j2" diff --git a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.py.j2 b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.py.j2 deleted file mode 100644 index 829e3a0..0000000 --- a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.py.j2 +++ /dev/null @@ -1,9 +0,0 @@ -# pyright: reportMissingModuleSource=false -from algopy import ARC4Contract, String -from algopy.arc4 import abimethod - - -class {{ contract_name.split('_')|map('capitalize')|join }}(ARC4Contract): - @abimethod() - def hello(self, name: String) -> String: - return "Hello, " + name diff --git a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 deleted file mode 100644 index 11464e7..0000000 --- a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 +++ /dev/null @@ -1,33 +0,0 @@ -import { AlgorandClient } from '@algorandfoundation/algokit-utils' -import { {{ contract_name.split('_')|map('capitalize')|join }}Factory } from '../artifacts/{{ contract_name }}/{{ contract_name.split('_')|map('capitalize')|join }}Client' - -// Below is a showcase of various deployment options you can use in TypeScript Client -export async function deploy() { - console.log('=== Deploying {{ contract_name.split('_')|map('capitalize')|join }} ===') - - const algorand = AlgorandClient.fromEnvironment() - const deployer = await algorand.account.fromEnvironment('DEPLOYER') - - const factory = algorand.client.getTypedAppFactory({{ contract_name.split('_')|map('capitalize')|join }}Factory, { - defaultSender: deployer.addr, - }) - - const { appClient, result } = await factory.deploy({ onUpdate: 'append', onSchemaBreak: 'append' }) - - // If app was just created fund the app account - if (['create', 'replace'].includes(result.operationPerformed)) { - await algorand.send.payment({ - amount: (1).algo(), - sender: deployer.addr, - receiver: app.appAddress, - }) - } - - const method = 'hello' - const response = await appClient.send.hello({ - args: { name: 'world' }, - }) - console.log( - `Called ${method} on ${appClient.appClient.appName} (${appClient.appClient.appId}) with name = world, received: ${response.return}`, - ) -} diff --git a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/copier.yaml b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/copier.yaml deleted file mode 100644 index afa2cac..0000000 --- a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/copier.yaml +++ /dev/null @@ -1,49 +0,0 @@ -_tasks: - - "echo '==== Successfully generated new .env file 🚀 ===='" - -target_network: - type: str - help: Name of your target network. - choices: - - mainnet - - testnet - - localnet - - custom - default: "localnet" - when: "{{ not use_generic_env }}" - -custom_network_name: - type: str - help: Name of your custom Algorand network. - placeholder: "custom" - when: "{{ not use_generic_env and target_network == 'custom' }}" - -is_localnet: - type: bool - help: Whether to deploy on localnet. - placeholder: "true" - default: "{{ target_network == 'localnet' and not use_generic_env }}" - when: 'false' - -is_testnet: - type: bool - help: Whether to deploy on testnet. - placeholder: "true" - default: "{{ target_network == 'testnet' and not use_generic_env }}" - when: 'false' - -is_mainnet: - type: bool - help: Whether to deploy on mainnet. - placeholder: "true" - default: "{{ target_network == 'mainnet' and not use_generic_env }}" - when: 'false' - -is_customnet: - type: bool - help: Whether to deploy on custom network. - placeholder: "true" - default: "{{ target_network == 'custom' and not use_generic_env }}" - when: 'false' - -_templates_suffix: ".j2" diff --git a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} deleted file mode 100644 index cfc9f21..0000000 --- a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} +++ /dev/null @@ -1,7 +0,0 @@ -# this file contains algorand network settings for interacting with testnet via algonode -ALGOD_TOKEN={YOUR_ALGOD_TOKEN} -ALGOD_SERVER={YOUR_ALGOD_SERVER_URL} -ALGOD_PORT={YOUR_ALGOD_PORT} -INDEXER_TOKEN={YOUR_INDEXER_TOKEN} -INDEXER_SERVER={YOUR_INDEXER_SERVER_URL} -INDEXER_PORT={YOUR_INDEXER_PORT} diff --git a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} deleted file mode 100644 index fcbf442..0000000 --- a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} +++ /dev/null @@ -1,7 +0,0 @@ -# this file should contain environment variables specific to algokit localnet -ALGOD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -ALGOD_SERVER=http://localhost -ALGOD_PORT=4001 -INDEXER_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -INDEXER_SERVER=http://localhost -INDEXER_PORT=8980 diff --git a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} deleted file mode 100644 index bb9a787..0000000 --- a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} +++ /dev/null @@ -1,3 +0,0 @@ -# this file contains algorand network settings for interacting with testnet via algonode -ALGOD_SERVER=https://mainnet-api.algonode.cloud -INDEXER_SERVER=https://mainnet-idx.algonode.cloud diff --git a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} deleted file mode 100644 index eeea43d..0000000 --- a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} +++ /dev/null @@ -1,3 +0,0 @@ -# this file contains algorand network settings for interacting with testnet via algonode -ALGOD_SERVER=https://testnet-api.algonode.cloud -INDEXER_SERVER=https://testnet-idx.algonode.cloud diff --git a/examples/s-py/projects/s-py-contracts/.editorconfig b/examples/s-py/projects/s-py-contracts/.editorconfig deleted file mode 100644 index e2fda34..0000000 --- a/examples/s-py/projects/s-py-contracts/.editorconfig +++ /dev/null @@ -1,10 +0,0 @@ -root=true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -insert_final_newline = true - -[*.py] -indent_size = 4 diff --git a/examples/s-py/projects/s-py-contracts/.gitignore b/examples/s-py/projects/s-py-contracts/.gitignore deleted file mode 100644 index 070829c..0000000 --- a/examples/s-py/projects/s-py-contracts/.gitignore +++ /dev/null @@ -1,180 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ -coverage/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -#pdm.lock -# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it -# in version control. -# https://pdm.fming.dev/#use-with-ide -.pdm.toml - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -.env.* -!.env.*.template -!.env.template -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Ruff (linter) -.ruff_cache/ - -# Cython debug symbols -cython_debug/ - -# PyCharm -.idea -!.idea/ -.idea/* -!.idea/runConfigurations/ - -# macOS -.DS_Store - -# Received approval test files -*.received.* - -# NPM -node_modules - -# AlgoKit -debug_traces/ -.algokit/static-analysis/ # Replace with .algokit/static-analysis/tealer/ to enable snapshot checks in CI -.algokit/sources diff --git a/examples/s-py/projects/s-py-contracts/.npmrc b/examples/s-py/projects/s-py-contracts/.npmrc deleted file mode 100644 index c42da84..0000000 --- a/examples/s-py/projects/s-py-contracts/.npmrc +++ /dev/null @@ -1 +0,0 @@ -engine-strict = true diff --git a/examples/s-py/projects/s-py-contracts/.prettierignore b/examples/s-py/projects/s-py-contracts/.prettierignore deleted file mode 100644 index dbda6ae..0000000 --- a/examples/s-py/projects/s-py-contracts/.prettierignore +++ /dev/null @@ -1,12 +0,0 @@ -# don't ever format node_modules -node_modules -# don't lint format output (make sure it's set to your correct build folder name) -dist -build -# don't format nyc coverage output -coverage -# don't format generated types -**/generated/types.d.ts -**/generated/types.ts -# don't format ide files -.idea diff --git a/examples/s-py/projects/s-py-contracts/.prettierrc.js b/examples/s-py/projects/s-py-contracts/.prettierrc.js deleted file mode 100644 index c484d0e..0000000 --- a/examples/s-py/projects/s-py-contracts/.prettierrc.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - singleQuote: true, - jsxSingleQuote: false, - semi: false, - tabWidth: 2, - trailingComma: 'all', - printWidth: 120, - endOfLine: 'lf', - arrowParens: 'always', -} diff --git a/examples/s-py/projects/s-py-contracts/.tours/getting-started-with-your-algokit-project.tour b/examples/s-py/projects/s-py-contracts/.tours/getting-started-with-your-algokit-project.tour deleted file mode 100644 index 4a58a5b..0000000 --- a/examples/s-py/projects/s-py-contracts/.tours/getting-started-with-your-algokit-project.tour +++ /dev/null @@ -1,51 +0,0 @@ -{ - "$schema": "https://aka.ms/codetour-schema", - "title": "Getting Started with Your AlgoKit Project", - "steps": [ - { - "file": "README.md", - "description": "Welcome to your brand new AlgoKit template-based project. In this tour, we will guide you through the main features and capabilities included in the template.", - "line": 3 - }, - { - "file": "README.md", - "description": "Start by ensuring you have followed the setup of pre-requisites.", - "line": 9 - }, - { - "file": ".algokit.toml", - "description": "This is the main configuration file used by algokit-cli to manage the project. The default template includes a starter 'Hello World' contract that is deployed via the `algokit-utils` package (either `ts` or `py`, depending on your choice). To create a new smart contract, you can use the [`algokit generate`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md) command and invoke a pre-bundled generator template by running `algokit generate smart-contract` (see how it is defined in the `.algokit.toml`, you can create your own generators if needed). This action will create a new folder in the `smart_contracts` directory, named after your project. Each folder contains a `contract.py` file, which is the entry point for your contract implementation, and `deploy_config.py` | `deployConfig.ts` files (depending on the language chosen for the template), that perform the deployment of the contract. Additionally you can define custom commands to run (similar to `npm` scripts), see definitions under `[project]` section in `.algokit.toml`.", - "line": 1 - }, - { - "file": "smart_contracts/hello_world/deploy-config.ts", - "description": "The default deployment scripts invoke a sample method on the starter contract that demonstrates how to interact with your deployed Algorand on-chain applications using the [`AlgoKit Typed Clients`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md#1-typed-clients) feature. The invocation if deploy is aliased in `.algokit.toml` file, allowing simple deployments via `algokit project deploy` command.", - "line": 32 - }, - { - "file": ".env.localnet.template", - "description": "Environment files are a crucial mechanism that allows you to set up the [`algokit deploy`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/deploy.md) feature to simplify deploying your contracts in CI/CD environments (please note we still recommend careful evaluation when it comes to deployment to MainNet). Clone the file and remove the `.template` suffix to apply the changes to deployment scripts and launch configurations. The network prefix `localnet|testnet|mainnet` is primarily optimized for `algokit deploy`. The order of loading the variables is `.env.{network}` < `.env`.", - "line": 2 - }, - { - "file": ".vscode/launch.json", - "description": "Refer to the pre-bundled Visual Studio launch configurations, offering various options on how to execute the build and deployment of your smart contracts. Alternatively execute `algokit project run` to see list of available custom commands.", - "line": 5 - }, - { - "file": ".vscode/extensions.json", - "description": "We highly recommend installing the recommended extensions to get the most out of this template starter project in your VSCode IDE.", - "line": 3 - }, - { - "file": "smart_contracts/index.ts", - "description": "Uncomment the following lines to enable complementary utilities that will generate artifacts required for the [AlgoKit AVM Debugger](https://github.com/algorandfoundation/algokit-avm-vscode-debugger) VSCode plugin available on the [VSCode Extension Marketplace](https://marketplace.visualstudio.com/items?itemName=algorandfoundation.algokit-avm-vscode-debugger). A new folder will be automatically created in the `.algokit` directory with source maps of all TEAL contracts in this workspace, as well as traces that will appear in a folder at the root of the workspace. You can then use the traces as entry points to trigger the debug extension. Make sure to have the `.algokit.toml` file available at the root of the workspace.", - "line": 15 - }, - { - "file": "smart_contracts/_helpers/__init__.py", - "description": "This folder contains helper scripts for contract management. These automate tasks like compiling, generating clients, and deploying. Usually, you won't need to edit these files, but advanced users can expand them for custom needs.", - "line": 1 - } - ] -} diff --git a/examples/s-py/projects/s-py-contracts/.vscode/extensions.json b/examples/s-py/projects/s-py-contracts/.vscode/extensions.json deleted file mode 100644 index e5ca4ca..0000000 --- a/examples/s-py/projects/s-py-contracts/.vscode/extensions.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "recommendations": [ - "ms-python.python", - "esbenp.prettier-vscode", - "tamasfe.even-better-toml", - "editorconfig.editorconfig", - "vsls-contrib.codetour", - "algorandfoundation.algokit-avm-vscode-debugger" - ] -} diff --git a/examples/s-py/projects/s-py-contracts/.vscode/launch.json b/examples/s-py/projects/s-py-contracts/.vscode/launch.json deleted file mode 100644 index 6c40d26..0000000 --- a/examples/s-py/projects/s-py-contracts/.vscode/launch.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Build & Deploy contracts", - "type": "node", - "request": "launch", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "deploy"], - "cwd": "${workspaceFolder}/smart_contracts", - "console": "integratedTerminal", - "skipFiles": ["/**", "node_modules/**"], - "preLaunchTask": "Build contracts (+ LocalNet)", - "env": { - "ALGOD_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "ALGOD_SERVER": "http://localhost", - "ALGOD_PORT": "4001", - "INDEXER_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "INDEXER_SERVER": "http://localhost", - "INDEXER_PORT": "8980" - } - }, - { - "name": "Deploy contracts", - "type": "node", - "request": "launch", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "deploy"], - "cwd": "${workspaceFolder}/smart_contracts", - "console": "integratedTerminal", - "skipFiles": ["/**", "node_modules/**"], - "env": { - "ALGOD_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "ALGOD_SERVER": "http://localhost", - "ALGOD_PORT": "4001", - "INDEXER_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "INDEXER_SERVER": "http://localhost", - "INDEXER_PORT": "8980" - } - }, - { - "name": "Build contracts", - "type": "python", - "request": "launch", - "module": "smart_contracts", - "args": ["build"], - "cwd": "${workspaceFolder}" - }, - { - "type": "avm", - "request": "launch", - "name": "Debug TEAL via AlgoKit AVM Debugger", - "simulateTraceFile": "${workspaceFolder}/${command:PickSimulateTraceFile}", - "stopOnEntry": true - } - ] -} diff --git a/examples/s-py/projects/s-py-contracts/.vscode/settings.json b/examples/s-py/projects/s-py-contracts/.vscode/settings.json deleted file mode 100644 index e4046da..0000000 --- a/examples/s-py/projects/s-py-contracts/.vscode/settings.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - // General - see also /.editorconfig - "editor.formatOnSave": true, - "files.exclude": { - "**/.git": true, - "**/.DS_Store": true, - "**/Thumbs.db": true, - ".mypy_cache": true, - ".pytest_cache": true, - ".ruff_cache": true, - "**/__pycache__": true, - ".idea": true - }, - - // TypeScript - "editor.defaultFormatter": "esbenp.prettier-vscode", - - // Python - "python.analysis.autoImportCompletions": true, - "python.analysis.extraPaths": ["${workspaceFolder}/smart_contracts"], - "python.analysis.diagnosticSeverityOverrides": { - "reportMissingModuleSource": "none" - }, - "python.defaultInterpreterPath": "${workspaceFolder}/.venv", - "[python]": { - "editor.codeActionsOnSave": { - "source.fixAll": "explicit", - // Prevent default import sorting from running; Ruff will sort imports for us anyway - "source.organizeImports": "never" - }, - "editor.defaultFormatter": null, - }, - - // On Windows, if execution policy is set to Signed (default) then it won't be able to activate the venv - // so instead let's set it to RemoteSigned for VS Code terminal - "terminal.integrated.shellArgs.windows": ["-ExecutionPolicy", "RemoteSigned"], - "algorandPython.languageServer.enable": true, -} diff --git a/examples/s-py/projects/s-py-contracts/.vscode/tasks.json b/examples/s-py/projects/s-py-contracts/.vscode/tasks.json deleted file mode 100644 index eb1e767..0000000 --- a/examples/s-py/projects/s-py-contracts/.vscode/tasks.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "Build contracts", - "command": "${workspaceFolder}/.venv/bin/python", - "windows": { - "command": "${workspaceFolder}/.venv/Scripts/python.exe" - }, - "args": ["-m", "smart_contracts", "build"], - "options": { - "cwd": "${workspaceFolder}" - }, - "group": { - "kind": "build", - "isDefault": true - }, - "problemMatcher": [] - }, - { - "label": "Build contracts (+ LocalNet)", - "command": "${workspaceFolder}/.venv/bin/python", - "windows": { - "command": "${workspaceFolder}/.venv/Scripts/python.exe" - }, - "args": ["-m", "smart_contracts", "build"], - "options": { - "cwd": "${workspaceFolder}" - }, - "dependsOn": "Start AlgoKit LocalNet", - "problemMatcher": [] - }, - { - "label": "Start AlgoKit LocalNet", - "command": "algokit", - "args": ["localnet", "start"], - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "problemMatcher": [] - }, - { - "label": "Stop AlgoKit LocalNet", - "command": "algokit", - "args": ["localnet", "stop"], - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "problemMatcher": [] - }, - { - "label": "Reset AlgoKit LocalNet", - "command": "algokit", - "args": ["localnet", "reset"], - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "problemMatcher": [] - }, - { - "label": "Analyze TEAL contracts with AlgoKit Tealer integration", - "command": "algokit", - "args": [ - "task", - "analyze", - "${workspaceFolder}/.algokit", - "--recursive", - "--force" - ], - "options": { - "cwd": "${workspaceFolder}" - }, - "problemMatcher": [] - } - ] -} diff --git a/examples/s-py/projects/s-py-contracts/README.md b/examples/s-py/projects/s-py-contracts/README.md deleted file mode 100644 index 3afcb30..0000000 --- a/examples/s-py/projects/s-py-contracts/README.md +++ /dev/null @@ -1,106 +0,0 @@ -# s-py-contracts - -This project has been generated using AlgoKit. See below for default getting started instructions. - -# Setup - -### Pre-requisites - -- [Python 3.12](https://www.python.org/downloads/) or later -- [Docker](https://www.docker.com/) (only required for LocalNet) - -> For interactive tour over the codebase, download [vsls-contrib.codetour](https://marketplace.visualstudio.com/items?itemName=vsls-contrib.codetour) extension for VS Code, then open the [`.codetour.json`](./.tours/getting-started-with-your-algokit-project.tour) file in code tour extension. - -### Initial Setup - -#### 1. Clone the Repository -Start by cloning this repository to your local machine. - -#### 2. Install Pre-requisites -Ensure the following pre-requisites are installed and properly configured: - -- **Docker**: Required for running a local Algorand network. [Install Docker](https://www.docker.com/). -- **AlgoKit CLI**: Essential for project setup and operations. Install the latest version from [AlgoKit CLI Installation Guide](https://github.com/algorandfoundation/algokit-cli#install). Verify installation with `algokit --version`, expecting `2.0.0` or later. - -#### 3. Bootstrap Your Local Environment -Run the following commands within the project folder: - -- **Install Poetry**: Required for Python dependency management. [Installation Guide](https://python-poetry.org/docs/#installation). Verify with `poetry -V` to see version `1.2`+. -- **Setup Project**: Execute `algokit project bootstrap all` to install dependencies and setup a Python virtual environment in `.venv`. -- **Configure environment**: Execute `algokit generate env-file -a target_network localnet` to create a `.env.localnet` file with default configuration for `localnet`. -- **Start LocalNet**: Use `algokit localnet start` to initiate a local Algorand network. - -### Development Workflow - -#### Terminal -Directly manage and interact with your project using AlgoKit commands: - -1. **Build Contracts**: `algokit project run build` compiles all smart contracts. You can also specify a specific contract by passing the name of the contract folder as an extra argument. -For example: `algokit project run build -- hello_world` will only build the `hello_world` contract. -2. **Deploy**: Use `algokit project deploy localnet` to deploy contracts to the local network. You can also specify a specific contract by passing the name of the contract folder as an extra argument. -For example: `algokit project deploy localnet -- hello_world` will only deploy the `hello_world` contract. - -#### VS Code -For a seamless experience with breakpoint debugging and other features: - -1. **Open Project**: In VS Code, open the repository root. -2. **Install Extensions**: Follow prompts to install recommended extensions. -3. **Debugging**: - - Use `F5` to start debugging. - - **Windows Users**: Select the Python interpreter at `./.venv/Scripts/python.exe` via `Ctrl/Cmd + Shift + P` > `Python: Select Interpreter` before the first run. - -#### JetBrains IDEs -While primarily optimized for VS Code, JetBrains IDEs are supported: - -1. **Open Project**: In your JetBrains IDE, open the repository root. -2. **Automatic Setup**: The IDE should configure the Python interpreter and virtual environment. -3. **Debugging**: Use `Shift+F10` or `Ctrl+R` to start debugging. Note: Windows users may encounter issues with pre-launch tasks due to a known bug. See [JetBrains forums](https://youtrack.jetbrains.com/issue/IDEA-277486/Shell-script-configuration-cannot-run-as-before-launch-task) for workarounds. - -## AlgoKit Workspaces and Project Management -This project supports both standalone and monorepo setups through AlgoKit workspaces. Leverage [`algokit project run`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md) commands for efficient monorepo project orchestration and management across multiple projects within a workspace. - -## AlgoKit Generators - -This template provides a set of [algokit generators](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md) that allow you to further modify the project instantiated from the template to fit your needs, as well as giving you a base to build your own extensions to invoke via the `algokit generate` command. - -### Generate Smart Contract - -By default the template creates a single `HelloWorld` contract under hello_world folder in the `smart_contracts` directory. To add a new contract: - -1. From the root of the project (`../`) execute `algokit generate smart-contract`. This will create a new starter smart contract and deployment configuration file under `{your_contract_name}` subfolder in the `smart_contracts` directory. -2. Each contract potentially has different creation parameters and deployment steps. Hence, you need to define your deployment logic in `deploy-config.ts`file. -3. `config.py` file will automatically build all contracts in the `smart_contracts` directory. If you want to build specific contracts manually, modify the default code provided by the template in `config.py` file. -4. Since you are generating a TypeScript client, you also need to reference your contract deployment logic in `index.ts` file. However, similar to config.py, by default, `index.ts` will auto import all TypeScript deployment files under `smart_contracts` directory. If you want to manually import specific contracts, modify the default code provided by the template in `index.ts` file. - -> Please note, above is just a suggested convention tailored for the base configuration and structure of this template. The default code supplied by the template in `config.py` and `index.ts` (if using ts clients) files are tailored for the suggested convention. You are free to modify the structure and naming conventions as you see fit. - -### Generate '.env' files - -By default the template instance does not contain any env files. Using [`algokit project deploy`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/deploy.md) against `localnet` | `testnet` | `mainnet` will use default values for `algod` and `indexer` unless overwritten via `.env` or `.env.{target_network}`. - -To generate a new `.env` or `.env.{target_network}` file, run `algokit generate env-file` - -### Debugging Smart Contracts - -This project is optimized to work with AlgoKit AVM Debugger extension. To activate it: -Refer to the commented header in the `index.ts` file in the `smart_contracts` folder. - -If you have opted in to include VSCode launch configurations in your project, you can also use the `Debug TEAL via AlgoKit AVM Debugger` launch configuration to interactively select an available trace file and launch the debug session for your smart contract. - -For information on using and setting up the `AlgoKit AVM Debugger` VSCode extension refer [here](https://github.com/algorandfoundation/algokit-avm-vscode-debugger). To install the extension from the VSCode Marketplace, use the following link: [AlgoKit AVM Debugger extension](https://marketplace.visualstudio.com/items?itemName=algorandfoundation.algokit-avm-vscode-debugger). - -# Tools - -This project makes use of Algorand Python to build Algorand smart contracts. The following tools are in use: - -- [Algorand](https://www.algorand.com/) - Layer 1 Blockchain; [Developer portal](https://dev.algorand.co/), [Why Algorand?](https://dev.algorand.co/getting-started/why-algorand/) -- [AlgoKit](https://github.com/algorandfoundation/algokit-cli) - One-stop shop tool for developers building on the Algorand network; [docs](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/algokit.md), [intro tutorial](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/tutorials/intro.md) -- [Algorand Python](https://github.com/algorandfoundation/puya) - A semantically and syntactically compatible, typed Python language that works with standard Python tooling and allows you to express smart contracts (apps) and smart signatures (logic signatures) for deployment on the Algorand Virtual Machine (AVM); [docs](https://github.com/algorandfoundation/puya), [examples](https://github.com/algorandfoundation/puya/tree/main/examples) -- [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-ts) - A set of core Algorand utilities that make it easier to build solutions on Algorand. -- [Poetry](https://python-poetry.org/): Python packaging and dependency management. -- [npm](https://www.npmjs.com/): Node.js package manager -- [TypeScript](https://www.typescriptlang.org/): Strongly typed programming language that builds on JavaScript -- [tsx](https://github.com/wclr/tsx): TypeScript development execution environment - -It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. - diff --git a/examples/s-py/projects/s-py-contracts/package.json b/examples/s-py/projects/s-py-contracts/package.json deleted file mode 100644 index c4c2bfb..0000000 --- a/examples/s-py/projects/s-py-contracts/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "smart_contracts", - "version": "1.0.0", - "description": "Smart contract deployer", - "main": "index.ts", - "type": "module", - "scripts": { - "deploy": "tsx watch --watch .env -r dotenv/config smart_contracts/index.ts", - "deploy:ci": "tsx -r dotenv/config smart_contracts/index.ts", - "format": "prettier --write ." - }, - "engines": { - "node": ">=20.0", - "npm": ">=9.0" - }, - "dependencies": { - "@algorandfoundation/algokit-utils": "^10.0.0-alpha.40", - "@algorandfoundation/algokit-utils-debug": "^2.0.0-alpha.2" - }, - "devDependencies": { - "@algorandfoundation/algokit-client-generator": "^7.0.0-alpha.5", - "dotenv": "^16.0.3", - "prettier": "^2.8.4", - "tsx": "^4.19.3", - "typescript": "^5.7.3" - } -} diff --git a/examples/s-py/projects/s-py-contracts/poetry.toml b/examples/s-py/projects/s-py-contracts/poetry.toml deleted file mode 100644 index 5fcef8c..0000000 --- a/examples/s-py/projects/s-py-contracts/poetry.toml +++ /dev/null @@ -1,3 +0,0 @@ -[virtualenvs] -in-project = true -prefer-active-python = true diff --git a/examples/s-py/projects/s-py-contracts/pyproject.toml b/examples/s-py/projects/s-py-contracts/pyproject.toml deleted file mode 100644 index 4afb32d..0000000 --- a/examples/s-py/projects/s-py-contracts/pyproject.toml +++ /dev/null @@ -1,22 +0,0 @@ -[tool.poetry] -name = "s-py-contracts" -version = "0.1.0" -description = "Algorand smart contracts" -authors = ["None "] -readme = "README.md" -package-mode = false - -[tool.poetry.dependencies] -python = "^3.12" -algokit-utils = "^5.0.0a13" -python-dotenv = "^1.0.0" -algorand-python = "^3" -algorand-python-testing = {git = "https://github.com/algorandfoundation/algorand-python-testing.git", branch = "refactor/util-v5"} - -[tool.poetry.group.dev.dependencies] -puyapy = "*" - -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" - diff --git a/examples/s-py/projects/s-py-contracts/smart_contracts/__init__.py b/examples/s-py/projects/s-py-contracts/smart_contracts/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/examples/s-py/projects/s-py-contracts/smart_contracts/__main__.py b/examples/s-py/projects/s-py-contracts/smart_contracts/__main__.py deleted file mode 100644 index 41bf978..0000000 --- a/examples/s-py/projects/s-py-contracts/smart_contracts/__main__.py +++ /dev/null @@ -1,188 +0,0 @@ -import dataclasses -import importlib -import logging -import subprocess -import sys -from collections.abc import Callable -from pathlib import Path -from shutil import rmtree - -from dotenv import load_dotenv - -# Set up logging and load environment variables. -logging.basicConfig( - level=logging.DEBUG, format="%(asctime)s %(levelname)-10s: %(message)s" -) -logger = logging.getLogger(__name__) -logger.info("Loading .env") -load_dotenv() - -# Determine the root path based on this file's location. -root_path = Path(__file__).parent - -# ----------------------- Contract Configuration ----------------------- # - - -@dataclasses.dataclass -class SmartContract: - path: Path - name: str - deploy: Callable[[], None] | None = None - - -def import_contract(folder: Path) -> Path: - """Imports the contract from a folder if it exists.""" - contract_path = folder / "contract.py" - if contract_path.exists(): - return contract_path - else: - raise Exception(f"Contract not found in {folder}") - - -def import_deploy_if_exists(folder: Path) -> Callable[[], None] | None: - """Imports the deploy function from a folder if it exists.""" - try: - module_name = f"{folder.parent.name}.{folder.name}.deploy_config" - deploy_module = importlib.import_module(module_name) - return deploy_module.deploy # type: ignore[no-any-return, misc] - except ImportError: - return None - - -def has_contract_file(directory: Path) -> bool: - """Checks whether the directory contains a contract.py file.""" - return (directory / "contract.py").exists() - - -# Use the current directory (root_path) as the base for contract folders and exclude -# folders that start with '_' (internal helpers). -contracts: list[SmartContract] = [ - SmartContract( - path=import_contract(folder), - name=folder.name, - deploy=import_deploy_if_exists(folder), - ) - for folder in root_path.iterdir() - if folder.is_dir() and has_contract_file(folder) and not folder.name.startswith("_") -] - -# -------------------------- Build Logic -------------------------- # - -deployment_extension = "ts" - - -def _get_output_path(output_dir: Path, deployment_extension: str) -> Path: - """Constructs the output path for the generated client file.""" - return output_dir / Path( - "{contract_name}" - + ("_client" if deployment_extension == "py" else "Client") - + f".{deployment_extension}" - ) - - -def build(output_dir: Path, contract_path: Path) -> Path: - """ - Builds the contract by exporting (compiling) its source and generating a client. - If the output directory already exists, it is cleared. - """ - output_dir = output_dir.resolve() - if output_dir.exists(): - rmtree(output_dir) - output_dir.mkdir(exist_ok=True, parents=True) - logger.info(f"Exporting {contract_path} to {output_dir}") - - build_result = subprocess.run( - [ - "algokit", - "--no-color", - "compile", - "python", - str(contract_path.resolve()), - f"--out-dir={output_dir}", - "--output-source-map", - ], - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - text=True, - ) - - if build_result.stdout: - print(build_result.stdout) - - if build_result.returncode: - raise Exception(f"Could not build contract:\n{build_result.stdout}") - - # Look for arc56.json files and generate the client based on them. - app_spec_file_names: list[str] = [ - file.name for file in output_dir.glob("*.arc56.json") - ] - - client_file: str | None = None - if not app_spec_file_names: - logger.warning( - "No '*.arc56.json' file found (likely a logic signature being compiled). Skipping client generation." - ) - else: - for file_name in app_spec_file_names: - client_file = file_name - print(file_name) - generate_result = subprocess.run( - [ - "algokit", - "generate", - "client", - str(output_dir), - "--output", - str(_get_output_path(output_dir, deployment_extension)), - ], - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - text=True, - ) - - if generate_result.stdout: - print(generate_result.stdout) - - if generate_result.returncode: - if "No such command" in generate_result.stdout: - raise Exception( - "Could not generate typed client, requires AlgoKit 2.0.0 or later. Please update AlgoKit" - ) - else: - raise Exception( - f"Could not generate typed client:\n{generate_result.stdout}" - ) - if client_file: - return output_dir / client_file - return output_dir - - -# --------------------------- Main Logic --------------------------- # - - -def main(action: str, contract_name: str | None = None) -> None: - """Main entry point to build and/or deploy smart contracts.""" - artifact_path = root_path / "artifacts" - # Filter contracts based on an optional specific contract name. - filtered_contracts = [ - contract - for contract in contracts - if contract_name is None or contract.name == contract_name - ] - - match action: - case "build": - for contract in filtered_contracts: - logger.info(f"Building app at {contract.path}") - build(artifact_path / contract.name, contract.path) - case _: - logger.error(f"Unknown action: {action}") - - -if __name__ == "__main__": - if len(sys.argv) > 2: - main(sys.argv[1], sys.argv[2]) - elif len(sys.argv) > 1: - main(sys.argv[1]) - else: - main("all") diff --git a/examples/s-py/projects/s-py-contracts/smart_contracts/hello_world/contract.py b/examples/s-py/projects/s-py-contracts/smart_contracts/hello_world/contract.py deleted file mode 100644 index 8a8d12b..0000000 --- a/examples/s-py/projects/s-py-contracts/smart_contracts/hello_world/contract.py +++ /dev/null @@ -1,8 +0,0 @@ -from algopy import ARC4Contract, String -from algopy.arc4 import abimethod - - -class HelloWorld(ARC4Contract): - @abimethod() - def hello(self, name: String) -> String: - return "Hello, " + name diff --git a/examples/s-py/projects/s-py-contracts/smart_contracts/hello_world/deploy-config.ts b/examples/s-py/projects/s-py-contracts/smart_contracts/hello_world/deploy-config.ts deleted file mode 100644 index 6b9d652..0000000 --- a/examples/s-py/projects/s-py-contracts/smart_contracts/hello_world/deploy-config.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { AlgorandClient } from '@algorandfoundation/algokit-utils' -import { HelloWorldFactory } from '../artifacts/hello_world/HelloWorldClient' - -// Below is a showcase of various deployment options you can use in TypeScript Client -export async function deploy() { - console.log('=== Deploying HelloWorld ===') - - const algorand = AlgorandClient.fromEnvironment() - const deployer = await algorand.account.fromEnvironment('DEPLOYER') - - const factory = algorand.client.getTypedAppFactory(HelloWorldFactory, { - defaultSender: deployer.addr, - }) - - const { appClient, result } = await factory.deploy({ onUpdate: 'append', onSchemaBreak: 'append' }) - - // If app was just created fund the app account - if (['create', 'replace'].includes(result.operationPerformed)) { - await algorand.send.payment({ - amount: (1).algo(), - sender: deployer.addr, - receiver: appClient.appAddress, - }) - } - - const method = 'hello' - const response = await appClient.send.hello({ - args: { name: 'world' }, - }) - console.log( - `Called ${method} on ${appClient.appClient.appName} (${appClient.appClient.appId}) with name = world, received: ${response.return}`, - ) -} diff --git a/examples/s-py/projects/s-py-contracts/smart_contracts/index.ts b/examples/s-py/projects/s-py-contracts/smart_contracts/index.ts deleted file mode 100644 index 4a14ad5..0000000 --- a/examples/s-py/projects/s-py-contracts/smart_contracts/index.ts +++ /dev/null @@ -1,66 +0,0 @@ -import * as fs from 'fs' -import * as path from 'path' -import { fileURLToPath, pathToFileURL } from 'url' -import { consoleLogger } from '@algorandfoundation/algokit-utils/types/logging' -import { Config } from '@algorandfoundation/algokit-utils' -// import { registerDebugEventHandlers } from '@algorandfoundation/algokit-utils-debug' // Uncomment to enable persisting artifacts required by AlgoKit AVM Debugger - -// Uncomment the debug and traceAll options to enable auto generation of AVM Debugger compliant sourceMap and simulation trace file. -// Learn more about using AlgoKit AVM Debugger to debug your TEAL source codes and inspect various kinds of Algorand transactions in atomic groups -> https://github.com/algorandfoundation/algokit-avm-vscode-Debugger - -Config.configure({ - logger: consoleLogger, - // debug: true, - // traceAll: true, -}) -// registerDebugEventHandlers() // Uncomment to enable persisting artifacts required by AlgoKit AVM Debugger - -// base directory -const baseDir = path.dirname(fileURLToPath(import.meta.url)) - -// function to validate and dynamically import a module -async function importDeployerIfExists(dir: string) { - const tsPath = path.resolve(dir, 'deploy-config.ts') - const jsPath = path.resolve(dir, 'deploy-config.js') - const deployerPath = fs.existsSync(tsPath) ? tsPath : fs.existsSync(jsPath) ? jsPath : undefined - - if (deployerPath) { - const deployer = await import(pathToFileURL(deployerPath).href) - return { ...deployer, name: path.basename(dir) } - } - return null -} - -// get a list of all deployers from the subdirectories -async function getDeployers() { - const directories = fs - .readdirSync(baseDir, { withFileTypes: true }) - .filter((dirent) => dirent.isDirectory()) - .map((dirent) => path.resolve(baseDir, dirent.name)) - - const deployers = await Promise.all(directories.map(importDeployerIfExists)) - return deployers.filter((deployer) => deployer !== null) // Filter out null values -} - -// execute all the deployers -(async () => { - const contractName = process.argv.length > 2 ? process.argv[2] : undefined - const contractDeployers = await getDeployers() - - const filteredDeployers = contractName - ? contractDeployers.filter(deployer => deployer.name === contractName) - : contractDeployers - - if (contractName && filteredDeployers.length === 0) { - console.warn(`No deployer found for contract name: ${contractName}`) - return - } - - for (const deployer of filteredDeployers) { - try { - await deployer.deploy() - } catch (e) { - console.error(`Error deploying ${deployer.name}:`, e) - } - } -})() diff --git a/examples/s-py/projects/s-py-contracts/tsconfig.json b/examples/s-py/projects/s-py-contracts/tsconfig.json deleted file mode 100644 index 5b195eb..0000000 --- a/examples/s-py/projects/s-py-contracts/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "declaration": true, - "declarationMap": true, - "sourceMap": true, - "strict": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "esModuleInterop": true, - "experimentalDecorators": true, - "emitDecoratorMetadata": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "allowJs": false, - "allowSyntheticDefaultImports": true, - "module": "NodeNext", - "moduleResolution": "NodeNext", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true - }, - "include": ["smart_contracts/**/*.ts"], - "exclude": ["node_modules", "dist", "coverage"] -} diff --git a/examples/s-py/projects/s-py-frontend/.algokit.toml b/examples/s-py/projects/s-py-frontend/.algokit.toml deleted file mode 100644 index 4c74fac..0000000 --- a/examples/s-py/projects/s-py-frontend/.algokit.toml +++ /dev/null @@ -1,11 +0,0 @@ -[algokit] -min_version = "v2.0.0" - -[project] -type = "frontend" -name = 's-py-frontend' -artifacts = "src/contracts" - -[project.run] -build = { commands = ['npm run build'], description = 'Build frontend' } -test = { commands = ['npm run test'], description = 'Run frontend tests' } diff --git a/examples/s-py/projects/s-py-frontend/.algokit/.copier-answers.yml b/examples/s-py/projects/s-py-frontend/.algokit/.copier-answers.yml deleted file mode 100644 index 8440898..0000000 --- a/examples/s-py/projects/s-py-frontend/.algokit/.copier-answers.yml +++ /dev/null @@ -1,8 +0,0 @@ -# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 1.1.1-13-gc5abe59 -_src_path: gh:algorandfoundation/algokit-react-frontend-template -author_email: None -author_name: None -preset_name: starter -project_name: s-py-frontend - diff --git a/examples/s-py/projects/s-py-frontend/.env.template b/examples/s-py/projects/s-py-frontend/.env.template deleted file mode 100644 index 5dfbb2d..0000000 --- a/examples/s-py/projects/s-py-frontend/.env.template +++ /dev/null @@ -1,70 +0,0 @@ -# ====================== -# LocalNet configuration -# uncomment below to use -# ====================== - -VITE_ENVIRONMENT=local - -# Algod -VITE_ALGOD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -VITE_ALGOD_SERVER=http://localhost -VITE_ALGOD_PORT=4001 -VITE_ALGOD_NETWORK=localnet - -# Indexer -VITE_INDEXER_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -VITE_INDEXER_SERVER=http://localhost -VITE_INDEXER_PORT=8980 - -# KMD -# Please note: -# 1. This is only needed for LocalNet since -# by default KMD provider is ignored on other networks. -# 2. AlgoKit LocalNet starts with a single wallet called 'unencrypted-default-wallet', -# with heaps of tokens available for testing. -VITE_KMD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -VITE_KMD_SERVER=http://localhost -VITE_KMD_PORT=4002 -VITE_KMD_WALLET="unencrypted-default-wallet" -VITE_KMD_PASSWORD="" - -# # ====================== -# # TestNet configuration: -# # uncomment below to use -# # ====================== - -# VITE_ENVIRONMENT=local - -# # Algod -# VITE_ALGOD_TOKEN="" -# VITE_ALGOD_SERVER="https://testnet-api.algonode.cloud" -# VITE_ALGOD_PORT="" -# VITE_ALGOD_NETWORK="testnet" - -# # Indexer -# VITE_INDEXER_TOKEN="" -# VITE_INDEXER_SERVER="https://testnet-idx.algonode.cloud" -# VITE_INDEXER_PORT="" - - -# # ====================== -# # MainNet configuration: -# # uncomment below to use -# # ====================== - -# VITE_ENVIRONMENT=production - -# # Algod -# VITE_ALGOD_TOKEN="" -# VITE_ALGOD_SERVER="https://mainnet-api.algonode.cloud" -# VITE_ALGOD_PORT="" -# VITE_ALGOD_NETWORK="mainnet" - -# # Indexer -# VITE_INDEXER_TOKEN="" -# VITE_INDEXER_SERVER="https://mainnet-idx.algonode.cloud" -# VITE_INDEXER_PORT="" - - -# Add your Web3Auth Client ID here if you want to test Web3Auth integration on TestNet or Mainnet -# VITE_WEB3_AUTH_CLIENT_ID="" \ No newline at end of file diff --git a/examples/s-py/projects/s-py-frontend/.gitignore b/examples/s-py/projects/s-py-frontend/.gitignore deleted file mode 100644 index b1ce837..0000000 --- a/examples/s-py/projects/s-py-frontend/.gitignore +++ /dev/null @@ -1,38 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/build - - -# dotenv environment variable files -.env -env/ - -# misc -/dist -.DS_Store - - -npm-debug.log* -yarn-debug.log* -yarn-error.log* -/test-results/ -/playwright-report/ -/playwright/.cache/ - -# PyCharm -.idea -!.idea/ -.idea/* -!.idea/runConfigurations/ - -.vercel -.netlify diff --git a/examples/s-py/projects/s-py-frontend/.npmrc b/examples/s-py/projects/s-py-frontend/.npmrc deleted file mode 100644 index c42da84..0000000 --- a/examples/s-py/projects/s-py-frontend/.npmrc +++ /dev/null @@ -1 +0,0 @@ -engine-strict = true diff --git a/examples/s-py/projects/s-py-frontend/.vscode/extensions.json b/examples/s-py/projects/s-py-frontend/.vscode/extensions.json deleted file mode 100644 index 6d0554a..0000000 --- a/examples/s-py/projects/s-py-frontend/.vscode/extensions.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "recommendations": [ - "EditorConfig.EditorConfig", - "dotenv.dotenv-vscode", - ] -} - diff --git a/examples/s-py/projects/s-py-frontend/.vscode/launch.json b/examples/s-py/projects/s-py-frontend/.vscode/launch.json deleted file mode 100644 index 7edaf04..0000000 --- a/examples/s-py/projects/s-py-frontend/.vscode/launch.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "configurations": [ - { - "type": "msedge", - "request": "launch", - "name": "Run (Edge)", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - "presentation": { - "hidden": false, - "group": "2. Web" - } - }, - { - "type": "chrome", - "request": "launch", - "name": "Run (Chrome)", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - "presentation": { - "hidden": false, - "group": "2. Web" - } - }, - { - "type": "firefox", - "request": "launch", - "name": "Run (Firefox)", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - "presentation": { - "hidden": false, - "group": "2. Web" - } - }, - { - "name": "Run dApp", - "type": "node", - "request": "launch", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "dev"], - "cwd": "${workspaceRoot}", - "console": "integratedTerminal", - "skipFiles": ["/**", "node_modules/**"], - "presentation": { - "hidden": false, - "group": "1. Run Project", - "order": 1 - } - }, - { - "name": "Run dApp (+ LocalNet)", - "type": "node", - "request": "launch", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "dev"], - "cwd": "${workspaceRoot}", - "console": "integratedTerminal", - "skipFiles": ["/**", "node_modules/**"], - "preLaunchTask": "Start AlgoKit LocalNet", - "presentation": { - "hidden": false, - "group": "1. Run Project", - "order": 1 - } - } - ] -} diff --git a/examples/s-py/projects/s-py-frontend/.vscode/settings.json b/examples/s-py/projects/s-py-frontend/.vscode/settings.json deleted file mode 100644 index f34d28b..0000000 --- a/examples/s-py/projects/s-py-frontend/.vscode/settings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "editor.formatOnSave": true, - - "dotenv.enableAutocloaking": false, - -} diff --git a/examples/s-py/projects/s-py-frontend/.vscode/tasks.json b/examples/s-py/projects/s-py-frontend/.vscode/tasks.json deleted file mode 100644 index d611c4f..0000000 --- a/examples/s-py/projects/s-py-frontend/.vscode/tasks.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "Start AlgoKit LocalNet", - "command": "algokit", - "args": ["localnet", "start"], - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "problemMatcher": [] - } - ] -} diff --git a/examples/s-py/projects/s-py-frontend/README.md b/examples/s-py/projects/s-py-frontend/README.md deleted file mode 100644 index 716ea25..0000000 --- a/examples/s-py/projects/s-py-frontend/README.md +++ /dev/null @@ -1,76 +0,0 @@ -# s-py-frontend - -This starter React project has been generated using AlgoKit. See below for default getting started instructions. - -# Setup - -### Initial Setup - -#### 1. Clone the Repository -Start by cloning this repository to your local machine. - -#### 2. Install Pre-requisites -Ensure the following pre-requisites are installed and properly configured: - -- **npm**: Node package manager. Install from [Node.js Installation Guide](https://nodejs.org/en/download/). Verify with `npm -v` to see version `18.12`+. -- **AlgoKit CLI**: Essential for project setup and operations. Install the latest version from [AlgoKit CLI Installation Guide](https://github.com/algorandfoundation/algokit-cli#install). Verify installation with `algokit --version`, expecting `2.0.0` or later. - -#### 3. Bootstrap Your Local Environment -Run the following commands within the project folder: - -- **Install Project Dependencies**: With `algokit project bootstrap all`, ensure all dependencies are ready. - -### Development Workflow - -#### Terminal -Directly manage and interact with your project using AlgoKit commands: - -1. **Build Contracts**: `algokit project run build` builds react web app and links with smart contracts in workspace, if any. -2. Remaining set of command for linting, testing and deployment can be found in respective [package.json](./package.json) file and [.algokit.toml](./.algokit.toml) files. - -#### VS Code -For a seamless experience with breakpoint debugging and other features: - -1. **Open Project**: In VS Code, open the repository root. -2. **Install Extensions**: Follow prompts to install recommended extensions. -3. **Debugging**: - - Use `F5` to start debugging. - - **Windows Users**: Select the Python interpreter at `./.venv/Scripts/python.exe` via `Ctrl/Cmd + Shift + P` > `Python: Select Interpreter` before the first run. - -#### Other IDEs -While primarily optimized for VS Code, Jetbrains WebStorm has base support for this project: - -1. **Open Project**: In your JetBrains IDE, open the repository root. -2. **Automatic Setup**: The IDE should configure the Python interpreter and virtual environment. -3. **Debugging**: Use `Shift+F10` or `Ctrl+R` to start debugging. Note: Windows users may encounter issues with pre-launch tasks due to a known bug. See [JetBrains forums](https://youtrack.jetbrains.com/issue/IDEA-277486/Shell-script-configuration-cannot-run-as-before-launch-task) for workarounds. - -## AlgoKit Workspaces and Project Management -This project supports both standalone and monorepo setups through AlgoKit workspaces. Leverage [`algokit project run`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md) commands for efficient monorepo project orchestration and management across multiple projects within a workspace. - -> Please note, by default frontend is pre configured to run against Algorand LocalNet. If you want to run against TestNet or MainNet, comment out the current environment variable and uncomment the relevant one in [`.env`](.env) file that is created after running bootstrap command and based on [`.env.template`](.env.template). - -# Algorand Wallet integrations - -The template comes with [`use-wallet`](https://github.com/txnlab/use-wallet) integration, which provides a React hook for connecting to an Algorand wallet providers. The following wallet providers are included by default: -- LocalNet: -- - [KMD/Local Wallet](https://github.com/TxnLab/use-wallet#kmd-algorand-key-management-daemon) - Algorand's Key Management Daemon (KMD) is a service that manages Algorand private keys and signs transactions. Works best with AlgoKit LocalNet and allows you to easily test and interact with your dApps locally. -- TestNet and others: -- - [Pera Wallet](https://perawallet.app). -- - [Defly Wallet](https://defly.app). -- - [Exodus Wallet](https://www.exodus.com). -- - [Daffi Wallet](https://www.daffi.me). - -Refer to official [`use-wallet`](https://github.com/txnlab/use-wallet) documentation for detailed guidelines on how to integrate with other wallet providers (such as WalletConnect v2). Too see implementation details on the use wallet hook and initialization of extra wallet providers refer to [`App.tsx`](./src/App.tsx). - -# Tools - -This project makes use of React and Tailwind to provider a base project configuration to develop frontends for your Algorand dApps and interactions with smart contracts. The following tools are in use: - -- [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-ts) - Various TypeScript utilities to simplify interactions with Algorand and AlgoKit. -- [React](https://reactjs.org/) - A JavaScript library for building user interfaces. -- [use-wallet](https://github.com/txnlab/use-wallet) - A React hook for connecting to an Algorand wallet providers. -- [npm](https://www.npmjs.com/): Node.js package manager -It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. -# Integrating with smart contracts and application clients - -Refer to the detailed guidance on [integrating with smart contracts and application clients](./src/contracts/README.md). In essence, for any smart contract codebase generated with AlgoKit or other tools that produce compile contracts into ARC34 compliant app specifications, you can use the `algokit generate` command to generate TypeScript or Python typed client. Once generated simply drag and drop the generated client into `./src/contracts` and import it into your React components as you see fit. diff --git a/examples/s-py/projects/s-py-frontend/index.html b/examples/s-py/projects/s-py-frontend/index.html deleted file mode 100644 index 5a2ef4f..0000000 --- a/examples/s-py/projects/s-py-frontend/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - AlgoKit React Template - - -
- - - diff --git a/examples/s-py/projects/s-py-frontend/package.json b/examples/s-py/projects/s-py-frontend/package.json deleted file mode 100644 index 37b1664..0000000 --- a/examples/s-py/projects/s-py-frontend/package.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "name": "s-py-frontend", - "version": "0.1.0", - "author": { - "name": "None", - "email": "None" - }, - "private": true, - "type": "module", - "engines": { - "node": ">=20.0", - "npm": ">=9.0" - }, - "devDependencies": { - "@algorandfoundation/algokit-client-generator": "^7.0.0-alpha.5", - "@types/node": "^18.17.14", - "@types/react": "^18.2.11", - "@types/react-dom": "^18.2.4", - "@vitejs/plugin-react": "^4.2.1", - "autoprefixer": "^10.4.14", - "ts-node": "^10.9.1", - "typescript": "^5.1.6", - "vite": "^5.0.0", - "vite-plugin-node-polyfills": "^0.22.0" - }, - "dependencies": { - "@algorandfoundation/algokit-utils": "^10.0.0-alpha.40", - "@blockshake/defly-connect": "^1.2.1", - "@perawallet/connect": "^1.4.1", - "@txnlab/use-wallet": "^4.6.0", - "@txnlab/use-wallet-react": "^4.6.0", - "@web3auth/modal": "^9.7.0", - "notistack": "^3.0.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "tslib": "^2.6.2" - }, - "scripts": { - "generate:app-clients": "algokit project link --all", - "dev": "npm run generate:app-clients && vite", - "build": "npm run generate:app-clients && tsc && vite build", - "preview": "vite preview" - }, - "eslintConfig": { - "extends": [ - "react-app" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "overrides": { - "ws@>7.0.0 <7.5.9": "7.5.10" - } -} diff --git a/examples/s-py/projects/s-py-frontend/public/index.html b/examples/s-py/projects/s-py-frontend/public/index.html deleted file mode 100644 index 0d3a3a5..0000000 --- a/examples/s-py/projects/s-py-frontend/public/index.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - React App - - - -
- - - diff --git a/examples/s-py/projects/s-py-frontend/public/robots.txt b/examples/s-py/projects/s-py-frontend/public/robots.txt deleted file mode 100644 index e9e57dc..0000000 --- a/examples/s-py/projects/s-py-frontend/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * -Disallow: diff --git a/examples/s-py/projects/s-py-frontend/src/App.tsx b/examples/s-py/projects/s-py-frontend/src/App.tsx deleted file mode 100644 index f346006..0000000 --- a/examples/s-py/projects/s-py-frontend/src/App.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { SupportedWallet, WalletId, WalletManager, WalletProvider } from '@txnlab/use-wallet-react' -import { SnackbarProvider } from 'notistack' -import Home from './Home' -import { getAlgodConfigFromViteEnvironment, getKmdConfigFromViteEnvironment } from './utils/network/getAlgoClientConfigs' - -let supportedWallets: SupportedWallet[] -if (import.meta.env.VITE_ALGOD_NETWORK === 'localnet') { - const kmdConfig = getKmdConfigFromViteEnvironment() - supportedWallets = [ - { - id: WalletId.KMD, - options: { - baseServer: kmdConfig.server, - token: String(kmdConfig.token), - port: String(kmdConfig.port), - }, - }, - ] -} else { - supportedWallets = [ - { id: WalletId.DEFLY }, - { id: WalletId.PERA }, - { id: WalletId.EXODUS }, - // If you are interested in WalletConnect v2 provider - // refer to https://github.com/TxnLab/use-wallet for detailed integration instructions - ] -} - -export default function App() { - const algodConfig = getAlgodConfigFromViteEnvironment() - - const walletManager = new WalletManager({ - wallets: supportedWallets, - defaultNetwork: algodConfig.network, - networks: { - [algodConfig.network]: { - algod: { - baseServer: algodConfig.server, - port: algodConfig.port, - token: String(algodConfig.token), - }, - }, - }, - options: { - resetNetwork: true, - }, - }) - - return ( - - - - - - ) -} diff --git a/examples/s-py/projects/s-py-frontend/src/assets/logo.svg b/examples/s-py/projects/s-py-frontend/src/assets/logo.svg deleted file mode 100644 index 7169476..0000000 --- a/examples/s-py/projects/s-py-frontend/src/assets/logo.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/examples/s-py/projects/s-py-frontend/src/components/Account.tsx b/examples/s-py/projects/s-py-frontend/src/components/Account.tsx deleted file mode 100644 index 081ce47..0000000 --- a/examples/s-py/projects/s-py-frontend/src/components/Account.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { useWallet } from '@txnlab/use-wallet-react' -import { useMemo } from 'react' -import { ellipseAddress } from '../utils/ellipseAddress' -import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' - -const Account = () => { - const { activeAddress } = useWallet() - const algoConfig = getAlgodConfigFromViteEnvironment() - - const networkName = useMemo(() => { - return algoConfig.network === '' ? 'localnet' : algoConfig.network.toLocaleLowerCase() - }, [algoConfig.network]) - - return ( - - ) -} - -export default Account diff --git a/examples/s-py/projects/s-py-frontend/src/components/ConnectWallet.tsx b/examples/s-py/projects/s-py-frontend/src/components/ConnectWallet.tsx deleted file mode 100644 index 8814cd5..0000000 --- a/examples/s-py/projects/s-py-frontend/src/components/ConnectWallet.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import { useWallet, Wallet, WalletId } from '@txnlab/use-wallet-react' -import Account from './Account' - -interface ConnectWalletInterface { - openModal: boolean - closeModal: () => void -} - -const ConnectWallet = ({ openModal, closeModal }: ConnectWalletInterface) => { - const { wallets, activeAddress } = useWallet() - - const isKmd = (wallet: Wallet) => wallet.id === WalletId.KMD - - return ( - -
-

Select wallet provider

- -
- {activeAddress && ( - <> - -
- - )} - - {!activeAddress && - wallets?.map((wallet) => ( - - ))} -
- -
- - {activeAddress && ( - - )} -
- -
- ) -} -export default ConnectWallet diff --git a/examples/s-py/projects/s-py-frontend/src/components/ErrorBoundary.tsx b/examples/s-py/projects/s-py-frontend/src/components/ErrorBoundary.tsx deleted file mode 100644 index 435bf61..0000000 --- a/examples/s-py/projects/s-py-frontend/src/components/ErrorBoundary.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import React, { ReactNode } from 'react' - -interface ErrorBoundaryProps { - children: ReactNode -} - -interface ErrorBoundaryState { - hasError: boolean - error: Error | null -} - -class ErrorBoundary extends React.Component { - constructor(props: ErrorBoundaryProps) { - super(props) - this.state = { hasError: false, error: null } - } - - static getDerivedStateFromError(error: Error): ErrorBoundaryState { - // Update state so the next render will show the fallback UI. - return { hasError: true, error: error } - } - - render(): ReactNode { - if (this.state.hasError) { - // You can render any custom fallback UI - return ( -
-
-
-

Error occured

-

- {this.state.error?.message.includes('Attempt to get default algod configuration') - ? 'Please make sure to set up your environment variables correctly. Create a .env file based on .env.template and fill in the required values. This controls the network and credentials for connections with Algod and Indexer.' - : this.state.error?.message} -

-
-
-
- ) - } - - return this.props.children - } -} - -export default ErrorBoundary diff --git a/examples/s-py/projects/s-py-frontend/src/components/Transact.tsx b/examples/s-py/projects/s-py-frontend/src/components/Transact.tsx deleted file mode 100644 index 36b1ec7..0000000 --- a/examples/s-py/projects/s-py-frontend/src/components/Transact.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { algo, AlgorandClient } from '@algorandfoundation/algokit-utils' -import { encodeTransactionRaw } from '@algorandfoundation/algokit-utils/transact' -import { useWallet } from '@txnlab/use-wallet-react' -import { useSnackbar } from 'notistack' -import { useState } from 'react' -import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' - -interface TransactInterface { - openModal: boolean - setModalState: (value: boolean) => void -} - -const Transact = ({ openModal, setModalState }: TransactInterface) => { - const [loading, setLoading] = useState(false) - const [receiverAddress, setReceiverAddress] = useState('') - - const algodConfig = getAlgodConfigFromViteEnvironment() - const algorand = AlgorandClient.fromConfig({ algodConfig }) - - const { enqueueSnackbar } = useSnackbar() - - const { signTransactions, activeAddress } = useWallet() - - const handleSubmitAlgo = async () => { - setLoading(true) - - if (!signTransactions || !activeAddress) { - enqueueSnackbar('Please connect wallet first', { variant: 'warning' }) - return - } - - try { - enqueueSnackbar('Sending transaction...', { variant: 'info' }) - const result = await algorand.send.payment({ - signer: async (txnGroup, indexesToSign) => { - const encoded = txnGroup.map((txn) => encodeTransactionRaw(txn)) - const signed = await signTransactions(encoded, indexesToSign) - return signed.filter((s): s is Uint8Array => s !== null) - }, - sender: activeAddress, - receiver: receiverAddress, - amount: algo(1), - }) - enqueueSnackbar(`Transaction sent: ${result.txIds[0]}`, { variant: 'success' }) - setReceiverAddress('') - } catch (e) { - enqueueSnackbar('Failed to send transaction', { variant: 'error' }) - } - - setLoading(false) - } - - return ( - -
-

Send payment transaction

-
- { - setReceiverAddress(e.target.value) - }} - /> -
- - -
-
-
- ) -} - -export default Transact diff --git a/examples/s-py/projects/s-py-frontend/src/contracts/README.md b/examples/s-py/projects/s-py-frontend/src/contracts/README.md deleted file mode 100644 index 04629b1..0000000 --- a/examples/s-py/projects/s-py-frontend/src/contracts/README.md +++ /dev/null @@ -1,14 +0,0 @@ -## How to connect my web app with Algorand smart contracts? - -The following folder is reserved for the Algorand Application Clients. The clients are used to interact with instances of Algorand Smart Contracts (ASC1s) deployed on-chain. - -To integrate this react frontend template with your smart contracts codebase, perform the following steps: - -1. Generate the typed client using `algokit generate client -l typescript -o {path/to/this/folder}` or using the dedicated `link` command `algokit project link` (ensure to invoke it from the root of this react project). Using the `link` command is especially useful within workspaces that have multiple contract projects. -2. The generated typescript client should be ready to be imported and used in this react frontend template, making it a full fledged dApp. - -> Please note, by default this template defines `"generate:app-clients": "algokit project link --all"` which is a shortcut to automatically link TEAL code from all `contract` projects in the workspace as typed clients into the `frontend` project that is invoking the `link` command. Refer to [documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/link.md) to read more about `link` command. - -## **How to interact with the smart contract?** - -The generated client provides a set of functions that can be used to interact with the ABI (Application Binary Interface) compliant Algorand smart contract. For example, if the smart contract has a function called `hello`, the generated client will have a function called `hello` that can be used to interact with the smart contract. Refer to a [full-stack end-to-end starter template](https://github.com/algorandfoundation/algokit-fullstack-template) for a reference example on invoking and interacting with typescript typed clients generated. diff --git a/examples/s-py/projects/s-py-frontend/src/interfaces/network.ts b/examples/s-py/projects/s-py-frontend/src/interfaces/network.ts deleted file mode 100644 index fdb97ae..0000000 --- a/examples/s-py/projects/s-py-frontend/src/interfaces/network.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/network-client' - -export interface AlgoViteClientConfig extends AlgoClientConfig { - /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ - server: string - /** The port to use e.g. 4001, 443, etc. */ - port: string | number - /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string - /** String representing current Algorand Network type (testnet/mainnet and etc) */ - network: string -} - -export interface AlgoViteKMDConfig extends AlgoClientConfig { - /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ - server: string - /** The port to use e.g. 4001, 443, etc. */ - port: string | number - /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string - /** KMD wallet name */ - wallet: string - /** KMD wallet password */ - password: string -} diff --git a/examples/s-py/projects/s-py-frontend/src/main.tsx b/examples/s-py/projects/s-py-frontend/src/main.tsx deleted file mode 100644 index 431a30c..0000000 --- a/examples/s-py/projects/s-py-frontend/src/main.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App' -import './styles/App.css' -import ErrorBoundary from './components/ErrorBoundary' - -ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - - - - - , -) diff --git a/examples/s-py/projects/s-py-frontend/src/styles/App.css b/examples/s-py/projects/s-py-frontend/src/styles/App.css deleted file mode 100644 index ee2b188..0000000 --- a/examples/s-py/projects/s-py-frontend/src/styles/App.css +++ /dev/null @@ -1,126 +0,0 @@ -/* App.css */ - -.hero { - display: flex; - justify-content: center; - align-items: center; - min-height: 100vh; - background-color: #38b2ac; -} - -.hero-content { - text-align: center; - border-radius: 0.5rem; - padding: 1.5rem; - max-width: 24rem; - background-color: #ffffff; - margin: 0 auto; -} - -.text-4xl { - font-size: 2.25rem; - line-height: 2.5rem; -} - -.font-bold { - font-weight: 700; -} - -.py-6 { - padding-top: 1.5rem; - padding-bottom: 1.5rem; -} - -.grid { - display: grid; -} - -.btn { - margin: 0.5rem; -} - -.btn-primary { - background-color: #1a202c; - color: #fff; -} - -.divider { - border-top: 1px solid #e2e8f0; - margin-top: 1rem; - margin-bottom: 1rem; -} - -.modal { - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - background: rgba(0, 0, 0, 0.6); - display: none; - z-index: 9999; - overflow: auto; -} - -.modal-open { - display: block; -} - -.modal-box { - margin: 2.5em auto; - background: #fff; - border-radius: 0.5em; - width: 40em; - max-width: 90vw; - padding: 1em; -} - -.font-bold { - font-weight: bold; -} - -.text-2xl { - font-size: 1.5rem; -} - -.m-2 { - margin: 0.5rem; -} - -.pt-5 { - padding-top: 1.25rem; -} - -.grid { - display: grid; -} - -.btn { - margin: 0.5rem; - padding: 0.5rem 1rem; - background-color: #00aba2; - color: #fff; -} - -.btn-warning { - background-color: #d69e2e; -} - -.border-1 { - border-width: 1px; -} - -.border-teal-800 { - border-color: #2c7a7b; -} - -.modal-action { - display: grid; - margin-top: 1rem; -} - -.divider { - border-top: 1px solid #e2e8f0; - margin-top: 1rem; - margin-bottom: 1rem; -} diff --git a/examples/s-py/projects/s-py-frontend/src/utils/ellipseAddress.ts b/examples/s-py/projects/s-py-frontend/src/utils/ellipseAddress.ts deleted file mode 100644 index db97e48..0000000 --- a/examples/s-py/projects/s-py-frontend/src/utils/ellipseAddress.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function ellipseAddress(address: string | null, width = 6): string { - return address ? `${address.slice(0, width)}...${address.slice(-width)}` : (address ?? '') -} diff --git a/examples/s-py/projects/s-py-frontend/src/utils/network/getAlgoClientConfigs.ts b/examples/s-py/projects/s-py-frontend/src/utils/network/getAlgoClientConfigs.ts deleted file mode 100644 index b5121f8..0000000 --- a/examples/s-py/projects/s-py-frontend/src/utils/network/getAlgoClientConfigs.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { AlgoViteClientConfig, AlgoViteKMDConfig } from '../../interfaces/network' - -export function getAlgodConfigFromViteEnvironment(): AlgoViteClientConfig { - if (!import.meta.env.VITE_ALGOD_SERVER) { - throw new Error('Attempt to get default algod configuration without specifying VITE_ALGOD_SERVER in the environment variables') - } - - return { - server: import.meta.env.VITE_ALGOD_SERVER, - port: import.meta.env.VITE_ALGOD_PORT, - token: import.meta.env.VITE_ALGOD_TOKEN, - network: import.meta.env.VITE_ALGOD_NETWORK, - } -} - -export function getIndexerConfigFromViteEnvironment(): AlgoViteClientConfig { - if (!import.meta.env.VITE_INDEXER_SERVER) { - throw new Error('Attempt to get default algod configuration without specifying VITE_INDEXER_SERVER in the environment variables') - } - - return { - server: import.meta.env.VITE_INDEXER_SERVER, - port: import.meta.env.VITE_INDEXER_PORT, - token: import.meta.env.VITE_INDEXER_TOKEN, - network: import.meta.env.VITE_ALGOD_NETWORK, - } -} - -export function getKmdConfigFromViteEnvironment(): AlgoViteKMDConfig { - if (!import.meta.env.VITE_KMD_SERVER) { - throw new Error('Attempt to get default kmd configuration without specifying VITE_KMD_SERVER in the environment variables') - } - - return { - server: import.meta.env.VITE_KMD_SERVER, - port: import.meta.env.VITE_KMD_PORT, - token: import.meta.env.VITE_KMD_TOKEN, - wallet: import.meta.env.VITE_KMD_WALLET, - password: import.meta.env.VITE_KMD_PASSWORD, - } -} diff --git a/examples/s-py/projects/s-py-frontend/src/vite-env.d.ts b/examples/s-py/projects/s-py-frontend/src/vite-env.d.ts deleted file mode 100644 index 67c2d30..0000000 --- a/examples/s-py/projects/s-py-frontend/src/vite-env.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -/// - -interface ImportMetaEnv { - readonly VITE_ENVIRONMENT: string - - readonly VITE_ALGOD_TOKEN: string - readonly VITE_ALGOD_SERVER: string - readonly VITE_ALGOD_PORT: string - readonly VITE_ALGOD_NETWORK: string - - readonly VITE_INDEXER_TOKEN: string - readonly VITE_INDEXER_SERVER: string - readonly VITE_INDEXER_PORT: string - - readonly VITE_KMD_TOKEN: string - readonly VITE_KMD_SERVER: string - readonly VITE_KMD_PORT: string - readonly VITE_KMD_PASSWORD: string - readonly VITE_KMD_WALLET: string -} - -interface ImportMeta { - readonly env: ImportMetaEnv -} diff --git a/examples/s-py/projects/s-py-frontend/tsconfig.json b/examples/s-py/projects/s-py-frontend/tsconfig.json deleted file mode 100644 index a0f5661..0000000 --- a/examples/s-py/projects/s-py-frontend/tsconfig.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, - "module": "ESNext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, - "declaration": true /* Generates corresponding '.d.ts' file. */, - "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, - "sourceMap": true /* Generates corresponding '.map' file. */, - "strict": true /* Enable all strict type-checking options. */, - "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, - "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, - "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, - "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, - "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */, - "skipLibCheck": true /* Skip type checking of declaration files. */, - "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, - "allowJs": false, - "allowSyntheticDefaultImports": true, - "moduleResolution": "Bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - "outDir": "./dist/" - }, - "include": [ - "src/**/*.ts", - "src/**/*.tsx", - "vite.config.js", - "src/utils/", - "src/utils/", - "src/main.tsx", - ], - "references": [ - { - "path": "./tsconfig.node.json" - } - ] -} diff --git a/examples/s-py/projects/s-py-frontend/tsconfig.node.json b/examples/s-py/projects/s-py-frontend/tsconfig.node.json deleted file mode 100644 index e32f207..0000000 --- a/examples/s-py/projects/s-py-frontend/tsconfig.node.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "module": "NodeNext", - "moduleResolution": "NodeNext", - "allowSyntheticDefaultImports": true - }, - "include": ["vite.config.ts"] -} diff --git a/examples/s-py/projects/s-py-frontend/vite.config.ts b/examples/s-py/projects/s-py-frontend/vite.config.ts deleted file mode 100644 index e42dc7c..0000000 --- a/examples/s-py/projects/s-py-frontend/vite.config.ts +++ /dev/null @@ -1,15 +0,0 @@ -import react from '@vitejs/plugin-react' -import { defineConfig } from 'vite' -import { nodePolyfills } from 'vite-plugin-node-polyfills' - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [ - react(), - nodePolyfills({ - globals: { - Buffer: true, - }, - }), - ], -}) diff --git a/examples/s-tls/.algokit/.copier-answers.yml b/examples/s-tls/.algokit/.copier-answers.yml index 6a47aa5..e19132d 100644 --- a/examples/s-tls/.algokit/.copier-answers.yml +++ b/examples/s-tls/.algokit/.copier-answers.yml @@ -1,6 +1,6 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 2.1.8-8-g954a453 -_src_path: .. +_commit: 2.1.8-11-g7668422 +_src_path: /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template author_email: None author_name: None contract_name: Calculator diff --git a/examples/s-tls/.algokit/generators/create-devcontainer/copier.yaml b/examples/s-tls/.algokit/generators/create-devcontainer/copier.yaml deleted file mode 100644 index e98f334..0000000 --- a/examples/s-tls/.algokit/generators/create-devcontainer/copier.yaml +++ /dev/null @@ -1,4 +0,0 @@ -_tasks: - - "echo '==== Successfully generated new .devcontainer.json file 🚀 ===='" - -_templates_suffix: ".j2" diff --git a/examples/s-tls/.algokit/generators/create-devcontainer/devcontainer.json b/examples/s-tls/.algokit/generators/create-devcontainer/devcontainer.json deleted file mode 100644 index 6452c65..0000000 --- a/examples/s-tls/.algokit/generators/create-devcontainer/devcontainer.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "forwardPorts": [4001, 4002, 8980, 5173], - "portsAttributes": { - "4001": { - "label": "algod" - }, - "4002": { - "label": "kmd" - }, - "8980": { - "label": "indexer" - }, - "5173": { - "label": "vite" - } - }, - "postCreateCommand": "mkdir -p ~/.config/algokit && pipx install algokit && sudo chown -R codespace:codespace ~/.config/algokit", - "postStartCommand": "for i in {1..5}; do algokit localnet status > /dev/null 2>&1 && break || sleep 30; algokit localnet reset; done" -} diff --git a/examples/s-tls/.editorconfig b/examples/s-tls/.editorconfig deleted file mode 100644 index 5e550a1..0000000 --- a/examples/s-tls/.editorconfig +++ /dev/null @@ -1,10 +0,0 @@ -[*] -charset = utf-8 -insert_final_newline = true -end_of_line = lf -indent_style = space -indent_size = 2 -tab_width = 2 -max_line_length = 140 -trim_trailing_whitespace = true -single_quote = true diff --git a/examples/s-tls/.gitattributes b/examples/s-tls/.gitattributes deleted file mode 100644 index 6313b56..0000000 --- a/examples/s-tls/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text=auto eol=lf diff --git a/examples/s-tls/.gitignore b/examples/s-tls/.gitignore deleted file mode 100644 index 4105eb2..0000000 --- a/examples/s-tls/.gitignore +++ /dev/null @@ -1,170 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -#pdm.lock -# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it -# in version control. -# https://pdm.fming.dev/#use-with-ide -.pdm.toml - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Ruff (linter) -.ruff_cache/ - -# Cython debug symbols -cython_debug/ - -# PyCharm -.idea/ -!.idea/runConfigurations - -# macOS -.DS_Store - -# Received approval test files -*.received.* - -# NPM -node_modules - diff --git a/examples/s-tls/copy_files.sh b/examples/s-tls/copy_files.sh new file mode 100644 index 0000000..749b01f --- /dev/null +++ b/examples/s-tls/copy_files.sh @@ -0,0 +1,23 @@ + +#!/bin/bash +# Script to copy required files to the frontend project +# Usage: ./copy_files.sh + + +project_name="$1" +frontend_root="./projects/${project_name}-frontend" + +# Ensure directories exist +mkdir -p "${frontend_root}/src/components" + +# Copy files +cp "./inject_content/Home.tsx" "${frontend_root}/src/Home.tsx" +cp "./inject_content/AppCalls.tsx" "${frontend_root}/src/components/AppCalls.tsx" + +echo "Template completed successfully!" +# remove inject_content folder +rm -rf "./inject_content" +# self destruct the file +rm -f "$0" + + diff --git a/examples/s-tls/projects/s-tls-frontend/src/components/AppCalls.tsx b/examples/s-tls/inject_content/AppCalls.tsx similarity index 100% rename from examples/s-tls/projects/s-tls-frontend/src/components/AppCalls.tsx rename to examples/s-tls/inject_content/AppCalls.tsx diff --git a/examples/s-tls/projects/s-tls-frontend/src/Home.tsx b/examples/s-tls/inject_content/Home.tsx similarity index 100% rename from examples/s-tls/projects/s-tls-frontend/src/Home.tsx rename to examples/s-tls/inject_content/Home.tsx diff --git a/examples/s-tls/projects/.gitkeep b/examples/s-tls/projects/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/examples/s-tls/projects/s-tls-contracts/.algokit.toml b/examples/s-tls/projects/s-tls-contracts/.algokit.toml deleted file mode 100644 index b4b0251..0000000 --- a/examples/s-tls/projects/s-tls-contracts/.algokit.toml +++ /dev/null @@ -1,15 +0,0 @@ -[algokit] -min_version = "v2.0.0" - -[project] -type = 'contract' -name = 's-tls-contracts' -artifacts = 'contracts/artifacts' - -[project.run] -build = { commands = [ - 'npm run build', -], description = 'Build all smart contracts in the project' } -test = { commands = [ - 'npm run test', -], description = 'Run smart contract tests' } diff --git a/examples/s-tls/projects/s-tls-contracts/.eslintrc.js b/examples/s-tls/projects/s-tls-contracts/.eslintrc.js deleted file mode 100644 index 0fede66..0000000 --- a/examples/s-tls/projects/s-tls-contracts/.eslintrc.js +++ /dev/null @@ -1,56 +0,0 @@ -module.exports = { - env: { - browser: true, - es2021: true, - }, - extends: [ - 'airbnb-base', - 'plugin:import/errors', - 'plugin:import/warnings', - 'plugin:import/typescript', - 'plugin:prettier/recommended', - ], - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - }, - plugins: ['@typescript-eslint'], - rules: { - '@typescript-eslint/no-explicit-any': 'error', - '@typescript-eslint/ban-ts-comment': 'warn', - 'import/prefer-default-export': 'off', - 'import/extensions': [ - 'error', - 'ignorePackages', - { - js: 'never', - jsx: 'never', - ts: 'never', - tsx: 'never', - }, - ], - 'import/no-extraneous-dependencies': [ - 'error', - { - devDependencies: ['**/*.test.ts'], - }, - ], - }, - overrides: [ - { - files: ['*.algo.ts'], - rules: { - 'import/no-extraneous-dependencies': 'off', - 'object-shorthand': 'off', - 'class-methods-use-this': 'off', - 'no-undef': 'off', - 'max-classes-per-file': 'off', - 'no-bitwise': 'off', - 'operator-assignment': 'off', - 'prefer-template': 'off', - 'prefer-destructuring': 'off', - }, - }, - ], -}; diff --git a/examples/s-tls/projects/s-tls-contracts/.gitignore b/examples/s-tls/projects/s-tls-contracts/.gitignore deleted file mode 100644 index 40b878d..0000000 --- a/examples/s-tls/projects/s-tls-contracts/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/ \ No newline at end of file diff --git a/examples/s-tls/projects/s-tls-contracts/.prettierrc.toml b/examples/s-tls/projects/s-tls-contracts/.prettierrc.toml deleted file mode 100644 index d979519..0000000 --- a/examples/s-tls/projects/s-tls-contracts/.prettierrc.toml +++ /dev/null @@ -1,6 +0,0 @@ -# .prettierrc.toml -trailingComma = "es5" -tabWidth = 2 -semi = true -singleQuote = true -printWidth = 120 \ No newline at end of file diff --git a/examples/s-tls/projects/s-tls-contracts/.vscode/extensions.json b/examples/s-tls/projects/s-tls-contracts/.vscode/extensions.json deleted file mode 100644 index c582379..0000000 --- a/examples/s-tls/projects/s-tls-contracts/.vscode/extensions.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "recommendations": [ - "dbaeumer.vscode-eslint", - ] - } \ No newline at end of file diff --git a/examples/s-tls/projects/s-tls-contracts/.vscode/settings.json b/examples/s-tls/projects/s-tls-contracts/.vscode/settings.json deleted file mode 100644 index 99a5c70..0000000 --- a/examples/s-tls/projects/s-tls-contracts/.vscode/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit" - }, -} \ No newline at end of file diff --git a/examples/s-tls/projects/s-tls-contracts/README.md b/examples/s-tls/projects/s-tls-contracts/README.md deleted file mode 100644 index 6800947..0000000 --- a/examples/s-tls/projects/s-tls-contracts/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# TEALScript Project - -## Documentation - -For TEALScript documentation, go to https://tealscript.algo.xyz - -## Usage - -### Algokit - -This template assumes you have a local network running on your machine. The easiet way to setup a local network is with [algokit](https://github.com/algorandfoundation/algokit-cli). If you don't have Algokit or its dependencies installed locally you can open this repository in a GitHub codespace via https://codespaces.new and choosing this repo. - -### Build Contract - -`npm run build` will compile the contract to TEAL and generate an ABI and appspec JSON in [./contracts/artifacts](./contracts/artifacts/) and a algokit TypeScript client in [./contracts/clients](./contracts/clients/). - -`npm run compile-contract` or `npm run generate-client` can be used to compile the contract or generate the contract seperately. - -### Run Tests - -`npm run test` will execute the tests defined in [./\_\_test\_\_](./__test__) - -### Lint - -`npm run lint` will lint the contracts and tests with ESLint. diff --git a/examples/s-tls/projects/s-tls-contracts/__test__/Calculator.test.ts b/examples/s-tls/projects/s-tls-contracts/__test__/Calculator.test.ts deleted file mode 100644 index 6c94ecc..0000000 --- a/examples/s-tls/projects/s-tls-contracts/__test__/Calculator.test.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { describe, test, expect, beforeAll, beforeEach } from '@jest/globals'; -import { algorandFixture } from '@algorandfoundation/algokit-utils/testing'; -import { Config } from '@algorandfoundation/algokit-utils'; -import { CalculatorClient, CalculatorFactory } from '../contracts/clients/CalculatorClient'; - -const fixture = algorandFixture(); -Config.configure({ populateAppCallResources: true }); - -let appClient: CalculatorClient; - -describe('Calculator', () => { - beforeEach(fixture.beforeEach); - - beforeAll(async () => { - await fixture.beforeEach(); - const { testAccount } = fixture.context; - const { algorand } = fixture; - - const factory = new CalculatorFactory({ - algorand, - defaultSender: testAccount.addr, - }); - - const createResult = await factory.send.create.createApplication(); - appClient = createResult.appClient; - }); - - test('sum', async () => { - const a = 13; - const b = 37; - const sum = await appClient.send.doMath({ args: { a, b, operation: 'sum' } }); - expect(sum.return).toBe(BigInt(a + b)); - }); - - test('difference', async () => { - const a = 13; - const b = 37; - const diff = await appClient.send.doMath({ args: { a, b, operation: 'difference' } }); - expect(diff.return).toBe(BigInt(a >= b ? a - b : b - a)); - }); - - test('hello', async () => { - const hello = await appClient.send.hello({ args: { name: 'world!' } }); - expect(hello.return).toBe('Hello, world!'); - }); -}); diff --git a/examples/s-tls/projects/s-tls-contracts/contracts/Calculator.algo.ts b/examples/s-tls/projects/s-tls-contracts/contracts/Calculator.algo.ts deleted file mode 100644 index 9b36280..0000000 --- a/examples/s-tls/projects/s-tls-contracts/contracts/Calculator.algo.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Contract } from '@algorandfoundation/tealscript'; - -export class Calculator extends Contract { - /** - * Calculates the sum of two numbers - * - * @param a - * @param b - * @returns The sum of a and b - */ - private getSum(a: uint64, b: uint64): uint64 { - return a + b; - } - - /** - * Calculates the difference between two numbers - * - * @param a - * @param b - * @returns The difference between a and b. - */ - private getDifference(a: uint64, b: uint64): uint64 { - return a >= b ? a - b : b - a; - } - - /** - * A method that takes two numbers and does either addition or subtraction - * - * @param a The first uint64 - * @param b The second uint64 - * @param operation The operation to perform. Can be either 'sum' or 'difference' - * - * @returns The result of the operation - */ - doMath(a: uint64, b: uint64, operation: string): uint64 { - let result: uint64; - - if (operation === 'sum') { - result = this.getSum(a, b); - } else if (operation === 'difference') { - result = this.getDifference(a, b); - } else throw Error('Invalid operation'); - - return result; - } - - /** - * A demonstration method used in the AlgoKit fullstack template. - * Greets the user by name. - * - * @param name The name of the user to greet. - * @returns A greeting message to the user. - */ - hello(name: string): string { - return 'Hello, ' + name; - } -} diff --git a/examples/s-tls/projects/s-tls-contracts/contracts/clients/.gitkeep b/examples/s-tls/projects/s-tls-contracts/contracts/clients/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/examples/s-tls/projects/s-tls-contracts/jest.config.js b/examples/s-tls/projects/s-tls-contracts/jest.config.js deleted file mode 100644 index 6f5ef4e..0000000 --- a/examples/s-tls/projects/s-tls-contracts/jest.config.js +++ /dev/null @@ -1,6 +0,0 @@ -/** @type {import('ts-jest').JestConfigWithTsJest} */ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - testTimeout: 60000 -}; diff --git a/examples/s-tls/projects/s-tls-contracts/package.json b/examples/s-tls/projects/s-tls-contracts/package.json deleted file mode 100644 index a8a1c58..0000000 --- a/examples/s-tls/projects/s-tls-contracts/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "s-tls-contracts", - "version": "0.0.0", - "license": "MIT", - "scripts": { - "generate-client": "algokit generate client contracts/artifacts/ --language typescript --output contracts/clients/{contract_name}Client.ts", - "compile-contract": "tealscript contracts/*.algo.ts contracts/artifacts", - "generate-components": "algokit-generate-component contracts/artifacts/Calculator.arc32.json contracts/artifacts/components", - "build": "npm run compile-contract && npm run generate-client", - "test": "npm run build && jest", - "lint": "eslint . --ext .ts", - "fix": "eslint . --ext .ts --fix" - }, - "dependencies": { - "@algorandfoundation/algokit-utils": "^7.0.0", - "algosdk": ">=2.9.0 <3.0" - }, - "devDependencies": { - "@algorandfoundation/algokit-client-generator": "^4.0.0", - "@algorandfoundation/tealscript": "latest", - "@jest/globals": "^29.5.0", - "@joe-p/algokit-generate-component": "^0.2.0", - "@typescript-eslint/eslint-plugin": "^5.13.0", - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^7.32.0 || ^8.2.0", - "eslint-config-airbnb-base": "^15.0.0", - "eslint-config-airbnb-typescript": "^17.0.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-prettier": "^5.0.1", - "jest": "^29.5.0", - "prettier": "^3.0.3", - "ts-jest": "^29.1.0", - "typescript": "5.0.2" - } -} diff --git a/examples/s-tls/projects/s-tls-contracts/tsconfig.json b/examples/s-tls/projects/s-tls-contracts/tsconfig.json deleted file mode 100644 index 5e3106d..0000000 --- a/examples/s-tls/projects/s-tls-contracts/tsconfig.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "compilerOptions": { - /* Visit https://aka.ms/tsconfig to read more about this file */ - - /* Projects */ - // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ - // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ - // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ - // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ - // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ - // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ - - /* Language and Environment */ - "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ - // "jsx": "preserve", /* Specify what JSX code is generated. */ - "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ - // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ - // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ - // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ - // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ - // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ - // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ - // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ - // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ - - /* Modules */ - "module": "commonjs", /* Specify what module code is generated. */ - // "rootDir": "./", /* Specify the root folder within your source files. */ - // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ - // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ - // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ - // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ - // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ - // "types": [], /* Specify type package names to be included without being referenced in a source file. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ - // "resolveJsonModule": true, /* Enable importing .json files. */ - // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ - - /* JavaScript Support */ - // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ - // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ - // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ - - /* Emit */ - // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ - // "declarationMap": true, /* Create sourcemaps for d.ts files. */ - // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ - // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ - // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ - // "outDir": "./", /* Specify an output folder for all emitted files. */ - // "removeComments": true, /* Disable emitting comments. */ - // "noEmit": true, /* Disable emitting files from a compilation. */ - // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ - // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ - // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ - // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ - // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ - // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ - // "newLine": "crlf", /* Set the newline character for emitting files. */ - // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ - // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ - // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ - // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ - // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ - // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ - - /* Interop Constraints */ - // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ - // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ - "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ - // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ - "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ - - /* Type Checking */ - "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ - // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ - // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ - // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ - // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ - // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ - // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ - // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ - // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ - // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ - // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ - // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ - // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ - // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ - // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ - // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ - // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ - - /* Completeness */ - // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ - "skipLibCheck": true /* Skip type checking all .d.ts files. */ - } -} diff --git a/examples/s-tls/projects/s-tls-frontend/.algokit.toml b/examples/s-tls/projects/s-tls-frontend/.algokit.toml deleted file mode 100644 index f11e2b6..0000000 --- a/examples/s-tls/projects/s-tls-frontend/.algokit.toml +++ /dev/null @@ -1,11 +0,0 @@ -[algokit] -min_version = "v2.0.0" - -[project] -type = "frontend" -name = 's-tls-frontend' -artifacts = "src/contracts" - -[project.run] -build = { commands = ['npm run build'], description = 'Build frontend' } -test = { commands = ['npm run test'], description = 'Run frontend tests' } diff --git a/examples/s-tls/projects/s-tls-frontend/.algokit/.copier-answers.yml b/examples/s-tls/projects/s-tls-frontend/.algokit/.copier-answers.yml deleted file mode 100644 index c7dc6c9..0000000 --- a/examples/s-tls/projects/s-tls-frontend/.algokit/.copier-answers.yml +++ /dev/null @@ -1,8 +0,0 @@ -# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 1.1.1-13-gc5abe59 -_src_path: gh:algorandfoundation/algokit-react-frontend-template -author_email: None -author_name: None -preset_name: starter -project_name: s-tls-frontend - diff --git a/examples/s-tls/projects/s-tls-frontend/.env.template b/examples/s-tls/projects/s-tls-frontend/.env.template deleted file mode 100644 index 5dfbb2d..0000000 --- a/examples/s-tls/projects/s-tls-frontend/.env.template +++ /dev/null @@ -1,70 +0,0 @@ -# ====================== -# LocalNet configuration -# uncomment below to use -# ====================== - -VITE_ENVIRONMENT=local - -# Algod -VITE_ALGOD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -VITE_ALGOD_SERVER=http://localhost -VITE_ALGOD_PORT=4001 -VITE_ALGOD_NETWORK=localnet - -# Indexer -VITE_INDEXER_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -VITE_INDEXER_SERVER=http://localhost -VITE_INDEXER_PORT=8980 - -# KMD -# Please note: -# 1. This is only needed for LocalNet since -# by default KMD provider is ignored on other networks. -# 2. AlgoKit LocalNet starts with a single wallet called 'unencrypted-default-wallet', -# with heaps of tokens available for testing. -VITE_KMD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -VITE_KMD_SERVER=http://localhost -VITE_KMD_PORT=4002 -VITE_KMD_WALLET="unencrypted-default-wallet" -VITE_KMD_PASSWORD="" - -# # ====================== -# # TestNet configuration: -# # uncomment below to use -# # ====================== - -# VITE_ENVIRONMENT=local - -# # Algod -# VITE_ALGOD_TOKEN="" -# VITE_ALGOD_SERVER="https://testnet-api.algonode.cloud" -# VITE_ALGOD_PORT="" -# VITE_ALGOD_NETWORK="testnet" - -# # Indexer -# VITE_INDEXER_TOKEN="" -# VITE_INDEXER_SERVER="https://testnet-idx.algonode.cloud" -# VITE_INDEXER_PORT="" - - -# # ====================== -# # MainNet configuration: -# # uncomment below to use -# # ====================== - -# VITE_ENVIRONMENT=production - -# # Algod -# VITE_ALGOD_TOKEN="" -# VITE_ALGOD_SERVER="https://mainnet-api.algonode.cloud" -# VITE_ALGOD_PORT="" -# VITE_ALGOD_NETWORK="mainnet" - -# # Indexer -# VITE_INDEXER_TOKEN="" -# VITE_INDEXER_SERVER="https://mainnet-idx.algonode.cloud" -# VITE_INDEXER_PORT="" - - -# Add your Web3Auth Client ID here if you want to test Web3Auth integration on TestNet or Mainnet -# VITE_WEB3_AUTH_CLIENT_ID="" \ No newline at end of file diff --git a/examples/s-tls/projects/s-tls-frontend/.gitignore b/examples/s-tls/projects/s-tls-frontend/.gitignore deleted file mode 100644 index b1ce837..0000000 --- a/examples/s-tls/projects/s-tls-frontend/.gitignore +++ /dev/null @@ -1,38 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/build - - -# dotenv environment variable files -.env -env/ - -# misc -/dist -.DS_Store - - -npm-debug.log* -yarn-debug.log* -yarn-error.log* -/test-results/ -/playwright-report/ -/playwright/.cache/ - -# PyCharm -.idea -!.idea/ -.idea/* -!.idea/runConfigurations/ - -.vercel -.netlify diff --git a/examples/s-tls/projects/s-tls-frontend/.npmrc b/examples/s-tls/projects/s-tls-frontend/.npmrc deleted file mode 100644 index c42da84..0000000 --- a/examples/s-tls/projects/s-tls-frontend/.npmrc +++ /dev/null @@ -1 +0,0 @@ -engine-strict = true diff --git a/examples/s-tls/projects/s-tls-frontend/.vscode/extensions.json b/examples/s-tls/projects/s-tls-frontend/.vscode/extensions.json deleted file mode 100644 index 6d0554a..0000000 --- a/examples/s-tls/projects/s-tls-frontend/.vscode/extensions.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "recommendations": [ - "EditorConfig.EditorConfig", - "dotenv.dotenv-vscode", - ] -} - diff --git a/examples/s-tls/projects/s-tls-frontend/.vscode/launch.json b/examples/s-tls/projects/s-tls-frontend/.vscode/launch.json deleted file mode 100644 index 7edaf04..0000000 --- a/examples/s-tls/projects/s-tls-frontend/.vscode/launch.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "configurations": [ - { - "type": "msedge", - "request": "launch", - "name": "Run (Edge)", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - "presentation": { - "hidden": false, - "group": "2. Web" - } - }, - { - "type": "chrome", - "request": "launch", - "name": "Run (Chrome)", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - "presentation": { - "hidden": false, - "group": "2. Web" - } - }, - { - "type": "firefox", - "request": "launch", - "name": "Run (Firefox)", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - "presentation": { - "hidden": false, - "group": "2. Web" - } - }, - { - "name": "Run dApp", - "type": "node", - "request": "launch", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "dev"], - "cwd": "${workspaceRoot}", - "console": "integratedTerminal", - "skipFiles": ["/**", "node_modules/**"], - "presentation": { - "hidden": false, - "group": "1. Run Project", - "order": 1 - } - }, - { - "name": "Run dApp (+ LocalNet)", - "type": "node", - "request": "launch", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "dev"], - "cwd": "${workspaceRoot}", - "console": "integratedTerminal", - "skipFiles": ["/**", "node_modules/**"], - "preLaunchTask": "Start AlgoKit LocalNet", - "presentation": { - "hidden": false, - "group": "1. Run Project", - "order": 1 - } - } - ] -} diff --git a/examples/s-tls/projects/s-tls-frontend/.vscode/settings.json b/examples/s-tls/projects/s-tls-frontend/.vscode/settings.json deleted file mode 100644 index f34d28b..0000000 --- a/examples/s-tls/projects/s-tls-frontend/.vscode/settings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "editor.formatOnSave": true, - - "dotenv.enableAutocloaking": false, - -} diff --git a/examples/s-tls/projects/s-tls-frontend/.vscode/tasks.json b/examples/s-tls/projects/s-tls-frontend/.vscode/tasks.json deleted file mode 100644 index d611c4f..0000000 --- a/examples/s-tls/projects/s-tls-frontend/.vscode/tasks.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "Start AlgoKit LocalNet", - "command": "algokit", - "args": ["localnet", "start"], - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "problemMatcher": [] - } - ] -} diff --git a/examples/s-tls/projects/s-tls-frontend/README.md b/examples/s-tls/projects/s-tls-frontend/README.md deleted file mode 100644 index da97047..0000000 --- a/examples/s-tls/projects/s-tls-frontend/README.md +++ /dev/null @@ -1,76 +0,0 @@ -# s-tls-frontend - -This starter React project has been generated using AlgoKit. See below for default getting started instructions. - -# Setup - -### Initial Setup - -#### 1. Clone the Repository -Start by cloning this repository to your local machine. - -#### 2. Install Pre-requisites -Ensure the following pre-requisites are installed and properly configured: - -- **npm**: Node package manager. Install from [Node.js Installation Guide](https://nodejs.org/en/download/). Verify with `npm -v` to see version `18.12`+. -- **AlgoKit CLI**: Essential for project setup and operations. Install the latest version from [AlgoKit CLI Installation Guide](https://github.com/algorandfoundation/algokit-cli#install). Verify installation with `algokit --version`, expecting `2.0.0` or later. - -#### 3. Bootstrap Your Local Environment -Run the following commands within the project folder: - -- **Install Project Dependencies**: With `algokit project bootstrap all`, ensure all dependencies are ready. - -### Development Workflow - -#### Terminal -Directly manage and interact with your project using AlgoKit commands: - -1. **Build Contracts**: `algokit project run build` builds react web app and links with smart contracts in workspace, if any. -2. Remaining set of command for linting, testing and deployment can be found in respective [package.json](./package.json) file and [.algokit.toml](./.algokit.toml) files. - -#### VS Code -For a seamless experience with breakpoint debugging and other features: - -1. **Open Project**: In VS Code, open the repository root. -2. **Install Extensions**: Follow prompts to install recommended extensions. -3. **Debugging**: - - Use `F5` to start debugging. - - **Windows Users**: Select the Python interpreter at `./.venv/Scripts/python.exe` via `Ctrl/Cmd + Shift + P` > `Python: Select Interpreter` before the first run. - -#### Other IDEs -While primarily optimized for VS Code, Jetbrains WebStorm has base support for this project: - -1. **Open Project**: In your JetBrains IDE, open the repository root. -2. **Automatic Setup**: The IDE should configure the Python interpreter and virtual environment. -3. **Debugging**: Use `Shift+F10` or `Ctrl+R` to start debugging. Note: Windows users may encounter issues with pre-launch tasks due to a known bug. See [JetBrains forums](https://youtrack.jetbrains.com/issue/IDEA-277486/Shell-script-configuration-cannot-run-as-before-launch-task) for workarounds. - -## AlgoKit Workspaces and Project Management -This project supports both standalone and monorepo setups through AlgoKit workspaces. Leverage [`algokit project run`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md) commands for efficient monorepo project orchestration and management across multiple projects within a workspace. - -> Please note, by default frontend is pre configured to run against Algorand LocalNet. If you want to run against TestNet or MainNet, comment out the current environment variable and uncomment the relevant one in [`.env`](.env) file that is created after running bootstrap command and based on [`.env.template`](.env.template). - -# Algorand Wallet integrations - -The template comes with [`use-wallet`](https://github.com/txnlab/use-wallet) integration, which provides a React hook for connecting to an Algorand wallet providers. The following wallet providers are included by default: -- LocalNet: -- - [KMD/Local Wallet](https://github.com/TxnLab/use-wallet#kmd-algorand-key-management-daemon) - Algorand's Key Management Daemon (KMD) is a service that manages Algorand private keys and signs transactions. Works best with AlgoKit LocalNet and allows you to easily test and interact with your dApps locally. -- TestNet and others: -- - [Pera Wallet](https://perawallet.app). -- - [Defly Wallet](https://defly.app). -- - [Exodus Wallet](https://www.exodus.com). -- - [Daffi Wallet](https://www.daffi.me). - -Refer to official [`use-wallet`](https://github.com/txnlab/use-wallet) documentation for detailed guidelines on how to integrate with other wallet providers (such as WalletConnect v2). Too see implementation details on the use wallet hook and initialization of extra wallet providers refer to [`App.tsx`](./src/App.tsx). - -# Tools - -This project makes use of React and Tailwind to provider a base project configuration to develop frontends for your Algorand dApps and interactions with smart contracts. The following tools are in use: - -- [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-ts) - Various TypeScript utilities to simplify interactions with Algorand and AlgoKit. -- [React](https://reactjs.org/) - A JavaScript library for building user interfaces. -- [use-wallet](https://github.com/txnlab/use-wallet) - A React hook for connecting to an Algorand wallet providers. -- [npm](https://www.npmjs.com/): Node.js package manager -It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. -# Integrating with smart contracts and application clients - -Refer to the detailed guidance on [integrating with smart contracts and application clients](./src/contracts/README.md). In essence, for any smart contract codebase generated with AlgoKit or other tools that produce compile contracts into ARC34 compliant app specifications, you can use the `algokit generate` command to generate TypeScript or Python typed client. Once generated simply drag and drop the generated client into `./src/contracts` and import it into your React components as you see fit. diff --git a/examples/s-tls/projects/s-tls-frontend/index.html b/examples/s-tls/projects/s-tls-frontend/index.html deleted file mode 100644 index 5a2ef4f..0000000 --- a/examples/s-tls/projects/s-tls-frontend/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - AlgoKit React Template - - -
- - - diff --git a/examples/s-tls/projects/s-tls-frontend/package.json b/examples/s-tls/projects/s-tls-frontend/package.json deleted file mode 100644 index 87e6657..0000000 --- a/examples/s-tls/projects/s-tls-frontend/package.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "name": "s-tls-frontend", - "version": "0.1.0", - "author": { - "name": "None", - "email": "None" - }, - "private": true, - "type": "module", - "engines": { - "node": ">=20.0", - "npm": ">=9.0" - }, - "devDependencies": { - "@algorandfoundation/algokit-client-generator": "^7.0.0-alpha.5", - "@types/node": "^18.17.14", - "@types/react": "^18.2.11", - "@types/react-dom": "^18.2.4", - "@vitejs/plugin-react": "^4.2.1", - "autoprefixer": "^10.4.14", - "ts-node": "^10.9.1", - "typescript": "^5.1.6", - "vite": "^5.0.0", - "vite-plugin-node-polyfills": "^0.22.0" - }, - "dependencies": { - "@algorandfoundation/algokit-utils": "^10.0.0-alpha.40", - "@blockshake/defly-connect": "^1.2.1", - "@perawallet/connect": "^1.4.1", - "@txnlab/use-wallet": "^4.6.0", - "@txnlab/use-wallet-react": "^4.6.0", - "@web3auth/modal": "^9.7.0", - "notistack": "^3.0.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "tslib": "^2.6.2" - }, - "scripts": { - "generate:app-clients": "algokit project link --all", - "dev": "npm run generate:app-clients && vite", - "build": "npm run generate:app-clients && tsc && vite build", - "preview": "vite preview" - }, - "eslintConfig": { - "extends": [ - "react-app" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "overrides": { - "ws@>7.0.0 <7.5.9": "7.5.10" - } -} diff --git a/examples/s-tls/projects/s-tls-frontend/public/index.html b/examples/s-tls/projects/s-tls-frontend/public/index.html deleted file mode 100644 index 0d3a3a5..0000000 --- a/examples/s-tls/projects/s-tls-frontend/public/index.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - React App - - - -
- - - diff --git a/examples/s-tls/projects/s-tls-frontend/public/robots.txt b/examples/s-tls/projects/s-tls-frontend/public/robots.txt deleted file mode 100644 index e9e57dc..0000000 --- a/examples/s-tls/projects/s-tls-frontend/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * -Disallow: diff --git a/examples/s-tls/projects/s-tls-frontend/src/App.tsx b/examples/s-tls/projects/s-tls-frontend/src/App.tsx deleted file mode 100644 index f346006..0000000 --- a/examples/s-tls/projects/s-tls-frontend/src/App.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { SupportedWallet, WalletId, WalletManager, WalletProvider } from '@txnlab/use-wallet-react' -import { SnackbarProvider } from 'notistack' -import Home from './Home' -import { getAlgodConfigFromViteEnvironment, getKmdConfigFromViteEnvironment } from './utils/network/getAlgoClientConfigs' - -let supportedWallets: SupportedWallet[] -if (import.meta.env.VITE_ALGOD_NETWORK === 'localnet') { - const kmdConfig = getKmdConfigFromViteEnvironment() - supportedWallets = [ - { - id: WalletId.KMD, - options: { - baseServer: kmdConfig.server, - token: String(kmdConfig.token), - port: String(kmdConfig.port), - }, - }, - ] -} else { - supportedWallets = [ - { id: WalletId.DEFLY }, - { id: WalletId.PERA }, - { id: WalletId.EXODUS }, - // If you are interested in WalletConnect v2 provider - // refer to https://github.com/TxnLab/use-wallet for detailed integration instructions - ] -} - -export default function App() { - const algodConfig = getAlgodConfigFromViteEnvironment() - - const walletManager = new WalletManager({ - wallets: supportedWallets, - defaultNetwork: algodConfig.network, - networks: { - [algodConfig.network]: { - algod: { - baseServer: algodConfig.server, - port: algodConfig.port, - token: String(algodConfig.token), - }, - }, - }, - options: { - resetNetwork: true, - }, - }) - - return ( - - - - - - ) -} diff --git a/examples/s-tls/projects/s-tls-frontend/src/assets/logo.svg b/examples/s-tls/projects/s-tls-frontend/src/assets/logo.svg deleted file mode 100644 index 7169476..0000000 --- a/examples/s-tls/projects/s-tls-frontend/src/assets/logo.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/examples/s-tls/projects/s-tls-frontend/src/components/Account.tsx b/examples/s-tls/projects/s-tls-frontend/src/components/Account.tsx deleted file mode 100644 index 081ce47..0000000 --- a/examples/s-tls/projects/s-tls-frontend/src/components/Account.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { useWallet } from '@txnlab/use-wallet-react' -import { useMemo } from 'react' -import { ellipseAddress } from '../utils/ellipseAddress' -import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' - -const Account = () => { - const { activeAddress } = useWallet() - const algoConfig = getAlgodConfigFromViteEnvironment() - - const networkName = useMemo(() => { - return algoConfig.network === '' ? 'localnet' : algoConfig.network.toLocaleLowerCase() - }, [algoConfig.network]) - - return ( - - ) -} - -export default Account diff --git a/examples/s-tls/projects/s-tls-frontend/src/components/ConnectWallet.tsx b/examples/s-tls/projects/s-tls-frontend/src/components/ConnectWallet.tsx deleted file mode 100644 index 8814cd5..0000000 --- a/examples/s-tls/projects/s-tls-frontend/src/components/ConnectWallet.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import { useWallet, Wallet, WalletId } from '@txnlab/use-wallet-react' -import Account from './Account' - -interface ConnectWalletInterface { - openModal: boolean - closeModal: () => void -} - -const ConnectWallet = ({ openModal, closeModal }: ConnectWalletInterface) => { - const { wallets, activeAddress } = useWallet() - - const isKmd = (wallet: Wallet) => wallet.id === WalletId.KMD - - return ( - -
-

Select wallet provider

- -
- {activeAddress && ( - <> - -
- - )} - - {!activeAddress && - wallets?.map((wallet) => ( - - ))} -
- -
- - {activeAddress && ( - - )} -
- -
- ) -} -export default ConnectWallet diff --git a/examples/s-tls/projects/s-tls-frontend/src/components/ErrorBoundary.tsx b/examples/s-tls/projects/s-tls-frontend/src/components/ErrorBoundary.tsx deleted file mode 100644 index 435bf61..0000000 --- a/examples/s-tls/projects/s-tls-frontend/src/components/ErrorBoundary.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import React, { ReactNode } from 'react' - -interface ErrorBoundaryProps { - children: ReactNode -} - -interface ErrorBoundaryState { - hasError: boolean - error: Error | null -} - -class ErrorBoundary extends React.Component { - constructor(props: ErrorBoundaryProps) { - super(props) - this.state = { hasError: false, error: null } - } - - static getDerivedStateFromError(error: Error): ErrorBoundaryState { - // Update state so the next render will show the fallback UI. - return { hasError: true, error: error } - } - - render(): ReactNode { - if (this.state.hasError) { - // You can render any custom fallback UI - return ( -
-
-
-

Error occured

-

- {this.state.error?.message.includes('Attempt to get default algod configuration') - ? 'Please make sure to set up your environment variables correctly. Create a .env file based on .env.template and fill in the required values. This controls the network and credentials for connections with Algod and Indexer.' - : this.state.error?.message} -

-
-
-
- ) - } - - return this.props.children - } -} - -export default ErrorBoundary diff --git a/examples/s-tls/projects/s-tls-frontend/src/components/Transact.tsx b/examples/s-tls/projects/s-tls-frontend/src/components/Transact.tsx deleted file mode 100644 index 36b1ec7..0000000 --- a/examples/s-tls/projects/s-tls-frontend/src/components/Transact.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { algo, AlgorandClient } from '@algorandfoundation/algokit-utils' -import { encodeTransactionRaw } from '@algorandfoundation/algokit-utils/transact' -import { useWallet } from '@txnlab/use-wallet-react' -import { useSnackbar } from 'notistack' -import { useState } from 'react' -import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' - -interface TransactInterface { - openModal: boolean - setModalState: (value: boolean) => void -} - -const Transact = ({ openModal, setModalState }: TransactInterface) => { - const [loading, setLoading] = useState(false) - const [receiverAddress, setReceiverAddress] = useState('') - - const algodConfig = getAlgodConfigFromViteEnvironment() - const algorand = AlgorandClient.fromConfig({ algodConfig }) - - const { enqueueSnackbar } = useSnackbar() - - const { signTransactions, activeAddress } = useWallet() - - const handleSubmitAlgo = async () => { - setLoading(true) - - if (!signTransactions || !activeAddress) { - enqueueSnackbar('Please connect wallet first', { variant: 'warning' }) - return - } - - try { - enqueueSnackbar('Sending transaction...', { variant: 'info' }) - const result = await algorand.send.payment({ - signer: async (txnGroup, indexesToSign) => { - const encoded = txnGroup.map((txn) => encodeTransactionRaw(txn)) - const signed = await signTransactions(encoded, indexesToSign) - return signed.filter((s): s is Uint8Array => s !== null) - }, - sender: activeAddress, - receiver: receiverAddress, - amount: algo(1), - }) - enqueueSnackbar(`Transaction sent: ${result.txIds[0]}`, { variant: 'success' }) - setReceiverAddress('') - } catch (e) { - enqueueSnackbar('Failed to send transaction', { variant: 'error' }) - } - - setLoading(false) - } - - return ( - -
-

Send payment transaction

-
- { - setReceiverAddress(e.target.value) - }} - /> -
- - -
-
-
- ) -} - -export default Transact diff --git a/examples/s-tls/projects/s-tls-frontend/src/contracts/README.md b/examples/s-tls/projects/s-tls-frontend/src/contracts/README.md deleted file mode 100644 index 04629b1..0000000 --- a/examples/s-tls/projects/s-tls-frontend/src/contracts/README.md +++ /dev/null @@ -1,14 +0,0 @@ -## How to connect my web app with Algorand smart contracts? - -The following folder is reserved for the Algorand Application Clients. The clients are used to interact with instances of Algorand Smart Contracts (ASC1s) deployed on-chain. - -To integrate this react frontend template with your smart contracts codebase, perform the following steps: - -1. Generate the typed client using `algokit generate client -l typescript -o {path/to/this/folder}` or using the dedicated `link` command `algokit project link` (ensure to invoke it from the root of this react project). Using the `link` command is especially useful within workspaces that have multiple contract projects. -2. The generated typescript client should be ready to be imported and used in this react frontend template, making it a full fledged dApp. - -> Please note, by default this template defines `"generate:app-clients": "algokit project link --all"` which is a shortcut to automatically link TEAL code from all `contract` projects in the workspace as typed clients into the `frontend` project that is invoking the `link` command. Refer to [documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/link.md) to read more about `link` command. - -## **How to interact with the smart contract?** - -The generated client provides a set of functions that can be used to interact with the ABI (Application Binary Interface) compliant Algorand smart contract. For example, if the smart contract has a function called `hello`, the generated client will have a function called `hello` that can be used to interact with the smart contract. Refer to a [full-stack end-to-end starter template](https://github.com/algorandfoundation/algokit-fullstack-template) for a reference example on invoking and interacting with typescript typed clients generated. diff --git a/examples/s-tls/projects/s-tls-frontend/src/interfaces/network.ts b/examples/s-tls/projects/s-tls-frontend/src/interfaces/network.ts deleted file mode 100644 index fdb97ae..0000000 --- a/examples/s-tls/projects/s-tls-frontend/src/interfaces/network.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/network-client' - -export interface AlgoViteClientConfig extends AlgoClientConfig { - /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ - server: string - /** The port to use e.g. 4001, 443, etc. */ - port: string | number - /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string - /** String representing current Algorand Network type (testnet/mainnet and etc) */ - network: string -} - -export interface AlgoViteKMDConfig extends AlgoClientConfig { - /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ - server: string - /** The port to use e.g. 4001, 443, etc. */ - port: string | number - /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string - /** KMD wallet name */ - wallet: string - /** KMD wallet password */ - password: string -} diff --git a/examples/s-tls/projects/s-tls-frontend/src/main.tsx b/examples/s-tls/projects/s-tls-frontend/src/main.tsx deleted file mode 100644 index 431a30c..0000000 --- a/examples/s-tls/projects/s-tls-frontend/src/main.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App' -import './styles/App.css' -import ErrorBoundary from './components/ErrorBoundary' - -ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - - - - - , -) diff --git a/examples/s-tls/projects/s-tls-frontend/src/styles/App.css b/examples/s-tls/projects/s-tls-frontend/src/styles/App.css deleted file mode 100644 index ee2b188..0000000 --- a/examples/s-tls/projects/s-tls-frontend/src/styles/App.css +++ /dev/null @@ -1,126 +0,0 @@ -/* App.css */ - -.hero { - display: flex; - justify-content: center; - align-items: center; - min-height: 100vh; - background-color: #38b2ac; -} - -.hero-content { - text-align: center; - border-radius: 0.5rem; - padding: 1.5rem; - max-width: 24rem; - background-color: #ffffff; - margin: 0 auto; -} - -.text-4xl { - font-size: 2.25rem; - line-height: 2.5rem; -} - -.font-bold { - font-weight: 700; -} - -.py-6 { - padding-top: 1.5rem; - padding-bottom: 1.5rem; -} - -.grid { - display: grid; -} - -.btn { - margin: 0.5rem; -} - -.btn-primary { - background-color: #1a202c; - color: #fff; -} - -.divider { - border-top: 1px solid #e2e8f0; - margin-top: 1rem; - margin-bottom: 1rem; -} - -.modal { - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - background: rgba(0, 0, 0, 0.6); - display: none; - z-index: 9999; - overflow: auto; -} - -.modal-open { - display: block; -} - -.modal-box { - margin: 2.5em auto; - background: #fff; - border-radius: 0.5em; - width: 40em; - max-width: 90vw; - padding: 1em; -} - -.font-bold { - font-weight: bold; -} - -.text-2xl { - font-size: 1.5rem; -} - -.m-2 { - margin: 0.5rem; -} - -.pt-5 { - padding-top: 1.25rem; -} - -.grid { - display: grid; -} - -.btn { - margin: 0.5rem; - padding: 0.5rem 1rem; - background-color: #00aba2; - color: #fff; -} - -.btn-warning { - background-color: #d69e2e; -} - -.border-1 { - border-width: 1px; -} - -.border-teal-800 { - border-color: #2c7a7b; -} - -.modal-action { - display: grid; - margin-top: 1rem; -} - -.divider { - border-top: 1px solid #e2e8f0; - margin-top: 1rem; - margin-bottom: 1rem; -} diff --git a/examples/s-tls/projects/s-tls-frontend/src/utils/ellipseAddress.ts b/examples/s-tls/projects/s-tls-frontend/src/utils/ellipseAddress.ts deleted file mode 100644 index db97e48..0000000 --- a/examples/s-tls/projects/s-tls-frontend/src/utils/ellipseAddress.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function ellipseAddress(address: string | null, width = 6): string { - return address ? `${address.slice(0, width)}...${address.slice(-width)}` : (address ?? '') -} diff --git a/examples/s-tls/projects/s-tls-frontend/src/utils/network/getAlgoClientConfigs.ts b/examples/s-tls/projects/s-tls-frontend/src/utils/network/getAlgoClientConfigs.ts deleted file mode 100644 index b5121f8..0000000 --- a/examples/s-tls/projects/s-tls-frontend/src/utils/network/getAlgoClientConfigs.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { AlgoViteClientConfig, AlgoViteKMDConfig } from '../../interfaces/network' - -export function getAlgodConfigFromViteEnvironment(): AlgoViteClientConfig { - if (!import.meta.env.VITE_ALGOD_SERVER) { - throw new Error('Attempt to get default algod configuration without specifying VITE_ALGOD_SERVER in the environment variables') - } - - return { - server: import.meta.env.VITE_ALGOD_SERVER, - port: import.meta.env.VITE_ALGOD_PORT, - token: import.meta.env.VITE_ALGOD_TOKEN, - network: import.meta.env.VITE_ALGOD_NETWORK, - } -} - -export function getIndexerConfigFromViteEnvironment(): AlgoViteClientConfig { - if (!import.meta.env.VITE_INDEXER_SERVER) { - throw new Error('Attempt to get default algod configuration without specifying VITE_INDEXER_SERVER in the environment variables') - } - - return { - server: import.meta.env.VITE_INDEXER_SERVER, - port: import.meta.env.VITE_INDEXER_PORT, - token: import.meta.env.VITE_INDEXER_TOKEN, - network: import.meta.env.VITE_ALGOD_NETWORK, - } -} - -export function getKmdConfigFromViteEnvironment(): AlgoViteKMDConfig { - if (!import.meta.env.VITE_KMD_SERVER) { - throw new Error('Attempt to get default kmd configuration without specifying VITE_KMD_SERVER in the environment variables') - } - - return { - server: import.meta.env.VITE_KMD_SERVER, - port: import.meta.env.VITE_KMD_PORT, - token: import.meta.env.VITE_KMD_TOKEN, - wallet: import.meta.env.VITE_KMD_WALLET, - password: import.meta.env.VITE_KMD_PASSWORD, - } -} diff --git a/examples/s-tls/projects/s-tls-frontend/src/vite-env.d.ts b/examples/s-tls/projects/s-tls-frontend/src/vite-env.d.ts deleted file mode 100644 index 67c2d30..0000000 --- a/examples/s-tls/projects/s-tls-frontend/src/vite-env.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -/// - -interface ImportMetaEnv { - readonly VITE_ENVIRONMENT: string - - readonly VITE_ALGOD_TOKEN: string - readonly VITE_ALGOD_SERVER: string - readonly VITE_ALGOD_PORT: string - readonly VITE_ALGOD_NETWORK: string - - readonly VITE_INDEXER_TOKEN: string - readonly VITE_INDEXER_SERVER: string - readonly VITE_INDEXER_PORT: string - - readonly VITE_KMD_TOKEN: string - readonly VITE_KMD_SERVER: string - readonly VITE_KMD_PORT: string - readonly VITE_KMD_PASSWORD: string - readonly VITE_KMD_WALLET: string -} - -interface ImportMeta { - readonly env: ImportMetaEnv -} diff --git a/examples/s-tls/projects/s-tls-frontend/tsconfig.json b/examples/s-tls/projects/s-tls-frontend/tsconfig.json deleted file mode 100644 index a0f5661..0000000 --- a/examples/s-tls/projects/s-tls-frontend/tsconfig.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, - "module": "ESNext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, - "declaration": true /* Generates corresponding '.d.ts' file. */, - "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, - "sourceMap": true /* Generates corresponding '.map' file. */, - "strict": true /* Enable all strict type-checking options. */, - "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, - "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, - "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, - "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, - "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */, - "skipLibCheck": true /* Skip type checking of declaration files. */, - "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, - "allowJs": false, - "allowSyntheticDefaultImports": true, - "moduleResolution": "Bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - "outDir": "./dist/" - }, - "include": [ - "src/**/*.ts", - "src/**/*.tsx", - "vite.config.js", - "src/utils/", - "src/utils/", - "src/main.tsx", - ], - "references": [ - { - "path": "./tsconfig.node.json" - } - ] -} diff --git a/examples/s-tls/projects/s-tls-frontend/tsconfig.node.json b/examples/s-tls/projects/s-tls-frontend/tsconfig.node.json deleted file mode 100644 index e32f207..0000000 --- a/examples/s-tls/projects/s-tls-frontend/tsconfig.node.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "module": "NodeNext", - "moduleResolution": "NodeNext", - "allowSyntheticDefaultImports": true - }, - "include": ["vite.config.ts"] -} diff --git a/examples/s-tls/projects/s-tls-frontend/vite.config.ts b/examples/s-tls/projects/s-tls-frontend/vite.config.ts deleted file mode 100644 index e42dc7c..0000000 --- a/examples/s-tls/projects/s-tls-frontend/vite.config.ts +++ /dev/null @@ -1,15 +0,0 @@ -import react from '@vitejs/plugin-react' -import { defineConfig } from 'vite' -import { nodePolyfills } from 'vite-plugin-node-polyfills' - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [ - react(), - nodePolyfills({ - globals: { - Buffer: true, - }, - }), - ], -}) diff --git a/examples/s-ts/.algokit/.copier-answers.yml b/examples/s-ts/.algokit/.copier-answers.yml index 1b02299..c7a810e 100644 --- a/examples/s-ts/.algokit/.copier-answers.yml +++ b/examples/s-ts/.algokit/.copier-answers.yml @@ -1,6 +1,6 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 2.1.8-8-g954a453 -_src_path: .. +_commit: 2.1.8-11-g7668422 +_src_path: /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template author_email: None author_name: None contract_name: hello_world diff --git a/examples/s-ts/.algokit/generators/create-devcontainer/copier.yaml b/examples/s-ts/.algokit/generators/create-devcontainer/copier.yaml deleted file mode 100644 index e98f334..0000000 --- a/examples/s-ts/.algokit/generators/create-devcontainer/copier.yaml +++ /dev/null @@ -1,4 +0,0 @@ -_tasks: - - "echo '==== Successfully generated new .devcontainer.json file 🚀 ===='" - -_templates_suffix: ".j2" diff --git a/examples/s-ts/.algokit/generators/create-devcontainer/devcontainer.json b/examples/s-ts/.algokit/generators/create-devcontainer/devcontainer.json deleted file mode 100644 index 6452c65..0000000 --- a/examples/s-ts/.algokit/generators/create-devcontainer/devcontainer.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "forwardPorts": [4001, 4002, 8980, 5173], - "portsAttributes": { - "4001": { - "label": "algod" - }, - "4002": { - "label": "kmd" - }, - "8980": { - "label": "indexer" - }, - "5173": { - "label": "vite" - } - }, - "postCreateCommand": "mkdir -p ~/.config/algokit && pipx install algokit && sudo chown -R codespace:codespace ~/.config/algokit", - "postStartCommand": "for i in {1..5}; do algokit localnet status > /dev/null 2>&1 && break || sleep 30; algokit localnet reset; done" -} diff --git a/examples/s-ts/.editorconfig b/examples/s-ts/.editorconfig deleted file mode 100644 index 5e550a1..0000000 --- a/examples/s-ts/.editorconfig +++ /dev/null @@ -1,10 +0,0 @@ -[*] -charset = utf-8 -insert_final_newline = true -end_of_line = lf -indent_style = space -indent_size = 2 -tab_width = 2 -max_line_length = 140 -trim_trailing_whitespace = true -single_quote = true diff --git a/examples/s-ts/.gitattributes b/examples/s-ts/.gitattributes deleted file mode 100644 index 6313b56..0000000 --- a/examples/s-ts/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text=auto eol=lf diff --git a/examples/s-ts/.gitignore b/examples/s-ts/.gitignore deleted file mode 100644 index 4105eb2..0000000 --- a/examples/s-ts/.gitignore +++ /dev/null @@ -1,170 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -#pdm.lock -# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it -# in version control. -# https://pdm.fming.dev/#use-with-ide -.pdm.toml - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Ruff (linter) -.ruff_cache/ - -# Cython debug symbols -cython_debug/ - -# PyCharm -.idea/ -!.idea/runConfigurations - -# macOS -.DS_Store - -# Received approval test files -*.received.* - -# NPM -node_modules - diff --git a/examples/s-ts/copy_files.sh b/examples/s-ts/copy_files.sh new file mode 100644 index 0000000..749b01f --- /dev/null +++ b/examples/s-ts/copy_files.sh @@ -0,0 +1,23 @@ + +#!/bin/bash +# Script to copy required files to the frontend project +# Usage: ./copy_files.sh + + +project_name="$1" +frontend_root="./projects/${project_name}-frontend" + +# Ensure directories exist +mkdir -p "${frontend_root}/src/components" + +# Copy files +cp "./inject_content/Home.tsx" "${frontend_root}/src/Home.tsx" +cp "./inject_content/AppCalls.tsx" "${frontend_root}/src/components/AppCalls.tsx" + +echo "Template completed successfully!" +# remove inject_content folder +rm -rf "./inject_content" +# self destruct the file +rm -f "$0" + + diff --git a/examples/s-ts/projects/s-ts-frontend/src/components/AppCalls.tsx b/examples/s-ts/inject_content/AppCalls.tsx similarity index 100% rename from examples/s-ts/projects/s-ts-frontend/src/components/AppCalls.tsx rename to examples/s-ts/inject_content/AppCalls.tsx diff --git a/examples/s-ts/projects/s-ts-frontend/src/Home.tsx b/examples/s-ts/inject_content/Home.tsx similarity index 100% rename from examples/s-ts/projects/s-ts-frontend/src/Home.tsx rename to examples/s-ts/inject_content/Home.tsx diff --git a/examples/s-ts/projects/.gitkeep b/examples/s-ts/projects/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit.toml b/examples/s-ts/projects/s-ts-contracts/.algokit.toml deleted file mode 100644 index bb2b2d4..0000000 --- a/examples/s-ts/projects/s-ts-contracts/.algokit.toml +++ /dev/null @@ -1,44 +0,0 @@ -[algokit] -min_version = "v2.6.0" - -[generate.smart-contract] -description = "Generate a new smart contract for existing project" -path = ".algokit/generators/create_contract" - -[generate.env-file] -description = "Generate a new generic or Algorand network specific .env file" -path = ".algokit/generators/create_env_file" - -[project] -type = 'contract' -name = 's-ts-contracts' -artifacts = 'smart_contracts/artifacts' - -[project.deploy] -command = "npm run deploy:ci" - -[project.deploy.testnet] -environment_secrets = [ - "DEPLOYER_MNEMONIC", -] - -[project.deploy.mainnet] -environment_secrets = [ - "DEPLOYER_MNEMONIC", -] - -[project.run] -# Commands intended for use locally and in CI -build = { commands = [ - 'npm run build', -], description = 'Build all smart contracts in the project' } -audit-teal = { commands = [ - # 🚨 IMPORTANT 🚨: For strict TEAL validation, remove --exclude statements. The default starter contract is not for production. Ensure thorough testing and adherence to best practices in smart contract development. This is not a replacement for a professional audit. - 'algokit task analyze smart_contracts/artifacts --recursive --force --exclude rekey-to --exclude is-updatable --exclude missing-fee-check --exclude is-deletable --exclude can-close-asset --exclude can-close-account --exclude unprotected-deletable --exclude unprotected-updatable', -], description = 'Audit TEAL files' } - -# Commands intented for CI only, prefixed with `ci-` by convention -ci-teal-diff = { commands = [ - 'git add -N ./smart_contracts/artifacts', - 'git diff --exit-code --minimal ./smart_contracts/artifacts', -], description = 'Check TEAL files for differences' } diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/.copier-answers.yml b/examples/s-ts/projects/s-ts-contracts/.algokit/.copier-answers.yml deleted file mode 100644 index 0551700..0000000 --- a/examples/s-ts/projects/s-ts-contracts/.algokit/.copier-answers.yml +++ /dev/null @@ -1,9 +0,0 @@ -# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 0.3.7-16-g0ed1ece -_src_path: gh:algorandfoundation/algokit-typescript-template -author_email: None -author_name: None -contract_name: hello_world -preset_name: starter -project_name: s-ts-contracts - diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/copier.yaml b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/copier.yaml deleted file mode 100644 index 82f2c4a..0000000 --- a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/copier.yaml +++ /dev/null @@ -1,15 +0,0 @@ -_tasks: - - "echo '==== Successfully initialized new smart contract 🚀 ===='" - -contract_name: - type: str - help: Name of your new contract. - placeholder: "my-new-contract" - default: "my-new-contract" - -include_tests: - type: bool - help: Should we include testing files? - default: 'yes' - -_templates_suffix: ".j2" diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.algo.ts.j2 b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.algo.ts.j2 deleted file mode 100644 index 344c1a1..0000000 --- a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.algo.ts.j2 +++ /dev/null @@ -1,7 +0,0 @@ -import { Contract } from '@algorandfoundation/algorand-typescript' - -export class {{ contract_name.split('_')|map('capitalize')|join }} extends Contract { - {% if preset_name != 'starter' %}public {% endif %}hello(name: string): string { - return `Hello, ${name}` - } -} diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 deleted file mode 100644 index b1c76dd..0000000 --- a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 +++ /dev/null @@ -1,33 +0,0 @@ -import { AlgorandClient } from '@algorandfoundation/algokit-utils' -import { {{ contract_name.split('_')|map('capitalize')|join }}Factory } from '../artifacts/{{ contract_name }}/{{ contract_name.split('_')|map('capitalize')|join }}Client' - -// Below is a showcase of various deployment options you can use in TypeScript Client -export async function deploy() { - console.log('=== Deploying {{ contract_name.split('_')|map('capitalize')|join }} ===') - - const algorand = AlgorandClient.fromEnvironment() - const deployer = await algorand.account.fromEnvironment('DEPLOYER') - - const factory = algorand.client.getTypedAppFactory({{ contract_name.split('_')|map('capitalize')|join }}Factory, { - defaultSender: deployer.addr, - }) - - const { appClient, result } = await factory.deploy({ onUpdate: 'append', onSchemaBreak: 'append' }) - - // If app was just created fund the app account - if (['create', 'replace'].includes(result.operationPerformed)) { - await algorand.send.payment({ - amount: (1).algo(), - sender: deployer.addr, - receiver: appClient.appAddress, - }) - } - - const method = 'hello' - const response = await appClient.send.hello({ - args: { name: 'world' }, - }) - console.log( - `Called ${method} on ${appClient.appClient.appName} (${appClient.appClient.appId}) with name = world, received: ${response.return}`, - ) -} diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 deleted file mode 100644 index b94556a..0000000 --- a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 +++ /dev/null @@ -1,35 +0,0 @@ -import { Config, Address } from '@algorandfoundation/algokit-utils' -import { algorandFixture } from '@algorandfoundation/algokit-utils/testing' -import { beforeAll, beforeEach, describe, expect, test } from 'vitest' -import { {{ contract_name.split('_')|map('capitalize')|join }}Factory } from '../artifacts/{{ contract_name }}/{{ contract_name.split('_')|map('capitalize')|join }}Client' - -describe('{{ contract_name.split('_')|map('capitalize')|join }} contract', () => { - const localnet = algorandFixture() - beforeAll(() => { - Config.configure({ - debug: true, - // traceAll: true, - }) - }) - beforeEach(localnet.newScope) - - const deploy = async (account: Address) => { - const factory = localnet.algorand.client.getTypedAppFactory({{ contract_name.split('_')|map('capitalize')|join }}Factory, { - defaultSender: account, - }) - - const { appClient } = await factory.deploy({ onUpdate: 'append', onSchemaBreak: 'append' }) - return { client: appClient } - } - - test('says hello', async () => { - const { testAccount } = localnet.context - const { client } = await deploy(testAccount) - - const result = await client.send.hello({ args: { name: 'World' } }) - - expect(result.return).toBe('Hello World') - }) - -}) - diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.spec.ts{% endif %}.j2 b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.spec.ts{% endif %}.j2 deleted file mode 100644 index e7a7414..0000000 --- a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.spec.ts{% endif %}.j2 +++ /dev/null @@ -1,14 +0,0 @@ -import { TestExecutionContext } from '@algorandfoundation/algorand-typescript-testing' -import { describe, expect, it } from 'vitest' -import { {{ contract_name.split('_')|map('capitalize')|join }} } from './contract.algo' - -describe('{{ contract_name.split('_')|map('capitalize')|join }} contract', () => { - const ctx = new TestExecutionContext() - it('Logs the returned value when sayHello is called', () => { - const contract = ctx.contract.create({{ contract_name.split('_')|map('capitalize')|join }}) - - const result = contract.hello('Sally') - - expect(result).toBe('Hello Sally') - }) -}) diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/copier.yaml b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/copier.yaml deleted file mode 100644 index afa2cac..0000000 --- a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/copier.yaml +++ /dev/null @@ -1,49 +0,0 @@ -_tasks: - - "echo '==== Successfully generated new .env file 🚀 ===='" - -target_network: - type: str - help: Name of your target network. - choices: - - mainnet - - testnet - - localnet - - custom - default: "localnet" - when: "{{ not use_generic_env }}" - -custom_network_name: - type: str - help: Name of your custom Algorand network. - placeholder: "custom" - when: "{{ not use_generic_env and target_network == 'custom' }}" - -is_localnet: - type: bool - help: Whether to deploy on localnet. - placeholder: "true" - default: "{{ target_network == 'localnet' and not use_generic_env }}" - when: 'false' - -is_testnet: - type: bool - help: Whether to deploy on testnet. - placeholder: "true" - default: "{{ target_network == 'testnet' and not use_generic_env }}" - when: 'false' - -is_mainnet: - type: bool - help: Whether to deploy on mainnet. - placeholder: "true" - default: "{{ target_network == 'mainnet' and not use_generic_env }}" - when: 'false' - -is_customnet: - type: bool - help: Whether to deploy on custom network. - placeholder: "true" - default: "{{ target_network == 'custom' and not use_generic_env }}" - when: 'false' - -_templates_suffix: ".j2" diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} deleted file mode 100644 index cfc9f21..0000000 --- a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} +++ /dev/null @@ -1,7 +0,0 @@ -# this file contains algorand network settings for interacting with testnet via algonode -ALGOD_TOKEN={YOUR_ALGOD_TOKEN} -ALGOD_SERVER={YOUR_ALGOD_SERVER_URL} -ALGOD_PORT={YOUR_ALGOD_PORT} -INDEXER_TOKEN={YOUR_INDEXER_TOKEN} -INDEXER_SERVER={YOUR_INDEXER_SERVER_URL} -INDEXER_PORT={YOUR_INDEXER_PORT} diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} deleted file mode 100644 index fcbf442..0000000 --- a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} +++ /dev/null @@ -1,7 +0,0 @@ -# this file should contain environment variables specific to algokit localnet -ALGOD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -ALGOD_SERVER=http://localhost -ALGOD_PORT=4001 -INDEXER_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -INDEXER_SERVER=http://localhost -INDEXER_PORT=8980 diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} deleted file mode 100644 index bb9a787..0000000 --- a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} +++ /dev/null @@ -1,3 +0,0 @@ -# this file contains algorand network settings for interacting with testnet via algonode -ALGOD_SERVER=https://mainnet-api.algonode.cloud -INDEXER_SERVER=https://mainnet-idx.algonode.cloud diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} deleted file mode 100644 index eeea43d..0000000 --- a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} +++ /dev/null @@ -1,3 +0,0 @@ -# this file contains algorand network settings for interacting with testnet via algonode -ALGOD_SERVER=https://testnet-api.algonode.cloud -INDEXER_SERVER=https://testnet-idx.algonode.cloud diff --git a/examples/s-ts/projects/s-ts-contracts/.gitignore b/examples/s-ts/projects/s-ts-contracts/.gitignore deleted file mode 100644 index 25494bf..0000000 --- a/examples/s-ts/projects/s-ts-contracts/.gitignore +++ /dev/null @@ -1,62 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -# Dependency directories -node_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# Editor/OS directories and files -.DS_Store -*.suo - -# IntelliJ family -.idea -!.idea/ -.idea/* -!.idea/runConfigurations/ - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* - -# Compiled code -dist/ -build/ - -# Coverage report -coverage - -# dotenv environment variable files -.env -.env.development.local -.env.test.local -.env.production.local -.env.local - -# Received approval test files -*.received.* - -# AlgoKit -debug_traces/ -.algokit/static-analysis/ # Replace with .algokit/static-analysis/tealer/ to enable snapshot checks in CI -.algokit/sources diff --git a/examples/s-ts/projects/s-ts-contracts/.tours/getting-started-with-your-algokit-project.tour b/examples/s-ts/projects/s-ts-contracts/.tours/getting-started-with-your-algokit-project.tour deleted file mode 100644 index 2ad6a00..0000000 --- a/examples/s-ts/projects/s-ts-contracts/.tours/getting-started-with-your-algokit-project.tour +++ /dev/null @@ -1,46 +0,0 @@ -{ - "$schema": "https://aka.ms/codetour-schema", - "title": "Getting Started with Your AlgoKit Project", - "steps": [ - { - "file": "README.md", - "description": "Welcome to your brand new AlgoKit template-based project. In this tour, we will guide you through the main features and capabilities included in the template.", - "line": 3 - }, - { - "file": "README.md", - "description": "Start by ensuring you have followed the setup of pre-requisites.", - "line": 9 - }, - { - "file": ".algokit.toml", - "description": "This is the main configuration file used by algokit-cli to manage the project. The default template includes a starter 'Hello World' contract that is deployed via the `algokit-utils` package. To create a new smart contract, you can use the [`algokit generate`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md) command and invoke a pre-bundled generator template by running `algokit generate smart-contract` (see how it is defined in the `.algokit.toml`, you can create your own generators if needed). This action will create a new folder in the `smart_contracts` directory, named after your project. Each folder contains a `contract.algo.ts` file, which is the entry point for your contract implementation, and `deployConfig.ts` file, that perform the deployment of the contract. Additionally you can define custom commands to run (similar to `npm` scripts), see definitions under `[project]` section in `.algokit.toml`.", - "line": 1 - }, - { - "file": "smart_contracts/hello_world/deploy-config.ts", - "description": "The default deployment scripts invoke a sample method on the starter contract that demonstrates how to interact with your deployed Algorand on-chain applications using the [`AlgoKit Typed Clients`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md#1-typed-clients) feature. The invocation if deploy is aliased in `.algokit.toml` file, allowing simple deployments via `algokit project deploy` command.", - "line": 32 - }, - { - "file": ".env.localnet.template", - "description": "Environment files are a crucial mechanism that allows you to set up the [`algokit deploy`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/deploy.md) feature to simplify deploying your contracts in CI/CD environments (please note we still recommend careful evaluation when it comes to deployment to MainNet). Clone the file and remove the `.template` suffix to apply the changes to deployment scripts and launch configurations. The network prefix `localnet|testnet|mainnet` is primarily optimized for `algokit deploy`. The order of loading the variables is `.env.{network}` < `.env`.", - "line": 2 - }, - { - "file": ".vscode/launch.json", - "description": "Refer to the pre-bundled Visual Studio launch configurations, offering various options on how to execute the build and deployment of your smart contracts. Alternatively execute `algokit project run` to see list of available custom commands.", - "line": 5 - }, - { - "file": ".vscode/extensions.json", - "description": "We highly recommend installing the recommended extensions to get the most out of this template starter project in your VSCode IDE.", - "line": 3 - }, - { - "file": "smart_contracts/index.ts", - "description": "Uncomment the following line to enable artifacts required for the [AlgoKit AVM Debugger](https://github.com/algorandfoundation/algokit-avm-vscode-debugger) that run for every single call rather than just failures. This VSCode plugin is available on the [VSCode Extension Marketplace](https://marketplace.visualstudio.com/items?itemName=algorandfoundation.algokit-avm-vscode-debugger) for every call. A new folder will be automatically created in the `.algokit` directory with source maps of all TEAL contracts in this workspace, as well as traces that will appear in a folder at the root of the workspace. You can then use the traces as entry points to trigger the debug extension. Make sure to have the `.algokit.toml` file available at the root of the workspace.", - "line": 13 - } - ] -} diff --git a/examples/s-ts/projects/s-ts-contracts/.vscode/extensions.json b/examples/s-ts/projects/s-ts-contracts/.vscode/extensions.json deleted file mode 100644 index 270814b..0000000 --- a/examples/s-ts/projects/s-ts-contracts/.vscode/extensions.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "recommendations": [ - "editorconfig.editorconfig", - "vsls-contrib.codetour", - "algorandfoundation.algokit-avm-vscode-debugger" - ] -} diff --git a/examples/s-ts/projects/s-ts-contracts/.vscode/launch.json b/examples/s-ts/projects/s-ts-contracts/.vscode/launch.json deleted file mode 100644 index 093ebb1..0000000 --- a/examples/s-ts/projects/s-ts-contracts/.vscode/launch.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Build & Deploy contracts", - "type": "node", - "request": "launch", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "deploy"], - "cwd": "${workspaceFolder}/smart_contracts", - "console": "integratedTerminal", - "skipFiles": ["/**", "node_modules/**"], - "preLaunchTask": "Build contracts (+ LocalNet)", - "env": { - "ALGOD_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "ALGOD_SERVER": "http://localhost", - "ALGOD_PORT": "4001", - "INDEXER_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "INDEXER_SERVER": "http://localhost", - "INDEXER_PORT": "8980" - } - }, - { - "name": "Deploy contracts", - "type": "node", - "request": "launch", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "deploy"], - "cwd": "${workspaceFolder}/smart_contracts", - "console": "integratedTerminal", - "skipFiles": ["/**", "node_modules/**"], - "env": { - "ALGOD_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "ALGOD_SERVER": "http://localhost", - "ALGOD_PORT": "4001", - "INDEXER_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "INDEXER_SERVER": "http://localhost", - "INDEXER_PORT": "8980" - } - }, - { - "name": "Build contracts", - "request": "launch", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "build"], - "cwd": "${workspaceFolder}", - "console": "integratedTerminal", - "skipFiles": ["/**", "node_modules/**"], - }, - { - "type": "avm", - "request": "launch", - "name": "Debug AVM executions", - "simulateTraceFile": "${workspaceFolder}/${command:PickSimulateTraceFile}", - "stopOnEntry": true - } - ] -} diff --git a/examples/s-ts/projects/s-ts-contracts/.vscode/settings.json b/examples/s-ts/projects/s-ts-contracts/.vscode/settings.json deleted file mode 100644 index ccf1564..0000000 --- a/examples/s-ts/projects/s-ts-contracts/.vscode/settings.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "files.eol": "\n", - "algorandTypeScript.languageServer.enable": true, - } diff --git a/examples/s-ts/projects/s-ts-contracts/.vscode/tasks.json b/examples/s-ts/projects/s-ts-contracts/.vscode/tasks.json deleted file mode 100644 index 55310ab..0000000 --- a/examples/s-ts/projects/s-ts-contracts/.vscode/tasks.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "Build contracts", - "type": "npm", - "script": "build", - "path": "${workspaceFolder}", - "options": { - "cwd": "${workspaceFolder}" - }, - "group": { - "kind": "build", - "isDefault": true - }, - "problemMatcher": [] - }, - { - "label": "Build contracts (+ LocalNet)", - "type": "npm", - "script": "build", - "path": "${workspaceFolder}", - "options": { - "cwd": "${workspaceFolder}" - }, - "dependsOn": "Start AlgoKit LocalNet", - "problemMatcher": [] - }, - { - "label": "Start AlgoKit LocalNet", - "command": "algokit", - "args": ["localnet", "start"], - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "problemMatcher": [] - }, - { - "label": "Stop AlgoKit LocalNet", - "command": "algokit", - "args": ["localnet", "stop"], - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "problemMatcher": [] - }, - { - "label": "Reset AlgoKit LocalNet", - "command": "algokit", - "args": ["localnet", "reset"], - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "problemMatcher": [] - }, - { - "label": "Analyze TEAL contracts with AlgoKit Tealer integration", - "command": "algokit", - "args": ["task", "analyze", "${workspaceFolder}/.algokit", "--recursive", "--force"], - "options": { - "cwd": "${workspaceFolder}" - }, - "problemMatcher": [] - } - ] -} diff --git a/examples/s-ts/projects/s-ts-contracts/README.md b/examples/s-ts/projects/s-ts-contracts/README.md deleted file mode 100644 index 1fe031d..0000000 --- a/examples/s-ts/projects/s-ts-contracts/README.md +++ /dev/null @@ -1,107 +0,0 @@ -# s-ts-contracts - -This project has been generated using AlgoKit. See below for default getting started instructions. - -# Setup - -### Pre-requisites - -- [Nodejs 22](https://nodejs.org/en/download) or later -- [AlgoKit CLI 2.5](https://github.com/algorandfoundation/algokit-cli?tab=readme-ov-file#install) or later -- [Docker](https://www.docker.com/) (only required for LocalNet) -- [Puya Compiler 4.4.4](https://pypi.org/project/puyapy/) or later - -> For interactive tour over the codebase, download [vsls-contrib.codetour](https://marketplace.visualstudio.com/items?itemName=vsls-contrib.codetour) extension for VS Code, then open the [`.codetour.json`](./.tours/getting-started-with-your-algokit-project.tour) file in code tour extension. - -### Initial Setup - -#### 1. Clone the Repository -Start by cloning this repository to your local machine. - -#### 2. Install Pre-requisites -Ensure the following pre-requisites are installed and properly configured: - -- **Docker**: Required for running a local Algorand network. -- **AlgoKit CLI**: Essential for project setup and operations. Verify installation with `algokit --version`, expecting `2.6.0` or later. - -#### 3. Bootstrap Your Local Environment -Run the following commands within the project folder: - -- **Setup Project**: Execute `algokit project bootstrap all` to install dependencies and setup npm dependencies. -- **Configure environment**: Execute `algokit generate env-file -a target_network localnet` to create a `.env.localnet` file with default configuration for `localnet`. -- **Start LocalNet**: Use `algokit localnet start` to initiate a local Algorand network. - -### Development Workflow - -#### Terminal -Directly manage and interact with your project using AlgoKit commands: - -1. **Build Contracts**: `algokit project run build` compiles all smart contracts. You can also specify a specific contract by passing the name of the contract folder as an extra argument. -For example: `algokit project run build -- hello_world` will only build the `hello_world` contract. -2. **Deploy**: Use `algokit project deploy localnet` to deploy contracts to the local network. You can also specify a specific contract by passing the name of the contract folder as an extra argument. -For example: `algokit project deploy localnet -- hello_world` will only deploy the `hello_world` contract. - -#### VS Code -For a seamless experience with breakpoint debugging and other features: - -1. **Open Project**: In VS Code, open the repository root. -2. **Install Extensions**: Follow prompts to install recommended extensions. -3. **Debugging**: - - Use `F5` to start debugging. - -#### JetBrains IDEs -While primarily optimized for VS Code, JetBrains IDEs are supported: - -1. **Open Project**: In your JetBrains IDE, open the repository root. -2. **Automatic Setup**: The IDE should configure the Node.js environment. -3. **Debugging**: Use `Shift+F10` or `Ctrl+R` to start debugging. Note: Windows users may encounter issues with pre-launch tasks due to a known bug. See [JetBrains forums](https://youtrack.jetbrains.com/issue/IDEA-277486/Shell-script-configuration-cannot-run-as-before-launch-task) for workarounds. - -## AlgoKit Workspaces and Project Management -This project supports both standalone and monorepo setups through AlgoKit workspaces. Leverage [`algokit project run`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md) commands for efficient monorepo project orchestration and management across multiple projects within a workspace. - -## AlgoKit Generators - -This template provides a set of [algokit generators](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md) that allow you to further modify the project instantiated from the template to fit your needs, as well as giving you a base to build your own extensions to invoke via the `algokit generate` command. - -### Generate Smart Contract - -By default the template creates a single `HelloWorld` contract under hello_world folder in the `smart_contracts` directory. To add a new contract: - -1. From the root of the project (`../`) execute `algokit generate smart-contract`. This will create a new starter smart contract and deployment configuration file under `{your_contract_name}` subfolder in the `smart_contracts` directory. -2. Each contract potentially has different creation parameters and deployment steps. Hence, you need to define your deployment logic in `deploy-config.ts` file. -3. Technically, you need to reference your contract deployment logic in the `index.ts` file. However, by default, `index.ts` will auto import all TypeScript deployment files under `smart_contracts` directory. If you want to manually import specific contracts, modify the default code provided by the template in `index.ts` file. - -> Please note, above is just a suggested convention tailored for the base configuration and structure of this template. The default code supplied by the template in the `index.ts` file is tailored for the suggested convention. You are free to modify the structure and naming conventions as you see fit. - -### Generate '.env' files - -By default the template instance does not contain any env files to deploy to different networks. Using [`algokit project deploy`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/deploy.md) against `localnet` | `testnet` | `mainnet` will use default values for `algod` and `indexer` unless overwritten via `.env` or `.env.{target_network}`. - -To generate a new `.env` or `.env.{target_network}` file, run `algokit generate env-file` - -### Debugging Smart Contracts - -This project is optimized to work with AlgoKit AVM Debugger extension. To activate it: - -Refer to the commented header in the `index.ts` file in the `smart_contracts` folder.Since you have opted in to include VSCode launch configurations in your project, you can also use the `Debug TEAL via AlgoKit AVM Debugger` launch configuration to interactively select an available trace file and launch the debug session for your smart contract. - - -For information on using and setting up the `AlgoKit AVM Debugger` VSCode extension refer [here](https://github.com/algorandfoundation/algokit-avm-vscode-debugger). To install the extension from the VSCode Marketplace, use the following link: [AlgoKit AVM Debugger extension](https://marketplace.visualstudio.com/items?itemName=algorandfoundation.algokit-avm-vscode-debugger). - -# Tools - -This project makes use of Algorand TypeScript to build Algorand smart contracts. The following tools are in use: - -- [Algorand](https://www.algorand.com/) - Layer 1 Blockchain; [Developer portal](https://dev.algorand.co/), [Why Algorand?](https://dev.algorand.co/getting-started/why-algorand/) -- [AlgoKit](https://github.com/algorandfoundation/algokit-cli) - One-stop shop tool for developers building on the Algorand network; [docs](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/algokit.md), [intro tutorial](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/tutorials/intro.md) -- [Algorand TypeScript](https://github.com/algorandfoundation/puya-ts/) - A semantically and syntactically compatible, typed TypeScript language that works with standard TypeScript tooling and allows you to express smart contracts (apps) and smart signatures (logic signatures) for deployment on the Algorand Virtual Machine (AVM); [docs](https://github.com/algorandfoundation/puya-ts/), [examples](https://github.com/algorandfoundation/puya-ts/tree/main/examples) -- [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-ts) - A set of core Algorand utilities that make it easier to build solutions on Algorand. -- [NPM](https://www.npmjs.com/): TypeScript packaging and dependency management. -- [TypeScript](https://www.typescriptlang.org/): Strongly typed programming language that builds on JavaScript -- [tsx](https://github.com/wclr/tsx): TypeScript development execution environment - - -It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. - - - diff --git a/examples/s-ts/projects/s-ts-contracts/package.json b/examples/s-ts/projects/s-ts-contracts/package.json deleted file mode 100644 index bda8b65..0000000 --- a/examples/s-ts/projects/s-ts-contracts/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "smart_contracts", - "version": "1.0.0", - "description": "Smart contract deployer", - "main": "smart_contracts/index.ts", - "type": "module", - "scripts": { - "build": "algokit compile ts smart_contracts --output-source-map --out-dir artifacts && algokit generate client smart_contracts/artifacts --output {app_spec_dir}/{contract_name}Client.ts", - "deploy": "tsx watch -r dotenv/config smart_contracts/index.ts", - "deploy:ci": "tsx -r dotenv/config smart_contracts/index.ts", - "check-types": "tsc --noEmit" - }, - "engines": { - "node": ">=22.0", - "npm": ">=9.0" - }, - "dependencies": { - "@algorandfoundation/algorand-typescript": "^1.0.1" - }, - "devDependencies": { - "@algorandfoundation/algokit-client-generator": "^7.0.0-alpha.5", - "@algorandfoundation/algokit-utils": "^10.0.0-alpha.40", - "@algorandfoundation/algokit-utils-debug": "^2.0.0-alpha.2", - "@algorandfoundation/puya-ts": "^1.0.1", - "@rollup/plugin-typescript": "^12.1.2", - "@tsconfig/node22": "^22.0.0", - "dotenv": "^16.4.7", - "tsx": "^4.19.3", - "typescript": "^5.7.3" - }, - "overrides": { - "esbuild": "0.25.0" - } -} diff --git a/examples/s-ts/projects/s-ts-contracts/smart_contracts/hello_world/contract.algo.ts b/examples/s-ts/projects/s-ts-contracts/smart_contracts/hello_world/contract.algo.ts deleted file mode 100644 index 3737e90..0000000 --- a/examples/s-ts/projects/s-ts-contracts/smart_contracts/hello_world/contract.algo.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Contract } from '@algorandfoundation/algorand-typescript' - -export class HelloWorld extends Contract { - hello(name: string): string { - return `Hello, ${name}` - } -} diff --git a/examples/s-ts/projects/s-ts-contracts/smart_contracts/hello_world/deploy-config.ts b/examples/s-ts/projects/s-ts-contracts/smart_contracts/hello_world/deploy-config.ts deleted file mode 100644 index 6cf7f14..0000000 --- a/examples/s-ts/projects/s-ts-contracts/smart_contracts/hello_world/deploy-config.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { AlgorandClient } from '@algorandfoundation/algokit-utils' -import { HelloWorldFactory } from '../artifacts/hello_world/HelloWorldClient' - -// Below is a showcase of various deployment options you can use in TypeScript Client -export async function deploy() { - console.log('=== Deploying HelloWorld ===') - - const algorand = AlgorandClient.fromEnvironment() - const deployer = await algorand.account.fromEnvironment('DEPLOYER') - - const factory = algorand.client.getTypedAppFactory(HelloWorldFactory, { - defaultSender: deployer.addr, - }) - - const { appClient, result } = await factory.deploy({ onUpdate: 'append', onSchemaBreak: 'append' }) - - // If app was just created fund the app account - if (['create', 'replace'].includes(result.operationPerformed)) { - await algorand.send.payment({ - amount: (1).algo(), - sender: deployer.addr, - receiver: appClient.appAddress, - }) - } - - const method = 'hello' - const response = await appClient.send.hello({ - args: { name: 'world' }, - }) - console.log( - `Called ${method} on ${appClient.appClient.appName} (${appClient.appClient.appId}) with name = world, received: ${response.return}`, - ) -} diff --git a/examples/s-ts/projects/s-ts-contracts/smart_contracts/index.ts b/examples/s-ts/projects/s-ts-contracts/smart_contracts/index.ts deleted file mode 100644 index d643cd8..0000000 --- a/examples/s-ts/projects/s-ts-contracts/smart_contracts/index.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Config } from '@algorandfoundation/algokit-utils' -import { registerDebugEventHandlers } from '@algorandfoundation/algokit-utils-debug' -import { consoleLogger } from '@algorandfoundation/algokit-utils/logging' -import * as fs from 'node:fs' -import * as path from 'node:path' -import { fileURLToPath } from 'node:url' - -// Uncomment the traceAll option to enable auto generation of AVM Debugger compliant sourceMap and simulation trace file for all AVM calls. -// Learn more about using AlgoKit AVM Debugger to debug your TEAL source codes and inspect various kinds of Algorand transactions in atomic groups -> https://github.com/algorandfoundation/algokit-avm-vscode-Debugger - -Config.configure({ - logger: consoleLogger, - debug: true, - // traceAll: true, -}) -registerDebugEventHandlers() - -// base directory -const baseDir = path.dirname(fileURLToPath(import.meta.url)) - -// function to validate and dynamically import a module -async function importDeployerIfExists(dir: string) { - const deployerPath = path.resolve(dir, 'deploy-config') - if (fs.existsSync(deployerPath + '.ts') || fs.existsSync(deployerPath + '.js')) { - const deployer = await import(deployerPath) - return { ...deployer, name: path.basename(dir) } - } - return null -} - -// get a list of all deployers from the subdirectories -async function getDeployers() { - const directories = fs - .readdirSync(baseDir, { withFileTypes: true }) - .filter((dirent) => dirent.isDirectory()) - .map((dirent) => path.resolve(baseDir, dirent.name)) - - const deployers = await Promise.all(directories.map(importDeployerIfExists)) - return deployers.filter((deployer) => deployer !== null) // Filter out null values -} - -// execute all the deployers -(async () => { - const contractName = process.argv.length > 2 ? process.argv[2] : undefined - const contractDeployers = await getDeployers() - - const filteredDeployers = contractName - ? contractDeployers.filter((deployer) => deployer.name === contractName) - : contractDeployers - - if (contractName && filteredDeployers.length === 0) { - console.warn(`No deployer found for contract name: ${contractName}`) - return - } - - for (const deployer of filteredDeployers) { - try { - await deployer.deploy() - } catch (e) { - console.error(`Error deploying ${deployer.name}:`, e) - } - } -})() diff --git a/examples/s-ts/projects/s-ts-contracts/tsconfig.json b/examples/s-ts/projects/s-ts-contracts/tsconfig.json deleted file mode 100644 index 6cc09d9..0000000 --- a/examples/s-ts/projects/s-ts-contracts/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "@tsconfig/node22/tsconfig.json", - "compilerOptions": { - "noEmit": true, - "target": "ES2023", - "module": "ESNext", - "lib": ["ES2023"], - "moduleResolution": "Bundler", - "resolveJsonModule": true, - "esModuleInterop": true - }, - "include": ["**/*.ts", "**/*.mts"], - "exclude": ["node_modules"] -} diff --git a/examples/s-ts/projects/s-ts-frontend/.algokit.toml b/examples/s-ts/projects/s-ts-frontend/.algokit.toml deleted file mode 100644 index 3d3078d..0000000 --- a/examples/s-ts/projects/s-ts-frontend/.algokit.toml +++ /dev/null @@ -1,11 +0,0 @@ -[algokit] -min_version = "v2.0.0" - -[project] -type = "frontend" -name = 's-ts-frontend' -artifacts = "src/contracts" - -[project.run] -build = { commands = ['npm run build'], description = 'Build frontend' } -test = { commands = ['npm run test'], description = 'Run frontend tests' } diff --git a/examples/s-ts/projects/s-ts-frontend/.algokit/.copier-answers.yml b/examples/s-ts/projects/s-ts-frontend/.algokit/.copier-answers.yml deleted file mode 100644 index 00e96a6..0000000 --- a/examples/s-ts/projects/s-ts-frontend/.algokit/.copier-answers.yml +++ /dev/null @@ -1,8 +0,0 @@ -# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 1.1.1-13-gc5abe59 -_src_path: gh:algorandfoundation/algokit-react-frontend-template -author_email: None -author_name: None -preset_name: starter -project_name: s-ts-frontend - diff --git a/examples/s-ts/projects/s-ts-frontend/.env.template b/examples/s-ts/projects/s-ts-frontend/.env.template deleted file mode 100644 index 5dfbb2d..0000000 --- a/examples/s-ts/projects/s-ts-frontend/.env.template +++ /dev/null @@ -1,70 +0,0 @@ -# ====================== -# LocalNet configuration -# uncomment below to use -# ====================== - -VITE_ENVIRONMENT=local - -# Algod -VITE_ALGOD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -VITE_ALGOD_SERVER=http://localhost -VITE_ALGOD_PORT=4001 -VITE_ALGOD_NETWORK=localnet - -# Indexer -VITE_INDEXER_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -VITE_INDEXER_SERVER=http://localhost -VITE_INDEXER_PORT=8980 - -# KMD -# Please note: -# 1. This is only needed for LocalNet since -# by default KMD provider is ignored on other networks. -# 2. AlgoKit LocalNet starts with a single wallet called 'unencrypted-default-wallet', -# with heaps of tokens available for testing. -VITE_KMD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -VITE_KMD_SERVER=http://localhost -VITE_KMD_PORT=4002 -VITE_KMD_WALLET="unencrypted-default-wallet" -VITE_KMD_PASSWORD="" - -# # ====================== -# # TestNet configuration: -# # uncomment below to use -# # ====================== - -# VITE_ENVIRONMENT=local - -# # Algod -# VITE_ALGOD_TOKEN="" -# VITE_ALGOD_SERVER="https://testnet-api.algonode.cloud" -# VITE_ALGOD_PORT="" -# VITE_ALGOD_NETWORK="testnet" - -# # Indexer -# VITE_INDEXER_TOKEN="" -# VITE_INDEXER_SERVER="https://testnet-idx.algonode.cloud" -# VITE_INDEXER_PORT="" - - -# # ====================== -# # MainNet configuration: -# # uncomment below to use -# # ====================== - -# VITE_ENVIRONMENT=production - -# # Algod -# VITE_ALGOD_TOKEN="" -# VITE_ALGOD_SERVER="https://mainnet-api.algonode.cloud" -# VITE_ALGOD_PORT="" -# VITE_ALGOD_NETWORK="mainnet" - -# # Indexer -# VITE_INDEXER_TOKEN="" -# VITE_INDEXER_SERVER="https://mainnet-idx.algonode.cloud" -# VITE_INDEXER_PORT="" - - -# Add your Web3Auth Client ID here if you want to test Web3Auth integration on TestNet or Mainnet -# VITE_WEB3_AUTH_CLIENT_ID="" \ No newline at end of file diff --git a/examples/s-ts/projects/s-ts-frontend/.gitignore b/examples/s-ts/projects/s-ts-frontend/.gitignore deleted file mode 100644 index b1ce837..0000000 --- a/examples/s-ts/projects/s-ts-frontend/.gitignore +++ /dev/null @@ -1,38 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/build - - -# dotenv environment variable files -.env -env/ - -# misc -/dist -.DS_Store - - -npm-debug.log* -yarn-debug.log* -yarn-error.log* -/test-results/ -/playwright-report/ -/playwright/.cache/ - -# PyCharm -.idea -!.idea/ -.idea/* -!.idea/runConfigurations/ - -.vercel -.netlify diff --git a/examples/s-ts/projects/s-ts-frontend/.npmrc b/examples/s-ts/projects/s-ts-frontend/.npmrc deleted file mode 100644 index c42da84..0000000 --- a/examples/s-ts/projects/s-ts-frontend/.npmrc +++ /dev/null @@ -1 +0,0 @@ -engine-strict = true diff --git a/examples/s-ts/projects/s-ts-frontend/.vscode/extensions.json b/examples/s-ts/projects/s-ts-frontend/.vscode/extensions.json deleted file mode 100644 index 6d0554a..0000000 --- a/examples/s-ts/projects/s-ts-frontend/.vscode/extensions.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "recommendations": [ - "EditorConfig.EditorConfig", - "dotenv.dotenv-vscode", - ] -} - diff --git a/examples/s-ts/projects/s-ts-frontend/.vscode/launch.json b/examples/s-ts/projects/s-ts-frontend/.vscode/launch.json deleted file mode 100644 index 7edaf04..0000000 --- a/examples/s-ts/projects/s-ts-frontend/.vscode/launch.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "configurations": [ - { - "type": "msedge", - "request": "launch", - "name": "Run (Edge)", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - "presentation": { - "hidden": false, - "group": "2. Web" - } - }, - { - "type": "chrome", - "request": "launch", - "name": "Run (Chrome)", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - "presentation": { - "hidden": false, - "group": "2. Web" - } - }, - { - "type": "firefox", - "request": "launch", - "name": "Run (Firefox)", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - "presentation": { - "hidden": false, - "group": "2. Web" - } - }, - { - "name": "Run dApp", - "type": "node", - "request": "launch", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "dev"], - "cwd": "${workspaceRoot}", - "console": "integratedTerminal", - "skipFiles": ["/**", "node_modules/**"], - "presentation": { - "hidden": false, - "group": "1. Run Project", - "order": 1 - } - }, - { - "name": "Run dApp (+ LocalNet)", - "type": "node", - "request": "launch", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "dev"], - "cwd": "${workspaceRoot}", - "console": "integratedTerminal", - "skipFiles": ["/**", "node_modules/**"], - "preLaunchTask": "Start AlgoKit LocalNet", - "presentation": { - "hidden": false, - "group": "1. Run Project", - "order": 1 - } - } - ] -} diff --git a/examples/s-ts/projects/s-ts-frontend/.vscode/settings.json b/examples/s-ts/projects/s-ts-frontend/.vscode/settings.json deleted file mode 100644 index f34d28b..0000000 --- a/examples/s-ts/projects/s-ts-frontend/.vscode/settings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "editor.formatOnSave": true, - - "dotenv.enableAutocloaking": false, - -} diff --git a/examples/s-ts/projects/s-ts-frontend/.vscode/tasks.json b/examples/s-ts/projects/s-ts-frontend/.vscode/tasks.json deleted file mode 100644 index d611c4f..0000000 --- a/examples/s-ts/projects/s-ts-frontend/.vscode/tasks.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "Start AlgoKit LocalNet", - "command": "algokit", - "args": ["localnet", "start"], - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "problemMatcher": [] - } - ] -} diff --git a/examples/s-ts/projects/s-ts-frontend/README.md b/examples/s-ts/projects/s-ts-frontend/README.md deleted file mode 100644 index 62ee6e2..0000000 --- a/examples/s-ts/projects/s-ts-frontend/README.md +++ /dev/null @@ -1,76 +0,0 @@ -# s-ts-frontend - -This starter React project has been generated using AlgoKit. See below for default getting started instructions. - -# Setup - -### Initial Setup - -#### 1. Clone the Repository -Start by cloning this repository to your local machine. - -#### 2. Install Pre-requisites -Ensure the following pre-requisites are installed and properly configured: - -- **npm**: Node package manager. Install from [Node.js Installation Guide](https://nodejs.org/en/download/). Verify with `npm -v` to see version `18.12`+. -- **AlgoKit CLI**: Essential for project setup and operations. Install the latest version from [AlgoKit CLI Installation Guide](https://github.com/algorandfoundation/algokit-cli#install). Verify installation with `algokit --version`, expecting `2.0.0` or later. - -#### 3. Bootstrap Your Local Environment -Run the following commands within the project folder: - -- **Install Project Dependencies**: With `algokit project bootstrap all`, ensure all dependencies are ready. - -### Development Workflow - -#### Terminal -Directly manage and interact with your project using AlgoKit commands: - -1. **Build Contracts**: `algokit project run build` builds react web app and links with smart contracts in workspace, if any. -2. Remaining set of command for linting, testing and deployment can be found in respective [package.json](./package.json) file and [.algokit.toml](./.algokit.toml) files. - -#### VS Code -For a seamless experience with breakpoint debugging and other features: - -1. **Open Project**: In VS Code, open the repository root. -2. **Install Extensions**: Follow prompts to install recommended extensions. -3. **Debugging**: - - Use `F5` to start debugging. - - **Windows Users**: Select the Python interpreter at `./.venv/Scripts/python.exe` via `Ctrl/Cmd + Shift + P` > `Python: Select Interpreter` before the first run. - -#### Other IDEs -While primarily optimized for VS Code, Jetbrains WebStorm has base support for this project: - -1. **Open Project**: In your JetBrains IDE, open the repository root. -2. **Automatic Setup**: The IDE should configure the Python interpreter and virtual environment. -3. **Debugging**: Use `Shift+F10` or `Ctrl+R` to start debugging. Note: Windows users may encounter issues with pre-launch tasks due to a known bug. See [JetBrains forums](https://youtrack.jetbrains.com/issue/IDEA-277486/Shell-script-configuration-cannot-run-as-before-launch-task) for workarounds. - -## AlgoKit Workspaces and Project Management -This project supports both standalone and monorepo setups through AlgoKit workspaces. Leverage [`algokit project run`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md) commands for efficient monorepo project orchestration and management across multiple projects within a workspace. - -> Please note, by default frontend is pre configured to run against Algorand LocalNet. If you want to run against TestNet or MainNet, comment out the current environment variable and uncomment the relevant one in [`.env`](.env) file that is created after running bootstrap command and based on [`.env.template`](.env.template). - -# Algorand Wallet integrations - -The template comes with [`use-wallet`](https://github.com/txnlab/use-wallet) integration, which provides a React hook for connecting to an Algorand wallet providers. The following wallet providers are included by default: -- LocalNet: -- - [KMD/Local Wallet](https://github.com/TxnLab/use-wallet#kmd-algorand-key-management-daemon) - Algorand's Key Management Daemon (KMD) is a service that manages Algorand private keys and signs transactions. Works best with AlgoKit LocalNet and allows you to easily test and interact with your dApps locally. -- TestNet and others: -- - [Pera Wallet](https://perawallet.app). -- - [Defly Wallet](https://defly.app). -- - [Exodus Wallet](https://www.exodus.com). -- - [Daffi Wallet](https://www.daffi.me). - -Refer to official [`use-wallet`](https://github.com/txnlab/use-wallet) documentation for detailed guidelines on how to integrate with other wallet providers (such as WalletConnect v2). Too see implementation details on the use wallet hook and initialization of extra wallet providers refer to [`App.tsx`](./src/App.tsx). - -# Tools - -This project makes use of React and Tailwind to provider a base project configuration to develop frontends for your Algorand dApps and interactions with smart contracts. The following tools are in use: - -- [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-ts) - Various TypeScript utilities to simplify interactions with Algorand and AlgoKit. -- [React](https://reactjs.org/) - A JavaScript library for building user interfaces. -- [use-wallet](https://github.com/txnlab/use-wallet) - A React hook for connecting to an Algorand wallet providers. -- [npm](https://www.npmjs.com/): Node.js package manager -It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. -# Integrating with smart contracts and application clients - -Refer to the detailed guidance on [integrating with smart contracts and application clients](./src/contracts/README.md). In essence, for any smart contract codebase generated with AlgoKit or other tools that produce compile contracts into ARC34 compliant app specifications, you can use the `algokit generate` command to generate TypeScript or Python typed client. Once generated simply drag and drop the generated client into `./src/contracts` and import it into your React components as you see fit. diff --git a/examples/s-ts/projects/s-ts-frontend/index.html b/examples/s-ts/projects/s-ts-frontend/index.html deleted file mode 100644 index 5a2ef4f..0000000 --- a/examples/s-ts/projects/s-ts-frontend/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - AlgoKit React Template - - -
- - - diff --git a/examples/s-ts/projects/s-ts-frontend/package.json b/examples/s-ts/projects/s-ts-frontend/package.json deleted file mode 100644 index 1bbbe97..0000000 --- a/examples/s-ts/projects/s-ts-frontend/package.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "name": "s-ts-frontend", - "version": "0.1.0", - "author": { - "name": "None", - "email": "None" - }, - "private": true, - "type": "module", - "engines": { - "node": ">=20.0", - "npm": ">=9.0" - }, - "devDependencies": { - "@algorandfoundation/algokit-client-generator": "^7.0.0-alpha.5", - "@types/node": "^18.17.14", - "@types/react": "^18.2.11", - "@types/react-dom": "^18.2.4", - "@vitejs/plugin-react": "^4.2.1", - "autoprefixer": "^10.4.14", - "ts-node": "^10.9.1", - "typescript": "^5.1.6", - "vite": "^5.0.0", - "vite-plugin-node-polyfills": "^0.22.0" - }, - "dependencies": { - "@algorandfoundation/algokit-utils": "^10.0.0-alpha.40", - "@blockshake/defly-connect": "^1.2.1", - "@perawallet/connect": "^1.4.1", - "@txnlab/use-wallet": "^4.6.0", - "@txnlab/use-wallet-react": "^4.6.0", - "@web3auth/modal": "^9.7.0", - "notistack": "^3.0.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "tslib": "^2.6.2" - }, - "scripts": { - "generate:app-clients": "algokit project link --all", - "dev": "npm run generate:app-clients && vite", - "build": "npm run generate:app-clients && tsc && vite build", - "preview": "vite preview" - }, - "eslintConfig": { - "extends": [ - "react-app" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "overrides": { - "ws@>7.0.0 <7.5.9": "7.5.10" - } -} diff --git a/examples/s-ts/projects/s-ts-frontend/public/index.html b/examples/s-ts/projects/s-ts-frontend/public/index.html deleted file mode 100644 index 0d3a3a5..0000000 --- a/examples/s-ts/projects/s-ts-frontend/public/index.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - React App - - - -
- - - diff --git a/examples/s-ts/projects/s-ts-frontend/public/robots.txt b/examples/s-ts/projects/s-ts-frontend/public/robots.txt deleted file mode 100644 index e9e57dc..0000000 --- a/examples/s-ts/projects/s-ts-frontend/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * -Disallow: diff --git a/examples/s-ts/projects/s-ts-frontend/src/App.tsx b/examples/s-ts/projects/s-ts-frontend/src/App.tsx deleted file mode 100644 index f346006..0000000 --- a/examples/s-ts/projects/s-ts-frontend/src/App.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { SupportedWallet, WalletId, WalletManager, WalletProvider } from '@txnlab/use-wallet-react' -import { SnackbarProvider } from 'notistack' -import Home from './Home' -import { getAlgodConfigFromViteEnvironment, getKmdConfigFromViteEnvironment } from './utils/network/getAlgoClientConfigs' - -let supportedWallets: SupportedWallet[] -if (import.meta.env.VITE_ALGOD_NETWORK === 'localnet') { - const kmdConfig = getKmdConfigFromViteEnvironment() - supportedWallets = [ - { - id: WalletId.KMD, - options: { - baseServer: kmdConfig.server, - token: String(kmdConfig.token), - port: String(kmdConfig.port), - }, - }, - ] -} else { - supportedWallets = [ - { id: WalletId.DEFLY }, - { id: WalletId.PERA }, - { id: WalletId.EXODUS }, - // If you are interested in WalletConnect v2 provider - // refer to https://github.com/TxnLab/use-wallet for detailed integration instructions - ] -} - -export default function App() { - const algodConfig = getAlgodConfigFromViteEnvironment() - - const walletManager = new WalletManager({ - wallets: supportedWallets, - defaultNetwork: algodConfig.network, - networks: { - [algodConfig.network]: { - algod: { - baseServer: algodConfig.server, - port: algodConfig.port, - token: String(algodConfig.token), - }, - }, - }, - options: { - resetNetwork: true, - }, - }) - - return ( - - - - - - ) -} diff --git a/examples/s-ts/projects/s-ts-frontend/src/assets/logo.svg b/examples/s-ts/projects/s-ts-frontend/src/assets/logo.svg deleted file mode 100644 index 7169476..0000000 --- a/examples/s-ts/projects/s-ts-frontend/src/assets/logo.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/examples/s-ts/projects/s-ts-frontend/src/components/Account.tsx b/examples/s-ts/projects/s-ts-frontend/src/components/Account.tsx deleted file mode 100644 index 081ce47..0000000 --- a/examples/s-ts/projects/s-ts-frontend/src/components/Account.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { useWallet } from '@txnlab/use-wallet-react' -import { useMemo } from 'react' -import { ellipseAddress } from '../utils/ellipseAddress' -import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' - -const Account = () => { - const { activeAddress } = useWallet() - const algoConfig = getAlgodConfigFromViteEnvironment() - - const networkName = useMemo(() => { - return algoConfig.network === '' ? 'localnet' : algoConfig.network.toLocaleLowerCase() - }, [algoConfig.network]) - - return ( - - ) -} - -export default Account diff --git a/examples/s-ts/projects/s-ts-frontend/src/components/ConnectWallet.tsx b/examples/s-ts/projects/s-ts-frontend/src/components/ConnectWallet.tsx deleted file mode 100644 index 8814cd5..0000000 --- a/examples/s-ts/projects/s-ts-frontend/src/components/ConnectWallet.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import { useWallet, Wallet, WalletId } from '@txnlab/use-wallet-react' -import Account from './Account' - -interface ConnectWalletInterface { - openModal: boolean - closeModal: () => void -} - -const ConnectWallet = ({ openModal, closeModal }: ConnectWalletInterface) => { - const { wallets, activeAddress } = useWallet() - - const isKmd = (wallet: Wallet) => wallet.id === WalletId.KMD - - return ( - -
-

Select wallet provider

- -
- {activeAddress && ( - <> - -
- - )} - - {!activeAddress && - wallets?.map((wallet) => ( - - ))} -
- -
- - {activeAddress && ( - - )} -
- -
- ) -} -export default ConnectWallet diff --git a/examples/s-ts/projects/s-ts-frontend/src/components/ErrorBoundary.tsx b/examples/s-ts/projects/s-ts-frontend/src/components/ErrorBoundary.tsx deleted file mode 100644 index 435bf61..0000000 --- a/examples/s-ts/projects/s-ts-frontend/src/components/ErrorBoundary.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import React, { ReactNode } from 'react' - -interface ErrorBoundaryProps { - children: ReactNode -} - -interface ErrorBoundaryState { - hasError: boolean - error: Error | null -} - -class ErrorBoundary extends React.Component { - constructor(props: ErrorBoundaryProps) { - super(props) - this.state = { hasError: false, error: null } - } - - static getDerivedStateFromError(error: Error): ErrorBoundaryState { - // Update state so the next render will show the fallback UI. - return { hasError: true, error: error } - } - - render(): ReactNode { - if (this.state.hasError) { - // You can render any custom fallback UI - return ( -
-
-
-

Error occured

-

- {this.state.error?.message.includes('Attempt to get default algod configuration') - ? 'Please make sure to set up your environment variables correctly. Create a .env file based on .env.template and fill in the required values. This controls the network and credentials for connections with Algod and Indexer.' - : this.state.error?.message} -

-
-
-
- ) - } - - return this.props.children - } -} - -export default ErrorBoundary diff --git a/examples/s-ts/projects/s-ts-frontend/src/components/Transact.tsx b/examples/s-ts/projects/s-ts-frontend/src/components/Transact.tsx deleted file mode 100644 index 36b1ec7..0000000 --- a/examples/s-ts/projects/s-ts-frontend/src/components/Transact.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { algo, AlgorandClient } from '@algorandfoundation/algokit-utils' -import { encodeTransactionRaw } from '@algorandfoundation/algokit-utils/transact' -import { useWallet } from '@txnlab/use-wallet-react' -import { useSnackbar } from 'notistack' -import { useState } from 'react' -import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' - -interface TransactInterface { - openModal: boolean - setModalState: (value: boolean) => void -} - -const Transact = ({ openModal, setModalState }: TransactInterface) => { - const [loading, setLoading] = useState(false) - const [receiverAddress, setReceiverAddress] = useState('') - - const algodConfig = getAlgodConfigFromViteEnvironment() - const algorand = AlgorandClient.fromConfig({ algodConfig }) - - const { enqueueSnackbar } = useSnackbar() - - const { signTransactions, activeAddress } = useWallet() - - const handleSubmitAlgo = async () => { - setLoading(true) - - if (!signTransactions || !activeAddress) { - enqueueSnackbar('Please connect wallet first', { variant: 'warning' }) - return - } - - try { - enqueueSnackbar('Sending transaction...', { variant: 'info' }) - const result = await algorand.send.payment({ - signer: async (txnGroup, indexesToSign) => { - const encoded = txnGroup.map((txn) => encodeTransactionRaw(txn)) - const signed = await signTransactions(encoded, indexesToSign) - return signed.filter((s): s is Uint8Array => s !== null) - }, - sender: activeAddress, - receiver: receiverAddress, - amount: algo(1), - }) - enqueueSnackbar(`Transaction sent: ${result.txIds[0]}`, { variant: 'success' }) - setReceiverAddress('') - } catch (e) { - enqueueSnackbar('Failed to send transaction', { variant: 'error' }) - } - - setLoading(false) - } - - return ( - -
-

Send payment transaction

-
- { - setReceiverAddress(e.target.value) - }} - /> -
- - -
-
-
- ) -} - -export default Transact diff --git a/examples/s-ts/projects/s-ts-frontend/src/contracts/README.md b/examples/s-ts/projects/s-ts-frontend/src/contracts/README.md deleted file mode 100644 index 04629b1..0000000 --- a/examples/s-ts/projects/s-ts-frontend/src/contracts/README.md +++ /dev/null @@ -1,14 +0,0 @@ -## How to connect my web app with Algorand smart contracts? - -The following folder is reserved for the Algorand Application Clients. The clients are used to interact with instances of Algorand Smart Contracts (ASC1s) deployed on-chain. - -To integrate this react frontend template with your smart contracts codebase, perform the following steps: - -1. Generate the typed client using `algokit generate client -l typescript -o {path/to/this/folder}` or using the dedicated `link` command `algokit project link` (ensure to invoke it from the root of this react project). Using the `link` command is especially useful within workspaces that have multiple contract projects. -2. The generated typescript client should be ready to be imported and used in this react frontend template, making it a full fledged dApp. - -> Please note, by default this template defines `"generate:app-clients": "algokit project link --all"` which is a shortcut to automatically link TEAL code from all `contract` projects in the workspace as typed clients into the `frontend` project that is invoking the `link` command. Refer to [documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/link.md) to read more about `link` command. - -## **How to interact with the smart contract?** - -The generated client provides a set of functions that can be used to interact with the ABI (Application Binary Interface) compliant Algorand smart contract. For example, if the smart contract has a function called `hello`, the generated client will have a function called `hello` that can be used to interact with the smart contract. Refer to a [full-stack end-to-end starter template](https://github.com/algorandfoundation/algokit-fullstack-template) for a reference example on invoking and interacting with typescript typed clients generated. diff --git a/examples/s-ts/projects/s-ts-frontend/src/interfaces/network.ts b/examples/s-ts/projects/s-ts-frontend/src/interfaces/network.ts deleted file mode 100644 index fdb97ae..0000000 --- a/examples/s-ts/projects/s-ts-frontend/src/interfaces/network.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/network-client' - -export interface AlgoViteClientConfig extends AlgoClientConfig { - /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ - server: string - /** The port to use e.g. 4001, 443, etc. */ - port: string | number - /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string - /** String representing current Algorand Network type (testnet/mainnet and etc) */ - network: string -} - -export interface AlgoViteKMDConfig extends AlgoClientConfig { - /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ - server: string - /** The port to use e.g. 4001, 443, etc. */ - port: string | number - /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ - token: string - /** KMD wallet name */ - wallet: string - /** KMD wallet password */ - password: string -} diff --git a/examples/s-ts/projects/s-ts-frontend/src/main.tsx b/examples/s-ts/projects/s-ts-frontend/src/main.tsx deleted file mode 100644 index 431a30c..0000000 --- a/examples/s-ts/projects/s-ts-frontend/src/main.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App' -import './styles/App.css' -import ErrorBoundary from './components/ErrorBoundary' - -ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - - - - - , -) diff --git a/examples/s-ts/projects/s-ts-frontend/src/styles/App.css b/examples/s-ts/projects/s-ts-frontend/src/styles/App.css deleted file mode 100644 index ee2b188..0000000 --- a/examples/s-ts/projects/s-ts-frontend/src/styles/App.css +++ /dev/null @@ -1,126 +0,0 @@ -/* App.css */ - -.hero { - display: flex; - justify-content: center; - align-items: center; - min-height: 100vh; - background-color: #38b2ac; -} - -.hero-content { - text-align: center; - border-radius: 0.5rem; - padding: 1.5rem; - max-width: 24rem; - background-color: #ffffff; - margin: 0 auto; -} - -.text-4xl { - font-size: 2.25rem; - line-height: 2.5rem; -} - -.font-bold { - font-weight: 700; -} - -.py-6 { - padding-top: 1.5rem; - padding-bottom: 1.5rem; -} - -.grid { - display: grid; -} - -.btn { - margin: 0.5rem; -} - -.btn-primary { - background-color: #1a202c; - color: #fff; -} - -.divider { - border-top: 1px solid #e2e8f0; - margin-top: 1rem; - margin-bottom: 1rem; -} - -.modal { - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - background: rgba(0, 0, 0, 0.6); - display: none; - z-index: 9999; - overflow: auto; -} - -.modal-open { - display: block; -} - -.modal-box { - margin: 2.5em auto; - background: #fff; - border-radius: 0.5em; - width: 40em; - max-width: 90vw; - padding: 1em; -} - -.font-bold { - font-weight: bold; -} - -.text-2xl { - font-size: 1.5rem; -} - -.m-2 { - margin: 0.5rem; -} - -.pt-5 { - padding-top: 1.25rem; -} - -.grid { - display: grid; -} - -.btn { - margin: 0.5rem; - padding: 0.5rem 1rem; - background-color: #00aba2; - color: #fff; -} - -.btn-warning { - background-color: #d69e2e; -} - -.border-1 { - border-width: 1px; -} - -.border-teal-800 { - border-color: #2c7a7b; -} - -.modal-action { - display: grid; - margin-top: 1rem; -} - -.divider { - border-top: 1px solid #e2e8f0; - margin-top: 1rem; - margin-bottom: 1rem; -} diff --git a/examples/s-ts/projects/s-ts-frontend/src/utils/ellipseAddress.ts b/examples/s-ts/projects/s-ts-frontend/src/utils/ellipseAddress.ts deleted file mode 100644 index db97e48..0000000 --- a/examples/s-ts/projects/s-ts-frontend/src/utils/ellipseAddress.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function ellipseAddress(address: string | null, width = 6): string { - return address ? `${address.slice(0, width)}...${address.slice(-width)}` : (address ?? '') -} diff --git a/examples/s-ts/projects/s-ts-frontend/src/utils/network/getAlgoClientConfigs.ts b/examples/s-ts/projects/s-ts-frontend/src/utils/network/getAlgoClientConfigs.ts deleted file mode 100644 index b5121f8..0000000 --- a/examples/s-ts/projects/s-ts-frontend/src/utils/network/getAlgoClientConfigs.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { AlgoViteClientConfig, AlgoViteKMDConfig } from '../../interfaces/network' - -export function getAlgodConfigFromViteEnvironment(): AlgoViteClientConfig { - if (!import.meta.env.VITE_ALGOD_SERVER) { - throw new Error('Attempt to get default algod configuration without specifying VITE_ALGOD_SERVER in the environment variables') - } - - return { - server: import.meta.env.VITE_ALGOD_SERVER, - port: import.meta.env.VITE_ALGOD_PORT, - token: import.meta.env.VITE_ALGOD_TOKEN, - network: import.meta.env.VITE_ALGOD_NETWORK, - } -} - -export function getIndexerConfigFromViteEnvironment(): AlgoViteClientConfig { - if (!import.meta.env.VITE_INDEXER_SERVER) { - throw new Error('Attempt to get default algod configuration without specifying VITE_INDEXER_SERVER in the environment variables') - } - - return { - server: import.meta.env.VITE_INDEXER_SERVER, - port: import.meta.env.VITE_INDEXER_PORT, - token: import.meta.env.VITE_INDEXER_TOKEN, - network: import.meta.env.VITE_ALGOD_NETWORK, - } -} - -export function getKmdConfigFromViteEnvironment(): AlgoViteKMDConfig { - if (!import.meta.env.VITE_KMD_SERVER) { - throw new Error('Attempt to get default kmd configuration without specifying VITE_KMD_SERVER in the environment variables') - } - - return { - server: import.meta.env.VITE_KMD_SERVER, - port: import.meta.env.VITE_KMD_PORT, - token: import.meta.env.VITE_KMD_TOKEN, - wallet: import.meta.env.VITE_KMD_WALLET, - password: import.meta.env.VITE_KMD_PASSWORD, - } -} diff --git a/examples/s-ts/projects/s-ts-frontend/src/vite-env.d.ts b/examples/s-ts/projects/s-ts-frontend/src/vite-env.d.ts deleted file mode 100644 index 67c2d30..0000000 --- a/examples/s-ts/projects/s-ts-frontend/src/vite-env.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -/// - -interface ImportMetaEnv { - readonly VITE_ENVIRONMENT: string - - readonly VITE_ALGOD_TOKEN: string - readonly VITE_ALGOD_SERVER: string - readonly VITE_ALGOD_PORT: string - readonly VITE_ALGOD_NETWORK: string - - readonly VITE_INDEXER_TOKEN: string - readonly VITE_INDEXER_SERVER: string - readonly VITE_INDEXER_PORT: string - - readonly VITE_KMD_TOKEN: string - readonly VITE_KMD_SERVER: string - readonly VITE_KMD_PORT: string - readonly VITE_KMD_PASSWORD: string - readonly VITE_KMD_WALLET: string -} - -interface ImportMeta { - readonly env: ImportMetaEnv -} diff --git a/examples/s-ts/projects/s-ts-frontend/tsconfig.json b/examples/s-ts/projects/s-ts-frontend/tsconfig.json deleted file mode 100644 index a0f5661..0000000 --- a/examples/s-ts/projects/s-ts-frontend/tsconfig.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, - "module": "ESNext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, - "declaration": true /* Generates corresponding '.d.ts' file. */, - "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, - "sourceMap": true /* Generates corresponding '.map' file. */, - "strict": true /* Enable all strict type-checking options. */, - "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, - "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, - "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, - "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, - "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */, - "skipLibCheck": true /* Skip type checking of declaration files. */, - "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, - "allowJs": false, - "allowSyntheticDefaultImports": true, - "moduleResolution": "Bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - "outDir": "./dist/" - }, - "include": [ - "src/**/*.ts", - "src/**/*.tsx", - "vite.config.js", - "src/utils/", - "src/utils/", - "src/main.tsx", - ], - "references": [ - { - "path": "./tsconfig.node.json" - } - ] -} diff --git a/examples/s-ts/projects/s-ts-frontend/tsconfig.node.json b/examples/s-ts/projects/s-ts-frontend/tsconfig.node.json deleted file mode 100644 index e32f207..0000000 --- a/examples/s-ts/projects/s-ts-frontend/tsconfig.node.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "module": "NodeNext", - "moduleResolution": "NodeNext", - "allowSyntheticDefaultImports": true - }, - "include": ["vite.config.ts"] -} diff --git a/examples/s-ts/projects/s-ts-frontend/vite.config.ts b/examples/s-ts/projects/s-ts-frontend/vite.config.ts deleted file mode 100644 index e42dc7c..0000000 --- a/examples/s-ts/projects/s-ts-frontend/vite.config.ts +++ /dev/null @@ -1,15 +0,0 @@ -import react from '@vitejs/plugin-react' -import { defineConfig } from 'vite' -import { nodePolyfills } from 'vite-plugin-node-polyfills' - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [ - react(), - nodePolyfills({ - globals: { - Buffer: true, - }, - }), - ], -}) diff --git a/pytest-junit.xml b/pytest-junit.xml index 6590adf..6b466e9 100644 --- a/pytest-junit.xml +++ b/pytest-junit.xml @@ -1 +1,267 @@ - \ No newline at end of file +contract_template = 'python' +working_dir = PosixPath('/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template') + + @pytest.mark.parametrize("contract_template", contract_templates) + def test_production_preset(contract_template: str, working_dir: Path) -> None: + response = run_init( + working_dir, + f"p-{short_contract_templates[contract_template]}", + answers=get_answered_questions_from_copier_yaml( + preset_name="production", + deployment_language="python", + contract_template=contract_template, + ), + child_template_default_answer="y", + ) + +> assert response.returncode == 0, response.stdout +E AssertionError: DEBUG: Running ['/usr/bin/git', '-C', '/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template', 'rev-parse', '--is-shallow-repository'] +E DEBUG: Running ['/usr/bin/git', 'clone', '--no-checkout', '/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template', '/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.0pdwuvj0', '--filter=blob:none'] +E DEBUG: Chdir to /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.0pdwuvj0 +E DEBUG: Running ['/usr/bin/git', '-c', 'core.fsmonitor=false', 'checkout', '-f', 'prep/beta-release'] +E DEBUG: Running ['/usr/bin/git', 'submodule', 'update', '--checkout', '--init', '--recursive', '--force'] +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.0pdwuvj0 +E DEBUG: Running ['/usr/bin/git', 'describe', '--tags', '--always'] +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E DEBUG: final clone URL = /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples/p-py +E ==== 1/4 - Initializing base template ==== +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples/p-py +E WARNING: Failed to get user info from git, please input your 'name' manually or use default placeholder. +E WARNING: Failed to get user info from git, please input your 'email' manually or use default placeholder. +E Starting template copy and render at /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples/p-py... +E Unhandled ProcessExecutionError: Unexpected exit code: 128 +E Command line: | /usr/bin/git clone --no-checkout https://github.com/algorandfoundation/algokit-base-template.git /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.yetmhf0g --filter=blob:none +E Stderr: | Cloning into '/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.yetmhf0g'... +E | fatal: unable to access 'https://github.com/algorandfoundation/algokit-base-template.git/': Could not resolve host: github.com +E [PYI-59715:ERROR] Failed to execute script '__main__' due to unhandled exception! +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E Unhandled TaskError: Command 'algokit init -t base -n . --no-git --no-ide --no-bootstrap --no-workspace -a include_readme "no" -a include_algokit_toml "no" -a include_vscode_code_workspace "no" -a include_github_workflow_template "no"' returned non-zero exit status 1. +E [PYI-59668:ERROR] Failed to execute script '__main__' due to unhandled exception! +E +E assert 1 == 0 +E + where 1 = CompletedProcess(args=['algokit', '--verbose', 'init', '--name', 'p-py', '--template-url', '/var/folders/96/k83m8nkj3t...turned non-zero exit status 1.\n[PYI-59668:ERROR] Failed to execute script \'__main__\' due to unhandled exception!\n').returncode + +tests/test_templates.py:288: AssertionErrorcontract_template = 'tealscript' +working_dir = PosixPath('/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template') + + @pytest.mark.parametrize("contract_template", contract_templates) + def test_production_preset(contract_template: str, working_dir: Path) -> None: + response = run_init( + working_dir, + f"p-{short_contract_templates[contract_template]}", + answers=get_answered_questions_from_copier_yaml( + preset_name="production", + deployment_language="python", + contract_template=contract_template, + ), + child_template_default_answer="y", + ) + +> assert response.returncode == 0, response.stdout +E AssertionError: DEBUG: Chdir to /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.v39cv6gu +E DEBUG: Running ['/usr/bin/git', '-c', 'core.fsmonitor=false', 'checkout', '-f', 'prep/beta-release'] +E DEBUG: Running ['/usr/bin/git', 'submodule', 'update', '--checkout', '--init', '--recursive', '--force'] +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.v39cv6gu +E DEBUG: Running ['/usr/bin/git', 'describe', '--tags', '--always'] +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E DEBUG: final clone URL = /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples/p-tls +E ==== 1/4 - Initializing base template ==== +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples/p-tls +E WARNING: Failed to get user info from git, please input your 'name' manually or use default placeholder. +E WARNING: Failed to get user info from git, please input your 'email' manually or use default placeholder. +E Starting template copy and render at /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples/p-tls... +E Unhandled ProcessExecutionError: Unexpected exit code: 128 +E Command line: | /usr/bin/git clone --no-checkout https://github.com/algorandfoundation/algokit-base-template.git /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.ghyu4ug8 --filter=blob:none +E Stderr: | Cloning into '/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.ghyu4ug8'... +E | fatal: unable to access 'https://github.com/algorandfoundation/algokit-base-template.git/': Could not resolve host: github.com +E [PYI-59772:ERROR] Failed to execute script '__main__' due to unhandled exception! +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E Unhandled TaskError: Command 'algokit init -t base -n . --no-git --no-ide --no-bootstrap --no-workspace -a include_readme "no" -a include_algokit_toml "no" -a include_vscode_code_workspace "no" -a include_github_workflow_template "no"' returned non-zero exit status 1. +E [PYI-59725:ERROR] Failed to execute script '__main__' due to unhandled exception! +E +E assert 1 == 0 +E + where 1 = CompletedProcess(args=['algokit', '--verbose', 'init', '--name', 'p-tls', '--template-url', '/var/folders/96/k83m8nkj3...turned non-zero exit status 1.\n[PYI-59725:ERROR] Failed to execute script \'__main__\' due to unhandled exception!\n').returncode + +tests/test_templates.py:288: AssertionErrorcontract_template = 'typescript' +working_dir = PosixPath('/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template') + + @pytest.mark.parametrize("contract_template", contract_templates) + def test_production_preset(contract_template: str, working_dir: Path) -> None: + response = run_init( + working_dir, + f"p-{short_contract_templates[contract_template]}", + answers=get_answered_questions_from_copier_yaml( + preset_name="production", + deployment_language="python", + contract_template=contract_template, + ), + child_template_default_answer="y", + ) + +> assert response.returncode == 0, response.stdout +E AssertionError: DEBUG: Chdir to /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.i3ytp2qd +E DEBUG: Running ['/usr/bin/git', '-c', 'core.fsmonitor=false', 'checkout', '-f', 'prep/beta-release'] +E DEBUG: Running ['/usr/bin/git', 'submodule', 'update', '--checkout', '--init', '--recursive', '--force'] +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.i3ytp2qd +E DEBUG: Running ['/usr/bin/git', 'describe', '--tags', '--always'] +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E DEBUG: final clone URL = /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples/p-ts +E ==== 1/4 - Initializing base template ==== +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples/p-ts +E WARNING: Failed to get user info from git, please input your 'name' manually or use default placeholder. +E WARNING: Failed to get user info from git, please input your 'email' manually or use default placeholder. +E Starting template copy and render at /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples/p-ts... +E Unhandled ProcessExecutionError: Unexpected exit code: 128 +E Command line: | /usr/bin/git clone --no-checkout https://github.com/algorandfoundation/algokit-base-template.git /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.45rezklr --filter=blob:none +E Stderr: | Cloning into '/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.45rezklr'... +E | fatal: unable to access 'https://github.com/algorandfoundation/algokit-base-template.git/': Could not resolve host: github.com +E [PYI-59829:ERROR] Failed to execute script '__main__' due to unhandled exception! +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E Unhandled TaskError: Command 'algokit init -t base -n . --no-git --no-ide --no-bootstrap --no-workspace -a include_readme "no" -a include_algokit_toml "no" -a include_vscode_code_workspace "no" -a include_github_workflow_template "no"' returned non-zero exit status 1. +E [PYI-59782:ERROR] Failed to execute script '__main__' due to unhandled exception! +E +E assert 1 == 0 +E + where 1 = CompletedProcess(args=['algokit', '--verbose', 'init', '--name', 'p-ts', '--template-url', '/var/folders/96/k83m8nkj3t...turned non-zero exit status 1.\n[PYI-59782:ERROR] Failed to execute script \'__main__\' due to unhandled exception!\n').returncode + +tests/test_templates.py:288: AssertionErrorcontract_template = 'python' +working_dir = PosixPath('/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template') + + @pytest.mark.parametrize("contract_template", contract_templates) + def test_starter_preset(contract_template: str, working_dir: Path) -> None: + response = run_init( + working_dir, + f"s-{short_contract_templates[contract_template]}", + answers=get_answered_questions_from_copier_yaml( + preset_name="starter", + deployment_language="typescript", + contract_template=contract_template, + ), + child_template_default_answer="n", + ) + +> assert response.returncode == 0, response.stdout +E AssertionError: DEBUG: Chdir to /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.z4wjkl5s +E DEBUG: Running ['/usr/bin/git', '-c', 'core.fsmonitor=false', 'checkout', '-f', 'prep/beta-release'] +E DEBUG: Running ['/usr/bin/git', 'submodule', 'update', '--checkout', '--init', '--recursive', '--force'] +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.z4wjkl5s +E DEBUG: Running ['/usr/bin/git', 'describe', '--tags', '--always'] +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E DEBUG: final clone URL = /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples/s-py +E ==== 1/4 - Initializing base template ==== +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples/s-py +E WARNING: Failed to get user info from git, please input your 'name' manually or use default placeholder. +E WARNING: Failed to get user info from git, please input your 'email' manually or use default placeholder. +E Starting template copy and render at /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples/s-py... +E Unhandled ProcessExecutionError: Unexpected exit code: 128 +E Command line: | /usr/bin/git clone --no-checkout https://github.com/algorandfoundation/algokit-base-template.git /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.fanwhd7i --filter=blob:none +E Stderr: | Cloning into '/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.fanwhd7i'... +E | fatal: unable to access 'https://github.com/algorandfoundation/algokit-base-template.git/': Could not resolve host: github.com +E [PYI-59887:ERROR] Failed to execute script '__main__' due to unhandled exception! +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E Unhandled TaskError: Command 'algokit init -t base -n . --no-git --no-ide --no-bootstrap --no-workspace -a include_readme "no" -a include_algokit_toml "no" -a include_vscode_code_workspace "no" -a include_github_workflow_template "no"' returned non-zero exit status 1. +E [PYI-59840:ERROR] Failed to execute script '__main__' due to unhandled exception! +E +E assert 1 == 0 +E + where 1 = CompletedProcess(args=['algokit', '--verbose', 'init', '--name', 's-py', '--template-url', '/var/folders/96/k83m8nkj3t...turned non-zero exit status 1.\n[PYI-59840:ERROR] Failed to execute script \'__main__\' due to unhandled exception!\n').returncode + +tests/test_templates.py:304: AssertionErrorcontract_template = 'tealscript' +working_dir = PosixPath('/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template') + + @pytest.mark.parametrize("contract_template", contract_templates) + def test_starter_preset(contract_template: str, working_dir: Path) -> None: + response = run_init( + working_dir, + f"s-{short_contract_templates[contract_template]}", + answers=get_answered_questions_from_copier_yaml( + preset_name="starter", + deployment_language="typescript", + contract_template=contract_template, + ), + child_template_default_answer="n", + ) + +> assert response.returncode == 0, response.stdout +E AssertionError: DEBUG: Chdir to /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.xfp1u9ig +E DEBUG: Running ['/usr/bin/git', '-c', 'core.fsmonitor=false', 'checkout', '-f', 'prep/beta-release'] +E DEBUG: Running ['/usr/bin/git', 'submodule', 'update', '--checkout', '--init', '--recursive', '--force'] +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.xfp1u9ig +E DEBUG: Running ['/usr/bin/git', 'describe', '--tags', '--always'] +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E DEBUG: final clone URL = /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples/s-tls +E ==== 1/4 - Initializing base template ==== +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples/s-tls +E WARNING: Failed to get user info from git, please input your 'name' manually or use default placeholder. +E WARNING: Failed to get user info from git, please input your 'email' manually or use default placeholder. +E Starting template copy and render at /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples/s-tls... +E Unhandled ProcessExecutionError: Unexpected exit code: 128 +E Command line: | /usr/bin/git clone --no-checkout https://github.com/algorandfoundation/algokit-base-template.git /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.mnwppdyj --filter=blob:none +E Stderr: | Cloning into '/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.mnwppdyj'... +E | fatal: unable to access 'https://github.com/algorandfoundation/algokit-base-template.git/': Could not resolve host: github.com +E [PYI-59944:ERROR] Failed to execute script '__main__' due to unhandled exception! +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E Unhandled TaskError: Command 'algokit init -t base -n . --no-git --no-ide --no-bootstrap --no-workspace -a include_readme "no" -a include_algokit_toml "no" -a include_vscode_code_workspace "no" -a include_github_workflow_template "no"' returned non-zero exit status 1. +E [PYI-59897:ERROR] Failed to execute script '__main__' due to unhandled exception! +E +E assert 1 == 0 +E + where 1 = CompletedProcess(args=['algokit', '--verbose', 'init', '--name', 's-tls', '--template-url', '/var/folders/96/k83m8nkj3...turned non-zero exit status 1.\n[PYI-59897:ERROR] Failed to execute script \'__main__\' due to unhandled exception!\n').returncode + +tests/test_templates.py:304: AssertionErrorcontract_template = 'typescript' +working_dir = PosixPath('/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template') + + @pytest.mark.parametrize("contract_template", contract_templates) + def test_starter_preset(contract_template: str, working_dir: Path) -> None: + response = run_init( + working_dir, + f"s-{short_contract_templates[contract_template]}", + answers=get_answered_questions_from_copier_yaml( + preset_name="starter", + deployment_language="typescript", + contract_template=contract_template, + ), + child_template_default_answer="n", + ) + +> assert response.returncode == 0, response.stdout +E AssertionError: DEBUG: Chdir to /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.bc0xynky +E DEBUG: Running ['/usr/bin/git', '-c', 'core.fsmonitor=false', 'checkout', '-f', 'prep/beta-release'] +E DEBUG: Running ['/usr/bin/git', 'submodule', 'update', '--checkout', '--init', '--recursive', '--force'] +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.bc0xynky +E DEBUG: Running ['/usr/bin/git', 'describe', '--tags', '--always'] +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E DEBUG: final clone URL = /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples/s-ts +E ==== 1/4 - Initializing base template ==== +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples/s-ts +E WARNING: Failed to get user info from git, please input your 'name' manually or use default placeholder. +E WARNING: Failed to get user info from git, please input your 'email' manually or use default placeholder. +E Starting template copy and render at /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples/s-ts... +E Unhandled ProcessExecutionError: Unexpected exit code: 128 +E Command line: | /usr/bin/git clone --no-checkout https://github.com/algorandfoundation/algokit-base-template.git /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.fz6jg14s --filter=blob:none +E Stderr: | Cloning into '/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/copier._vcs.clone.fz6jg14s'... +E | fatal: unable to access 'https://github.com/algorandfoundation/algokit-base-template.git/': Could not resolve host: github.com +E [PYI-60002:ERROR] Failed to execute script '__main__' due to unhandled exception! +E DEBUG: Chdir to /private/var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template/examples +E Unhandled TaskError: Command 'algokit init -t base -n . --no-git --no-ide --no-bootstrap --no-workspace -a include_readme "no" -a include_algokit_toml "no" -a include_vscode_code_workspace "no" -a include_github_workflow_template "no"' returned non-zero exit status 1. +E [PYI-59954:ERROR] Failed to execute script '__main__' due to unhandled exception! +E +E assert 1 == 0 +E + where 1 = CompletedProcess(args=['algokit', '--verbose', 'init', '--name', 's-ts', '--template-url', '/var/folders/96/k83m8nkj3t...turned non-zero exit status 1.\n[PYI-59954:ERROR] Failed to execute script \'__main__\' due to unhandled exception!\n').returncode + +tests/test_templates.py:304: AssertionError \ No newline at end of file diff --git a/tests/test_templates.py b/tests/test_templates.py index 4391449..e3bc46b 100644 --- a/tests/test_templates.py +++ b/tests/test_templates.py @@ -27,6 +27,7 @@ BUILD_ARGS = ["algokit", "project", "run", "build"] TEST_ARGS = ["algokit", "project", "run", "test"] LINT_ARGS = ["algokit", "project", "run", "lint"] +DEFAULT_CHILD_TEMPLATE_REF = "prep/beta-release" def _load_copier_yaml(path: Path) -> dict[str, str | bool | dict]: @@ -238,9 +239,13 @@ def get_answered_questions_from_copier_yaml( answers["ide_vscode"] = "yes" if ide_vscode else "no" frontend_template_url = os.getenv("FRONTEND_TEMPLATE_URL") - frontend_template_ref = os.getenv("FRONTEND_TEMPLATE_REF") + frontend_template_ref = os.getenv( + "FRONTEND_TEMPLATE_REF", DEFAULT_CHILD_TEMPLATE_REF + ) contract_template_url = os.getenv("CONTRACT_TEMPLATE_URL") - contract_template_ref = os.getenv("CONTRACT_TEMPLATE_REF") + contract_template_ref = os.getenv( + "CONTRACT_TEMPLATE_REF", DEFAULT_CHILD_TEMPLATE_REF + ) contract_template_url = os.getenv( f"{contract_template.upper()}_CONTRACT_TEMPLATE_URL", contract_template_url ) From 9c6d556080bb6c7f5ff3900471e35d91d506d7a1 Mon Sep 17 00:00:00 2001 From: p2arthur Date: Mon, 9 Mar 2026 21:33:41 -0700 Subject: [PATCH 12/12] chore: remove algokit-tealscript-template prep/beta-release ref --- examples/p-py/.algokit/.copier-answers.yml | 4 +- .../create-devcontainer/copier.yaml | 4 + .../create-devcontainer/devcontainer.json | 19 + examples/p-py/.editorconfig | 10 + examples/p-py/.gitattributes | 1 + .../.github/workflows/p-py-contracts-cd.yaml | 44 + .../.github/workflows/p-py-contracts-ci.yaml | 65 + .../.github/workflows/p-py-frontend-cd.yaml | 36 + .../.github/workflows/p-py-frontend-ci.yaml | 47 + examples/p-py/.gitignore | 170 + examples/p-py/copy_files.sh | 23 - examples/p-py/projects/.gitkeep | 0 .../projects/p-py-contracts/.algokit.toml | 57 + .../.algokit/.copier-answers.yml | 10 + .../generators/create_contract/copier.yaml | 10 + .../{{ contract_name }}/contract.py.j2 | 9 + .../{{ contract_name }}/deploy_config.py.j2 | 44 + .../generators/create_env_file/copier.yaml | 49 + ... %}.env.{{custom_network_name}}{% endif %} | 7 + ... if is_localnet %}.env.localnet{% endif %} | 7 + ...{% if is_mainnet %}.env.mainnet{% endif %} | 3 + ...{% if is_testnet %}.env.testnet{% endif %} | 3 + .../projects/p-py-contracts/.editorconfig | 10 + .../p-py/projects/p-py-contracts/.gitignore | 180 + ...ing-started-with-your-algokit-project.tour | 56 + .../p-py-contracts/.vscode/extensions.json | 12 + .../p-py-contracts/.vscode/launch.json | 52 + .../p-py-contracts/.vscode/settings.json | 54 + .../p-py-contracts/.vscode/tasks.json | 79 + .../p-py/projects/p-py-contracts/README.md | 154 + .../p-py/projects/p-py-contracts/poetry.toml | 3 + .../projects/p-py-contracts/pyproject.toml | 65 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 217 + .../smart_contracts/hello_world/contract.py | 8 + .../hello_world/deploy_config.py | 44 + .../projects/p-py-contracts/tests/__init__.py | 0 .../projects/p-py-contracts/tests/conftest.py | 20 + .../tests/hello_world_client_test.py | 55 + .../p-py-contracts/tests/hello_world_test.py | 24 + .../p-py/projects/p-py-frontend/.algokit.toml | 17 + .../.algokit/.copier-answers.yml | 9 + .../p-py/projects/p-py-frontend/.editorconfig | 9 + .../p-py/projects/p-py-frontend/.env.template | 70 + .../p-py/projects/p-py-frontend/.eslintrc | 27 + .../p-py/projects/p-py-frontend/.gitignore | 38 + examples/p-py/projects/p-py-frontend/.npmrc | 1 + .../projects/p-py-frontend/.prettierignore | 12 + .../projects/p-py-frontend/.prettierrc.cjs | 10 + .../p-py-frontend/.vscode/extensions.json | 14 + .../p-py-frontend/.vscode/launch.json | 68 + .../p-py-frontend/.vscode/settings.json | 13 + .../projects/p-py-frontend/.vscode/tasks.json | 15 + .../p-py/projects/p-py-frontend/README.md | 124 + .../p-py/projects/p-py-frontend/index.html | 12 + .../projects/p-py-frontend/jest.config.ts | 20 + .../p-py/projects/p-py-frontend/package.json | 81 + .../p-py-frontend/playwright.config.ts | 73 + .../projects/p-py-frontend/postcss.config.cjs | 6 + .../projects/p-py-frontend/public/index.html | 37 + .../projects/p-py-frontend/public/robots.txt | 3 + .../p-py/projects/p-py-frontend/src/App.tsx | 56 + .../p-py-frontend/src}/Home.tsx | 0 .../p-py-frontend/src/assets/logo.svg | 1 + .../p-py-frontend/src/components/Account.tsx | 24 + .../src/components}/AppCalls.tsx | 0 .../src/components/ConnectWallet.tsx | 86 + .../src/components/ErrorBoundary.tsx | 46 + .../p-py-frontend/src/components/Transact.tsx | 85 + .../p-py-frontend/src/contracts/AppCall.ts | 558 ++ .../src/contracts/AppExpectingEffects.ts | 630 +++ .../src/contracts/Arc4InnerTxnsContract.ts | 556 ++ .../src/contracts/Arc4PrimitiveOpsContract.ts | 3982 ++++++++++++++ .../src/contracts/BoxContract.ts | 2352 +++++++++ .../p-py-frontend/src/contracts/Contract.ts | 621 +++ .../p-py-frontend/src/contracts/ContractV0.ts | 621 +++ .../p-py-frontend/src/contracts/ContractV1.ts | 621 +++ .../src/contracts/CryptoOpsContract.ts | 1422 +++++ .../src/contracts/DynamicArrayInitContract.ts | 755 +++ .../src/contracts/DynamicItxnGroup.ts | 629 +++ .../src/contracts/GlobalStateContract.ts | 2649 ++++++++++ .../src/contracts/GlobalStateValidator.ts | 557 ++ .../p-py-frontend/src/contracts/HelloWorld.ts | 560 ++ .../src/contracts/ITxnOpsContract.ts | 554 ++ .../src/contracts/ImmutableArrayContract.ts | 2231 ++++++++ .../contracts/ImmutableArrayInitContract.ts | 755 +++ .../src/contracts/LocalStateContract.ts | 1746 ++++++ .../src/contracts/MiscellaneousOpsContract.ts | 3082 +++++++++++ .../src/contracts/PrimitiveOpsContract.ts | 4701 +++++++++++++++++ .../p-py-frontend/src/contracts/README.md | 14 + .../src/contracts/SignaturesContract.ts | 1203 +++++ .../src/contracts/StateAcctParamsGet.ts | 1319 +++++ .../contracts/StateAcctParamsGetContract.ts | 1526 ++++++ .../src/contracts/StateAppGlobalContract.ts | 1018 ++++ .../src/contracts/StateAppGlobalExContract.ts | 551 ++ .../src/contracts/StateAppLocalContract.ts | 1197 +++++ .../src/contracts/StateAppLocalExContract.ts | 635 +++ .../src/contracts/StateAppParamsContract.ts | 1112 ++++ .../contracts/StateAssetHoldingContract.ts | 631 +++ .../src/contracts/StateAssetParamsContract.ts | 1319 +++++ .../src/contracts/StateMutations.ts | 880 +++ .../src/contracts/StaticSizeContract.ts | 1009 ++++ .../src/contracts/TuplesContract.ts | 558 ++ .../src/contracts/VerifierContract.ts | 554 ++ .../p-py-frontend/src/interfaces/network.ts | 25 + .../p-py/projects/p-py-frontend/src/main.tsx | 13 + .../p-py-frontend/src/styles/main.css | 3 + .../src/utils/ellipseAddress.spec.tsx | 15 + .../p-py-frontend/src/utils/ellipseAddress.ts | 3 + .../src/utils/network/getAlgoClientConfigs.ts | 41 + .../projects/p-py-frontend/src/vite-env.d.ts | 24 + .../p-py-frontend/tailwind.config.cjs | 12 + .../p-py-frontend/tests/example.spec.ts | 40 + .../p-py/projects/p-py-frontend/tsconfig.json | 38 + .../projects/p-py-frontend/tsconfig.node.json | 9 + .../projects/p-py-frontend/vite.config.ts | 15 + examples/p-tls/.algokit/.copier-answers.yml | 4 +- .../create-devcontainer/copier.yaml | 4 + .../create-devcontainer/devcontainer.json | 19 + examples/p-tls/.editorconfig | 10 + examples/p-tls/.gitattributes | 1 + .../.github/workflows/p-tls-frontend-cd.yaml | 36 + .../.github/workflows/p-tls-frontend-ci.yaml | 47 + examples/p-tls/.gitignore | 170 + examples/p-tls/copy_files.sh | 23 - examples/p-tls/projects/.gitkeep | 0 .../projects/p-tls-contracts/.algokit.toml | 15 + .../projects/p-tls-contracts/.eslintrc.js | 56 + .../p-tls/projects/p-tls-contracts/.gitignore | 1 + .../projects/p-tls-contracts/.prettierrc.toml | 6 + .../p-tls-contracts/.vscode/extensions.json | 5 + .../p-tls-contracts/.vscode/settings.json | 5 + .../p-tls/projects/p-tls-contracts/README.md | 25 + .../__test__/Calculator.test.ts | 46 + .../contracts/Calculator.algo.ts | 57 + .../contracts/clients/.gitkeep | 0 .../contracts/clients/CalculatorClient.ts | 742 +++ .../projects/p-tls-contracts/jest.config.js | 6 + .../projects/p-tls-contracts/package.json | 36 + .../projects/p-tls-contracts/tsconfig.json | 103 + .../projects/p-tls-frontend/.algokit.toml | 17 + .../.algokit/.copier-answers.yml | 9 + .../projects/p-tls-frontend/.editorconfig | 9 + .../projects/p-tls-frontend/.env.template | 67 + .../p-tls/projects/p-tls-frontend/.eslintrc | 27 + .../p-tls/projects/p-tls-frontend/.gitignore | 38 + examples/p-tls/projects/p-tls-frontend/.npmrc | 1 + .../projects/p-tls-frontend/.prettierignore | 12 + .../projects/p-tls-frontend/.prettierrc.cjs | 10 + .../p-tls-frontend/.vscode/extensions.json | 14 + .../p-tls-frontend/.vscode/launch.json | 68 + .../p-tls-frontend/.vscode/settings.json | 13 + .../p-tls-frontend/.vscode/tasks.json | 15 + .../p-tls/projects/p-tls-frontend/README.md | 124 + .../p-tls/projects/p-tls-frontend/index.html | 12 + .../projects/p-tls-frontend/jest.config.ts | 20 + .../projects/p-tls-frontend/package.json | 81 + .../p-tls-frontend/playwright.config.ts | 73 + .../p-tls-frontend/postcss.config.cjs | 6 + .../projects/p-tls-frontend/public/index.html | 37 + .../projects/p-tls-frontend/public/robots.txt | 3 + .../p-tls/projects/p-tls-frontend/src/App.tsx | 56 + .../p-tls-frontend/src}/Home.tsx | 0 .../p-tls-frontend/src/assets/logo.svg | 1 + .../p-tls-frontend/src/components/Account.tsx | 24 + .../src/components}/AppCalls.tsx | 0 .../src/components/ConnectWallet.tsx | 86 + .../src/components/ErrorBoundary.tsx | 46 + .../src/components/Transact.tsx | 80 + .../src/contracts/Calculator.ts | 742 +++ .../p-tls-frontend/src/contracts/README.md | 14 + .../p-tls-frontend/src/interfaces/network.ts | 26 + .../projects/p-tls-frontend/src/main.tsx | 13 + .../p-tls-frontend/src/styles/main.css | 3 + .../src/utils/ellipseAddress.spec.tsx | 15 + .../src/utils/ellipseAddress.ts | 3 + .../src/utils/network/getAlgoClientConfigs.ts | 41 + .../projects/p-tls-frontend/src/vite-env.d.ts | 24 + .../p-tls-frontend/tailwind.config.cjs | 12 + .../p-tls-frontend/tests/example.spec.ts | 40 + .../projects/p-tls-frontend/tsconfig.json | 38 + .../p-tls-frontend/tsconfig.node.json | 9 + .../projects/p-tls-frontend/vite.config.ts | 15 + examples/p-ts/.algokit/.copier-answers.yml | 4 +- .../create-devcontainer/copier.yaml | 4 + .../create-devcontainer/devcontainer.json | 19 + examples/p-ts/.editorconfig | 10 + examples/p-ts/.gitattributes | 1 + .../.github/workflows/p-ts-contracts-cd.yaml | 45 + .../.github/workflows/p-ts-contracts-ci.yaml | 72 + .../.github/workflows/p-ts-frontend-cd.yaml | 36 + .../.github/workflows/p-ts-frontend-ci.yaml | 47 + examples/p-ts/.gitignore | 170 + examples/p-ts/copy_files.sh | 23 - examples/p-ts/projects/.gitkeep | 0 .../projects/p-ts-contracts/.algokit.toml | 56 + .../.algokit/.copier-answers.yml | 9 + .../generators/create_contract/copier.yaml | 15 + .../{{ contract_name }}/contract.algo.ts.j2 | 7 + .../{{ contract_name }}/deploy-config.ts.j2 | 33 + ...tests %}contract.e2e.spec.ts{% endif %}.j2 | 36 + ...ude_tests %}contract.spec.ts{% endif %}.j2 | 14 + .../generators/create_env_file/copier.yaml | 49 + ... %}.env.{{custom_network_name}}{% endif %} | 7 + ... if is_localnet %}.env.localnet{% endif %} | 7 + ...{% if is_mainnet %}.env.mainnet{% endif %} | 3 + ...{% if is_testnet %}.env.testnet{% endif %} | 3 + .../projects/p-ts-contracts/.editorconfig | 7 + .../p-ts/projects/p-ts-contracts/.gitignore | 62 + examples/p-ts/projects/p-ts-contracts/.npmrc | 1 + .../projects/p-ts-contracts/.prettierignore | 13 + .../projects/p-ts-contracts/.prettierrc.js | 10 + ...ing-started-with-your-algokit-project.tour | 56 + .../p-ts-contracts/.vscode/extensions.json | 10 + .../p-ts-contracts/.vscode/launch.json | 58 + .../p-ts-contracts/.vscode/settings.json | 19 + .../p-ts-contracts/.vscode/tasks.json | 69 + .../p-ts/projects/p-ts-contracts/README.md | 157 + .../projects/p-ts-contracts/eslint.config.mjs | 18 + .../p-ts/projects/p-ts-contracts/package.json | 48 + .../hello_world/contract.algo.spec.ts | 14 + .../hello_world/contract.algo.ts | 7 + .../hello_world/contract.e2e.spec.ts | 53 + .../hello_world/deploy-config.ts | 33 + .../p-ts-contracts/smart_contracts/index.ts | 62 + .../projects/p-ts-contracts/tsconfig.json | 26 + .../p-ts-contracts/tsconfig.test.json | 14 + .../projects/p-ts-contracts/vitest.config.mts | 21 + .../p-ts/projects/p-ts-frontend/.algokit.toml | 17 + .../.algokit/.copier-answers.yml | 9 + .../p-ts/projects/p-ts-frontend/.editorconfig | 9 + .../p-ts/projects/p-ts-frontend/.env.template | 67 + .../p-ts/projects/p-ts-frontend/.eslintrc | 27 + .../p-ts/projects/p-ts-frontend/.gitignore | 38 + examples/p-ts/projects/p-ts-frontend/.npmrc | 1 + .../projects/p-ts-frontend/.prettierignore | 12 + .../projects/p-ts-frontend/.prettierrc.cjs | 10 + .../p-ts-frontend/.vscode/extensions.json | 14 + .../p-ts-frontend/.vscode/launch.json | 68 + .../p-ts-frontend/.vscode/settings.json | 13 + .../projects/p-ts-frontend/.vscode/tasks.json | 15 + .../p-ts/projects/p-ts-frontend/README.md | 124 + .../p-ts/projects/p-ts-frontend/index.html | 12 + .../projects/p-ts-frontend/jest.config.ts | 20 + .../p-ts/projects/p-ts-frontend/package.json | 81 + .../p-ts-frontend/playwright.config.ts | 73 + .../projects/p-ts-frontend/postcss.config.cjs | 6 + .../projects/p-ts-frontend/public/index.html | 37 + .../projects/p-ts-frontend/public/robots.txt | 3 + .../p-ts/projects/p-ts-frontend/src/App.tsx | 56 + .../p-ts-frontend/src}/Home.tsx | 0 .../p-ts-frontend/src/assets/logo.svg | 1 + .../p-ts-frontend/src/components/Account.tsx | 24 + .../src/components}/AppCalls.tsx | 0 .../src/components/ConnectWallet.tsx | 86 + .../src/components/ErrorBoundary.tsx | 46 + .../p-ts-frontend/src/components/Transact.tsx | 80 + .../p-ts-frontend/src/contracts/HelloWorld.ts | 581 ++ .../p-ts-frontend/src/contracts/README.md | 14 + .../p-ts-frontend/src/interfaces/network.ts | 26 + .../p-ts/projects/p-ts-frontend/src/main.tsx | 13 + .../p-ts-frontend/src/styles/main.css | 3 + .../src/utils/ellipseAddress.spec.tsx | 15 + .../p-ts-frontend/src/utils/ellipseAddress.ts | 3 + .../src/utils/network/getAlgoClientConfigs.ts | 41 + .../projects/p-ts-frontend/src/vite-env.d.ts | 24 + .../p-ts-frontend/tailwind.config.cjs | 12 + .../p-ts-frontend/tests/example.spec.ts | 40 + .../p-ts/projects/p-ts-frontend/tsconfig.json | 38 + .../projects/p-ts-frontend/tsconfig.node.json | 9 + .../projects/p-ts-frontend/vite.config.ts | 15 + examples/s-py/.algokit/.copier-answers.yml | 4 +- .../create-devcontainer/copier.yaml | 4 + .../create-devcontainer/devcontainer.json | 19 + examples/s-py/.editorconfig | 10 + examples/s-py/.gitattributes | 1 + examples/s-py/.gitignore | 170 + examples/s-py/copy_files.sh | 23 - examples/s-py/projects/.gitkeep | 0 .../projects/s-py-contracts/.algokit.toml | 46 + .../.algokit/.copier-answers.yml | 10 + .../generators/create_contract/copier.yaml | 10 + .../{{ contract_name }}/contract.py.j2 | 9 + .../{{ contract_name }}/deploy-config.ts.j2 | 33 + .../generators/create_env_file/copier.yaml | 49 + ... %}.env.{{custom_network_name}}{% endif %} | 7 + ... if is_localnet %}.env.localnet{% endif %} | 7 + ...{% if is_mainnet %}.env.mainnet{% endif %} | 3 + ...{% if is_testnet %}.env.testnet{% endif %} | 3 + .../projects/s-py-contracts/.editorconfig | 10 + .../s-py/projects/s-py-contracts/.gitignore | 180 + examples/s-py/projects/s-py-contracts/.npmrc | 1 + .../projects/s-py-contracts/.prettierignore | 12 + .../projects/s-py-contracts/.prettierrc.js | 10 + ...ing-started-with-your-algokit-project.tour | 51 + .../s-py-contracts/.vscode/extensions.json | 10 + .../s-py-contracts/.vscode/launch.json | 57 + .../s-py-contracts/.vscode/settings.json | 38 + .../s-py-contracts/.vscode/tasks.json | 79 + .../s-py/projects/s-py-contracts/README.md | 106 + .../s-py/projects/s-py-contracts/package.json | 27 + .../s-py/projects/s-py-contracts/poetry.toml | 3 + .../projects/s-py-contracts/pyproject.toml | 22 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 188 + .../smart_contracts/hello_world/contract.py | 8 + .../hello_world/deploy-config.ts | 33 + .../s-py-contracts/smart_contracts/index.ts | 62 + .../projects/s-py-contracts/tsconfig.json | 25 + .../s-py/projects/s-py-frontend/.algokit.toml | 11 + .../.algokit/.copier-answers.yml | 8 + .../s-py/projects/s-py-frontend/.env.template | 67 + .../s-py/projects/s-py-frontend/.gitignore | 38 + examples/s-py/projects/s-py-frontend/.npmrc | 1 + .../s-py-frontend/.vscode/extensions.json | 7 + .../s-py-frontend/.vscode/launch.json | 68 + .../s-py-frontend/.vscode/settings.json | 6 + .../projects/s-py-frontend/.vscode/tasks.json | 15 + .../s-py/projects/s-py-frontend/README.md | 76 + .../s-py/projects/s-py-frontend/index.html | 12 + .../s-py/projects/s-py-frontend/package.json | 64 + .../projects/s-py-frontend/public/index.html | 37 + .../projects/s-py-frontend/public/robots.txt | 3 + .../s-py/projects/s-py-frontend/src/App.tsx | 56 + .../s-py-frontend/src}/Home.tsx | 0 .../s-py-frontend/src/assets/logo.svg | 1 + .../s-py-frontend/src/components/Account.tsx | 24 + .../src/components}/AppCalls.tsx | 0 .../src/components/ConnectWallet.tsx | 86 + .../src/components/ErrorBoundary.tsx | 46 + .../s-py-frontend/src/components/Transact.tsx | 80 + .../s-py-frontend/src/contracts/HelloWorld.ts | 581 ++ .../s-py-frontend/src/contracts/README.md | 14 + .../s-py-frontend/src/interfaces/network.ts | 26 + .../s-py/projects/s-py-frontend/src/main.tsx | 13 + .../projects/s-py-frontend/src/styles/App.css | 126 + .../s-py-frontend/src/utils/ellipseAddress.ts | 3 + .../src/utils/network/getAlgoClientConfigs.ts | 41 + .../projects/s-py-frontend/src/vite-env.d.ts | 24 + .../s-py/projects/s-py-frontend/tsconfig.json | 38 + .../projects/s-py-frontend/tsconfig.node.json | 9 + .../projects/s-py-frontend/vite.config.ts | 15 + examples/s-tls/.algokit/.copier-answers.yml | 4 +- .../create-devcontainer/copier.yaml | 4 + .../create-devcontainer/devcontainer.json | 19 + examples/s-tls/.editorconfig | 10 + examples/s-tls/.gitattributes | 1 + examples/s-tls/.gitignore | 170 + examples/s-tls/copy_files.sh | 23 - examples/s-tls/projects/.gitkeep | 0 .../projects/s-tls-contracts/.algokit.toml | 15 + .../projects/s-tls-contracts/.eslintrc.js | 56 + .../s-tls/projects/s-tls-contracts/.gitignore | 1 + .../projects/s-tls-contracts/.prettierrc.toml | 6 + .../s-tls-contracts/.vscode/extensions.json | 5 + .../s-tls-contracts/.vscode/settings.json | 5 + .../s-tls/projects/s-tls-contracts/README.md | 25 + .../__test__/Calculator.test.ts | 46 + .../contracts/Calculator.algo.ts | 57 + .../contracts/clients/.gitkeep | 0 .../contracts/clients/CalculatorClient.ts | 742 +++ .../projects/s-tls-contracts/jest.config.js | 6 + .../projects/s-tls-contracts/package.json | 36 + .../projects/s-tls-contracts/tsconfig.json | 103 + .../projects/s-tls-frontend/.algokit.toml | 11 + .../.algokit/.copier-answers.yml | 8 + .../projects/s-tls-frontend/.env.template | 67 + .../s-tls/projects/s-tls-frontend/.gitignore | 38 + examples/s-tls/projects/s-tls-frontend/.npmrc | 1 + .../s-tls-frontend/.vscode/extensions.json | 7 + .../s-tls-frontend/.vscode/launch.json | 68 + .../s-tls-frontend/.vscode/settings.json | 6 + .../s-tls-frontend/.vscode/tasks.json | 15 + .../s-tls/projects/s-tls-frontend/README.md | 76 + .../s-tls/projects/s-tls-frontend/index.html | 12 + .../projects/s-tls-frontend/package.json | 64 + .../projects/s-tls-frontend/public/index.html | 37 + .../projects/s-tls-frontend/public/robots.txt | 3 + .../s-tls/projects/s-tls-frontend/src/App.tsx | 56 + .../s-tls-frontend/src}/Home.tsx | 0 .../s-tls-frontend/src/assets/logo.svg | 1 + .../s-tls-frontend/src/components/Account.tsx | 24 + .../src/components}/AppCalls.tsx | 0 .../src/components/ConnectWallet.tsx | 86 + .../src/components/ErrorBoundary.tsx | 46 + .../src/components/Transact.tsx | 80 + .../src/contracts/Calculator.ts | 742 +++ .../s-tls-frontend/src/contracts/README.md | 14 + .../s-tls-frontend/src/interfaces/network.ts | 26 + .../projects/s-tls-frontend/src/main.tsx | 13 + .../s-tls-frontend/src/styles/App.css | 126 + .../src/utils/ellipseAddress.ts | 3 + .../src/utils/network/getAlgoClientConfigs.ts | 41 + .../projects/s-tls-frontend/src/vite-env.d.ts | 24 + .../projects/s-tls-frontend/tsconfig.json | 38 + .../s-tls-frontend/tsconfig.node.json | 9 + .../projects/s-tls-frontend/vite.config.ts | 15 + examples/s-ts/.algokit/.copier-answers.yml | 4 +- .../create-devcontainer/copier.yaml | 4 + .../create-devcontainer/devcontainer.json | 19 + examples/s-ts/.editorconfig | 10 + examples/s-ts/.gitattributes | 1 + examples/s-ts/.gitignore | 170 + examples/s-ts/copy_files.sh | 23 - examples/s-ts/projects/.gitkeep | 0 .../projects/s-ts-contracts/.algokit.toml | 44 + .../.algokit/.copier-answers.yml | 9 + .../generators/create_contract/copier.yaml | 15 + .../{{ contract_name }}/contract.algo.ts.j2 | 7 + .../{{ contract_name }}/deploy-config.ts.j2 | 33 + ...tests %}contract.e2e.spec.ts{% endif %}.j2 | 36 + ...ude_tests %}contract.spec.ts{% endif %}.j2 | 14 + .../generators/create_env_file/copier.yaml | 49 + ... %}.env.{{custom_network_name}}{% endif %} | 7 + ... if is_localnet %}.env.localnet{% endif %} | 7 + ...{% if is_mainnet %}.env.mainnet{% endif %} | 3 + ...{% if is_testnet %}.env.testnet{% endif %} | 3 + .../s-ts/projects/s-ts-contracts/.gitignore | 62 + ...ing-started-with-your-algokit-project.tour | 46 + .../s-ts-contracts/.vscode/extensions.json | 7 + .../s-ts-contracts/.vscode/launch.json | 58 + .../s-ts-contracts/.vscode/settings.json | 4 + .../s-ts-contracts/.vscode/tasks.json | 69 + .../s-ts/projects/s-ts-contracts/README.md | 107 + .../s-ts/projects/s-ts-contracts/package.json | 34 + .../hello_world/contract.algo.ts | 7 + .../hello_world/deploy-config.ts | 33 + .../s-ts-contracts/smart_contracts/index.ts | 62 + .../projects/s-ts-contracts/tsconfig.json | 26 + .../s-ts/projects/s-ts-frontend/.algokit.toml | 11 + .../.algokit/.copier-answers.yml | 8 + .../s-ts/projects/s-ts-frontend/.env.template | 67 + .../s-ts/projects/s-ts-frontend/.gitignore | 38 + examples/s-ts/projects/s-ts-frontend/.npmrc | 1 + .../s-ts-frontend/.vscode/extensions.json | 7 + .../s-ts-frontend/.vscode/launch.json | 68 + .../s-ts-frontend/.vscode/settings.json | 6 + .../projects/s-ts-frontend/.vscode/tasks.json | 15 + .../s-ts/projects/s-ts-frontend/README.md | 76 + .../s-ts/projects/s-ts-frontend/index.html | 12 + .../s-ts/projects/s-ts-frontend/package.json | 64 + .../projects/s-ts-frontend/public/index.html | 37 + .../projects/s-ts-frontend/public/robots.txt | 3 + .../s-ts/projects/s-ts-frontend/src/App.tsx | 56 + .../s-ts-frontend/src}/Home.tsx | 0 .../s-ts-frontend/src/assets/logo.svg | 1 + .../s-ts-frontend/src/components/Account.tsx | 24 + .../src/components}/AppCalls.tsx | 0 .../src/components/ConnectWallet.tsx | 86 + .../src/components/ErrorBoundary.tsx | 46 + .../s-ts-frontend/src/components/Transact.tsx | 80 + .../s-ts-frontend/src/contracts/HelloWorld.ts | 581 ++ .../s-ts-frontend/src/contracts/README.md | 14 + .../s-ts-frontend/src/interfaces/network.ts | 26 + .../s-ts/projects/s-ts-frontend/src/main.tsx | 13 + .../projects/s-ts-frontend/src/styles/App.css | 126 + .../s-ts-frontend/src/utils/ellipseAddress.ts | 3 + .../src/utils/network/getAlgoClientConfigs.ts | 41 + .../projects/s-ts-frontend/src/vite-env.d.ts | 24 + .../s-ts/projects/s-ts-frontend/tsconfig.json | 38 + .../projects/s-ts-frontend/tsconfig.node.json | 9 + .../projects/s-ts-frontend/vite.config.ts | 15 + tests/test_templates.py | 8 +- 463 files changed, 60973 insertions(+), 151 deletions(-) create mode 100644 examples/p-py/.algokit/generators/create-devcontainer/copier.yaml create mode 100644 examples/p-py/.algokit/generators/create-devcontainer/devcontainer.json create mode 100644 examples/p-py/.editorconfig create mode 100644 examples/p-py/.gitattributes create mode 100644 examples/p-py/.github/workflows/p-py-contracts-cd.yaml create mode 100644 examples/p-py/.github/workflows/p-py-contracts-ci.yaml create mode 100644 examples/p-py/.github/workflows/p-py-frontend-cd.yaml create mode 100644 examples/p-py/.github/workflows/p-py-frontend-ci.yaml create mode 100644 examples/p-py/.gitignore delete mode 100644 examples/p-py/copy_files.sh create mode 100644 examples/p-py/projects/.gitkeep create mode 100644 examples/p-py/projects/p-py-contracts/.algokit.toml create mode 100644 examples/p-py/projects/p-py-contracts/.algokit/.copier-answers.yml create mode 100644 examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/copier.yaml create mode 100644 examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.py.j2 create mode 100644 examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy_config.py.j2 create mode 100644 examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/copier.yaml create mode 100644 examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} create mode 100644 examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} create mode 100644 examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} create mode 100644 examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} create mode 100644 examples/p-py/projects/p-py-contracts/.editorconfig create mode 100644 examples/p-py/projects/p-py-contracts/.gitignore create mode 100644 examples/p-py/projects/p-py-contracts/.tours/getting-started-with-your-algokit-project.tour create mode 100644 examples/p-py/projects/p-py-contracts/.vscode/extensions.json create mode 100644 examples/p-py/projects/p-py-contracts/.vscode/launch.json create mode 100644 examples/p-py/projects/p-py-contracts/.vscode/settings.json create mode 100644 examples/p-py/projects/p-py-contracts/.vscode/tasks.json create mode 100644 examples/p-py/projects/p-py-contracts/README.md create mode 100644 examples/p-py/projects/p-py-contracts/poetry.toml create mode 100644 examples/p-py/projects/p-py-contracts/pyproject.toml create mode 100644 examples/p-py/projects/p-py-contracts/smart_contracts/__init__.py create mode 100644 examples/p-py/projects/p-py-contracts/smart_contracts/__main__.py create mode 100644 examples/p-py/projects/p-py-contracts/smart_contracts/hello_world/contract.py create mode 100644 examples/p-py/projects/p-py-contracts/smart_contracts/hello_world/deploy_config.py create mode 100644 examples/p-py/projects/p-py-contracts/tests/__init__.py create mode 100644 examples/p-py/projects/p-py-contracts/tests/conftest.py create mode 100644 examples/p-py/projects/p-py-contracts/tests/hello_world_client_test.py create mode 100644 examples/p-py/projects/p-py-contracts/tests/hello_world_test.py create mode 100644 examples/p-py/projects/p-py-frontend/.algokit.toml create mode 100644 examples/p-py/projects/p-py-frontend/.algokit/.copier-answers.yml create mode 100644 examples/p-py/projects/p-py-frontend/.editorconfig create mode 100644 examples/p-py/projects/p-py-frontend/.env.template create mode 100644 examples/p-py/projects/p-py-frontend/.eslintrc create mode 100644 examples/p-py/projects/p-py-frontend/.gitignore create mode 100644 examples/p-py/projects/p-py-frontend/.npmrc create mode 100644 examples/p-py/projects/p-py-frontend/.prettierignore create mode 100644 examples/p-py/projects/p-py-frontend/.prettierrc.cjs create mode 100644 examples/p-py/projects/p-py-frontend/.vscode/extensions.json create mode 100644 examples/p-py/projects/p-py-frontend/.vscode/launch.json create mode 100644 examples/p-py/projects/p-py-frontend/.vscode/settings.json create mode 100644 examples/p-py/projects/p-py-frontend/.vscode/tasks.json create mode 100644 examples/p-py/projects/p-py-frontend/README.md create mode 100644 examples/p-py/projects/p-py-frontend/index.html create mode 100644 examples/p-py/projects/p-py-frontend/jest.config.ts create mode 100644 examples/p-py/projects/p-py-frontend/package.json create mode 100644 examples/p-py/projects/p-py-frontend/playwright.config.ts create mode 100644 examples/p-py/projects/p-py-frontend/postcss.config.cjs create mode 100644 examples/p-py/projects/p-py-frontend/public/index.html create mode 100644 examples/p-py/projects/p-py-frontend/public/robots.txt create mode 100644 examples/p-py/projects/p-py-frontend/src/App.tsx rename examples/p-py/{inject_content => projects/p-py-frontend/src}/Home.tsx (100%) create mode 100644 examples/p-py/projects/p-py-frontend/src/assets/logo.svg create mode 100644 examples/p-py/projects/p-py-frontend/src/components/Account.tsx rename examples/p-py/{inject_content => projects/p-py-frontend/src/components}/AppCalls.tsx (100%) create mode 100644 examples/p-py/projects/p-py-frontend/src/components/ConnectWallet.tsx create mode 100644 examples/p-py/projects/p-py-frontend/src/components/ErrorBoundary.tsx create mode 100644 examples/p-py/projects/p-py-frontend/src/components/Transact.tsx create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/AppCall.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/AppExpectingEffects.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/Arc4InnerTxnsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/Arc4PrimitiveOpsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/BoxContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/Contract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ContractV0.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ContractV1.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/CryptoOpsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/DynamicArrayInitContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/DynamicItxnGroup.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateValidator.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/HelloWorld.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ITxnOpsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayInitContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/LocalStateContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/MiscellaneousOpsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/PrimitiveOpsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/README.md create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/SignaturesContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGet.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGetContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalExContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalExContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAppParamsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAssetHoldingContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateAssetParamsContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StateMutations.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/StaticSizeContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/TuplesContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/contracts/VerifierContract.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/interfaces/network.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/main.tsx create mode 100644 examples/p-py/projects/p-py-frontend/src/styles/main.css create mode 100644 examples/p-py/projects/p-py-frontend/src/utils/ellipseAddress.spec.tsx create mode 100644 examples/p-py/projects/p-py-frontend/src/utils/ellipseAddress.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/utils/network/getAlgoClientConfigs.ts create mode 100644 examples/p-py/projects/p-py-frontend/src/vite-env.d.ts create mode 100644 examples/p-py/projects/p-py-frontend/tailwind.config.cjs create mode 100644 examples/p-py/projects/p-py-frontend/tests/example.spec.ts create mode 100644 examples/p-py/projects/p-py-frontend/tsconfig.json create mode 100644 examples/p-py/projects/p-py-frontend/tsconfig.node.json create mode 100644 examples/p-py/projects/p-py-frontend/vite.config.ts create mode 100644 examples/p-tls/.algokit/generators/create-devcontainer/copier.yaml create mode 100644 examples/p-tls/.algokit/generators/create-devcontainer/devcontainer.json create mode 100644 examples/p-tls/.editorconfig create mode 100644 examples/p-tls/.gitattributes create mode 100644 examples/p-tls/.github/workflows/p-tls-frontend-cd.yaml create mode 100644 examples/p-tls/.github/workflows/p-tls-frontend-ci.yaml create mode 100644 examples/p-tls/.gitignore delete mode 100644 examples/p-tls/copy_files.sh create mode 100644 examples/p-tls/projects/.gitkeep create mode 100644 examples/p-tls/projects/p-tls-contracts/.algokit.toml create mode 100644 examples/p-tls/projects/p-tls-contracts/.eslintrc.js create mode 100644 examples/p-tls/projects/p-tls-contracts/.gitignore create mode 100644 examples/p-tls/projects/p-tls-contracts/.prettierrc.toml create mode 100644 examples/p-tls/projects/p-tls-contracts/.vscode/extensions.json create mode 100644 examples/p-tls/projects/p-tls-contracts/.vscode/settings.json create mode 100644 examples/p-tls/projects/p-tls-contracts/README.md create mode 100644 examples/p-tls/projects/p-tls-contracts/__test__/Calculator.test.ts create mode 100644 examples/p-tls/projects/p-tls-contracts/contracts/Calculator.algo.ts create mode 100644 examples/p-tls/projects/p-tls-contracts/contracts/clients/.gitkeep create mode 100644 examples/p-tls/projects/p-tls-contracts/contracts/clients/CalculatorClient.ts create mode 100644 examples/p-tls/projects/p-tls-contracts/jest.config.js create mode 100644 examples/p-tls/projects/p-tls-contracts/package.json create mode 100644 examples/p-tls/projects/p-tls-contracts/tsconfig.json create mode 100644 examples/p-tls/projects/p-tls-frontend/.algokit.toml create mode 100644 examples/p-tls/projects/p-tls-frontend/.algokit/.copier-answers.yml create mode 100644 examples/p-tls/projects/p-tls-frontend/.editorconfig create mode 100644 examples/p-tls/projects/p-tls-frontend/.env.template create mode 100644 examples/p-tls/projects/p-tls-frontend/.eslintrc create mode 100644 examples/p-tls/projects/p-tls-frontend/.gitignore create mode 100644 examples/p-tls/projects/p-tls-frontend/.npmrc create mode 100644 examples/p-tls/projects/p-tls-frontend/.prettierignore create mode 100644 examples/p-tls/projects/p-tls-frontend/.prettierrc.cjs create mode 100644 examples/p-tls/projects/p-tls-frontend/.vscode/extensions.json create mode 100644 examples/p-tls/projects/p-tls-frontend/.vscode/launch.json create mode 100644 examples/p-tls/projects/p-tls-frontend/.vscode/settings.json create mode 100644 examples/p-tls/projects/p-tls-frontend/.vscode/tasks.json create mode 100644 examples/p-tls/projects/p-tls-frontend/README.md create mode 100644 examples/p-tls/projects/p-tls-frontend/index.html create mode 100644 examples/p-tls/projects/p-tls-frontend/jest.config.ts create mode 100644 examples/p-tls/projects/p-tls-frontend/package.json create mode 100644 examples/p-tls/projects/p-tls-frontend/playwright.config.ts create mode 100644 examples/p-tls/projects/p-tls-frontend/postcss.config.cjs create mode 100644 examples/p-tls/projects/p-tls-frontend/public/index.html create mode 100644 examples/p-tls/projects/p-tls-frontend/public/robots.txt create mode 100644 examples/p-tls/projects/p-tls-frontend/src/App.tsx rename examples/p-tls/{inject_content => projects/p-tls-frontend/src}/Home.tsx (100%) create mode 100644 examples/p-tls/projects/p-tls-frontend/src/assets/logo.svg create mode 100644 examples/p-tls/projects/p-tls-frontend/src/components/Account.tsx rename examples/p-tls/{inject_content => projects/p-tls-frontend/src/components}/AppCalls.tsx (100%) create mode 100644 examples/p-tls/projects/p-tls-frontend/src/components/ConnectWallet.tsx create mode 100644 examples/p-tls/projects/p-tls-frontend/src/components/ErrorBoundary.tsx create mode 100644 examples/p-tls/projects/p-tls-frontend/src/components/Transact.tsx create mode 100644 examples/p-tls/projects/p-tls-frontend/src/contracts/Calculator.ts create mode 100644 examples/p-tls/projects/p-tls-frontend/src/contracts/README.md create mode 100644 examples/p-tls/projects/p-tls-frontend/src/interfaces/network.ts create mode 100644 examples/p-tls/projects/p-tls-frontend/src/main.tsx create mode 100644 examples/p-tls/projects/p-tls-frontend/src/styles/main.css create mode 100644 examples/p-tls/projects/p-tls-frontend/src/utils/ellipseAddress.spec.tsx create mode 100644 examples/p-tls/projects/p-tls-frontend/src/utils/ellipseAddress.ts create mode 100644 examples/p-tls/projects/p-tls-frontend/src/utils/network/getAlgoClientConfigs.ts create mode 100644 examples/p-tls/projects/p-tls-frontend/src/vite-env.d.ts create mode 100644 examples/p-tls/projects/p-tls-frontend/tailwind.config.cjs create mode 100644 examples/p-tls/projects/p-tls-frontend/tests/example.spec.ts create mode 100644 examples/p-tls/projects/p-tls-frontend/tsconfig.json create mode 100644 examples/p-tls/projects/p-tls-frontend/tsconfig.node.json create mode 100644 examples/p-tls/projects/p-tls-frontend/vite.config.ts create mode 100644 examples/p-ts/.algokit/generators/create-devcontainer/copier.yaml create mode 100644 examples/p-ts/.algokit/generators/create-devcontainer/devcontainer.json create mode 100644 examples/p-ts/.editorconfig create mode 100644 examples/p-ts/.gitattributes create mode 100644 examples/p-ts/.github/workflows/p-ts-contracts-cd.yaml create mode 100644 examples/p-ts/.github/workflows/p-ts-contracts-ci.yaml create mode 100644 examples/p-ts/.github/workflows/p-ts-frontend-cd.yaml create mode 100644 examples/p-ts/.github/workflows/p-ts-frontend-ci.yaml create mode 100644 examples/p-ts/.gitignore delete mode 100644 examples/p-ts/copy_files.sh create mode 100644 examples/p-ts/projects/.gitkeep create mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit.toml create mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit/.copier-answers.yml create mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/copier.yaml create mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.algo.ts.j2 create mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 create mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 create mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.spec.ts{% endif %}.j2 create mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/copier.yaml create mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} create mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} create mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} create mode 100644 examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} create mode 100644 examples/p-ts/projects/p-ts-contracts/.editorconfig create mode 100644 examples/p-ts/projects/p-ts-contracts/.gitignore create mode 100644 examples/p-ts/projects/p-ts-contracts/.npmrc create mode 100644 examples/p-ts/projects/p-ts-contracts/.prettierignore create mode 100644 examples/p-ts/projects/p-ts-contracts/.prettierrc.js create mode 100644 examples/p-ts/projects/p-ts-contracts/.tours/getting-started-with-your-algokit-project.tour create mode 100644 examples/p-ts/projects/p-ts-contracts/.vscode/extensions.json create mode 100644 examples/p-ts/projects/p-ts-contracts/.vscode/launch.json create mode 100644 examples/p-ts/projects/p-ts-contracts/.vscode/settings.json create mode 100644 examples/p-ts/projects/p-ts-contracts/.vscode/tasks.json create mode 100644 examples/p-ts/projects/p-ts-contracts/README.md create mode 100644 examples/p-ts/projects/p-ts-contracts/eslint.config.mjs create mode 100644 examples/p-ts/projects/p-ts-contracts/package.json create mode 100644 examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.spec.ts create mode 100644 examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.ts create mode 100644 examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.e2e.spec.ts create mode 100644 examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/deploy-config.ts create mode 100644 examples/p-ts/projects/p-ts-contracts/smart_contracts/index.ts create mode 100644 examples/p-ts/projects/p-ts-contracts/tsconfig.json create mode 100644 examples/p-ts/projects/p-ts-contracts/tsconfig.test.json create mode 100644 examples/p-ts/projects/p-ts-contracts/vitest.config.mts create mode 100644 examples/p-ts/projects/p-ts-frontend/.algokit.toml create mode 100644 examples/p-ts/projects/p-ts-frontend/.algokit/.copier-answers.yml create mode 100644 examples/p-ts/projects/p-ts-frontend/.editorconfig create mode 100644 examples/p-ts/projects/p-ts-frontend/.env.template create mode 100644 examples/p-ts/projects/p-ts-frontend/.eslintrc create mode 100644 examples/p-ts/projects/p-ts-frontend/.gitignore create mode 100644 examples/p-ts/projects/p-ts-frontend/.npmrc create mode 100644 examples/p-ts/projects/p-ts-frontend/.prettierignore create mode 100644 examples/p-ts/projects/p-ts-frontend/.prettierrc.cjs create mode 100644 examples/p-ts/projects/p-ts-frontend/.vscode/extensions.json create mode 100644 examples/p-ts/projects/p-ts-frontend/.vscode/launch.json create mode 100644 examples/p-ts/projects/p-ts-frontend/.vscode/settings.json create mode 100644 examples/p-ts/projects/p-ts-frontend/.vscode/tasks.json create mode 100644 examples/p-ts/projects/p-ts-frontend/README.md create mode 100644 examples/p-ts/projects/p-ts-frontend/index.html create mode 100644 examples/p-ts/projects/p-ts-frontend/jest.config.ts create mode 100644 examples/p-ts/projects/p-ts-frontend/package.json create mode 100644 examples/p-ts/projects/p-ts-frontend/playwright.config.ts create mode 100644 examples/p-ts/projects/p-ts-frontend/postcss.config.cjs create mode 100644 examples/p-ts/projects/p-ts-frontend/public/index.html create mode 100644 examples/p-ts/projects/p-ts-frontend/public/robots.txt create mode 100644 examples/p-ts/projects/p-ts-frontend/src/App.tsx rename examples/p-ts/{inject_content => projects/p-ts-frontend/src}/Home.tsx (100%) create mode 100644 examples/p-ts/projects/p-ts-frontend/src/assets/logo.svg create mode 100644 examples/p-ts/projects/p-ts-frontend/src/components/Account.tsx rename examples/p-ts/{inject_content => projects/p-ts-frontend/src/components}/AppCalls.tsx (100%) create mode 100644 examples/p-ts/projects/p-ts-frontend/src/components/ConnectWallet.tsx create mode 100644 examples/p-ts/projects/p-ts-frontend/src/components/ErrorBoundary.tsx create mode 100644 examples/p-ts/projects/p-ts-frontend/src/components/Transact.tsx create mode 100644 examples/p-ts/projects/p-ts-frontend/src/contracts/HelloWorld.ts create mode 100644 examples/p-ts/projects/p-ts-frontend/src/contracts/README.md create mode 100644 examples/p-ts/projects/p-ts-frontend/src/interfaces/network.ts create mode 100644 examples/p-ts/projects/p-ts-frontend/src/main.tsx create mode 100644 examples/p-ts/projects/p-ts-frontend/src/styles/main.css create mode 100644 examples/p-ts/projects/p-ts-frontend/src/utils/ellipseAddress.spec.tsx create mode 100644 examples/p-ts/projects/p-ts-frontend/src/utils/ellipseAddress.ts create mode 100644 examples/p-ts/projects/p-ts-frontend/src/utils/network/getAlgoClientConfigs.ts create mode 100644 examples/p-ts/projects/p-ts-frontend/src/vite-env.d.ts create mode 100644 examples/p-ts/projects/p-ts-frontend/tailwind.config.cjs create mode 100644 examples/p-ts/projects/p-ts-frontend/tests/example.spec.ts create mode 100644 examples/p-ts/projects/p-ts-frontend/tsconfig.json create mode 100644 examples/p-ts/projects/p-ts-frontend/tsconfig.node.json create mode 100644 examples/p-ts/projects/p-ts-frontend/vite.config.ts create mode 100644 examples/s-py/.algokit/generators/create-devcontainer/copier.yaml create mode 100644 examples/s-py/.algokit/generators/create-devcontainer/devcontainer.json create mode 100644 examples/s-py/.editorconfig create mode 100644 examples/s-py/.gitattributes create mode 100644 examples/s-py/.gitignore delete mode 100644 examples/s-py/copy_files.sh create mode 100644 examples/s-py/projects/.gitkeep create mode 100644 examples/s-py/projects/s-py-contracts/.algokit.toml create mode 100644 examples/s-py/projects/s-py-contracts/.algokit/.copier-answers.yml create mode 100644 examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/copier.yaml create mode 100644 examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.py.j2 create mode 100644 examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 create mode 100644 examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/copier.yaml create mode 100644 examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} create mode 100644 examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} create mode 100644 examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} create mode 100644 examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} create mode 100644 examples/s-py/projects/s-py-contracts/.editorconfig create mode 100644 examples/s-py/projects/s-py-contracts/.gitignore create mode 100644 examples/s-py/projects/s-py-contracts/.npmrc create mode 100644 examples/s-py/projects/s-py-contracts/.prettierignore create mode 100644 examples/s-py/projects/s-py-contracts/.prettierrc.js create mode 100644 examples/s-py/projects/s-py-contracts/.tours/getting-started-with-your-algokit-project.tour create mode 100644 examples/s-py/projects/s-py-contracts/.vscode/extensions.json create mode 100644 examples/s-py/projects/s-py-contracts/.vscode/launch.json create mode 100644 examples/s-py/projects/s-py-contracts/.vscode/settings.json create mode 100644 examples/s-py/projects/s-py-contracts/.vscode/tasks.json create mode 100644 examples/s-py/projects/s-py-contracts/README.md create mode 100644 examples/s-py/projects/s-py-contracts/package.json create mode 100644 examples/s-py/projects/s-py-contracts/poetry.toml create mode 100644 examples/s-py/projects/s-py-contracts/pyproject.toml create mode 100644 examples/s-py/projects/s-py-contracts/smart_contracts/__init__.py create mode 100644 examples/s-py/projects/s-py-contracts/smart_contracts/__main__.py create mode 100644 examples/s-py/projects/s-py-contracts/smart_contracts/hello_world/contract.py create mode 100644 examples/s-py/projects/s-py-contracts/smart_contracts/hello_world/deploy-config.ts create mode 100644 examples/s-py/projects/s-py-contracts/smart_contracts/index.ts create mode 100644 examples/s-py/projects/s-py-contracts/tsconfig.json create mode 100644 examples/s-py/projects/s-py-frontend/.algokit.toml create mode 100644 examples/s-py/projects/s-py-frontend/.algokit/.copier-answers.yml create mode 100644 examples/s-py/projects/s-py-frontend/.env.template create mode 100644 examples/s-py/projects/s-py-frontend/.gitignore create mode 100644 examples/s-py/projects/s-py-frontend/.npmrc create mode 100644 examples/s-py/projects/s-py-frontend/.vscode/extensions.json create mode 100644 examples/s-py/projects/s-py-frontend/.vscode/launch.json create mode 100644 examples/s-py/projects/s-py-frontend/.vscode/settings.json create mode 100644 examples/s-py/projects/s-py-frontend/.vscode/tasks.json create mode 100644 examples/s-py/projects/s-py-frontend/README.md create mode 100644 examples/s-py/projects/s-py-frontend/index.html create mode 100644 examples/s-py/projects/s-py-frontend/package.json create mode 100644 examples/s-py/projects/s-py-frontend/public/index.html create mode 100644 examples/s-py/projects/s-py-frontend/public/robots.txt create mode 100644 examples/s-py/projects/s-py-frontend/src/App.tsx rename examples/s-py/{inject_content => projects/s-py-frontend/src}/Home.tsx (100%) create mode 100644 examples/s-py/projects/s-py-frontend/src/assets/logo.svg create mode 100644 examples/s-py/projects/s-py-frontend/src/components/Account.tsx rename examples/s-py/{inject_content => projects/s-py-frontend/src/components}/AppCalls.tsx (100%) create mode 100644 examples/s-py/projects/s-py-frontend/src/components/ConnectWallet.tsx create mode 100644 examples/s-py/projects/s-py-frontend/src/components/ErrorBoundary.tsx create mode 100644 examples/s-py/projects/s-py-frontend/src/components/Transact.tsx create mode 100644 examples/s-py/projects/s-py-frontend/src/contracts/HelloWorld.ts create mode 100644 examples/s-py/projects/s-py-frontend/src/contracts/README.md create mode 100644 examples/s-py/projects/s-py-frontend/src/interfaces/network.ts create mode 100644 examples/s-py/projects/s-py-frontend/src/main.tsx create mode 100644 examples/s-py/projects/s-py-frontend/src/styles/App.css create mode 100644 examples/s-py/projects/s-py-frontend/src/utils/ellipseAddress.ts create mode 100644 examples/s-py/projects/s-py-frontend/src/utils/network/getAlgoClientConfigs.ts create mode 100644 examples/s-py/projects/s-py-frontend/src/vite-env.d.ts create mode 100644 examples/s-py/projects/s-py-frontend/tsconfig.json create mode 100644 examples/s-py/projects/s-py-frontend/tsconfig.node.json create mode 100644 examples/s-py/projects/s-py-frontend/vite.config.ts create mode 100644 examples/s-tls/.algokit/generators/create-devcontainer/copier.yaml create mode 100644 examples/s-tls/.algokit/generators/create-devcontainer/devcontainer.json create mode 100644 examples/s-tls/.editorconfig create mode 100644 examples/s-tls/.gitattributes create mode 100644 examples/s-tls/.gitignore delete mode 100644 examples/s-tls/copy_files.sh create mode 100644 examples/s-tls/projects/.gitkeep create mode 100644 examples/s-tls/projects/s-tls-contracts/.algokit.toml create mode 100644 examples/s-tls/projects/s-tls-contracts/.eslintrc.js create mode 100644 examples/s-tls/projects/s-tls-contracts/.gitignore create mode 100644 examples/s-tls/projects/s-tls-contracts/.prettierrc.toml create mode 100644 examples/s-tls/projects/s-tls-contracts/.vscode/extensions.json create mode 100644 examples/s-tls/projects/s-tls-contracts/.vscode/settings.json create mode 100644 examples/s-tls/projects/s-tls-contracts/README.md create mode 100644 examples/s-tls/projects/s-tls-contracts/__test__/Calculator.test.ts create mode 100644 examples/s-tls/projects/s-tls-contracts/contracts/Calculator.algo.ts create mode 100644 examples/s-tls/projects/s-tls-contracts/contracts/clients/.gitkeep create mode 100644 examples/s-tls/projects/s-tls-contracts/contracts/clients/CalculatorClient.ts create mode 100644 examples/s-tls/projects/s-tls-contracts/jest.config.js create mode 100644 examples/s-tls/projects/s-tls-contracts/package.json create mode 100644 examples/s-tls/projects/s-tls-contracts/tsconfig.json create mode 100644 examples/s-tls/projects/s-tls-frontend/.algokit.toml create mode 100644 examples/s-tls/projects/s-tls-frontend/.algokit/.copier-answers.yml create mode 100644 examples/s-tls/projects/s-tls-frontend/.env.template create mode 100644 examples/s-tls/projects/s-tls-frontend/.gitignore create mode 100644 examples/s-tls/projects/s-tls-frontend/.npmrc create mode 100644 examples/s-tls/projects/s-tls-frontend/.vscode/extensions.json create mode 100644 examples/s-tls/projects/s-tls-frontend/.vscode/launch.json create mode 100644 examples/s-tls/projects/s-tls-frontend/.vscode/settings.json create mode 100644 examples/s-tls/projects/s-tls-frontend/.vscode/tasks.json create mode 100644 examples/s-tls/projects/s-tls-frontend/README.md create mode 100644 examples/s-tls/projects/s-tls-frontend/index.html create mode 100644 examples/s-tls/projects/s-tls-frontend/package.json create mode 100644 examples/s-tls/projects/s-tls-frontend/public/index.html create mode 100644 examples/s-tls/projects/s-tls-frontend/public/robots.txt create mode 100644 examples/s-tls/projects/s-tls-frontend/src/App.tsx rename examples/s-tls/{inject_content => projects/s-tls-frontend/src}/Home.tsx (100%) create mode 100644 examples/s-tls/projects/s-tls-frontend/src/assets/logo.svg create mode 100644 examples/s-tls/projects/s-tls-frontend/src/components/Account.tsx rename examples/s-tls/{inject_content => projects/s-tls-frontend/src/components}/AppCalls.tsx (100%) create mode 100644 examples/s-tls/projects/s-tls-frontend/src/components/ConnectWallet.tsx create mode 100644 examples/s-tls/projects/s-tls-frontend/src/components/ErrorBoundary.tsx create mode 100644 examples/s-tls/projects/s-tls-frontend/src/components/Transact.tsx create mode 100644 examples/s-tls/projects/s-tls-frontend/src/contracts/Calculator.ts create mode 100644 examples/s-tls/projects/s-tls-frontend/src/contracts/README.md create mode 100644 examples/s-tls/projects/s-tls-frontend/src/interfaces/network.ts create mode 100644 examples/s-tls/projects/s-tls-frontend/src/main.tsx create mode 100644 examples/s-tls/projects/s-tls-frontend/src/styles/App.css create mode 100644 examples/s-tls/projects/s-tls-frontend/src/utils/ellipseAddress.ts create mode 100644 examples/s-tls/projects/s-tls-frontend/src/utils/network/getAlgoClientConfigs.ts create mode 100644 examples/s-tls/projects/s-tls-frontend/src/vite-env.d.ts create mode 100644 examples/s-tls/projects/s-tls-frontend/tsconfig.json create mode 100644 examples/s-tls/projects/s-tls-frontend/tsconfig.node.json create mode 100644 examples/s-tls/projects/s-tls-frontend/vite.config.ts create mode 100644 examples/s-ts/.algokit/generators/create-devcontainer/copier.yaml create mode 100644 examples/s-ts/.algokit/generators/create-devcontainer/devcontainer.json create mode 100644 examples/s-ts/.editorconfig create mode 100644 examples/s-ts/.gitattributes create mode 100644 examples/s-ts/.gitignore delete mode 100644 examples/s-ts/copy_files.sh create mode 100644 examples/s-ts/projects/.gitkeep create mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit.toml create mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit/.copier-answers.yml create mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/copier.yaml create mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.algo.ts.j2 create mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 create mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 create mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.spec.ts{% endif %}.j2 create mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/copier.yaml create mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} create mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} create mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} create mode 100644 examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} create mode 100644 examples/s-ts/projects/s-ts-contracts/.gitignore create mode 100644 examples/s-ts/projects/s-ts-contracts/.tours/getting-started-with-your-algokit-project.tour create mode 100644 examples/s-ts/projects/s-ts-contracts/.vscode/extensions.json create mode 100644 examples/s-ts/projects/s-ts-contracts/.vscode/launch.json create mode 100644 examples/s-ts/projects/s-ts-contracts/.vscode/settings.json create mode 100644 examples/s-ts/projects/s-ts-contracts/.vscode/tasks.json create mode 100644 examples/s-ts/projects/s-ts-contracts/README.md create mode 100644 examples/s-ts/projects/s-ts-contracts/package.json create mode 100644 examples/s-ts/projects/s-ts-contracts/smart_contracts/hello_world/contract.algo.ts create mode 100644 examples/s-ts/projects/s-ts-contracts/smart_contracts/hello_world/deploy-config.ts create mode 100644 examples/s-ts/projects/s-ts-contracts/smart_contracts/index.ts create mode 100644 examples/s-ts/projects/s-ts-contracts/tsconfig.json create mode 100644 examples/s-ts/projects/s-ts-frontend/.algokit.toml create mode 100644 examples/s-ts/projects/s-ts-frontend/.algokit/.copier-answers.yml create mode 100644 examples/s-ts/projects/s-ts-frontend/.env.template create mode 100644 examples/s-ts/projects/s-ts-frontend/.gitignore create mode 100644 examples/s-ts/projects/s-ts-frontend/.npmrc create mode 100644 examples/s-ts/projects/s-ts-frontend/.vscode/extensions.json create mode 100644 examples/s-ts/projects/s-ts-frontend/.vscode/launch.json create mode 100644 examples/s-ts/projects/s-ts-frontend/.vscode/settings.json create mode 100644 examples/s-ts/projects/s-ts-frontend/.vscode/tasks.json create mode 100644 examples/s-ts/projects/s-ts-frontend/README.md create mode 100644 examples/s-ts/projects/s-ts-frontend/index.html create mode 100644 examples/s-ts/projects/s-ts-frontend/package.json create mode 100644 examples/s-ts/projects/s-ts-frontend/public/index.html create mode 100644 examples/s-ts/projects/s-ts-frontend/public/robots.txt create mode 100644 examples/s-ts/projects/s-ts-frontend/src/App.tsx rename examples/s-ts/{inject_content => projects/s-ts-frontend/src}/Home.tsx (100%) create mode 100644 examples/s-ts/projects/s-ts-frontend/src/assets/logo.svg create mode 100644 examples/s-ts/projects/s-ts-frontend/src/components/Account.tsx rename examples/s-ts/{inject_content => projects/s-ts-frontend/src/components}/AppCalls.tsx (100%) create mode 100644 examples/s-ts/projects/s-ts-frontend/src/components/ConnectWallet.tsx create mode 100644 examples/s-ts/projects/s-ts-frontend/src/components/ErrorBoundary.tsx create mode 100644 examples/s-ts/projects/s-ts-frontend/src/components/Transact.tsx create mode 100644 examples/s-ts/projects/s-ts-frontend/src/contracts/HelloWorld.ts create mode 100644 examples/s-ts/projects/s-ts-frontend/src/contracts/README.md create mode 100644 examples/s-ts/projects/s-ts-frontend/src/interfaces/network.ts create mode 100644 examples/s-ts/projects/s-ts-frontend/src/main.tsx create mode 100644 examples/s-ts/projects/s-ts-frontend/src/styles/App.css create mode 100644 examples/s-ts/projects/s-ts-frontend/src/utils/ellipseAddress.ts create mode 100644 examples/s-ts/projects/s-ts-frontend/src/utils/network/getAlgoClientConfigs.ts create mode 100644 examples/s-ts/projects/s-ts-frontend/src/vite-env.d.ts create mode 100644 examples/s-ts/projects/s-ts-frontend/tsconfig.json create mode 100644 examples/s-ts/projects/s-ts-frontend/tsconfig.node.json create mode 100644 examples/s-ts/projects/s-ts-frontend/vite.config.ts diff --git a/examples/p-py/.algokit/.copier-answers.yml b/examples/p-py/.algokit/.copier-answers.yml index 7753a3e..63a5c4d 100644 --- a/examples/p-py/.algokit/.copier-answers.yml +++ b/examples/p-py/.algokit/.copier-answers.yml @@ -1,6 +1,6 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 2.1.8-11-g7668422 -_src_path: /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template +_commit: 2.1.8-10-g72c45ae +_src_path: /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpccp2c3vt/template author_email: None author_name: None cloud_provider: netlify diff --git a/examples/p-py/.algokit/generators/create-devcontainer/copier.yaml b/examples/p-py/.algokit/generators/create-devcontainer/copier.yaml new file mode 100644 index 0000000..e98f334 --- /dev/null +++ b/examples/p-py/.algokit/generators/create-devcontainer/copier.yaml @@ -0,0 +1,4 @@ +_tasks: + - "echo '==== Successfully generated new .devcontainer.json file 🚀 ===='" + +_templates_suffix: ".j2" diff --git a/examples/p-py/.algokit/generators/create-devcontainer/devcontainer.json b/examples/p-py/.algokit/generators/create-devcontainer/devcontainer.json new file mode 100644 index 0000000..6452c65 --- /dev/null +++ b/examples/p-py/.algokit/generators/create-devcontainer/devcontainer.json @@ -0,0 +1,19 @@ +{ + "forwardPorts": [4001, 4002, 8980, 5173], + "portsAttributes": { + "4001": { + "label": "algod" + }, + "4002": { + "label": "kmd" + }, + "8980": { + "label": "indexer" + }, + "5173": { + "label": "vite" + } + }, + "postCreateCommand": "mkdir -p ~/.config/algokit && pipx install algokit && sudo chown -R codespace:codespace ~/.config/algokit", + "postStartCommand": "for i in {1..5}; do algokit localnet status > /dev/null 2>&1 && break || sleep 30; algokit localnet reset; done" +} diff --git a/examples/p-py/.editorconfig b/examples/p-py/.editorconfig new file mode 100644 index 0000000..5e550a1 --- /dev/null +++ b/examples/p-py/.editorconfig @@ -0,0 +1,10 @@ +[*] +charset = utf-8 +insert_final_newline = true +end_of_line = lf +indent_style = space +indent_size = 2 +tab_width = 2 +max_line_length = 140 +trim_trailing_whitespace = true +single_quote = true diff --git a/examples/p-py/.gitattributes b/examples/p-py/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/examples/p-py/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/examples/p-py/.github/workflows/p-py-contracts-cd.yaml b/examples/p-py/.github/workflows/p-py-contracts-cd.yaml new file mode 100644 index 0000000..567b072 --- /dev/null +++ b/examples/p-py/.github/workflows/p-py-contracts-cd.yaml @@ -0,0 +1,44 @@ +name: Release p-py-contracts + +on: + workflow_call: + +jobs: + deploy-testnet: + runs-on: "ubuntu-latest" + + environment: contract-testnet + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Install poetry + run: | + pipx install poetry + pipx inject poetry poetry-plugin-export + + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: "poetry" + + - name: Install algokit + run: pipx install algokit + + - name: Bootstrap dependencies + run: algokit project bootstrap all --project-name 'p-py-contracts' + + - name: Configure git + shell: bash + run: | + # set git user and email as test invoke git + git config --global user.email "actions@github.com" && git config --global user.name "github-actions" + + - name: Deploy to testnet + run: algokit project deploy testnet --project-name 'p-py-contracts' + env: + # This is the account that becomes the creator of the contract + DEPLOYER_MNEMONIC: ${{ secrets.DEPLOYER_MNEMONIC }} + # The dispenser account is used to ensure the deployer account is funded + DISPENSER_MNEMONIC: ${{ secrets.DISPENSER_MNEMONIC }} diff --git a/examples/p-py/.github/workflows/p-py-contracts-ci.yaml b/examples/p-py/.github/workflows/p-py-contracts-ci.yaml new file mode 100644 index 0000000..288a486 --- /dev/null +++ b/examples/p-py/.github/workflows/p-py-contracts-ci.yaml @@ -0,0 +1,65 @@ +name: Validate p-py-contracts + +on: + workflow_call: + +jobs: + validate: + runs-on: "ubuntu-latest" + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Install poetry + run: | + pipx install poetry + pipx inject poetry poetry-plugin-export + + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: "poetry" + + - name: Install algokit + run: pipx install algokit + + - name: Start LocalNet + run: algokit localnet start + + - name: Bootstrap dependencies + run: algokit project bootstrap all --project-name 'p-py-contracts' + + - name: Configure git + shell: bash + run: | + # set git user and email as test invoke git + git config --global user.email "actions@github.com" && git config --global user.name "github-actions" + + - name: Audit python dependencies + run: algokit project run audit --project-name 'p-py-contracts' + + - name: Lint and format python dependencies + run: algokit project run lint --project-name 'p-py-contracts' + + - name: Run tests + shell: bash + run: | + set -o pipefail + algokit project run test --project-name 'p-py-contracts' + + - name: Build smart contracts + run: algokit project run build --project-name 'p-py-contracts' + + - name: Scan TEAL files for issues + run: algokit project run audit-teal --project-name 'p-py-contracts' + + # # Uncomment to enable TEAL static analysis with snapshoting using Tealer package + # # Would first require running locally using audit-teal command and committing the snapshots into source control + # # Please note, tealer has a known bug that may result in large snapshot file sizes, track resolution here: + # # https://github.com/crytic/tealer/issues/101 + # - name: Check output stability of the smart contracts + # run: algokit project run ci-teal-diff --project-name 'p-py-contracts' + + - name: Run deployer against LocalNet + run: algokit project deploy localnet --project-name 'p-py-contracts' diff --git a/examples/p-py/.github/workflows/p-py-frontend-cd.yaml b/examples/p-py/.github/workflows/p-py-frontend-cd.yaml new file mode 100644 index 0000000..4049a93 --- /dev/null +++ b/examples/p-py/.github/workflows/p-py-frontend-cd.yaml @@ -0,0 +1,36 @@ +name: Release p-py-frontend + +on: + workflow_call: +permissions: + contents: read + packages: read + +jobs: + + deploy: + runs-on: ubuntu-latest + name: Deploy to Netlify + environment: frontend-prod + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup node + uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Install algokit + run: pipx install algokit + + - name: Bootstrap dependencies + run: algokit project bootstrap all --project-name 'p-py-frontend' + + - name: Publish to Netlify + env: + NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} + NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} + run: algokit project run ci-deploy-netlify + \ No newline at end of file diff --git a/examples/p-py/.github/workflows/p-py-frontend-ci.yaml b/examples/p-py/.github/workflows/p-py-frontend-ci.yaml new file mode 100644 index 0000000..fafb514 --- /dev/null +++ b/examples/p-py/.github/workflows/p-py-frontend-ci.yaml @@ -0,0 +1,47 @@ +name: Validate p-py-frontend + +on: + + workflow_call: + + +jobs: + validate: + runs-on: 'ubuntu-latest' + steps: + - name: Check out repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup node + uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Install poetry + run: pipx install poetry + + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: "poetry" + + - name: Install algokit + run: pipx install algokit + + - name: Install dependencies + run: algokit project bootstrap all --project-name 'p-py-frontend' + + + - name: Run linters + run: algokit project run lint --project-name 'p-py-frontend' + + + - name: Run unit tests + run: algokit project run test --project-name 'p-py-frontend' + + + - name: Build + run: algokit project run build --project-name 'p-py-frontend' diff --git a/examples/p-py/.gitignore b/examples/p-py/.gitignore new file mode 100644 index 0000000..4105eb2 --- /dev/null +++ b/examples/p-py/.gitignore @@ -0,0 +1,170 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Ruff (linter) +.ruff_cache/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +.idea/ +!.idea/runConfigurations + +# macOS +.DS_Store + +# Received approval test files +*.received.* + +# NPM +node_modules + diff --git a/examples/p-py/copy_files.sh b/examples/p-py/copy_files.sh deleted file mode 100644 index 749b01f..0000000 --- a/examples/p-py/copy_files.sh +++ /dev/null @@ -1,23 +0,0 @@ - -#!/bin/bash -# Script to copy required files to the frontend project -# Usage: ./copy_files.sh - - -project_name="$1" -frontend_root="./projects/${project_name}-frontend" - -# Ensure directories exist -mkdir -p "${frontend_root}/src/components" - -# Copy files -cp "./inject_content/Home.tsx" "${frontend_root}/src/Home.tsx" -cp "./inject_content/AppCalls.tsx" "${frontend_root}/src/components/AppCalls.tsx" - -echo "Template completed successfully!" -# remove inject_content folder -rm -rf "./inject_content" -# self destruct the file -rm -f "$0" - - diff --git a/examples/p-py/projects/.gitkeep b/examples/p-py/projects/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/examples/p-py/projects/p-py-contracts/.algokit.toml b/examples/p-py/projects/p-py-contracts/.algokit.toml new file mode 100644 index 0000000..845e015 --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/.algokit.toml @@ -0,0 +1,57 @@ +[algokit] +min_version = "v2.0.0" + +[generate.smart-contract] +description = "Generate a new smart contract for existing project" +path = ".algokit/generators/create_contract" + +[generate.env-file] +description = "Generate a new generic or Algorand network specific .env file" +path = ".algokit/generators/create_env_file" + +[project] +type = 'contract' +name = 'p-py-contracts' +artifacts = 'smart_contracts/artifacts' + +[project.deploy] +command = "poetry run python -m smart_contracts deploy" + +[project.deploy.testnet] +environment_secrets = [ + "DEPLOYER_MNEMONIC", + "DISPENSER_MNEMONIC", +] + +[project.deploy.mainnet] +environment_secrets = [ + "DEPLOYER_MNEMONIC", + "DISPENSER_MNEMONIC", +] + +[project.run] +# Commands intented for use locally and in CI +build = { commands = [ + 'poetry run python -m smart_contracts build', +], description = 'Build all smart contracts in the project' } +test = { commands = [ + 'poetry run pytest', +], description = 'Run smart contract tests' } +audit = { commands = [ + 'poetry run pip-audit', +], description = 'Audit with pip-audit. NOTE: If used with poetry >v2, make sure to install `poetry-plugin-export` as per https://github.com/python-poetry/poetry-plugin-export#installation.' } +lint = { commands = [ + 'poetry run black --check --diff .', + 'poetry run ruff check .', + 'poetry run mypy', +], description = 'Perform linting' } +audit-teal = { commands = [ + # 🚨 IMPORTANT 🚨: For strict TEAL validation, remove --exclude statements. The default starter contract is not for production. Ensure thorough testing and adherence to best practices in smart contract development. This is not a replacement for a professional audit. + 'algokit task analyze smart_contracts/artifacts --recursive --force --exclude rekey-to --exclude is-updatable --exclude missing-fee-check --exclude is-deletable --exclude can-close-asset --exclude can-close-account --exclude unprotected-deletable --exclude unprotected-updatable', +], description = 'Audit TEAL files' } + +# Commands intented for CI only, prefixed with `ci-` by convention +ci-teal-diff = { commands = [ + 'git add -N ./smart_contracts/artifacts', + 'git diff --exit-code --minimal ./smart_contracts/artifacts', +], description = 'Check TEAL files for differences' } diff --git a/examples/p-py/projects/p-py-contracts/.algokit/.copier-answers.yml b/examples/p-py/projects/p-py-contracts/.algokit/.copier-answers.yml new file mode 100644 index 0000000..ac678d7 --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/.algokit/.copier-answers.yml @@ -0,0 +1,10 @@ +# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY +_commit: 1.8.1-13-g270c4a5 +_src_path: gh:algorandfoundation/algokit-python-template +author_email: None +author_name: None +contract_name: hello_world +deployment_language: python +preset_name: production +project_name: p-py-contracts + diff --git a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/copier.yaml b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/copier.yaml new file mode 100644 index 0000000..73805de --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/copier.yaml @@ -0,0 +1,10 @@ +_tasks: + - "echo '==== Successfully initialized new smart contract 🚀 ===='" + +contract_name: + type: str + help: Name of your new contract. + placeholder: "my-new-contract" + default: "my-new-contract" + +_templates_suffix: ".j2" diff --git a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.py.j2 b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.py.j2 new file mode 100644 index 0000000..829e3a0 --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.py.j2 @@ -0,0 +1,9 @@ +# pyright: reportMissingModuleSource=false +from algopy import ARC4Contract, String +from algopy.arc4 import abimethod + + +class {{ contract_name.split('_')|map('capitalize')|join }}(ARC4Contract): + @abimethod() + def hello(self, name: String) -> String: + return "Hello, " + name diff --git a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy_config.py.j2 b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy_config.py.j2 new file mode 100644 index 0000000..194ba5e --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy_config.py.j2 @@ -0,0 +1,44 @@ +import logging + +import algokit_utils + +logger = logging.getLogger(__name__) + + +# define deployment behaviour based on supplied app spec +def deploy() -> None: + from smart_contracts.artifacts.{{ contract_name }}.{{ contract_name }}_client import ( + {{ contract_name.split('_')|map('capitalize')|join }}Factory, + HelloArgs, + ) + + algorand = algokit_utils.AlgorandClient.from_environment() + deployer_ = algorand.account.from_environment("DEPLOYER") + + factory = algorand.client.get_typed_app_factory( + {{ contract_name.split('_')|map('capitalize')|join }}Factory, default_sender=deployer_.addr + ) + + app_client, result = factory.deploy( + on_update=algokit_utils.OnUpdate.AppendApp, + on_schema_break=algokit_utils.OnSchemaBreak.AppendApp, + ) + + if result.operation_performed in [ + algokit_utils.OperationPerformed.Create, + algokit_utils.OperationPerformed.Replace, + ]: + algorand.send.payment( + algokit_utils.PaymentParams( + amount=algokit_utils.AlgoAmount(algo=1), + sender=deployer_.addr, + receiver=app_client.app_address, + ) + ) + + name = "world" + response = app_client.send.hello(args=HelloArgs(name=name)) + logger.info( + f"Called hello on {app_client.app_name} ({app_client.app_id}) " + f"with name={name}, received: {response.abi_return}" + ) diff --git a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/copier.yaml b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/copier.yaml new file mode 100644 index 0000000..afa2cac --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/copier.yaml @@ -0,0 +1,49 @@ +_tasks: + - "echo '==== Successfully generated new .env file 🚀 ===='" + +target_network: + type: str + help: Name of your target network. + choices: + - mainnet + - testnet + - localnet + - custom + default: "localnet" + when: "{{ not use_generic_env }}" + +custom_network_name: + type: str + help: Name of your custom Algorand network. + placeholder: "custom" + when: "{{ not use_generic_env and target_network == 'custom' }}" + +is_localnet: + type: bool + help: Whether to deploy on localnet. + placeholder: "true" + default: "{{ target_network == 'localnet' and not use_generic_env }}" + when: 'false' + +is_testnet: + type: bool + help: Whether to deploy on testnet. + placeholder: "true" + default: "{{ target_network == 'testnet' and not use_generic_env }}" + when: 'false' + +is_mainnet: + type: bool + help: Whether to deploy on mainnet. + placeholder: "true" + default: "{{ target_network == 'mainnet' and not use_generic_env }}" + when: 'false' + +is_customnet: + type: bool + help: Whether to deploy on custom network. + placeholder: "true" + default: "{{ target_network == 'custom' and not use_generic_env }}" + when: 'false' + +_templates_suffix: ".j2" diff --git a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} new file mode 100644 index 0000000..cfc9f21 --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} @@ -0,0 +1,7 @@ +# this file contains algorand network settings for interacting with testnet via algonode +ALGOD_TOKEN={YOUR_ALGOD_TOKEN} +ALGOD_SERVER={YOUR_ALGOD_SERVER_URL} +ALGOD_PORT={YOUR_ALGOD_PORT} +INDEXER_TOKEN={YOUR_INDEXER_TOKEN} +INDEXER_SERVER={YOUR_INDEXER_SERVER_URL} +INDEXER_PORT={YOUR_INDEXER_PORT} diff --git a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} new file mode 100644 index 0000000..fcbf442 --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} @@ -0,0 +1,7 @@ +# this file should contain environment variables specific to algokit localnet +ALGOD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +ALGOD_SERVER=http://localhost +ALGOD_PORT=4001 +INDEXER_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +INDEXER_SERVER=http://localhost +INDEXER_PORT=8980 diff --git a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} new file mode 100644 index 0000000..bb9a787 --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} @@ -0,0 +1,3 @@ +# this file contains algorand network settings for interacting with testnet via algonode +ALGOD_SERVER=https://mainnet-api.algonode.cloud +INDEXER_SERVER=https://mainnet-idx.algonode.cloud diff --git a/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} new file mode 100644 index 0000000..eeea43d --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} @@ -0,0 +1,3 @@ +# this file contains algorand network settings for interacting with testnet via algonode +ALGOD_SERVER=https://testnet-api.algonode.cloud +INDEXER_SERVER=https://testnet-idx.algonode.cloud diff --git a/examples/p-py/projects/p-py-contracts/.editorconfig b/examples/p-py/projects/p-py-contracts/.editorconfig new file mode 100644 index 0000000..e2fda34 --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/.editorconfig @@ -0,0 +1,10 @@ +root=true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true + +[*.py] +indent_size = 4 diff --git a/examples/p-py/projects/p-py-contracts/.gitignore b/examples/p-py/projects/p-py-contracts/.gitignore new file mode 100644 index 0000000..070829c --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/.gitignore @@ -0,0 +1,180 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ +coverage/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +.env.* +!.env.*.template +!.env.template +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Ruff (linter) +.ruff_cache/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +.idea +!.idea/ +.idea/* +!.idea/runConfigurations/ + +# macOS +.DS_Store + +# Received approval test files +*.received.* + +# NPM +node_modules + +# AlgoKit +debug_traces/ +.algokit/static-analysis/ # Replace with .algokit/static-analysis/tealer/ to enable snapshot checks in CI +.algokit/sources diff --git a/examples/p-py/projects/p-py-contracts/.tours/getting-started-with-your-algokit-project.tour b/examples/p-py/projects/p-py-contracts/.tours/getting-started-with-your-algokit-project.tour new file mode 100644 index 0000000..48867d6 --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/.tours/getting-started-with-your-algokit-project.tour @@ -0,0 +1,56 @@ +{ + "$schema": "https://aka.ms/codetour-schema", + "title": "Getting Started with Your AlgoKit Project", + "steps": [ + { + "file": "README.md", + "description": "Welcome to your brand new AlgoKit template-based project. In this tour, we will guide you through the main features and capabilities included in the template.", + "line": 3 + }, + { + "file": "README.md", + "description": "Start by ensuring you have followed the setup of pre-requisites.", + "line": 9 + }, + { + "file": ".algokit.toml", + "description": "This is the main configuration file used by algokit-cli to manage the project. The default template includes a starter 'Hello World' contract that is deployed via the `algokit-utils` package (either `ts` or `py`, depending on your choice). To create a new smart contract, you can use the [`algokit generate`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md) command and invoke a pre-bundled generator template by running `algokit generate smart-contract` (see how it is defined in the `.algokit.toml`, you can create your own generators if needed). This action will create a new folder in the `smart_contracts` directory, named after your project. Each folder contains a `contract.py` file, which is the entry point for your contract implementation, and `deploy_config.py` | `deployConfig.ts` files (depending on the language chosen for the template), that perform the deployment of the contract. Additionally you can define custom commands to run (similar to `npm` scripts), see definitions under `[project]` section in `.algokit.toml`.", + "line": 1 + }, + { + "file": "smart_contracts/hello_world/deploy_config.py", + "description": "The default deployment scripts invoke a sample method on the starter contract that demonstrates how to interact with your deployed Algorand on-chain applications using the [`AlgoKit Typed Clients`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md#1-typed-clients) feature. The invocation if deploy is aliased in `.algokit.toml` file, allowing simple deployments via `algokit project deploy` command.", + "line": 32 + }, + { + "file": "tests/hello_world_test.py", + "description": "If you opted to include unit tests, the default tests provided demonstrate an example of mocking, setting up fixtures, and testing smart contract calls on an AlgoKit typed client.", + "line": 36 + }, + { + "file": ".env.localnet.template", + "description": "Environment files are a crucial mechanism that allows you to set up the [`algokit deploy`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/deploy.md) feature to simplify deploying your contracts in CI/CD environments (please note we still recommend careful evaluation when it comes to deployment to MainNet). Clone the file and remove the `.template` suffix to apply the changes to deployment scripts and launch configurations. The network prefix `localnet|testnet|mainnet` is primarily optimized for `algokit deploy`. The order of loading the variables is `.env.{network}` < `.env`.", + "line": 2 + }, + { + "file": ".vscode/launch.json", + "description": "Refer to the pre-bundled Visual Studio launch configurations, offering various options on how to execute the build and deployment of your smart contracts. Alternatively execute `algokit project run` to see list of available custom commands.", + "line": 5 + }, + { + "file": ".vscode/extensions.json", + "description": "We highly recommend installing the recommended extensions to get the most out of this template starter project in your VSCode IDE.", + "line": 3 + }, + { + "file": "smart_contracts/__main__.py", + "description": "Uncomment the following lines to enable complementary utilities that will generate artifacts required for the [AlgoKit AVM Debugger](https://github.com/algorandfoundation/algokit-avm-vscode-debugger) VSCode plugin available on the [VSCode Extension Marketplace](https://marketplace.visualstudio.com/items?itemName=algorandfoundation.algokit-avm-vscode-debugger). A new folder will be automatically created in the `.algokit` directory with source maps of all TEAL contracts in this workspace, as well as traces that will appear in a folder at the root of the workspace. You can then use the traces as entry points to trigger the debug extension. Make sure to have the `.algokit.toml` file available at the root of the workspace.", + "line": 15 + }, + { + "file": "smart_contracts/_helpers/__init__.py", + "description": "This folder contains helper scripts for contract management. These automate tasks like compiling, generating clients, and deploying. Usually, you won't need to edit these files, but advanced users can expand them for custom needs.", + "line": 1 + } + ] +} diff --git a/examples/p-py/projects/p-py-contracts/.vscode/extensions.json b/examples/p-py/projects/p-py-contracts/.vscode/extensions.json new file mode 100644 index 0000000..1d2e7cf --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/.vscode/extensions.json @@ -0,0 +1,12 @@ +{ + "recommendations": [ + "ms-python.python", + "charliermarsh.ruff", + "matangover.mypy", + "ms-python.black-formatter", + "tamasfe.even-better-toml", + "editorconfig.editorconfig", + "vsls-contrib.codetour", + "algorandfoundation.algokit-avm-vscode-debugger" + ] +} diff --git a/examples/p-py/projects/p-py-contracts/.vscode/launch.json b/examples/p-py/projects/p-py-contracts/.vscode/launch.json new file mode 100644 index 0000000..dbaea6e --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/.vscode/launch.json @@ -0,0 +1,52 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Build & Deploy contracts", + "type": "python", + "request": "launch", + "module": "smart_contracts", + "cwd": "${workspaceFolder}", + "preLaunchTask": "Start AlgoKit LocalNet", + "env": { + "ALGOD_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "ALGOD_SERVER": "http://localhost", + "ALGOD_PORT": "4001", + "INDEXER_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "INDEXER_SERVER": "http://localhost", + "INDEXER_PORT": "8980" + } + }, + { + "name": "Deploy contracts", + "type": "python", + "request": "launch", + "module": "smart_contracts", + "args": ["deploy"], + "cwd": "${workspaceFolder}", + "env": { + "ALGOD_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "ALGOD_SERVER": "http://localhost", + "ALGOD_PORT": "4001", + "INDEXER_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "INDEXER_SERVER": "http://localhost", + "INDEXER_PORT": "8980" + } + }, + { + "name": "Build contracts", + "type": "python", + "request": "launch", + "module": "smart_contracts", + "args": ["build"], + "cwd": "${workspaceFolder}" + }, + { + "type": "avm", + "request": "launch", + "name": "Debug TEAL via AlgoKit AVM Debugger", + "simulateTraceFile": "${workspaceFolder}/${command:PickSimulateTraceFile}", + "stopOnEntry": true + } + ] +} diff --git a/examples/p-py/projects/p-py-contracts/.vscode/settings.json b/examples/p-py/projects/p-py-contracts/.vscode/settings.json new file mode 100644 index 0000000..8849569 --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/.vscode/settings.json @@ -0,0 +1,54 @@ +{ + // General - see also /.editorconfig + "editor.formatOnSave": true, + "files.exclude": { + "**/.git": true, + "**/.DS_Store": true, + "**/Thumbs.db": true, + ".mypy_cache": true, + ".pytest_cache": true, + ".ruff_cache": true, + "**/__pycache__": true, + ".idea": true + }, + + // Python + "python.analysis.autoImportCompletions": true, + "python.analysis.extraPaths": ["${workspaceFolder}/smart_contracts"], + "python.analysis.diagnosticSeverityOverrides": { + "reportMissingModuleSource": "none" + }, + "python.defaultInterpreterPath": "${workspaceFolder}/.venv", + "[python]": { + "editor.codeActionsOnSave": { + "source.fixAll": "explicit", + // Prevent default import sorting from running; Ruff will sort imports for us anyway + "source.organizeImports": "never" + }, + "editor.defaultFormatter": "ms-python.black-formatter", + }, + "black-formatter.args": ["--config=pyproject.toml"], + "python.testing.pytestEnabled": true, + "ruff.enable": true, + "ruff.lint.run": "onSave", + "ruff.lint.args": ["--config=pyproject.toml"], + "ruff.importStrategy": "fromEnvironment", + "ruff.fixAll": true, //lint and fix all files in workspace + "ruff.organizeImports": true, //organize imports on save + "ruff.codeAction.disableRuleComment": { + "enable": true + }, + "ruff.codeAction.fixViolation": { + "enable": true + }, + "python.analysis.typeCheckingMode": "off", + "mypy.configFile": "pyproject.toml", + // set to empty array to use config from project + "mypy.targets": [], + "mypy.runUsingActiveInterpreter": true, + + // On Windows, if execution policy is set to Signed (default) then it won't be able to activate the venv + // so instead let's set it to RemoteSigned for VS Code terminal + "terminal.integrated.shellArgs.windows": ["-ExecutionPolicy", "RemoteSigned"], + "algorandPython.languageServer.enable": true, +} diff --git a/examples/p-py/projects/p-py-contracts/.vscode/tasks.json b/examples/p-py/projects/p-py-contracts/.vscode/tasks.json new file mode 100644 index 0000000..eb1e767 --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/.vscode/tasks.json @@ -0,0 +1,79 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Build contracts", + "command": "${workspaceFolder}/.venv/bin/python", + "windows": { + "command": "${workspaceFolder}/.venv/Scripts/python.exe" + }, + "args": ["-m", "smart_contracts", "build"], + "options": { + "cwd": "${workspaceFolder}" + }, + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [] + }, + { + "label": "Build contracts (+ LocalNet)", + "command": "${workspaceFolder}/.venv/bin/python", + "windows": { + "command": "${workspaceFolder}/.venv/Scripts/python.exe" + }, + "args": ["-m", "smart_contracts", "build"], + "options": { + "cwd": "${workspaceFolder}" + }, + "dependsOn": "Start AlgoKit LocalNet", + "problemMatcher": [] + }, + { + "label": "Start AlgoKit LocalNet", + "command": "algokit", + "args": ["localnet", "start"], + "type": "shell", + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + }, + { + "label": "Stop AlgoKit LocalNet", + "command": "algokit", + "args": ["localnet", "stop"], + "type": "shell", + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + }, + { + "label": "Reset AlgoKit LocalNet", + "command": "algokit", + "args": ["localnet", "reset"], + "type": "shell", + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + }, + { + "label": "Analyze TEAL contracts with AlgoKit Tealer integration", + "command": "algokit", + "args": [ + "task", + "analyze", + "${workspaceFolder}/.algokit", + "--recursive", + "--force" + ], + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + } + ] +} diff --git a/examples/p-py/projects/p-py-contracts/README.md b/examples/p-py/projects/p-py-contracts/README.md new file mode 100644 index 0000000..484b7d2 --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/README.md @@ -0,0 +1,154 @@ +# p-py-contracts + +This project has been generated using AlgoKit. See below for default getting started instructions. + +# Setup + +### Pre-requisites + +- [Python 3.12](https://www.python.org/downloads/) or later +- [Docker](https://www.docker.com/) (only required for LocalNet) + +> For interactive tour over the codebase, download [vsls-contrib.codetour](https://marketplace.visualstudio.com/items?itemName=vsls-contrib.codetour) extension for VS Code, then open the [`.codetour.json`](./.tours/getting-started-with-your-algokit-project.tour) file in code tour extension. + +### Initial Setup + +#### 1. Clone the Repository +Start by cloning this repository to your local machine. + +#### 2. Install Pre-requisites +Ensure the following pre-requisites are installed and properly configured: + +- **Docker**: Required for running a local Algorand network. [Install Docker](https://www.docker.com/). +- **AlgoKit CLI**: Essential for project setup and operations. Install the latest version from [AlgoKit CLI Installation Guide](https://github.com/algorandfoundation/algokit-cli#install). Verify installation with `algokit --version`, expecting `2.0.0` or later. + +#### 3. Bootstrap Your Local Environment +Run the following commands within the project folder: + +- **Install Poetry**: Required for Python dependency management. [Installation Guide](https://python-poetry.org/docs/#installation). Verify with `poetry -V` to see version `1.2`+. +- **Setup Project**: Execute `algokit project bootstrap all` to install dependencies and setup a Python virtual environment in `.venv`. +- **Configure environment**: Execute `algokit generate env-file -a target_network localnet` to create a `.env.localnet` file with default configuration for `localnet`. +- **Start LocalNet**: Use `algokit localnet start` to initiate a local Algorand network. + +### Development Workflow + +#### Terminal +Directly manage and interact with your project using AlgoKit commands: + +1. **Build Contracts**: `algokit project run build` compiles all smart contracts. You can also specify a specific contract by passing the name of the contract folder as an extra argument. +For example: `algokit project run build -- hello_world` will only build the `hello_world` contract. +2. **Deploy**: Use `algokit project deploy localnet` to deploy contracts to the local network. You can also specify a specific contract by passing the name of the contract folder as an extra argument. +For example: `algokit project deploy localnet -- hello_world` will only deploy the `hello_world` contract. + +#### VS Code +For a seamless experience with breakpoint debugging and other features: + +1. **Open Project**: In VS Code, open the repository root. +2. **Install Extensions**: Follow prompts to install recommended extensions. +3. **Debugging**: + - Use `F5` to start debugging. + - **Windows Users**: Select the Python interpreter at `./.venv/Scripts/python.exe` via `Ctrl/Cmd + Shift + P` > `Python: Select Interpreter` before the first run. + +#### JetBrains IDEs +While primarily optimized for VS Code, JetBrains IDEs are supported: + +1. **Open Project**: In your JetBrains IDE, open the repository root. +2. **Automatic Setup**: The IDE should configure the Python interpreter and virtual environment. +3. **Debugging**: Use `Shift+F10` or `Ctrl+R` to start debugging. Note: Windows users may encounter issues with pre-launch tasks due to a known bug. See [JetBrains forums](https://youtrack.jetbrains.com/issue/IDEA-277486/Shell-script-configuration-cannot-run-as-before-launch-task) for workarounds. + +## AlgoKit Workspaces and Project Management +This project supports both standalone and monorepo setups through AlgoKit workspaces. Leverage [`algokit project run`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md) commands for efficient monorepo project orchestration and management across multiple projects within a workspace. + +## AlgoKit Generators + +This template provides a set of [algokit generators](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md) that allow you to further modify the project instantiated from the template to fit your needs, as well as giving you a base to build your own extensions to invoke via the `algokit generate` command. + +### Generate Smart Contract + +By default the template creates a single `HelloWorld` contract under hello_world folder in the `smart_contracts` directory. To add a new contract: + +1. From the root of the project (`../`) execute `algokit generate smart-contract`. This will create a new starter smart contract and deployment configuration file under `{your_contract_name}` subfolder in the `smart_contracts` directory. +2. Each contract potentially has different creation parameters and deployment steps. Hence, you need to define your deployment logic in `deploy_config.py`file. +3. `config.py` file will automatically build all contracts in the `smart_contracts` directory. If you want to build specific contracts manually, modify the default code provided by the template in `config.py` file. + +> Please note, above is just a suggested convention tailored for the base configuration and structure of this template. The default code supplied by the template in `config.py` and `index.ts` (if using ts clients) files are tailored for the suggested convention. You are free to modify the structure and naming conventions as you see fit. + +### Generate '.env' files + +By default the template instance does not contain any env files. Using [`algokit project deploy`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/deploy.md) against `localnet` | `testnet` | `mainnet` will use default values for `algod` and `indexer` unless overwritten via `.env` or `.env.{target_network}`. + +To generate a new `.env` or `.env.{target_network}` file, run `algokit generate env-file` + +### Debugging Smart Contracts + +This project is optimized to work with AlgoKit AVM Debugger extension. To activate it: +Refer to the commented header in the `__main__.py` file in the `smart_contracts` folder. + +If you have opted in to include VSCode launch configurations in your project, you can also use the `Debug TEAL via AlgoKit AVM Debugger` launch configuration to interactively select an available trace file and launch the debug session for your smart contract. + +For information on using and setting up the `AlgoKit AVM Debugger` VSCode extension refer [here](https://github.com/algorandfoundation/algokit-avm-vscode-debugger). To install the extension from the VSCode Marketplace, use the following link: [AlgoKit AVM Debugger extension](https://marketplace.visualstudio.com/items?itemName=algorandfoundation.algokit-avm-vscode-debugger).### Continuous Integration / Continuous Deployment (CI/CD) + +This project uses [GitHub Actions](https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions) to define CI/CD workflows, which are located in the [.github/workflows](`../../.github/workflows`) folder. + +> Please note, if you instantiated the project with --workspace flag in `algokit init` it will automatically attempt to move the contents of the `.github` folder to the root of the workspace. + +### AlgoKit Workspaces + +To define custom `algokit project run` commands refer to [documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md). This allows orchestration of commands spanning across multiple projects within an algokit workspace based project (monorepo). + +#### Setting up GitHub for CI/CD workflow and TestNet deployment + + 1. Every time you have a change to your smart contract, and when you first initialize the project you need to [build the contract](#initial-setup) and then commit the `smart_contracts/artifacts` folder so the [output stability](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/articles/output_stability.md) tests pass + 2. Decide what values you want to use for the `allow_update`, `allow_delete` and the `on_schema_break`, `on_update` parameters specified in [`contract.py`](./smart_contracts/hello_world/contract.py). + When deploying to LocalNet these values are both set to allow update and replacement of the app for convenience. But for non-LocalNet networks + the defaults are more conservative. + These default values will allow the smart contract to be deployed initially, but will not allow the app to be updated or deleted if is changed and the build will instead fail. + To help you decide it may be helpful to read the [AlgoKit Utils app deployment documentation](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/docs/capabilities/app-deploy.md) or the [AlgoKit smart contract deployment architecture](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/architecture-decisions/2023-01-12_smart-contract-deployment.md#upgradeable-and-deletable-contracts). + 3. Create a [Github Environment](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#creating-an-environment) named `Test`. + Note: If you have a private repository and don't have GitHub Enterprise then Environments won't work and you'll need to convert the GitHub Action to use a different approach. Ignore this step if you picked `Starter` preset. + 4. Create or obtain a mnemonic for an Algorand account for use on TestNet to deploy apps, referred to as the `DEPLOYER` account. + 5. Store the mnemonic as a [secret](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#environment-secrets) `DEPLOYER_MNEMONIC` + in the Test environment created in step 3. + 6. The account used to deploy the smart contract will require enough funds to create the app, and also fund it. There are two approaches available here: + * Either, ensure the account is funded outside of CI/CD. + In Testnet, funds can be obtained by using the [Algorand TestNet dispenser](https://bank.testnet.algorand.network/) and we recommend provisioning 50 ALGOs. + * Or, fund the account as part of the CI/CD process by using a `DISPENSER_MNEMONIC` GitHub Environment secret to point to a separate `DISPENSER` account that you maintain ALGOs in (similarly, you need to provision ALGOs into this account using the [TestNet dispenser](https://bank.testnet.algorand.network/)). + +#### Continuous Integration + +For pull requests and pushes to `main` branch against this repository the following checks are automatically performed by GitHub Actions: + - Python dependencies are audited using [pip-audit](https://pypi.org/project/pip-audit/) + - Code formatting is checked using [Black](https://github.com/psf/black) + - Linting is checked using [Ruff](https://github.com/charliermarsh/ruff) + - Types are checked using [mypy](https://mypy-lang.org/) +- The base framework for testing is [pytest](https://docs.pytest.org/), and the project includes two separate kinds of tests: +- - `Algorand Python` smart contract unit tests, that are run using [`algorand-python-testing`](https://pypi.org/project/algorand-python-testing/), which are executed in a Python intepreter emulating major AVM behaviour +- - Python `ApplicationClient` tests that are run against `algokit localnet` and test the behaviour in a real network enviornment + - Smart contract artifacts are built + - Smart contract artifacts are checked for [output stability](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/articles/output_stability.md). + - Smart contract is deployed to a AlgoKit LocalNet instance + +> NOTE: By default smart contract artifacts are compiled with `--debug-level` set to 0, to change this, modify the compiler invocation under `smart_contracts/_helpers/build.py` + +#### Continuous Deployment + +For pushes to `main` branch, after the above checks pass, the following deployment actions are performed: + - The smart contract(s) are deployed to TestNet using [AlgoNode](https://algonode.io). + +> Please note deployment is also performed via `algokit deploy` command which can be invoked both via CI as seen on this project, or locally. For more information on how to use `algokit deploy` please see [AlgoKit documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/deploy.md). + +# Tools + +This project makes use of Algorand Python to build Algorand smart contracts. The following tools are in use: + +- [Algorand](https://www.algorand.com/) - Layer 1 Blockchain; [Developer portal](https://dev.algorand.co/), [Why Algorand?](https://dev.algorand.co/getting-started/why-algorand/) +- [AlgoKit](https://github.com/algorandfoundation/algokit-cli) - One-stop shop tool for developers building on the Algorand network; [docs](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/algokit.md), [intro tutorial](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/tutorials/intro.md) +- [Algorand Python](https://github.com/algorandfoundation/puya) - A semantically and syntactically compatible, typed Python language that works with standard Python tooling and allows you to express smart contracts (apps) and smart signatures (logic signatures) for deployment on the Algorand Virtual Machine (AVM); [docs](https://github.com/algorandfoundation/puya), [examples](https://github.com/algorandfoundation/puya/tree/main/examples) +- [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-py) - A set of core Algorand utilities that make it easier to build solutions on Algorand. +- [Poetry](https://python-poetry.org/): Python packaging and dependency management.- [Black](https://github.com/psf/black): A Python code formatter.- [Ruff](https://github.com/charliermarsh/ruff): An extremely fast Python linter. + +- [mypy](https://mypy-lang.org/): Static type checker. +- [pytest](https://docs.pytest.org/): Automated testing. +- [pip-audit](https://pypi.org/project/pip-audit/): Tool for scanning Python environments for packages with known vulnerabilities. +It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. + diff --git a/examples/p-py/projects/p-py-contracts/poetry.toml b/examples/p-py/projects/p-py-contracts/poetry.toml new file mode 100644 index 0000000..5fcef8c --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/poetry.toml @@ -0,0 +1,3 @@ +[virtualenvs] +in-project = true +prefer-active-python = true diff --git a/examples/p-py/projects/p-py-contracts/pyproject.toml b/examples/p-py/projects/p-py-contracts/pyproject.toml new file mode 100644 index 0000000..e8c0604 --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/pyproject.toml @@ -0,0 +1,65 @@ +[tool.poetry] +name = "p-py-contracts" +version = "0.1.0" +description = "Algorand smart contracts" +authors = ["None "] +readme = "README.md" +package-mode = false + +[tool.poetry.dependencies] +python = "^3.12" +algokit-utils = "^5.0.0a13" +python-dotenv = "^1.0.0" +algorand-python = "^3" +algorand-python-testing = {git = "https://github.com/algorandfoundation/algorand-python-testing.git", branch = "refactor/util-v5"} + +[tool.poetry.group.dev.dependencies] +algokit-client-generator = "^3.0.0a3" +black = {extras = ["d"], version = "*"} +ruff = "^0.9.4" +mypy = "^1" +pytest = "*" +pytest-cov = "*" +pip-audit = "*" +puyapy = "*" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.ruff] +line-length = 120 +lint.select = ["E", "F", "ANN", "UP", "N", "C4", "B", "A", "YTT", "W", "FBT", "Q", "RUF", "I"] +lint.unfixable = ["B", "RUF"] + +[tool.ruff.lint.flake8-annotations] +allow-star-arg-any = true +suppress-none-returning = true + +[tool.pytest.ini_options] +pythonpath = ["smart_contracts", "tests"] + +[tool.mypy] +files = "smart_contracts/" +python_version = "3.12" +disallow_any_generics = true +disallow_subclassing_any = true +disallow_untyped_calls = true +disallow_untyped_defs = true +disallow_incomplete_defs = true +check_untyped_defs = true +disallow_untyped_decorators = true +warn_redundant_casts = true +warn_unused_ignores = true +warn_return_any = true +strict_equality = true +extra_checks = true +disallow_any_unimported = true +disallow_any_expr = true +disallow_any_decorated = true +disallow_any_explicit = true +# Remove if you prefer to use mypy's default behavior against +# untyped types +[[tool.mypy.overrides]] +module = "tests.*" +disallow_any_expr = false diff --git a/examples/p-py/projects/p-py-contracts/smart_contracts/__init__.py b/examples/p-py/projects/p-py-contracts/smart_contracts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/p-py/projects/p-py-contracts/smart_contracts/__main__.py b/examples/p-py/projects/p-py-contracts/smart_contracts/__main__.py new file mode 100644 index 0000000..fa68e36 --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/smart_contracts/__main__.py @@ -0,0 +1,217 @@ +import dataclasses +import importlib +import logging +import subprocess +import sys +from collections.abc import Callable +from pathlib import Path +from shutil import rmtree + +from algokit_utils.config import config +from dotenv import load_dotenv + +# Set trace_all to True to capture all transactions, defaults to capturing traces only on failure +# Learn more about using AlgoKit AVM Debugger to debug your TEAL source codes and inspect various kinds of +# Algorand transactions in atomic groups -> https://github.com/algorandfoundation/algokit-avm-vscode-debugger +config.configure(debug=True, trace_all=False) + +# Set up logging and load environment variables. +logging.basicConfig( + level=logging.DEBUG, format="%(asctime)s %(levelname)-10s: %(message)s" +) +logger = logging.getLogger(__name__) +logger.info("Loading .env") +load_dotenv() + +# Determine the root path based on this file's location. +root_path = Path(__file__).parent + +# ----------------------- Contract Configuration ----------------------- # + + +@dataclasses.dataclass +class SmartContract: + path: Path + name: str + deploy: Callable[[], None] | None = None + + +def import_contract(folder: Path) -> Path: + """Imports the contract from a folder if it exists.""" + contract_path = folder / "contract.py" + if contract_path.exists(): + return contract_path + else: + raise Exception(f"Contract not found in {folder}") + + +def import_deploy_if_exists(folder: Path) -> Callable[[], None] | None: + """Imports the deploy function from a folder if it exists.""" + try: + module_name = f"{folder.parent.name}.{folder.name}.deploy_config" + deploy_module = importlib.import_module(module_name) + return deploy_module.deploy # type: ignore[no-any-return, misc] + except ImportError: + return None + + +def has_contract_file(directory: Path) -> bool: + """Checks whether the directory contains a contract.py file.""" + return (directory / "contract.py").exists() + + +# Use the current directory (root_path) as the base for contract folders and exclude +# folders that start with '_' (internal helpers). +contracts: list[SmartContract] = [ + SmartContract( + path=import_contract(folder), + name=folder.name, + deploy=import_deploy_if_exists(folder), + ) + for folder in root_path.iterdir() + if folder.is_dir() and has_contract_file(folder) and not folder.name.startswith("_") +] + +# -------------------------- Build Logic -------------------------- # + +deployment_extension = "py" + + +def _get_output_path(output_dir: Path, deployment_extension: str) -> Path: + """Constructs the output path for the generated client file.""" + return output_dir / Path( + "{contract_name}" + + ("_client" if deployment_extension == "py" else "Client") + + f".{deployment_extension}" + ) + + +def build(output_dir: Path, contract_path: Path) -> Path: + """ + Builds the contract by exporting (compiling) its source and generating a client. + If the output directory already exists, it is cleared. + """ + output_dir = output_dir.resolve() + if output_dir.exists(): + rmtree(output_dir) + output_dir.mkdir(exist_ok=True, parents=True) + logger.info(f"Exporting {contract_path} to {output_dir}") + + build_result = subprocess.run( + [ + "algokit", + "--no-color", + "compile", + "python", + str(contract_path.resolve()), + f"--out-dir={output_dir}", + "--output-source-map", + ], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + ) + + if build_result.stdout: + print(build_result.stdout) + + if build_result.returncode: + raise Exception(f"Could not build contract:\n{build_result.stdout}") + + # Look for arc56.json files and generate the client based on them. + app_spec_file_names: list[str] = [ + file.name for file in output_dir.glob("*.arc56.json") + ] + + client_file: str | None = None + if not app_spec_file_names: + logger.warning( + "No '*.arc56.json' file found (likely a logic signature being compiled). Skipping client generation." + ) + else: + for file_name in app_spec_file_names: + client_file = file_name + print(file_name) + generate_result = subprocess.run( + [ + "algokit", + "generate", + "client", + str(output_dir), + "--output", + str(_get_output_path(output_dir, deployment_extension)), + ], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + ) + + if generate_result.stdout: + print(generate_result.stdout) + + if generate_result.returncode: + if "No such command" in generate_result.stdout: + raise Exception( + "Could not generate typed client, requires AlgoKit 2.0.0 or later. Please update AlgoKit" + ) + else: + raise Exception( + f"Could not generate typed client:\n{generate_result.stdout}" + ) + if client_file: + return output_dir / client_file + return output_dir + + +# --------------------------- Main Logic --------------------------- # + + +def main(action: str, contract_name: str | None = None) -> None: + """Main entry point to build and/or deploy smart contracts.""" + artifact_path = root_path / "artifacts" + # Filter contracts based on an optional specific contract name. + filtered_contracts = [ + contract + for contract in contracts + if contract_name is None or contract.name == contract_name + ] + + match action: + case "build": + for contract in filtered_contracts: + logger.info(f"Building app at {contract.path}") + build(artifact_path / contract.name, contract.path) + case "deploy": + for contract in filtered_contracts: + output_dir = artifact_path / contract.name + app_spec_file_name = next( + ( + file.name + for file in output_dir.iterdir() + if file.is_file() and file.suffixes == [".arc56", ".json"] + ), + None, + ) + if app_spec_file_name is None: + raise Exception("Could not deploy app, .arc56.json file not found") + if contract.deploy: + logger.info(f"Deploying app {contract.name}") + contract.deploy() + case "all": + for contract in filtered_contracts: + logger.info(f"Building app at {contract.path}") + build(artifact_path / contract.name, contract.path) + if contract.deploy: + logger.info(f"Deploying {contract.name}") + contract.deploy() + case _: + logger.error(f"Unknown action: {action}") + + +if __name__ == "__main__": + if len(sys.argv) > 2: + main(sys.argv[1], sys.argv[2]) + elif len(sys.argv) > 1: + main(sys.argv[1]) + else: + main("all") diff --git a/examples/p-py/projects/p-py-contracts/smart_contracts/hello_world/contract.py b/examples/p-py/projects/p-py-contracts/smart_contracts/hello_world/contract.py new file mode 100644 index 0000000..8a8d12b --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/smart_contracts/hello_world/contract.py @@ -0,0 +1,8 @@ +from algopy import ARC4Contract, String +from algopy.arc4 import abimethod + + +class HelloWorld(ARC4Contract): + @abimethod() + def hello(self, name: String) -> String: + return "Hello, " + name diff --git a/examples/p-py/projects/p-py-contracts/smart_contracts/hello_world/deploy_config.py b/examples/p-py/projects/p-py-contracts/smart_contracts/hello_world/deploy_config.py new file mode 100644 index 0000000..cf0bb15 --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/smart_contracts/hello_world/deploy_config.py @@ -0,0 +1,44 @@ +import logging + +import algokit_utils + +logger = logging.getLogger(__name__) + + +# define deployment behaviour based on supplied app spec +def deploy() -> None: + from smart_contracts.artifacts.hello_world.hello_world_client import ( + HelloArgs, + HelloWorldFactory, + ) + + algorand = algokit_utils.AlgorandClient.from_environment() + deployer_ = algorand.account.from_environment("DEPLOYER") + + factory = algorand.client.get_typed_app_factory( + HelloWorldFactory, default_sender=deployer_.addr + ) + + app_client, result = factory.deploy( + on_update=algokit_utils.OnUpdate.AppendApp, + on_schema_break=algokit_utils.OnSchemaBreak.AppendApp, + ) + + if result.operation_performed in [ + algokit_utils.OperationPerformed.Create, + algokit_utils.OperationPerformed.Replace, + ]: + algorand.send.payment( + algokit_utils.PaymentParams( + amount=algokit_utils.AlgoAmount(algo=1), + sender=deployer_.addr, + receiver=app_client.app_address, + ) + ) + + name = "world" + response = app_client.send.hello(args=HelloArgs(name=name)) + logger.info( + f"Called hello on {app_client.app_name} ({app_client.app_id}) " + f"with name={name}, received: {response.abi_return}" + ) diff --git a/examples/p-py/projects/p-py-contracts/tests/__init__.py b/examples/p-py/projects/p-py-contracts/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/p-py/projects/p-py-contracts/tests/conftest.py b/examples/p-py/projects/p-py-contracts/tests/conftest.py new file mode 100644 index 0000000..c15f645 --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/tests/conftest.py @@ -0,0 +1,20 @@ +import pytest +from algokit_utils import AlgorandClient +from algokit_utils.config import config + +# Uncomment if you want to load network specific or generic .env file +# @pytest.fixture(autouse=True, scope="session") +# def environment_fixture() -> None: +# env_path = Path(__file__).parent.parent / ".env" +# load_dotenv(env_path) + +config.configure( + debug=True, + # trace_all=True, # uncomment to trace all transactions +) + + +@pytest.fixture(scope="session") +def algorand_client() -> AlgorandClient: + # by default we are using localnet algod + return AlgorandClient.from_environment() diff --git a/examples/p-py/projects/p-py-contracts/tests/hello_world_client_test.py b/examples/p-py/projects/p-py-contracts/tests/hello_world_client_test.py new file mode 100644 index 0000000..1ce278f --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/tests/hello_world_client_test.py @@ -0,0 +1,55 @@ +import algokit_utils +import pytest +from algokit_utils import ( + AddressWithSigners, + AlgoAmount, + AlgorandClient, +) + +from smart_contracts.artifacts.hello_world.hello_world_client import ( + HelloWorldClient, + HelloWorldFactory, +) + + +@pytest.fixture() +def deployer(algorand_client: AlgorandClient) -> AddressWithSigners: + account = algorand_client.account.from_environment("DEPLOYER") + algorand_client.account.ensure_funded_from_environment( + account_to_fund=account.addr, min_spending_balance=AlgoAmount.from_algo(10) + ) + return account + + +@pytest.fixture() +def hello_world_client( + algorand_client: AlgorandClient, deployer: AddressWithSigners +) -> HelloWorldClient: + factory = algorand_client.client.get_typed_app_factory( + HelloWorldFactory, default_sender=deployer.addr + ) + + client, _ = factory.deploy( + on_schema_break=algokit_utils.OnSchemaBreak.AppendApp, + on_update=algokit_utils.OnUpdate.AppendApp, + ) + return client + + +def test_says_hello(hello_world_client: HelloWorldClient) -> None: + result = hello_world_client.send.hello(args=("World",)) + assert result.abi_return == "Hello, World" + + +def test_simulate_says_hello_with_correct_budget_consumed( + hello_world_client: HelloWorldClient, +) -> None: + result = ( + hello_world_client.new_group() + .hello(args=("World",)) + .hello(args=("Jane",)) + .simulate() + ) + assert result.returns[0].value == "Hello, World" + assert result.returns[1].value == "Hello, Jane" + assert result.simulate_response.txn_groups[0].app_budget_consumed < 100 diff --git a/examples/p-py/projects/p-py-contracts/tests/hello_world_test.py b/examples/p-py/projects/p-py-contracts/tests/hello_world_test.py new file mode 100644 index 0000000..b2d41ee --- /dev/null +++ b/examples/p-py/projects/p-py-contracts/tests/hello_world_test.py @@ -0,0 +1,24 @@ +from collections.abc import Iterator + +import pytest +from algopy_testing import AlgopyTestContext, algopy_testing_context + +from smart_contracts.hello_world.contract import HelloWorld + + +@pytest.fixture() +def context() -> Iterator[AlgopyTestContext]: + with algopy_testing_context() as ctx: + yield ctx + + +def test_hello(context: AlgopyTestContext) -> None: + # Arrange + dummy_input = context.any.string(length=10) + contract = HelloWorld() + + # Act + output = contract.hello(dummy_input) + + # Assert + assert output == f"Hello, {dummy_input}" diff --git a/examples/p-py/projects/p-py-frontend/.algokit.toml b/examples/p-py/projects/p-py-frontend/.algokit.toml new file mode 100644 index 0000000..22ec37f --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/.algokit.toml @@ -0,0 +1,17 @@ +[algokit] +min_version = "v2.0.0" + +[project] +type = "frontend" +name = 'p-py-frontend' +artifacts = "src/contracts" + +[project.run] +build = { commands = ['npm run build'], description = 'Build frontend' } +test = { commands = ['npm run test'], description = 'Run frontend tests' } +lint = { commands = ['npm run lint'], description = 'Lint frontend code' } +ci-deploy-netlify = { commands = [ + 'npm install --global netlify-cli@latest', + 'netlify login', + 'netlify deploy --build --prod' + ], description = 'Deploy to Netlify' } diff --git a/examples/p-py/projects/p-py-frontend/.algokit/.copier-answers.yml b/examples/p-py/projects/p-py-frontend/.algokit/.copier-answers.yml new file mode 100644 index 0000000..7af32d8 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/.algokit/.copier-answers.yml @@ -0,0 +1,9 @@ +# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY +_commit: 1.1.1-13-gc5abe59 +_src_path: gh:algorandfoundation/algokit-react-frontend-template +author_email: None +author_name: None +cloud_provider: netlify +preset_name: production +project_name: p-py-frontend + diff --git a/examples/p-py/projects/p-py-frontend/.editorconfig b/examples/p-py/projects/p-py-frontend/.editorconfig new file mode 100644 index 0000000..a83b72c --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/.editorconfig @@ -0,0 +1,9 @@ +[*] +charset = utf-8 +insert_final_newline = true +end_of_line = lf +indent_style = space +indent_size = 2 +tab_width = 2 +max_line_length = 140 +trim_trailing_whitespace = true diff --git a/examples/p-py/projects/p-py-frontend/.env.template b/examples/p-py/projects/p-py-frontend/.env.template new file mode 100644 index 0000000..5dfbb2d --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/.env.template @@ -0,0 +1,70 @@ +# ====================== +# LocalNet configuration +# uncomment below to use +# ====================== + +VITE_ENVIRONMENT=local + +# Algod +VITE_ALGOD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +VITE_ALGOD_SERVER=http://localhost +VITE_ALGOD_PORT=4001 +VITE_ALGOD_NETWORK=localnet + +# Indexer +VITE_INDEXER_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +VITE_INDEXER_SERVER=http://localhost +VITE_INDEXER_PORT=8980 + +# KMD +# Please note: +# 1. This is only needed for LocalNet since +# by default KMD provider is ignored on other networks. +# 2. AlgoKit LocalNet starts with a single wallet called 'unencrypted-default-wallet', +# with heaps of tokens available for testing. +VITE_KMD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +VITE_KMD_SERVER=http://localhost +VITE_KMD_PORT=4002 +VITE_KMD_WALLET="unencrypted-default-wallet" +VITE_KMD_PASSWORD="" + +# # ====================== +# # TestNet configuration: +# # uncomment below to use +# # ====================== + +# VITE_ENVIRONMENT=local + +# # Algod +# VITE_ALGOD_TOKEN="" +# VITE_ALGOD_SERVER="https://testnet-api.algonode.cloud" +# VITE_ALGOD_PORT="" +# VITE_ALGOD_NETWORK="testnet" + +# # Indexer +# VITE_INDEXER_TOKEN="" +# VITE_INDEXER_SERVER="https://testnet-idx.algonode.cloud" +# VITE_INDEXER_PORT="" + + +# # ====================== +# # MainNet configuration: +# # uncomment below to use +# # ====================== + +# VITE_ENVIRONMENT=production + +# # Algod +# VITE_ALGOD_TOKEN="" +# VITE_ALGOD_SERVER="https://mainnet-api.algonode.cloud" +# VITE_ALGOD_PORT="" +# VITE_ALGOD_NETWORK="mainnet" + +# # Indexer +# VITE_INDEXER_TOKEN="" +# VITE_INDEXER_SERVER="https://mainnet-idx.algonode.cloud" +# VITE_INDEXER_PORT="" + + +# Add your Web3Auth Client ID here if you want to test Web3Auth integration on TestNet or Mainnet +# VITE_WEB3_AUTH_CLIENT_ID="" \ No newline at end of file diff --git a/examples/p-py/projects/p-py-frontend/.eslintrc b/examples/p-py/projects/p-py-frontend/.eslintrc new file mode 100644 index 0000000..868fe37 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/.eslintrc @@ -0,0 +1,27 @@ +{ + "root": true, + "env": { + "node": true + }, + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint", "prettier"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "plugin:prettier/recommended" + ], + "rules": { + "prettier/prettier": "warn", + "no-console": "warn", + "@typescript-eslint/no-unused-vars": [ + "warn", + { + "ignoreRestSiblings": true, + "argsIgnorePattern": "^_", + "destructuredArrayIgnorePattern": "^_" + } + ], + "prefer-template": "error" + } +} diff --git a/examples/p-py/projects/p-py-frontend/.gitignore b/examples/p-py/projects/p-py-frontend/.gitignore new file mode 100644 index 0000000..b1ce837 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/.gitignore @@ -0,0 +1,38 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + + +# dotenv environment variable files +.env +env/ + +# misc +/dist +.DS_Store + + +npm-debug.log* +yarn-debug.log* +yarn-error.log* +/test-results/ +/playwright-report/ +/playwright/.cache/ + +# PyCharm +.idea +!.idea/ +.idea/* +!.idea/runConfigurations/ + +.vercel +.netlify diff --git a/examples/p-py/projects/p-py-frontend/.npmrc b/examples/p-py/projects/p-py-frontend/.npmrc new file mode 100644 index 0000000..c42da84 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/.npmrc @@ -0,0 +1 @@ +engine-strict = true diff --git a/examples/p-py/projects/p-py-frontend/.prettierignore b/examples/p-py/projects/p-py-frontend/.prettierignore new file mode 100644 index 0000000..dbda6ae --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/.prettierignore @@ -0,0 +1,12 @@ +# don't ever format node_modules +node_modules +# don't lint format output (make sure it's set to your correct build folder name) +dist +build +# don't format nyc coverage output +coverage +# don't format generated types +**/generated/types.d.ts +**/generated/types.ts +# don't format ide files +.idea diff --git a/examples/p-py/projects/p-py-frontend/.prettierrc.cjs b/examples/p-py/projects/p-py-frontend/.prettierrc.cjs new file mode 100644 index 0000000..066b8e5 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/.prettierrc.cjs @@ -0,0 +1,10 @@ +module.exports = { + singleQuote: true, + jsxSingleQuote: false, + semi: false, + tabWidth: 2, + trailingComma: 'all', + printWidth: 140, + endOfLine: 'lf', + arrowParens: 'always', +} diff --git a/examples/p-py/projects/p-py-frontend/.vscode/extensions.json b/examples/p-py/projects/p-py-frontend/.vscode/extensions.json new file mode 100644 index 0000000..5c94122 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/.vscode/extensions.json @@ -0,0 +1,14 @@ +{ + "recommendations": [ + "EditorConfig.EditorConfig", + "dotenv.dotenv-vscode", + "esbenp.prettier-vscode", + "dbaeumer.vscode-eslint", + "krysenlo.vite-plugin-eslint-problemmatcher", + "ms-playwright.playwright", + "Orta.vscode-jest", + "bradlc.vscode-tailwindcss", + "csstools.postcss", + ] +} + diff --git a/examples/p-py/projects/p-py-frontend/.vscode/launch.json b/examples/p-py/projects/p-py-frontend/.vscode/launch.json new file mode 100644 index 0000000..7edaf04 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/.vscode/launch.json @@ -0,0 +1,68 @@ +{ + "configurations": [ + { + "type": "msedge", + "request": "launch", + "name": "Run (Edge)", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}", + "presentation": { + "hidden": false, + "group": "2. Web" + } + }, + { + "type": "chrome", + "request": "launch", + "name": "Run (Chrome)", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}", + "presentation": { + "hidden": false, + "group": "2. Web" + } + }, + { + "type": "firefox", + "request": "launch", + "name": "Run (Firefox)", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}", + "presentation": { + "hidden": false, + "group": "2. Web" + } + }, + { + "name": "Run dApp", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev"], + "cwd": "${workspaceRoot}", + "console": "integratedTerminal", + "skipFiles": ["/**", "node_modules/**"], + "presentation": { + "hidden": false, + "group": "1. Run Project", + "order": 1 + } + }, + { + "name": "Run dApp (+ LocalNet)", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev"], + "cwd": "${workspaceRoot}", + "console": "integratedTerminal", + "skipFiles": ["/**", "node_modules/**"], + "preLaunchTask": "Start AlgoKit LocalNet", + "presentation": { + "hidden": false, + "group": "1. Run Project", + "order": 1 + } + } + ] +} diff --git a/examples/p-py/projects/p-py-frontend/.vscode/settings.json b/examples/p-py/projects/p-py-frontend/.vscode/settings.json new file mode 100644 index 0000000..f1d7017 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/.vscode/settings.json @@ -0,0 +1,13 @@ +{ + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + "source.organizeImports": "explicit" + }, + "dotenv.enableAutocloaking": false, + "jest.autoRun": { + "watch": false, + "onSave": "test-file" + } +} diff --git a/examples/p-py/projects/p-py-frontend/.vscode/tasks.json b/examples/p-py/projects/p-py-frontend/.vscode/tasks.json new file mode 100644 index 0000000..d611c4f --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/.vscode/tasks.json @@ -0,0 +1,15 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Start AlgoKit LocalNet", + "command": "algokit", + "args": ["localnet", "start"], + "type": "shell", + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + } + ] +} diff --git a/examples/p-py/projects/p-py-frontend/README.md b/examples/p-py/projects/p-py-frontend/README.md new file mode 100644 index 0000000..223078a --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/README.md @@ -0,0 +1,124 @@ +# p-py-frontend + +This starter React project has been generated using AlgoKit. See below for default getting started instructions. + +# Setup + +### Initial Setup + +#### 1. Clone the Repository +Start by cloning this repository to your local machine. + +#### 2. Install Pre-requisites +Ensure the following pre-requisites are installed and properly configured: + +- **npm**: Node package manager. Install from [Node.js Installation Guide](https://nodejs.org/en/download/). Verify with `npm -v` to see version `18.12`+. +- **AlgoKit CLI**: Essential for project setup and operations. Install the latest version from [AlgoKit CLI Installation Guide](https://github.com/algorandfoundation/algokit-cli#install). Verify installation with `algokit --version`, expecting `2.0.0` or later. + +#### 3. Bootstrap Your Local Environment +Run the following commands within the project folder: + +- **Install Project Dependencies**: With `algokit project bootstrap all`, ensure all dependencies are ready. + +### Development Workflow + +#### Terminal +Directly manage and interact with your project using AlgoKit commands: + +1. **Build Contracts**: `algokit project run build` builds react web app and links with smart contracts in workspace, if any. +2. Remaining set of command for linting, testing and deployment can be found in respective [package.json](./package.json) file and [.algokit.toml](./.algokit.toml) files. + +#### VS Code +For a seamless experience with breakpoint debugging and other features: + +1. **Open Project**: In VS Code, open the repository root. +2. **Install Extensions**: Follow prompts to install recommended extensions. +3. **Debugging**: + - Use `F5` to start debugging. + - **Windows Users**: Select the Python interpreter at `./.venv/Scripts/python.exe` via `Ctrl/Cmd + Shift + P` > `Python: Select Interpreter` before the first run. + +#### Other IDEs +While primarily optimized for VS Code, Jetbrains WebStorm has base support for this project: + +1. **Open Project**: In your JetBrains IDE, open the repository root. +2. **Automatic Setup**: The IDE should configure the Python interpreter and virtual environment. +3. **Debugging**: Use `Shift+F10` or `Ctrl+R` to start debugging. Note: Windows users may encounter issues with pre-launch tasks due to a known bug. See [JetBrains forums](https://youtrack.jetbrains.com/issue/IDEA-277486/Shell-script-configuration-cannot-run-as-before-launch-task) for workarounds. + +## AlgoKit Workspaces and Project Management +This project supports both standalone and monorepo setups through AlgoKit workspaces. Leverage [`algokit project run`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md) commands for efficient monorepo project orchestration and management across multiple projects within a workspace. + +> Please note, by default frontend is pre configured to run against Algorand LocalNet. If you want to run against TestNet or MainNet, comment out the current environment variable and uncomment the relevant one in [`.env`](.env) file that is created after running bootstrap command and based on [`.env.template`](.env.template). + +### Continuous Integration + +This project uses [GitHub Actions](https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions) to define CI workflows, which are located in the [.github/workflows](`../../.github/workflows`) folder. + +For pull requests and pushes to `main` branch against this repository the following checks are automatically performed by GitHub Actions: + +- `install`: Installs dependencies using `npm` +- `lint`: Lints the codebase using `ESLint` +- `build`: Builds the codebase using `vite` + +> Please note, if you instantiated the project via `algokit init` without explicitly specifying the `--no-workspace` flag, we will automatically attempt to move the contents of the `.github` folder to the root of the workspace. + +### Continuous Deployment + +The project template provides base Github Actions workflows for continuous deployment to [Netlify](https://www.netlify.com/) or [Vercel](https://vercel.com/). These workflows are located in the [`.github/workflows`](./.github/workflows) folder. + +**Please note**: when configuring the github repository for the first time. Depending on selected provider you will need to set the provider secrets in the repository settings. Default setup provided by the template allows you to manage the secrets via environment variables and secrets on your github repository. + + +#### Setting up environment variables and secrets for webapp deployment + +For Vercel: +1. Retrieve your [Vercel Access Token](https://vercel.com/support/articles/how-do-i-use-a-vercel-api-access-token) +2. Install the [Vercel CLI](https://vercel.com/cli) and run `vercel login` +3. Inside your folder, run `vercel link` to create a new Vercel project +4. Inside the generated `.vercel` folder, save the `projectId` and `orgId` from the `project.json` +5. Inside GitHub, add `VERCEL_TOKEN`, `VERCEL_ORG_ID`, and `VERCEL_PROJECT_ID` as [secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets). +6. Create an .env file containing ENV vars for the project (pointing to testnet or mainnet), drag and drop the .env file to upload initial batch of default environment variables to your vercel project. +7. Upon invocation, CD pipeline will pull the VITE_ prefixed environment variables, build the project and deploy to the specified environment. + +For Netlify: +1. Retrieve your [Netlify Access Token](https://docs.netlify.com/cli/get-started/#obtain-a-token-in-the-netlify-ui) +2. Inside your folder run `netlify login` +3. Inside your folder run `netlify sites:create` to create a new site, obtain NETLIFY_SITE_ID from the output +4. Inside GitHub, add `NETLIFY_AUTH_TOKEN` and `NETLIFY_SITE_ID` as [secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets). +5. Define the VITE_ prefixed environment variables in netlify environment variables under site settings. +6. Upon invocation, CD pipeline will build the project and deploy to the specified environment. + +> If you prefer alternative deployment methods, you can modify the relevant workflow files from the [`.github/workflows`](./.github/workflows) folder or modify deploy scripts in `.algokit.toml`. + + +# Algorand Wallet integrations + +The template comes with [`use-wallet`](https://github.com/txnlab/use-wallet) integration, which provides a React hook for connecting to an Algorand wallet providers. The following wallet providers are included by default: +- LocalNet: +- - [KMD/Local Wallet](https://github.com/TxnLab/use-wallet#kmd-algorand-key-management-daemon) - Algorand's Key Management Daemon (KMD) is a service that manages Algorand private keys and signs transactions. Works best with AlgoKit LocalNet and allows you to easily test and interact with your dApps locally. +- TestNet and others: +- - [Pera Wallet](https://perawallet.app). +- - [Defly Wallet](https://defly.app). +- - [Exodus Wallet](https://www.exodus.com). +- - [Daffi Wallet](https://www.daffi.me). + +Refer to official [`use-wallet`](https://github.com/txnlab/use-wallet) documentation for detailed guidelines on how to integrate with other wallet providers (such as WalletConnect v2). Too see implementation details on the use wallet hook and initialization of extra wallet providers refer to [`App.tsx`](./src/App.tsx). + +# Tools + +This project makes use of React and Tailwind to provider a base project configuration to develop frontends for your Algorand dApps and interactions with smart contracts. The following tools are in use: + +- [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-ts) - Various TypeScript utilities to simplify interactions with Algorand and AlgoKit. +- [React](https://reactjs.org/) - A JavaScript library for building user interfaces. +- [Tailwind CSS](https://tailwindcss.com/) - A utility-first CSS framework for rapidly building custom designs. +- [daisyUI](https://daisyui.com/) - A component library for Tailwind CSS. +- [use-wallet](https://github.com/txnlab/use-wallet) - A React hook for connecting to an Algorand wallet providers. +- [npm](https://www.npmjs.com/): Node.js package manager +- [jest](https://jestjs.io/): JavaScript testing framework +- [playwright](https://playwright.dev/): Browser automation library +- [Prettier](https://prettier.io/): Opinionated code formatter +- [ESLint](https://eslint.org/): Tool for identifying and reporting on patterns in JavaScript +- Github Actions workflows for build validation +It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. +# Integrating with smart contracts and application clients + +Refer to the detailed guidance on [integrating with smart contracts and application clients](./src/contracts/README.md). In essence, for any smart contract codebase generated with AlgoKit or other tools that produce compile contracts into ARC34 compliant app specifications, you can use the `algokit generate` command to generate TypeScript or Python typed client. Once generated simply drag and drop the generated client into `./src/contracts` and import it into your React components as you see fit. diff --git a/examples/p-py/projects/p-py-frontend/index.html b/examples/p-py/projects/p-py-frontend/index.html new file mode 100644 index 0000000..5a2ef4f --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/index.html @@ -0,0 +1,12 @@ + + + + + + AlgoKit React Template + + +
+ + + diff --git a/examples/p-py/projects/p-py-frontend/jest.config.ts b/examples/p-py/projects/p-py-frontend/jest.config.ts new file mode 100644 index 0000000..28a8c3d --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/jest.config.ts @@ -0,0 +1,20 @@ +import type { Config } from '@jest/types' + +const config: Config.InitialOptions = { + preset: 'ts-jest', + testEnvironment: 'node', + testMatch: ['**/*.spec.ts', '**/*.spec.tsx'], + moduleDirectories: ['node_modules', 'src'], + transform: { + '': [ + 'ts-jest', + { + tsconfig: 'tsconfig.test.json', + }, + ], + }, + coveragePathIgnorePatterns: ['tests'], + testPathIgnorePatterns: ['/tests/'], + } + +export default config diff --git a/examples/p-py/projects/p-py-frontend/package.json b/examples/p-py/projects/p-py-frontend/package.json new file mode 100644 index 0000000..1704502 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/package.json @@ -0,0 +1,81 @@ +{ + "name": "p-py-frontend", + "version": "0.1.0", + "author": { + "name": "None", + "email": "None" + }, + "private": true, + "type": "module", + "engines": { + "node": ">=20.0", + "npm": ">=9.0" + }, + "devDependencies": { + "@algorandfoundation/algokit-client-generator": "^7.0.0-alpha.5", + "@types/node": "^18.17.14", + "@types/react": "^18.2.11", + "@types/react-dom": "^18.2.4", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.14", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.1.3", + "@typescript-eslint/eslint-plugin": "^7.0.2", + "@typescript-eslint/parser": "^7.0.2", + "postcss": "^8.4.24", + "tailwindcss": "3.3.2", + "ts-jest": "^29.1.1", + "@types/jest": "29.5.2", + "ts-node": "^10.9.1", + "typescript": "^5.1.6", + "@playwright/test": "^1.35.0", + "playwright": "^1.35.0", + "vite": "^5.0.0", + "vite-plugin-node-polyfills": "^0.22.0" + }, + "dependencies": { + "@algorandfoundation/algokit-utils": "^10.0.0-alpha.40", + "@blockshake/defly-connect": "^1.2.1", + "@perawallet/connect": "^1.4.1", + "@txnlab/use-wallet": "^4.6.0", + "@txnlab/use-wallet-react": "^4.6.0", + "@web3auth/modal": "^9.7.0", + "daisyui": "^4.0.0", + "notistack": "^3.0.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "tslib": "^2.6.2" + }, + "scripts": { + "generate:app-clients": "algokit project link --all", + "dev": "npm run generate:app-clients && vite", + "build": "npm run generate:app-clients && tsc && vite build", + "test": "jest --coverage --passWithNoTests", + "playwright:test": "playwright test", + "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "lint:fix": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0 --fix", + "preview": "vite preview" + }, + "eslintConfig": { + "extends": [ + "react-app/jest", + "react-app" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "overrides": { + "ws@>7.0.0 <7.5.9": "7.5.10" + } +} diff --git a/examples/p-py/projects/p-py-frontend/playwright.config.ts b/examples/p-py/projects/p-py-frontend/playwright.config.ts new file mode 100644 index 0000000..d7cbca6 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/playwright.config.ts @@ -0,0 +1,73 @@ +import { defineConfig, devices } from '@playwright/test' + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './tests', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + // baseURL: 'http://127.0.0.1:3000', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + testIdAttribute: 'data-test-id', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, + }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ..devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: 'npm run dev', + url: 'http://localhost:5173', + reuseExistingServer: !process.env.CI, + }, +}) diff --git a/examples/p-py/projects/p-py-frontend/postcss.config.cjs b/examples/p-py/projects/p-py-frontend/postcss.config.cjs new file mode 100644 index 0000000..33ad091 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/postcss.config.cjs @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/examples/p-py/projects/p-py-frontend/public/index.html b/examples/p-py/projects/p-py-frontend/public/index.html new file mode 100644 index 0000000..0d3a3a5 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/public/index.html @@ -0,0 +1,37 @@ + + + + + + + + + + React App + + + +
+ + + diff --git a/examples/p-py/projects/p-py-frontend/public/robots.txt b/examples/p-py/projects/p-py-frontend/public/robots.txt new file mode 100644 index 0000000..e9e57dc --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/examples/p-py/projects/p-py-frontend/src/App.tsx b/examples/p-py/projects/p-py-frontend/src/App.tsx new file mode 100644 index 0000000..f346006 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/App.tsx @@ -0,0 +1,56 @@ +import { SupportedWallet, WalletId, WalletManager, WalletProvider } from '@txnlab/use-wallet-react' +import { SnackbarProvider } from 'notistack' +import Home from './Home' +import { getAlgodConfigFromViteEnvironment, getKmdConfigFromViteEnvironment } from './utils/network/getAlgoClientConfigs' + +let supportedWallets: SupportedWallet[] +if (import.meta.env.VITE_ALGOD_NETWORK === 'localnet') { + const kmdConfig = getKmdConfigFromViteEnvironment() + supportedWallets = [ + { + id: WalletId.KMD, + options: { + baseServer: kmdConfig.server, + token: String(kmdConfig.token), + port: String(kmdConfig.port), + }, + }, + ] +} else { + supportedWallets = [ + { id: WalletId.DEFLY }, + { id: WalletId.PERA }, + { id: WalletId.EXODUS }, + // If you are interested in WalletConnect v2 provider + // refer to https://github.com/TxnLab/use-wallet for detailed integration instructions + ] +} + +export default function App() { + const algodConfig = getAlgodConfigFromViteEnvironment() + + const walletManager = new WalletManager({ + wallets: supportedWallets, + defaultNetwork: algodConfig.network, + networks: { + [algodConfig.network]: { + algod: { + baseServer: algodConfig.server, + port: algodConfig.port, + token: String(algodConfig.token), + }, + }, + }, + options: { + resetNetwork: true, + }, + }) + + return ( + + + + + + ) +} diff --git a/examples/p-py/inject_content/Home.tsx b/examples/p-py/projects/p-py-frontend/src/Home.tsx similarity index 100% rename from examples/p-py/inject_content/Home.tsx rename to examples/p-py/projects/p-py-frontend/src/Home.tsx diff --git a/examples/p-py/projects/p-py-frontend/src/assets/logo.svg b/examples/p-py/projects/p-py-frontend/src/assets/logo.svg new file mode 100644 index 0000000..7169476 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/examples/p-py/projects/p-py-frontend/src/components/Account.tsx b/examples/p-py/projects/p-py-frontend/src/components/Account.tsx new file mode 100644 index 0000000..081ce47 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/components/Account.tsx @@ -0,0 +1,24 @@ +import { useWallet } from '@txnlab/use-wallet-react' +import { useMemo } from 'react' +import { ellipseAddress } from '../utils/ellipseAddress' +import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' + +const Account = () => { + const { activeAddress } = useWallet() + const algoConfig = getAlgodConfigFromViteEnvironment() + + const networkName = useMemo(() => { + return algoConfig.network === '' ? 'localnet' : algoConfig.network.toLocaleLowerCase() + }, [algoConfig.network]) + + return ( + + ) +} + +export default Account diff --git a/examples/p-py/inject_content/AppCalls.tsx b/examples/p-py/projects/p-py-frontend/src/components/AppCalls.tsx similarity index 100% rename from examples/p-py/inject_content/AppCalls.tsx rename to examples/p-py/projects/p-py-frontend/src/components/AppCalls.tsx diff --git a/examples/p-py/projects/p-py-frontend/src/components/ConnectWallet.tsx b/examples/p-py/projects/p-py-frontend/src/components/ConnectWallet.tsx new file mode 100644 index 0000000..8ff01dc --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/components/ConnectWallet.tsx @@ -0,0 +1,86 @@ +import { useWallet, Wallet, WalletId } from '@txnlab/use-wallet-react' +import Account from './Account' + +interface ConnectWalletInterface { + openModal: boolean + closeModal: () => void +} + +const ConnectWallet = ({ openModal, closeModal }: ConnectWalletInterface) => { + const { wallets, activeAddress } = useWallet() + + const isKmd = (wallet: Wallet) => wallet.id === WalletId.KMD + + return ( + +
+

Select wallet provider

+ +
+ {activeAddress && ( + <> + +
+ + )} + + {!activeAddress && + wallets?.map((wallet) => ( + + ))} +
+ +
+ + {activeAddress && ( + + )} +
+ +
+ ) +} +export default ConnectWallet diff --git a/examples/p-py/projects/p-py-frontend/src/components/ErrorBoundary.tsx b/examples/p-py/projects/p-py-frontend/src/components/ErrorBoundary.tsx new file mode 100644 index 0000000..435bf61 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/components/ErrorBoundary.tsx @@ -0,0 +1,46 @@ +import React, { ReactNode } from 'react' + +interface ErrorBoundaryProps { + children: ReactNode +} + +interface ErrorBoundaryState { + hasError: boolean + error: Error | null +} + +class ErrorBoundary extends React.Component { + constructor(props: ErrorBoundaryProps) { + super(props) + this.state = { hasError: false, error: null } + } + + static getDerivedStateFromError(error: Error): ErrorBoundaryState { + // Update state so the next render will show the fallback UI. + return { hasError: true, error: error } + } + + render(): ReactNode { + if (this.state.hasError) { + // You can render any custom fallback UI + return ( +
+
+
+

Error occured

+

+ {this.state.error?.message.includes('Attempt to get default algod configuration') + ? 'Please make sure to set up your environment variables correctly. Create a .env file based on .env.template and fill in the required values. This controls the network and credentials for connections with Algod and Indexer.' + : this.state.error?.message} +

+
+
+
+ ) + } + + return this.props.children + } +} + +export default ErrorBoundary diff --git a/examples/p-py/projects/p-py-frontend/src/components/Transact.tsx b/examples/p-py/projects/p-py-frontend/src/components/Transact.tsx new file mode 100644 index 0000000..3f8191d --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/components/Transact.tsx @@ -0,0 +1,85 @@ +import { algo, AlgorandClient } from '@algorandfoundation/algokit-utils' +import { encodeTransactionRaw } from '@algorandfoundation/algokit-utils/transact' +import { useWallet } from '@txnlab/use-wallet-react' +import { useSnackbar } from 'notistack' +import { useState } from 'react' +import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' + +interface TransactInterface { + openModal: boolean + setModalState: (value: boolean) => void +} + +const Transact = ({ openModal, setModalState }: TransactInterface) => { + const [loading, setLoading] = useState(false) + const [receiverAddress, setReceiverAddress] = useState('') + + const algodConfig = getAlgodConfigFromViteEnvironment() + const algorand = AlgorandClient.fromConfig({ algodConfig }) + + const { enqueueSnackbar } = useSnackbar() + + const { signTransactions, activeAddress } = useWallet() + + const handleSubmitAlgo = async () => { + setLoading(true) + + if (!signTransactions || !activeAddress) { + enqueueSnackbar('Please connect wallet first', { variant: 'warning' }) + return + } + + try { + enqueueSnackbar('Sending transaction...', { variant: 'info' }) + const result = await algorand.send.payment({ + signer: async (txnGroup, indexesToSign) => { + const encoded = txnGroup.map((txn) => encodeTransactionRaw(txn)) + const signed = await signTransactions(encoded, indexesToSign) + return signed.filter((s): s is Uint8Array => s !== null) + }, + sender: activeAddress, + receiver: receiverAddress, + amount: algo(1), + }) + enqueueSnackbar(`Transaction sent: ${result.txIds[0]}`, { variant: 'success' }) + setReceiverAddress('') + } catch (e) { + enqueueSnackbar('Failed to send transaction', { variant: 'error' }) + } + + setLoading(false) + } + + return ( + +
+

Send payment transaction

+
+ { + setReceiverAddress(e.target.value) + }} + /> +
+ + +
+
+
+ ) +} + +export default Transact diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/AppCall.ts b/examples/p-py/projects/p-py-frontend/src/contracts/AppCall.ts new file mode 100644 index 0000000..c61e144 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/AppCall.ts @@ -0,0 +1,558 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"AppCall","structs":{},"methods":[{"name":"some_value","args":[],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NAogICAgLy8gY2xhc3MgQXBwQ2FsbChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANQogICAgcHVzaGJ5dGVzIDB4ZDM0NzllNjUgLy8gbWV0aG9kICJzb21lX3ZhbHVlKCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3NvbWVfdmFsdWVfcm91dGVAMwogICAgZXJyCgptYWluX3NvbWVfdmFsdWVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIHNvbWVfdmFsdWUKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyZWF0ZWRBcHBBc3NldC5vdGhlci5BcHBDYWxsLnNvbWVfdmFsdWVbcm91dGluZ10oKSAtPiB2b2lkOgpzb21lX3ZhbHVlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9vdGhlci5weTo3CiAgICAvLyByZXR1cm4gR2xvYmFsLmdyb3VwX3NpemUgKiAoVHhuLmdyb3VwX2luZGV4ICsgMSkKICAgIGdsb2JhbCBHcm91cFNpemUKICAgIHR4biBHcm91cEluZGV4CiAgICBwdXNoaW50IDEKICAgICsKICAgICoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcHVzaGludCAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgATTR55lNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEMyBDEWgQEICxaABBUffHVMULCBAUM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the AppCall contract + */ +export type AppCallArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'some_value()uint64': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'some_value()uint64': [] + } +} + +/** + * The return type for each method + */ +export type AppCallReturns = { + 'some_value()uint64': bigint +} + +/** + * Defines the types of available calls and state of the AppCall smart contract. + */ +export type AppCallTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'some_value()uint64' | 'some_value', { + argsObj: AppCallArgs['obj']['some_value()uint64'] + argsTuple: AppCallArgs['tuple']['some_value()uint64'] + returns: AppCallReturns['some_value()uint64'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type AppCallSignatures = keyof AppCallTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type AppCallNonVoidMethodSignatures = keyof AppCallTypes['methods'] extends infer T ? T extends keyof AppCallTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the AppCall smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = AppCallTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the AppCall smart contract to the method's return type + */ +export type MethodReturn = AppCallTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type AppCallCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type AppCallDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: AppCallCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the AppCall smart contract + */ +export abstract class AppCallParamsFactory { + /** + * Constructs a no op call for the some_value()uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static someValue(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'some_value()uint64' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the AppCall smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class AppCallFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `AppCallFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new AppCallClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new AppCallClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the AppCall smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: AppCallDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new AppCallClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AppCall smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AppCall smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AppCall smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new AppCallClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the AppCall smart contract + */ +export class AppCallClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `AppCallClient` + * + * @param appClient An `AppClient` instance which has been created with the AppCall app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `AppCallClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `AppCallClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new AppCallClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `AppCallClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new AppCallClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the AppCall smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the AppCall smart contract using the `some_value()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + someValue: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(AppCallParamsFactory.someValue(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the AppCall smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the AppCall smart contract using the `some_value()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + someValue: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(AppCallParamsFactory.someValue(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the AppCall smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the AppCall smart contract using the `some_value()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + someValue: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(AppCallParamsFactory.someValue(params)) + return {...result, return: result.return as unknown as (undefined | AppCallReturns['some_value()uint64'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new AppCallClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current AppCall app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): AppCallComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a some_value()uint64 method call against the AppCall contract + */ + someValue(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.someValue(params))) + return this + }, + /** + * Add a clear state call to the AppCall contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as AppCallComposer + } +} +export type AppCallComposer = { + /** + * Calls the some_value()uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + someValue(params?: CallParams): AppCallComposer<[...TReturns, AppCallReturns['some_value()uint64'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the AppCall smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): AppCallComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): AppCallComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type AppCallComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/AppExpectingEffects.ts b/examples/p-py/projects/p-py-frontend/src/contracts/AppExpectingEffects.ts new file mode 100644 index 0000000..1a953ef --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/AppExpectingEffects.ts @@ -0,0 +1,630 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"AppExpectingEffects","structs":{},"methods":[{"name":"create_group","args":[{"type":"acfg","name":"asset_create"},{"type":"appl","name":"app_create"}],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"log_group","args":[{"type":"appl","name":"app_call"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[159],"errorMessage":"application log value is not the result of an ABI return"},{"pc":[96],"errorMessage":"expected app created"},{"pc":[81],"errorMessage":"expected asset created"},{"pc":[105],"errorMessage":"expected correct app id"},{"pc":[90],"errorMessage":"expected correct asset id"},{"pc":[139],"errorMessage":"expected correct method called"},{"pc":[145],"errorMessage":"expected logs"},{"pc":[65],"errorMessage":"transaction type is acfg"},{"pc":[75,126],"errorMessage":"transaction type is appl"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBBcHBFeHBlY3RpbmdFZmZlY3RzKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg2ZDNhMDQzOSAweDYyYTBlZjYyIC8vIG1ldGhvZCAiY3JlYXRlX2dyb3VwKGFjZmcsYXBwbCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19ncm91cChhcHBsKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGVfZ3JvdXAgbG9nX2dyb3VwCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyZWF0ZWRBcHBBc3NldC5jb250cmFjdC5BcHBFeHBlY3RpbmdFZmZlY3RzLmNyZWF0ZV9ncm91cFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZV9ncm91cDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFjZmcKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjExCiAgICAvLyBhc3NlcnQgYXNzZXRfY3JlYXRlLmNyZWF0ZWRfYXNzZXQuaWQsICJleHBlY3RlZCBhc3NldCBjcmVhdGVkIgogICAgZGlnIDEKICAgIGd0eG5zIENyZWF0ZWRBc3NldElECiAgICBkdXAKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCBjcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjEzCiAgICAvLyBvcC5nYWlkKGFzc2V0X2NyZWF0ZS5ncm91cF9pbmRleCkgPT0gYXNzZXRfY3JlYXRlLmNyZWF0ZWRfYXNzZXQuaWQKICAgIHVuY292ZXIgMgogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgZ2FpZHMKICAgIGRpZyAxCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToxMi0xNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5nYWlkKGFzc2V0X2NyZWF0ZS5ncm91cF9pbmRleCkgPT0gYXNzZXRfY3JlYXRlLmNyZWF0ZWRfYXNzZXQuaWQKICAgIC8vICksICJleHBlY3RlZCBjb3JyZWN0IGFzc2V0IGlkIgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgYXNzZXQgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MTUKICAgIC8vIGFzc2VydCBhcHBfY3JlYXRlLmNyZWF0ZWRfYXBwLmlkLCAiZXhwZWN0ZWQgYXBwIGNyZWF0ZWQiCiAgICBkaWcgMQogICAgZ3R4bnMgQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcCBjcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjE3CiAgICAvLyBvcC5nYWlkKGFwcF9jcmVhdGUuZ3JvdXBfaW5kZXgpID09IGFwcF9jcmVhdGUuY3JlYXRlZF9hcHAuaWQKICAgIHVuY292ZXIgMgogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgZ2FpZHMKICAgIGRpZyAxCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToxNi0xOAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5nYWlkKGFwcF9jcmVhdGUuZ3JvdXBfaW5kZXgpID09IGFwcF9jcmVhdGUuY3JlYXRlZF9hcHAuaWQKICAgIC8vICksICJleHBlY3RlZCBjb3JyZWN0IGFwcCBpZCIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGFwcCBpZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcmVhdGVkQXBwQXNzZXQuY29udHJhY3QuQXBwRXhwZWN0aW5nRWZmZWN0cy5sb2dfZ3JvdXBbcm91dGluZ10oKSAtPiB2b2lkOgpsb2dfZ3JvdXA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgYXBwX2NhbGwuYXBwX2FyZ3MoMCkgPT0gYXJjNC5hcmM0X3NpZ25hdHVyZSgKICAgIGR1cAogICAgcHVzaGludCAwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToyNC0yNgogICAgLy8gYXNzZXJ0IGFwcF9jYWxsLmFwcF9hcmdzKDApID09IGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgInNvbWVfdmFsdWUoKXVpbnQ2NCIKICAgIC8vICksICJleHBlY3RlZCBjb3JyZWN0IG1ldGhvZCBjYWxsZWQiCiAgICBwdXNoYnl0ZXMgMHhkMzQ3OWU2NSAvLyBtZXRob2QgInNvbWVfdmFsdWUoKXVpbnQ2NCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBtZXRob2QgY2FsbGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjI3CiAgICAvLyBhc3NlcnQgYXBwX2NhbGwubnVtX2xvZ3MgPT0gMSwgImV4cGVjdGVkIGxvZ3MiCiAgICBkdXAKICAgIGd0eG5zIE51bUxvZ3MKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxvZ3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MjkKICAgIC8vIGFyYzQuVUludDY0LmZyb21fbG9nKGFwcF9jYWxsLmxhc3RfbG9nKQogICAgZHVwCiAgICBndHhucyBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjMwCiAgICAvLyA9PSAoYXBwX2NhbGwuZ3JvdXBfaW5kZXggKyAxKSAqIEdsb2JhbC5ncm91cF9zaXplCiAgICBzd2FwCiAgICBndHhucyBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgKgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToyOS0zMAogICAgLy8gYXJjNC5VSW50NjQuZnJvbV9sb2coYXBwX2NhbGwubGFzdF9sb2cpCiAgICAvLyA9PSAoYXBwX2NhbGwuZ3JvdXBfaW5kZXggKyAxKSAqIEdsb2JhbC5ncm91cF9zaXplCiAgICBpdG9iCiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MjgtMzEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgYXJjNC5VSW50NjQuZnJvbV9sb2coYXBwX2NhbGwubGFzdF9sb2cpCiAgICAvLyAgICAgPT0gKGFwcF9jYWxsLmdyb3VwX2luZGV4ICsgMSkgKiBHbG9iYWwuZ3JvdXBfc2l6ZQogICAgLy8gKQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQYmAQQVH3x1MRtBAB0xGRREMRhEggIEbToEOQRioO9iNhoAjgIACQBIADEZFDEYFBBDMRaBAglJOBCBAxJEMRYiCUk4ECMSREsBODxJRE8COBY9SwESREsBOD1JRE8COBY9SwESREwWTBZQKExQsCJDMRYiCUk4ECMSREmBAMIagATTR55lEkRJODsiEkRJOD5JVwQATFcABCgSREw4FiIIMgQLFqhEIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the AppExpectingEffects contract + */ +export type AppExpectingEffectsArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'create_group(acfg,appl)(uint64,uint64)': { + assetCreate?: AppMethodCallTransactionArgument + appCreate: AppMethodCallTransactionArgument + } + 'log_group(appl)void': { + appCall: AppMethodCallTransactionArgument + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'create_group(acfg,appl)(uint64,uint64)': [assetCreate: AppMethodCallTransactionArgument | undefined, appCreate: AppMethodCallTransactionArgument] + 'log_group(appl)void': [appCall: AppMethodCallTransactionArgument] + } +} + +/** + * The return type for each method + */ +export type AppExpectingEffectsReturns = { + 'create_group(acfg,appl)(uint64,uint64)': [bigint, bigint] + 'log_group(appl)void': void +} + +/** + * Defines the types of available calls and state of the AppExpectingEffects smart contract. + */ +export type AppExpectingEffectsTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'create_group(acfg,appl)(uint64,uint64)' | 'create_group', { + argsObj: AppExpectingEffectsArgs['obj']['create_group(acfg,appl)(uint64,uint64)'] + argsTuple: AppExpectingEffectsArgs['tuple']['create_group(acfg,appl)(uint64,uint64)'] + returns: AppExpectingEffectsReturns['create_group(acfg,appl)(uint64,uint64)'] + }> + & Record<'log_group(appl)void' | 'log_group', { + argsObj: AppExpectingEffectsArgs['obj']['log_group(appl)void'] + argsTuple: AppExpectingEffectsArgs['tuple']['log_group(appl)void'] + returns: AppExpectingEffectsReturns['log_group(appl)void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type AppExpectingEffectsSignatures = keyof AppExpectingEffectsTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type AppExpectingEffectsNonVoidMethodSignatures = keyof AppExpectingEffectsTypes['methods'] extends infer T ? T extends keyof AppExpectingEffectsTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the AppExpectingEffects smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = AppExpectingEffectsTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the AppExpectingEffects smart contract to the method's return type + */ +export type MethodReturn = AppExpectingEffectsTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type AppExpectingEffectsCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type AppExpectingEffectsDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: AppExpectingEffectsCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the AppExpectingEffects smart contract + */ +export abstract class AppExpectingEffectsParamsFactory { + /** + * Constructs a no op call for the create_group(acfg,appl)(uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static createGroup(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'create_group(acfg,appl)(uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.assetCreate, params.args.appCreate], + } + } + /** + * Constructs a no op call for the log_group(appl)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static logGroup(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'log_group(appl)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.appCall], + } + } +} + +/** + * A factory to create and deploy one or more instance of the AppExpectingEffects smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class AppExpectingEffectsFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `AppExpectingEffectsFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new AppExpectingEffectsClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new AppExpectingEffectsClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the AppExpectingEffects smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: AppExpectingEffectsDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new AppExpectingEffectsClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AppExpectingEffects smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AppExpectingEffects smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AppExpectingEffects smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new AppExpectingEffectsClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the AppExpectingEffects smart contract + */ +export class AppExpectingEffectsClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `AppExpectingEffectsClient` + * + * @param appClient An `AppClient` instance which has been created with the AppExpectingEffects app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `AppExpectingEffectsClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `AppExpectingEffectsClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new AppExpectingEffectsClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `AppExpectingEffectsClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new AppExpectingEffectsClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the AppExpectingEffects smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the AppExpectingEffects smart contract using the `create_group(acfg,appl)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + createGroup: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(AppExpectingEffectsParamsFactory.createGroup(params)) + }, + + /** + * Makes a call to the AppExpectingEffects smart contract using the `log_group(appl)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + logGroup: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(AppExpectingEffectsParamsFactory.logGroup(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the AppExpectingEffects smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the AppExpectingEffects smart contract using the `create_group(acfg,appl)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + createGroup: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(AppExpectingEffectsParamsFactory.createGroup(params)) + }, + + /** + * Makes a call to the AppExpectingEffects smart contract using the `log_group(appl)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + logGroup: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(AppExpectingEffectsParamsFactory.logGroup(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the AppExpectingEffects smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the AppExpectingEffects smart contract using the `create_group(acfg,appl)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + createGroup: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(AppExpectingEffectsParamsFactory.createGroup(params)) + return {...result, return: result.return as unknown as (undefined | AppExpectingEffectsReturns['create_group(acfg,appl)(uint64,uint64)'])} + }, + + /** + * Makes a call to the AppExpectingEffects smart contract using the `log_group(appl)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + logGroup: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(AppExpectingEffectsParamsFactory.logGroup(params)) + return {...result, return: result.return as unknown as (undefined | AppExpectingEffectsReturns['log_group(appl)void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new AppExpectingEffectsClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current AppExpectingEffects app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): AppExpectingEffectsComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a create_group(acfg,appl)(uint64,uint64) method call against the AppExpectingEffects contract + */ + createGroup(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createGroup(params))) + return this + }, + /** + * Add a log_group(appl)void method call against the AppExpectingEffects contract + */ + logGroup(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.logGroup(params))) + return this + }, + /** + * Add a clear state call to the AppExpectingEffects contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as AppExpectingEffectsComposer + } +} +export type AppExpectingEffectsComposer = { + /** + * Calls the create_group(acfg,appl)(uint64,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + createGroup(params?: CallParams): AppExpectingEffectsComposer<[...TReturns, AppExpectingEffectsReturns['create_group(acfg,appl)(uint64,uint64)'] | undefined]> + + /** + * Calls the log_group(appl)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + logGroup(params?: CallParams): AppExpectingEffectsComposer<[...TReturns, AppExpectingEffectsReturns['log_group(appl)void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the AppExpectingEffects smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): AppExpectingEffectsComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): AppExpectingEffectsComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type AppExpectingEffectsComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/Arc4InnerTxnsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/Arc4InnerTxnsContract.ts new file mode 100644 index 0000000..afe3303 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/Arc4InnerTxnsContract.ts @@ -0,0 +1,556 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"Arc4InnerTxnsContract","structs":{},"methods":[{"name":"opt_in_dummy_asset","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0SW5uZXJUeG5zL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIEFyYzRJbm5lclR4bnNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANQogICAgcHVzaGJ5dGVzIDB4YWIzOWM1NWEgLy8gbWV0aG9kICJvcHRfaW5fZHVtbXlfYXNzZXQodWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX29wdF9pbl9kdW1teV9hc3NldF9yb3V0ZUAzCiAgICBlcnIKCm1haW5fb3B0X2luX2R1bW15X2Fzc2V0X3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIG9wdF9pbl9kdW1teV9hc3NldAoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNElubmVyVHhucy5jb250cmFjdC5BcmM0SW5uZXJUeG5zQ29udHJhY3Qub3B0X2luX2R1bW15X2Fzc2V0W3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luX2R1bW15X2Fzc2V0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRJbm5lclR4bnMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo3LTExCiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0SW5uZXJUeG5zL2NvbnRyYWN0LnB5OjkKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRJbm5lclR4bnMvY29udHJhY3QucHk6Ny04CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo3LTExCiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgASrOcVaNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEM2GgEXsTIKshSyEYEEshCBALIBs4EBQw==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the Arc4InnerTxnsContract contract + */ +export type Arc4InnerTxnsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'opt_in_dummy_asset(uint64)void': { + asset: bigint | number + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'opt_in_dummy_asset(uint64)void': [asset: bigint | number] + } +} + +/** + * The return type for each method + */ +export type Arc4InnerTxnsContractReturns = { + 'opt_in_dummy_asset(uint64)void': void +} + +/** + * Defines the types of available calls and state of the Arc4InnerTxnsContract smart contract. + */ +export type Arc4InnerTxnsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'opt_in_dummy_asset(uint64)void' | 'opt_in_dummy_asset', { + argsObj: Arc4InnerTxnsContractArgs['obj']['opt_in_dummy_asset(uint64)void'] + argsTuple: Arc4InnerTxnsContractArgs['tuple']['opt_in_dummy_asset(uint64)void'] + returns: Arc4InnerTxnsContractReturns['opt_in_dummy_asset(uint64)void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type Arc4InnerTxnsContractSignatures = keyof Arc4InnerTxnsContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the Arc4InnerTxnsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = Arc4InnerTxnsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the Arc4InnerTxnsContract smart contract to the method's return type + */ +export type MethodReturn = Arc4InnerTxnsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type Arc4InnerTxnsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type Arc4InnerTxnsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: Arc4InnerTxnsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the Arc4InnerTxnsContract smart contract + */ +export abstract class Arc4InnerTxnsContractParamsFactory { + /** + * Constructs a no op call for the opt_in_dummy_asset(uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static optInDummyAsset(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'opt_in_dummy_asset(uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset], + } + } +} + +/** + * A factory to create and deploy one or more instance of the Arc4InnerTxnsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class Arc4InnerTxnsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `Arc4InnerTxnsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new Arc4InnerTxnsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new Arc4InnerTxnsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the Arc4InnerTxnsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: Arc4InnerTxnsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new Arc4InnerTxnsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Arc4InnerTxnsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Arc4InnerTxnsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Arc4InnerTxnsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new Arc4InnerTxnsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the Arc4InnerTxnsContract smart contract + */ +export class Arc4InnerTxnsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `Arc4InnerTxnsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the Arc4InnerTxnsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `Arc4InnerTxnsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `Arc4InnerTxnsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new Arc4InnerTxnsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `Arc4InnerTxnsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new Arc4InnerTxnsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the Arc4InnerTxnsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the Arc4InnerTxnsContract smart contract using the `opt_in_dummy_asset(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + optInDummyAsset: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4InnerTxnsContractParamsFactory.optInDummyAsset(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the Arc4InnerTxnsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the Arc4InnerTxnsContract smart contract using the `opt_in_dummy_asset(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + optInDummyAsset: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4InnerTxnsContractParamsFactory.optInDummyAsset(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the Arc4InnerTxnsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the Arc4InnerTxnsContract smart contract using the `opt_in_dummy_asset(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + optInDummyAsset: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4InnerTxnsContractParamsFactory.optInDummyAsset(params)) + return {...result, return: result.return as unknown as (undefined | Arc4InnerTxnsContractReturns['opt_in_dummy_asset(uint64)void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new Arc4InnerTxnsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current Arc4InnerTxnsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): Arc4InnerTxnsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a opt_in_dummy_asset(uint64)void method call against the Arc4InnerTxnsContract contract + */ + optInDummyAsset(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optInDummyAsset(params))) + return this + }, + /** + * Add a clear state call to the Arc4InnerTxnsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as Arc4InnerTxnsContractComposer + } +} +export type Arc4InnerTxnsContractComposer = { + /** + * Calls the opt_in_dummy_asset(uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + optInDummyAsset(params?: CallParams): Arc4InnerTxnsContractComposer<[...TReturns, Arc4InnerTxnsContractReturns['opt_in_dummy_asset(uint64)void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the Arc4InnerTxnsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): Arc4InnerTxnsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): Arc4InnerTxnsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type Arc4InnerTxnsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/Arc4PrimitiveOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/Arc4PrimitiveOpsContract.ts new file mode 100644 index 0000000..355f633 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/Arc4PrimitiveOpsContract.ts @@ -0,0 +1,3982 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"Arc4PrimitiveOpsContract","structs":{},"methods":[{"name":"verify_uintn_uintn_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_uintn_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_uintn_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_biguintn_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_biguintn_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_init","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint32"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_init","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint256"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint32"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint256"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint32"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint256"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_as_uint64","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguintn_as_biguint","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint512"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn64_as_uint64","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uintn64_as_biguint","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint512"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ufixednxm_bytes","args":[{"type":"ufixed32x8","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bigufixednxm_bytes","args":[{"type":"ufixed256x16","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ufixednxm_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"ufixed32x8"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bigufixednxm_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"ufixed256x16"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ufixednxm_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"ufixed32x8"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bigufixednxm_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"ufixed256x16"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_init","args":[{"type":"string","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_add","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_eq","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_bytes","args":[{"type":"string","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bool_bytes","args":[{"type":"bool","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bool_from_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bool_from_log","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_emit","args":[{"type":"string","name":"a"},{"type":"uint512","name":"b"},{"type":"uint64","name":"c"},{"type":"byte[]","name":"d"},{"type":"uint64","name":"e"},{"type":"bool","name":"f"},{"type":"byte[]","name":"g"},{"type":"string","name":"h"},{"type":"uint64","name":"m"},{"type":"uint256","name":"n"},{"type":"ufixed32x8","name":"o"},{"type":"ufixed256x16","name":"p"},{"type":"bool","name":"q"},{"type":"byte[]","name":"r"},{"type":"byte[]","name":"s"},{"type":"byte[]","name":"t"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[{"name":"SwappedArc4","args":[{"type":"uint64","name":"m"},{"type":"uint256","name":"n"},{"type":"ufixed32x8","name":"o"},{"type":"ufixed256x16","name":"p"},{"type":"bool","name":"q"},{"type":"uint8[3]","name":"r"},{"type":"uint16[]","name":"s"},{"type":"(uint32,uint64,string)","name":"t"}]},{"name":"Swapped","args":[{"type":"string","name":"field1"},{"type":"uint512","name":"field2"},{"type":"uint64","name":"field3"},{"type":"byte[]","name":"field4"},{"type":"uint64","name":"field5"},{"type":"bool","name":"field6"},{"type":"byte[]","name":"field7"},{"type":"string","name":"field8"},{"type":"uint64","name":"field9"},{"type":"uint256","name":"field10"},{"type":"ufixed32x8","name":"field11"},{"type":"ufixed256x16","name":"field12"},{"type":"bool","name":"field13"},{"type":"uint8[3]","name":"field14"},{"type":"uint16[]","name":"field15"},{"type":"(uint32,uint64,string)","name":"field16"}]}],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[1579,1599,1788,1808,1933,1982],"errorMessage":"application log value is not the result of an ABI return"},{"pc":[1855],"errorMessage":"max array length exceeded"},{"pc":[411,424,457,468,503,514,549,562,595,608,641,652,687,698,733,746,779,792,825,836,871,882,917,930,963,976,1009,1020,1055,1066,1101,1114,1147,1160,1193,1204,1239,1250,1285,1298,1331,1344,1377,1388,1423,1434,1469,1482,1509,1531,1617,1626,1650,1659,1679,1699,1707],"errorMessage":"overflow"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDggNjQgMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4MDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjYKICAgIC8vIGNsYXNzIEFyYzRQcmltaXRpdmVPcHNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANTcKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDk2ZjE0MTE2IDB4ZWQ2NjYwOTYgMHgyY2EwMzUyYiAweDg1OTA3ZDQwIDB4MmNiZWM0NWIgMHgwNzY2NmZkOSAweDM3MGJhYmQzIDB4MmI2YjNlZjAgMHgzMzlkYTk3YyAweDc4OThlZDk3IDB4MWYxMzBjZWMgMHhjNzQ4NjY0ZSAweDdhNDYwY2IxIDB4ZGNhYjFmMDEgMHg5N2Q5MDY0ZCAweGNlMDZjMmEwIDB4ZGNkYmNlZTAgMHg3N2E0YjY4ZCAweDRmNTQwNjI2IDB4MDk1YWVkNDEgMHhlM2I3ZTkxOCAweDU1MzM3MDA4IDB4OWJiMWNkNjYgMHg4MTQ4NGQ5ZCAweDlhMDNkZjEwIDB4ZDNmMGU0NGIgMHg5ODJkYjIzMyAweGFmZmJkZjBlIDB4Mjg4YWY3NmUgMHg4YmQ4NGEwNCAweDMwMmI4YTBhIDB4MzM3YWUyMGIgMHg2ZTI1OTI3MCAweDc5ZTM1Zjc3IDB4MGYxNTc0ZmUgMHhiMmNiMTNiZSAweGQwNTllZWE3IDB4NGNjNGMxNTcgMHgzZDE3YWM2ZSAweGY3ZjNkNWZjIDB4ZjhjOGY4ZDUgMHg0M2Y3MTYyYSAweDQyZTA5MDc1IDB4ZDk1NmY1NzUgMHg2YzAxNjBkZiAweGE4OTAxNTBiIDB4MGIyZjRjM2YgMHg5ZGI5ZDMyNyAweGU0ZDk1MGExIDB4YjYwNWU4MGMgLy8gbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5faW5pdChieXRlW10pdWludDMyIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5faW5pdChieXRlW10pdWludDI1NiIsIG1ldGhvZCAidmVyaWZ5X3VpbnRuX2Zyb21fYnl0ZXMoYnl0ZVtdKXVpbnQzMiIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRuX2Zyb21fYnl0ZXMoYnl0ZVtdKXVpbnQyNTYiLCBtZXRob2QgInZlcmlmeV91aW50bl9mcm9tX2xvZyhieXRlW10pdWludDMyIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fZnJvbV9sb2coYnl0ZVtdKXVpbnQyNTYiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl9hc191aW50NjQoYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRuX2FzX2JpZ3VpbnQoYnl0ZVtdKXVpbnQ1MTIiLCBtZXRob2QgInZlcmlmeV91aW50bjY0X2FzX3VpbnQ2NChieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludG42NF9hc19iaWd1aW50KGJ5dGVbXSl1aW50NTEyIiwgbWV0aG9kICJ2ZXJpZnlfdWZpeGVkbnhtX2J5dGVzKHVmaXhlZDMyeDgpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWZpeGVkbnhtX2J5dGVzKHVmaXhlZDI1NngxNilieXRlW10iLCBtZXRob2QgInZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlcyhieXRlW10pdWZpeGVkMzJ4OCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VmaXhlZG54bV9mcm9tX2J5dGVzKGJ5dGVbXSl1Zml4ZWQyNTZ4MTYiLCBtZXRob2QgInZlcmlmeV91Zml4ZWRueG1fZnJvbV9sb2coYnl0ZVtdKXVmaXhlZDMyeDgiLCBtZXRob2QgInZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9sb2coYnl0ZVtdKXVmaXhlZDI1NngxNiIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19pbml0KHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfYWRkKHN0cmluZyxzdHJpbmcpc3RyaW5nIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2VxKHN0cmluZyxzdHJpbmcpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19ieXRlcyhzdHJpbmcpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2Zyb21fYnl0ZXMoYnl0ZVtdKXN0cmluZyIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19mcm9tX2xvZyhieXRlW10pc3RyaW5nIiwgbWV0aG9kICJ2ZXJpZnlfYm9vbF9ieXRlcyhib29sKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Jvb2xfZnJvbV9ieXRlcyhieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2Jvb2xfZnJvbV9sb2coYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9lbWl0KHN0cmluZyx1aW50NTEyLHVpbnQ2NCxieXRlW10sdWludDY0LGJvb2wsYnl0ZVtdLHN0cmluZyx1aW50NjQsdWludDI1Nix1Zml4ZWQzMng4LHVmaXhlZDI1NngxNixib29sLGJ5dGVbXSxieXRlW10sYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfdWludG5fdWludG5fZXEgdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2VxIHZlcmlmeV91aW50bl9iaWd1aW50bl9lcSB2ZXJpZnlfYmlndWludG5fYmlndWludG5fZXEgdmVyaWZ5X3VpbnRuX3VpbnRuX25lIHZlcmlmeV9iaWd1aW50bl91aW50bl9uZSB2ZXJpZnlfdWludG5fYmlndWludG5fbmUgdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX25lIHZlcmlmeV91aW50bl91aW50bl9sdCB2ZXJpZnlfYmlndWludG5fdWludG5fbHQgdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX2x0IHZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9sdCB2ZXJpZnlfdWludG5fdWludG5fbGUgdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2xlIHZlcmlmeV91aW50bl9iaWd1aW50bl9sZSB2ZXJpZnlfYmlndWludG5fYmlndWludG5fbGUgdmVyaWZ5X3VpbnRuX3VpbnRuX2d0IHZlcmlmeV9iaWd1aW50bl91aW50bl9ndCB2ZXJpZnlfdWludG5fYmlndWludG5fZ3QgdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX2d0IHZlcmlmeV91aW50bl91aW50bl9nZSB2ZXJpZnlfYmlndWludG5fdWludG5fZ2UgdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX2dlIHZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9nZSB2ZXJpZnlfdWludG5faW5pdCB2ZXJpZnlfYmlndWludG5faW5pdCB2ZXJpZnlfdWludG5fZnJvbV9ieXRlcyB2ZXJpZnlfYmlndWludG5fZnJvbV9ieXRlcyB2ZXJpZnlfdWludG5fZnJvbV9sb2cgdmVyaWZ5X2JpZ3VpbnRuX2Zyb21fbG9nIHZlcmlmeV9iaWd1aW50bl9hc191aW50NjQgdmVyaWZ5X2JpZ3VpbnRuX2FzX2JpZ3VpbnQgdmVyaWZ5X3VpbnRuNjRfYXNfdWludDY0IHZlcmlmeV91aW50bjY0X2FzX2JpZ3VpbnQgdmVyaWZ5X3VmaXhlZG54bV9ieXRlcyB2ZXJpZnlfYmlndWZpeGVkbnhtX2J5dGVzIHZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlcyB2ZXJpZnlfYmlndWZpeGVkbnhtX2Zyb21fYnl0ZXMgdmVyaWZ5X3VmaXhlZG54bV9mcm9tX2xvZyB2ZXJpZnlfYmlndWZpeGVkbnhtX2Zyb21fbG9nIHZlcmlmeV9zdHJpbmdfaW5pdCB2ZXJpZnlfc3RyaW5nX2FkZCB2ZXJpZnlfc3RyaW5nX2VxIHZlcmlmeV9zdHJpbmdfYnl0ZXMgdmVyaWZ5X3N0cmluZ19mcm9tX2J5dGVzIHZlcmlmeV9zdHJpbmdfZnJvbV9sb2cgdmVyaWZ5X2Jvb2xfYnl0ZXMgdmVyaWZ5X2Jvb2xfZnJvbV9ieXRlcyB2ZXJpZnlfYm9vbF9mcm9tX2xvZyB2ZXJpZnlfZW1pdAogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU3OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX3VpbnRuX2VxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX3VpbnRuX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTEKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpID09IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl91aW50bl9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl91aW50bl9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID09IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPT0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOQogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID09IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSAhPSBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBifAogICAgZGlnIDIKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgIT0gYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSAhPSBhcmM0LlVJbnQ1MTIoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjUzCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgIT0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGIhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fbHQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpIDwgYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBjb3ZlciAyCiAgICBifAogICAgYjwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2x0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgPCBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9sdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9sdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPCBhcmM0LlVJbnQ1MTIoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiPAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fbHQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzcKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA8IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODMKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpIDw9IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fdWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fdWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA8PSBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fYmlndWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fYmlndWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpIDw9IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgPD0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fZ3Rbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPiBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBifAogICAgZGlnIDIKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2d0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2d0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTMKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA+IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9ndFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9ndDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTE5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSA+IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fZ3Rbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID4gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPj0gYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBjb3ZlciAyCiAgICBifAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fdWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fdWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID49IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fYmlndWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fYmlndWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPj0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID49IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPj0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX2luaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTU0CiAgICAvLyByZXR1cm4gYXJjNC5VSW50MzIoYV9iaWd1aW50KQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgcHVzaGludCA0CiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2luaXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5faW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQyNTYoYV9iaWd1aW50KQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHB1c2hpbnQgMzIKICAgIGJ6ZXJvCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fZnJvbV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9mcm9tX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2Zyb21fYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9mcm9tX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDMyLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl9mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl9mcm9tX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gcmV0dXJuIGFyYzQuVUludDI1Ni5mcm9tX2xvZyhhKQogICAgZHVwCiAgICBleHRyYWN0IDYgMAogICAgc3dhcAogICAgZXh0cmFjdCAyIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBsb2cgdmFsdWUgaXMgbm90IHRoZSByZXN1bHQgb2YgYW4gQUJJIHJldHVybgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYXNfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX2FzX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxODAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQyNTYoYV9iaWd1aW50KS5hc191aW50NjQoKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHB1c2hpbnQgMzIKICAgIGJ6ZXJvCiAgICBifAogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAtCiAgICBpbnRjXzEgLy8gOAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZXh0cmFjdDMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2FzX2JpZ3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYXNfYmlndWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxODUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQyNTYoYV9iaWd1aW50KS5hc19iaWd1aW50KCkKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBwdXNoaW50IDMyCiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIGJ8CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bjY0X2FzX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bjY0X2FzX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuNjRfYXNfYmlndWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bjY0X2FzX2JpZ3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KS5hc19iaWd1aW50KCkKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgYnwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VmaXhlZG54bV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91Zml4ZWRueG1fYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWZpeGVkbnhtX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VmaXhlZG54bV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91Zml4ZWRueG1fZnJvbV9sb2dbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWZpeGVkbnhtX2Zyb21fbG9nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI1CiAgICAvLyByZXR1cm4gYXJjNC5VRml4ZWROeE1bdHlwaW5nLkxpdGVyYWxbMzJdLCB0eXBpbmcuTGl0ZXJhbFs4XV0uZnJvbV9sb2coYSkKICAgIGR1cAogICAgZXh0cmFjdCA2IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMiA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gbG9nIHZhbHVlIGlzIG5vdCB0aGUgcmVzdWx0IG9mIGFuIEFCSSByZXR1cm4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VmaXhlZG54bV9mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzEKICAgIC8vIHJldHVybiBhcmM0LkJpZ1VGaXhlZE54TVt0eXBpbmcuTGl0ZXJhbFsyNTZdLCB0eXBpbmcuTGl0ZXJhbFsxNl1dLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjM1CiAgICAvLyByZXN1bHQgPSBhcmM0LlN0cmluZyhTdHJpbmcoIkhlbGxvLCAiKSArIGEpCiAgICBwdXNoYnl0ZXMgIkhlbGxvLCAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2FkZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfYWRkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0MAogICAgLy8gcmVzdWx0ID0gYSArIGIKICAgIGV4dHJhY3QgMiAwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfZXFbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQ1CiAgICAvLyByZXR1cm4gYSA9PSBiCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2Zyb21fYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2Zyb21fYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2Zyb21fbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N0cmluZ19mcm9tX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gcmV0dXJuIGFyYzQuU3RyaW5nLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ib29sX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jvb2xfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYm9vbF9mcm9tX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jvb2xfZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ib29sX2Zyb21fbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jvb2xfZnJvbV9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNzAKICAgIC8vIHJldHVybiBhcmM0LkJvb2wuZnJvbV9sb2coYSkKICAgIGR1cAogICAgZXh0cmFjdCA2IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMiA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gbG9nIHZhbHVlIGlzIG5vdCB0aGUgcmVzdWx0IG9mIGFuIEFCSSByZXR1cm4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2VtaXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZW1pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50MTYKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZHVwCiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk2CiAgICAvLyBhcmM0LmVtaXQoU3dhcHBlZEFyYzQobSwgbiwgbywgcCwgcSwgYXJjNF9yLCBhcmM0X3MsIGFyYzRfdCkpCiAgICBkaWcgNwogICAgZGlnIDcKICAgIGNvbmNhdAogICAgZGlnIDYKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDA1NAogICAgY29uY2F0CiAgICBkaWcgMgogICAgbGVuCiAgICBwdXNoaW50IDg0CiAgICBkaWcgMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHg2NmJiMDMzMyAvLyBtZXRob2QgIlN3YXBwZWRBcmM0KHVpbnQ2NCx1aW50MjU2LHVmaXhlZDMyeDgsdWZpeGVkMjU2eDE2LGJvb2wsdWludDhbM10sdWludDE2W10sKHVpbnQzMix1aW50NjQsc3RyaW5nKSkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk3LTMxNQogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgICJTd2FwcGVkIiwKICAgIC8vICAgICBhLAogICAgLy8gICAgIGIsCiAgICAvLyAgICAgYywKICAgIC8vICAgICBkLmNvcHkoKSwKICAgIC8vICAgICBlLAogICAgLy8gICAgIGYsCiAgICAvLyAgICAgZy5jb3B5KCksCiAgICAvLyAgICAgaCwKICAgIC8vICAgICBtLAogICAgLy8gICAgIG4sCiAgICAvLyAgICAgbywKICAgIC8vICAgICBwLAogICAgLy8gICAgIHEsCiAgICAvLyAgICAgYXJjNF9yLmNvcHkoKSwKICAgIC8vICAgICBhcmM0X3MuY29weSgpLAogICAgLy8gICAgIGFyYzRfdCwKICAgIC8vICkKICAgIGRpZyAxNgogICAgbGVuCiAgICBwdXNoaW50IDE3MwogICAgKwogICAgcHVzaGJ5dGVzIDB4MDBhZAogICAgdW5jb3ZlciAxNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDE2CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBkaWcgMTUKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDE0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIGRpZyAxMgogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMTEKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweGVjMzMxOWJiIC8vIG1ldGhvZCAiU3dhcHBlZChzdHJpbmcsdWludDUxMix1aW50NjQsYnl0ZVtdLHVpbnQ2NCxib29sLGJ5dGVbXSxzdHJpbmcsdWludDY0LHVpbnQyNTYsdWZpeGVkMzJ4OCx1Zml4ZWQyNTZ4MTYsYm9vbCx1aW50OFszXSx1aW50MTZbXSwodWludDMyLHVpbnQ2NCxzdHJpbmcpKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxNi0zMzQKICAgIC8vIGFyYzQuZW1pdCgKICAgIC8vICAgICAiU3dhcHBlZChzdHJpbmcsdWludDUxMix1aW50NjQsYnl0ZVtdLHVpbnQ2NCxib29sLGJ5dGVbXSxzdHJpbmcsdWludDY0LHVpbnQyNTYsdWZpeGVkMzJ4OCx1Zml4ZWQyNTZ4MTYsYm9vbCx1aW50OFszXSx1aW50MTZbXSwodWludDMyLHVpbnQ2NCxzdHJpbmcpKSIsCiAgICAvLyAgICAgYSwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGMsCiAgICAvLyAgICAgZC5jb3B5KCksCiAgICAvLyAgICAgZSwKICAgIC8vICAgICBmLAogICAgLy8gICAgIGcuY29weSgpLAogICAgLy8gICAgIGgsCiAgICAvLyAgICAgbSwKICAgIC8vICAgICBuLAogICAgLy8gICAgIG8sCiAgICAvLyAgICAgcCwKICAgIC8vICAgICBxLAogICAgLy8gICAgIGFyYzRfci5jb3B5KCksCiAgICAvLyAgICAgYXJjNF9zLmNvcHkoKSwKICAgIC8vICAgICBhcmM0X3QsCiAgICAvLyApCiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAQhAACYCBBUffHUBADEbQQFtMRkURDEYRIIyBJbxQRYE7WZglgQsoDUrBIWQfUAELL7EWwQHZm/ZBDcLq9MEK2s+8AQznal8BHiY7ZcEHxMM7ATHSGZOBHpGDLEE3KsfAQSX2QZNBM4GwqAE3NvO4AR3pLaNBE9UBiYECVrtQQTjt+kYBFUzcAgEm7HNZgSBSE2dBJoD3xAE0/DkSwSYLbIzBK/73w4EKIr3bgSL2EoEBDArigoEM3riCwRuJZJwBHnjX3cEDxV0/gSyyxO+BNBZ7qcETMTBVwQ9F6xuBPfz1fwE+Mj41QRD9xYqBELgkHUE2Vb1dQRsAWDfBKiQFQsECy9MPwSdudMnBOTZUKEEtgXoDDYaAI4yAAkANwBlAJMAwQDvAR0BSwF5AacB1QIDAjECXwKNArsC6QMXA0UDcwOhA88D/QQrBFkEbwSFBJEEnQSxBMUE5gUEBRgFNAVFBVYFYgVuBYIFlgW1BdAF4gXzBf8GEwYkBjAGRAAxGRQxGBQQQzYaAVcCADYaAlcCAEsBFSMORCOvTwJLAatLAhUjDkROAquoKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08Cq0sBFSMORCOvTwKrqCklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAqtLARUkDkQkr08Cq6gpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwJLAatLAhUkDkROAquoKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08CSwGrSwIVIw5ETgKrqSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAqtLARUjDkQjr08Cq6kpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwKrSwEVJA5EJK9PAqupKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08CSwGrSwIVJA5ETgKrqSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAksBq0sCFSMORE4Cq6QpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwKrSwEVIw5EI69PAqukKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08Cq0sBFSQORCSvTwKrpCklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAksBq0sCFSQORE4Cq6QpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwJLAatLAhUjDkROAqumKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08Cq0sBFSMORCOvTwKrpiklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAqtLARUkDkQkr08Cq6YpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwJLAatLAhUkDkROAqumKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08CSwGrSwIVIw5ETgKrpSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAqtLARUjDkQjr08Cq6UpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwKrSwEVJA5EJK9PAqulKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08CSwGrSwIVJA5ETgKrpSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAksBq0sCFSMORE4Cq6cpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwKrSwEVIw5EI69PAqunKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08Cq0sBFSQORCSvTwKrpyklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAksBq0sCFSQORE4Cq6cpJU8CVChMULAiQzYaAVcCAEkVgQQORIEEr6soTFCwIkM2GgFXAgBJFYEgDkSBIK+rKExQsCJDNhoBVwIAKExQsCJDNhoBVwIAKExQsCJDNhoBSVcGAExXAgQoEkQoTFCwIkM2GgFJVwYATFcCBCgSRChMULAiQzYaAVcCAEkVgSAORIEgr6tJkyQOREkVIwkjWChMULAiQzYaAVcCAEkVgSAORIEgr6tJFSQORCSvqyhMULAiQzYaAVcCAEkVIw5EI6+rKExQsCJDNhoBVwIASRUjDkQjr6tJFSQORCSvqyhMULAiQzYaAUkVFlcGAkxQKExQsCJDNhoBSRUWVwYCTFAoTFCwIkM2GgFXAgAoTFCwIkM2GgFXAgAoTFCwIkM2GgFJVwYATFcCBCgSRChMULAiQzYaAUlXBgBMVwIEKBJEKExQsCJDNhoBVwIAgAdIZWxsbywgTFBJFRZXBgJMUChMULAiQzYaATYaAlcCAFBJVwIAFRZXBgJcAChMULAiQzYaATYaAhIpJU8CVChMULAiQzYaAUkVFlcGAkxQKExQsCJDNhoBVwIAKExQsCJDNhoBSVcGAExXAgQoEkQoTFCwIkM2GgFJFRZXBgJMUChMULAiQzYaAVcCAChMULAiQzYaAUlXBgBMVwIEKBJEKExQsCJDNhoBNhoCNhoDNhoENhoFNhoGNhoHNhoINhoJNhoKNhoLNhoMNhoNNhoOVwIANhoPSSVZSwGBAllSVwIANhoPSYECWUsBFVJXAgBLB0sHUEsGUEsFUEsEUEsDUIACAFRQSwIVgVRLAQgWVwYCTwJMUEsDUEsCUIAEZrsDM0xQsEsQFYGtAQiAAgCtTxFQTxBQSwEWVwYCUEsPFU8CCExPDlBPDVBLARZXBgJQSwwVTwIISRZXBgJPAkxQSwsVTwIITE8KUE8JUE8IUE8HUE8GUE8FUEsBFlcGAlBMTwIIFlcGAlBPBlBPBVBPBFBPA1BPAlBMUIAE7DMZu0xQSbCwIkM=","clear":"C4EBQw=="},"events":[{"name":"SwappedArc4","args":[{"type":"uint64","name":"m"},{"type":"uint256","name":"n"},{"type":"ufixed32x8","name":"o"},{"type":"ufixed256x16","name":"p"},{"type":"bool","name":"q"},{"type":"uint8[3]","name":"r"},{"type":"uint16[]","name":"s"},{"type":"(uint32,uint64,string)","name":"t"}]},{"name":"Swapped","args":[{"type":"string","name":"field1"},{"type":"uint512","name":"field2"},{"type":"uint64","name":"field3"},{"type":"byte[]","name":"field4"},{"type":"uint64","name":"field5"},{"type":"bool","name":"field6"},{"type":"byte[]","name":"field7"},{"type":"string","name":"field8"},{"type":"uint64","name":"field9"},{"type":"uint256","name":"field10"},{"type":"ufixed32x8","name":"field11"},{"type":"ufixed256x16","name":"field12"},{"type":"bool","name":"field13"},{"type":"uint8[3]","name":"field14"},{"type":"uint16[]","name":"field15"},{"type":"(uint32,uint64,string)","name":"field16"}]}],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the Arc4PrimitiveOpsContract contract + */ +export type Arc4PrimitiveOpsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_uintn_uintn_eq(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_uintn_eq(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_biguintn_eq(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_biguintn_eq(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_uintn_ne(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_uintn_ne(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_biguintn_ne(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_biguintn_ne(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_uintn_lt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_uintn_lt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_biguintn_lt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_biguintn_lt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_uintn_le(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_uintn_le(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_biguintn_le(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_biguintn_le(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_uintn_gt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_uintn_gt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_biguintn_gt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_biguintn_gt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_uintn_ge(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_uintn_ge(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_biguintn_ge(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguintn_biguintn_ge(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_uintn_init(byte[])uint32': { + a: Uint8Array + } + 'verify_biguintn_init(byte[])uint256': { + a: Uint8Array + } + 'verify_uintn_from_bytes(byte[])uint32': { + a: Uint8Array + } + 'verify_biguintn_from_bytes(byte[])uint256': { + a: Uint8Array + } + 'verify_uintn_from_log(byte[])uint32': { + a: Uint8Array + } + 'verify_biguintn_from_log(byte[])uint256': { + a: Uint8Array + } + 'verify_biguintn_as_uint64(byte[])uint64': { + a: Uint8Array + } + 'verify_biguintn_as_biguint(byte[])uint512': { + a: Uint8Array + } + 'verify_uintn64_as_uint64(byte[])uint64': { + a: Uint8Array + } + 'verify_uintn64_as_biguint(byte[])uint512': { + a: Uint8Array + } + 'verify_ufixednxm_bytes(ufixed32x8)byte[]': { + a: number + } + 'verify_bigufixednxm_bytes(ufixed256x16)byte[]': { + a: number + } + 'verify_ufixednxm_from_bytes(byte[])ufixed32x8': { + a: Uint8Array + } + 'verify_bigufixednxm_from_bytes(byte[])ufixed256x16': { + a: Uint8Array + } + 'verify_ufixednxm_from_log(byte[])ufixed32x8': { + a: Uint8Array + } + 'verify_bigufixednxm_from_log(byte[])ufixed256x16': { + a: Uint8Array + } + 'verify_string_init(string)string': { + a: string + } + 'verify_string_add(string,string)string': { + a: string + b: string + } + 'verify_string_eq(string,string)bool': { + a: string + b: string + } + 'verify_string_bytes(string)byte[]': { + a: string + } + 'verify_string_from_bytes(byte[])string': { + a: Uint8Array + } + 'verify_string_from_log(byte[])string': { + a: Uint8Array + } + 'verify_bool_bytes(bool)byte[]': { + a: boolean + } + 'verify_bool_from_bytes(byte[])bool': { + a: Uint8Array + } + 'verify_bool_from_log(byte[])bool': { + a: Uint8Array + } + 'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void': { + a: string + b: bigint | number + c: bigint | number + d: Uint8Array + e: bigint | number + f: boolean + g: Uint8Array + h: string + m: bigint | number + n: bigint | number + o: number + p: number + q: boolean + r: Uint8Array + s: Uint8Array + t: Uint8Array + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_uintn_uintn_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_uintn_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_biguintn_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_biguintn_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_uintn_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_uintn_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_biguintn_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_biguintn_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_uintn_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_uintn_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_biguintn_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_biguintn_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_uintn_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_uintn_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_biguintn_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_biguintn_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_uintn_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_uintn_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_biguintn_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_biguintn_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_uintn_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_uintn_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_biguintn_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguintn_biguintn_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_uintn_init(byte[])uint32': [a: Uint8Array] + 'verify_biguintn_init(byte[])uint256': [a: Uint8Array] + 'verify_uintn_from_bytes(byte[])uint32': [a: Uint8Array] + 'verify_biguintn_from_bytes(byte[])uint256': [a: Uint8Array] + 'verify_uintn_from_log(byte[])uint32': [a: Uint8Array] + 'verify_biguintn_from_log(byte[])uint256': [a: Uint8Array] + 'verify_biguintn_as_uint64(byte[])uint64': [a: Uint8Array] + 'verify_biguintn_as_biguint(byte[])uint512': [a: Uint8Array] + 'verify_uintn64_as_uint64(byte[])uint64': [a: Uint8Array] + 'verify_uintn64_as_biguint(byte[])uint512': [a: Uint8Array] + 'verify_ufixednxm_bytes(ufixed32x8)byte[]': [a: number] + 'verify_bigufixednxm_bytes(ufixed256x16)byte[]': [a: number] + 'verify_ufixednxm_from_bytes(byte[])ufixed32x8': [a: Uint8Array] + 'verify_bigufixednxm_from_bytes(byte[])ufixed256x16': [a: Uint8Array] + 'verify_ufixednxm_from_log(byte[])ufixed32x8': [a: Uint8Array] + 'verify_bigufixednxm_from_log(byte[])ufixed256x16': [a: Uint8Array] + 'verify_string_init(string)string': [a: string] + 'verify_string_add(string,string)string': [a: string, b: string] + 'verify_string_eq(string,string)bool': [a: string, b: string] + 'verify_string_bytes(string)byte[]': [a: string] + 'verify_string_from_bytes(byte[])string': [a: Uint8Array] + 'verify_string_from_log(byte[])string': [a: Uint8Array] + 'verify_bool_bytes(bool)byte[]': [a: boolean] + 'verify_bool_from_bytes(byte[])bool': [a: Uint8Array] + 'verify_bool_from_log(byte[])bool': [a: Uint8Array] + 'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void': [a: string, b: bigint | number, c: bigint | number, d: Uint8Array, e: bigint | number, f: boolean, g: Uint8Array, h: string, m: bigint | number, n: bigint | number, o: number, p: number, q: boolean, r: Uint8Array, s: Uint8Array, t: Uint8Array] + } +} + +/** + * The return type for each method + */ +export type Arc4PrimitiveOpsContractReturns = { + 'verify_uintn_uintn_eq(byte[],byte[])bool': boolean + 'verify_biguintn_uintn_eq(byte[],byte[])bool': boolean + 'verify_uintn_biguintn_eq(byte[],byte[])bool': boolean + 'verify_biguintn_biguintn_eq(byte[],byte[])bool': boolean + 'verify_uintn_uintn_ne(byte[],byte[])bool': boolean + 'verify_biguintn_uintn_ne(byte[],byte[])bool': boolean + 'verify_uintn_biguintn_ne(byte[],byte[])bool': boolean + 'verify_biguintn_biguintn_ne(byte[],byte[])bool': boolean + 'verify_uintn_uintn_lt(byte[],byte[])bool': boolean + 'verify_biguintn_uintn_lt(byte[],byte[])bool': boolean + 'verify_uintn_biguintn_lt(byte[],byte[])bool': boolean + 'verify_biguintn_biguintn_lt(byte[],byte[])bool': boolean + 'verify_uintn_uintn_le(byte[],byte[])bool': boolean + 'verify_biguintn_uintn_le(byte[],byte[])bool': boolean + 'verify_uintn_biguintn_le(byte[],byte[])bool': boolean + 'verify_biguintn_biguintn_le(byte[],byte[])bool': boolean + 'verify_uintn_uintn_gt(byte[],byte[])bool': boolean + 'verify_biguintn_uintn_gt(byte[],byte[])bool': boolean + 'verify_uintn_biguintn_gt(byte[],byte[])bool': boolean + 'verify_biguintn_biguintn_gt(byte[],byte[])bool': boolean + 'verify_uintn_uintn_ge(byte[],byte[])bool': boolean + 'verify_biguintn_uintn_ge(byte[],byte[])bool': boolean + 'verify_uintn_biguintn_ge(byte[],byte[])bool': boolean + 'verify_biguintn_biguintn_ge(byte[],byte[])bool': boolean + 'verify_uintn_init(byte[])uint32': number + 'verify_biguintn_init(byte[])uint256': bigint + 'verify_uintn_from_bytes(byte[])uint32': number + 'verify_biguintn_from_bytes(byte[])uint256': bigint + 'verify_uintn_from_log(byte[])uint32': number + 'verify_biguintn_from_log(byte[])uint256': bigint + 'verify_biguintn_as_uint64(byte[])uint64': bigint + 'verify_biguintn_as_biguint(byte[])uint512': bigint + 'verify_uintn64_as_uint64(byte[])uint64': bigint + 'verify_uintn64_as_biguint(byte[])uint512': bigint + 'verify_ufixednxm_bytes(ufixed32x8)byte[]': Uint8Array + 'verify_bigufixednxm_bytes(ufixed256x16)byte[]': Uint8Array + 'verify_ufixednxm_from_bytes(byte[])ufixed32x8': number + 'verify_bigufixednxm_from_bytes(byte[])ufixed256x16': number + 'verify_ufixednxm_from_log(byte[])ufixed32x8': number + 'verify_bigufixednxm_from_log(byte[])ufixed256x16': number + 'verify_string_init(string)string': string + 'verify_string_add(string,string)string': string + 'verify_string_eq(string,string)bool': boolean + 'verify_string_bytes(string)byte[]': Uint8Array + 'verify_string_from_bytes(byte[])string': string + 'verify_string_from_log(byte[])string': string + 'verify_bool_bytes(bool)byte[]': Uint8Array + 'verify_bool_from_bytes(byte[])bool': boolean + 'verify_bool_from_log(byte[])bool': boolean + 'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void': void +} + +/** + * Defines the types of available calls and state of the Arc4PrimitiveOpsContract smart contract. + */ +export type Arc4PrimitiveOpsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_uintn_uintn_eq(byte[],byte[])bool' | 'verify_uintn_uintn_eq', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_eq(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_eq(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_eq(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_uintn_eq(byte[],byte[])bool' | 'verify_biguintn_uintn_eq', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_eq(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_eq(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_eq(byte[],byte[])bool'] + }> + & Record<'verify_uintn_biguintn_eq(byte[],byte[])bool' | 'verify_uintn_biguintn_eq', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_eq(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_eq(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_eq(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_biguintn_eq(byte[],byte[])bool' | 'verify_biguintn_biguintn_eq', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_eq(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_eq(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_eq(byte[],byte[])bool'] + }> + & Record<'verify_uintn_uintn_ne(byte[],byte[])bool' | 'verify_uintn_uintn_ne', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_ne(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_ne(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ne(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_uintn_ne(byte[],byte[])bool' | 'verify_biguintn_uintn_ne', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_ne(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_ne(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ne(byte[],byte[])bool'] + }> + & Record<'verify_uintn_biguintn_ne(byte[],byte[])bool' | 'verify_uintn_biguintn_ne', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_ne(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_ne(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ne(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_biguintn_ne(byte[],byte[])bool' | 'verify_biguintn_biguintn_ne', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_ne(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_ne(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ne(byte[],byte[])bool'] + }> + & Record<'verify_uintn_uintn_lt(byte[],byte[])bool' | 'verify_uintn_uintn_lt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_lt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_lt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_lt(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_uintn_lt(byte[],byte[])bool' | 'verify_biguintn_uintn_lt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_lt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_lt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_lt(byte[],byte[])bool'] + }> + & Record<'verify_uintn_biguintn_lt(byte[],byte[])bool' | 'verify_uintn_biguintn_lt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_lt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_lt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_lt(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_biguintn_lt(byte[],byte[])bool' | 'verify_biguintn_biguintn_lt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_lt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_lt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_lt(byte[],byte[])bool'] + }> + & Record<'verify_uintn_uintn_le(byte[],byte[])bool' | 'verify_uintn_uintn_le', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_le(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_le(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_le(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_uintn_le(byte[],byte[])bool' | 'verify_biguintn_uintn_le', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_le(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_le(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_le(byte[],byte[])bool'] + }> + & Record<'verify_uintn_biguintn_le(byte[],byte[])bool' | 'verify_uintn_biguintn_le', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_le(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_le(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_le(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_biguintn_le(byte[],byte[])bool' | 'verify_biguintn_biguintn_le', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_le(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_le(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_le(byte[],byte[])bool'] + }> + & Record<'verify_uintn_uintn_gt(byte[],byte[])bool' | 'verify_uintn_uintn_gt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_gt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_gt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_gt(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_uintn_gt(byte[],byte[])bool' | 'verify_biguintn_uintn_gt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_gt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_gt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_gt(byte[],byte[])bool'] + }> + & Record<'verify_uintn_biguintn_gt(byte[],byte[])bool' | 'verify_uintn_biguintn_gt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_gt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_gt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_gt(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_biguintn_gt(byte[],byte[])bool' | 'verify_biguintn_biguintn_gt', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_gt(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_gt(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_gt(byte[],byte[])bool'] + }> + & Record<'verify_uintn_uintn_ge(byte[],byte[])bool' | 'verify_uintn_uintn_ge', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_uintn_ge(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_uintn_ge(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ge(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_uintn_ge(byte[],byte[])bool' | 'verify_biguintn_uintn_ge', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_uintn_ge(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_uintn_ge(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ge(byte[],byte[])bool'] + }> + & Record<'verify_uintn_biguintn_ge(byte[],byte[])bool' | 'verify_uintn_biguintn_ge', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_biguintn_ge(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_biguintn_ge(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ge(byte[],byte[])bool'] + }> + & Record<'verify_biguintn_biguintn_ge(byte[],byte[])bool' | 'verify_biguintn_biguintn_ge', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_biguintn_ge(byte[],byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_biguintn_ge(byte[],byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ge(byte[],byte[])bool'] + }> + & Record<'verify_uintn_init(byte[])uint32' | 'verify_uintn_init', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_init(byte[])uint32'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_init(byte[])uint32'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_init(byte[])uint32'] + }> + & Record<'verify_biguintn_init(byte[])uint256' | 'verify_biguintn_init', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_init(byte[])uint256'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_init(byte[])uint256'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_init(byte[])uint256'] + }> + & Record<'verify_uintn_from_bytes(byte[])uint32' | 'verify_uintn_from_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_from_bytes(byte[])uint32'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_from_bytes(byte[])uint32'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_from_bytes(byte[])uint32'] + }> + & Record<'verify_biguintn_from_bytes(byte[])uint256' | 'verify_biguintn_from_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_from_bytes(byte[])uint256'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_from_bytes(byte[])uint256'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_from_bytes(byte[])uint256'] + }> + & Record<'verify_uintn_from_log(byte[])uint32' | 'verify_uintn_from_log', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn_from_log(byte[])uint32'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn_from_log(byte[])uint32'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn_from_log(byte[])uint32'] + }> + & Record<'verify_biguintn_from_log(byte[])uint256' | 'verify_biguintn_from_log', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_from_log(byte[])uint256'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_from_log(byte[])uint256'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_from_log(byte[])uint256'] + }> + & Record<'verify_biguintn_as_uint64(byte[])uint64' | 'verify_biguintn_as_uint64', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_as_uint64(byte[])uint64'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_as_uint64(byte[])uint64'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_as_uint64(byte[])uint64'] + }> + & Record<'verify_biguintn_as_biguint(byte[])uint512' | 'verify_biguintn_as_biguint', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_biguintn_as_biguint(byte[])uint512'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_biguintn_as_biguint(byte[])uint512'] + returns: Arc4PrimitiveOpsContractReturns['verify_biguintn_as_biguint(byte[])uint512'] + }> + & Record<'verify_uintn64_as_uint64(byte[])uint64' | 'verify_uintn64_as_uint64', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn64_as_uint64(byte[])uint64'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn64_as_uint64(byte[])uint64'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn64_as_uint64(byte[])uint64'] + }> + & Record<'verify_uintn64_as_biguint(byte[])uint512' | 'verify_uintn64_as_biguint', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_uintn64_as_biguint(byte[])uint512'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_uintn64_as_biguint(byte[])uint512'] + returns: Arc4PrimitiveOpsContractReturns['verify_uintn64_as_biguint(byte[])uint512'] + }> + & Record<'verify_ufixednxm_bytes(ufixed32x8)byte[]' | 'verify_ufixednxm_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_ufixednxm_bytes(ufixed32x8)byte[]'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_ufixednxm_bytes(ufixed32x8)byte[]'] + returns: Arc4PrimitiveOpsContractReturns['verify_ufixednxm_bytes(ufixed32x8)byte[]'] + }> + & Record<'verify_bigufixednxm_bytes(ufixed256x16)byte[]' | 'verify_bigufixednxm_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bigufixednxm_bytes(ufixed256x16)byte[]'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bigufixednxm_bytes(ufixed256x16)byte[]'] + returns: Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_bytes(ufixed256x16)byte[]'] + }> + & Record<'verify_ufixednxm_from_bytes(byte[])ufixed32x8' | 'verify_ufixednxm_from_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_ufixednxm_from_bytes(byte[])ufixed32x8'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_ufixednxm_from_bytes(byte[])ufixed32x8'] + returns: Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_bytes(byte[])ufixed32x8'] + }> + & Record<'verify_bigufixednxm_from_bytes(byte[])ufixed256x16' | 'verify_bigufixednxm_from_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'] + returns: Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'] + }> + & Record<'verify_ufixednxm_from_log(byte[])ufixed32x8' | 'verify_ufixednxm_from_log', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_ufixednxm_from_log(byte[])ufixed32x8'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_ufixednxm_from_log(byte[])ufixed32x8'] + returns: Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_log(byte[])ufixed32x8'] + }> + & Record<'verify_bigufixednxm_from_log(byte[])ufixed256x16' | 'verify_bigufixednxm_from_log', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bigufixednxm_from_log(byte[])ufixed256x16'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bigufixednxm_from_log(byte[])ufixed256x16'] + returns: Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_log(byte[])ufixed256x16'] + }> + & Record<'verify_string_init(string)string' | 'verify_string_init', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_init(string)string'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_init(string)string'] + returns: Arc4PrimitiveOpsContractReturns['verify_string_init(string)string'] + }> + & Record<'verify_string_add(string,string)string' | 'verify_string_add', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_add(string,string)string'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_add(string,string)string'] + returns: Arc4PrimitiveOpsContractReturns['verify_string_add(string,string)string'] + }> + & Record<'verify_string_eq(string,string)bool' | 'verify_string_eq', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_eq(string,string)bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_eq(string,string)bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_string_eq(string,string)bool'] + }> + & Record<'verify_string_bytes(string)byte[]' | 'verify_string_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_bytes(string)byte[]'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_bytes(string)byte[]'] + returns: Arc4PrimitiveOpsContractReturns['verify_string_bytes(string)byte[]'] + }> + & Record<'verify_string_from_bytes(byte[])string' | 'verify_string_from_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_from_bytes(byte[])string'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_from_bytes(byte[])string'] + returns: Arc4PrimitiveOpsContractReturns['verify_string_from_bytes(byte[])string'] + }> + & Record<'verify_string_from_log(byte[])string' | 'verify_string_from_log', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_string_from_log(byte[])string'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_string_from_log(byte[])string'] + returns: Arc4PrimitiveOpsContractReturns['verify_string_from_log(byte[])string'] + }> + & Record<'verify_bool_bytes(bool)byte[]' | 'verify_bool_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bool_bytes(bool)byte[]'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bool_bytes(bool)byte[]'] + returns: Arc4PrimitiveOpsContractReturns['verify_bool_bytes(bool)byte[]'] + }> + & Record<'verify_bool_from_bytes(byte[])bool' | 'verify_bool_from_bytes', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bool_from_bytes(byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bool_from_bytes(byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_bool_from_bytes(byte[])bool'] + }> + & Record<'verify_bool_from_log(byte[])bool' | 'verify_bool_from_log', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_bool_from_log(byte[])bool'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_bool_from_log(byte[])bool'] + returns: Arc4PrimitiveOpsContractReturns['verify_bool_from_log(byte[])bool'] + }> + & Record<'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void' | 'verify_emit', { + argsObj: Arc4PrimitiveOpsContractArgs['obj']['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'] + argsTuple: Arc4PrimitiveOpsContractArgs['tuple']['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'] + returns: Arc4PrimitiveOpsContractReturns['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type Arc4PrimitiveOpsContractSignatures = keyof Arc4PrimitiveOpsContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type Arc4PrimitiveOpsContractNonVoidMethodSignatures = keyof Arc4PrimitiveOpsContractTypes['methods'] extends infer T ? T extends keyof Arc4PrimitiveOpsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the Arc4PrimitiveOpsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = Arc4PrimitiveOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the Arc4PrimitiveOpsContract smart contract to the method's return type + */ +export type MethodReturn = Arc4PrimitiveOpsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type Arc4PrimitiveOpsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type Arc4PrimitiveOpsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: Arc4PrimitiveOpsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the Arc4PrimitiveOpsContract smart contract + */ +export abstract class Arc4PrimitiveOpsContractParamsFactory { + /** + * Constructs a no op call for the verify_uintn_uintn_eq(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnUintnEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_uintn_eq(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_uintn_eq(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnUintnEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_uintn_eq(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_biguintn_eq(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnBiguintnEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_biguintn_eq(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_biguintn_eq(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnBiguintnEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_biguintn_eq(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_uintn_ne(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnUintnNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_uintn_ne(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_uintn_ne(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnUintnNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_uintn_ne(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_biguintn_ne(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnBiguintnNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_biguintn_ne(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_biguintn_ne(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnBiguintnNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_biguintn_ne(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_uintn_lt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnUintnLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_uintn_lt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_uintn_lt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnUintnLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_uintn_lt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_biguintn_lt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnBiguintnLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_biguintn_lt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_biguintn_lt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnBiguintnLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_biguintn_lt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_uintn_le(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnUintnLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_uintn_le(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_uintn_le(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnUintnLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_uintn_le(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_biguintn_le(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnBiguintnLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_biguintn_le(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_biguintn_le(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnBiguintnLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_biguintn_le(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_uintn_gt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnUintnGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_uintn_gt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_uintn_gt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnUintnGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_uintn_gt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_biguintn_gt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnBiguintnGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_biguintn_gt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_biguintn_gt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnBiguintnGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_biguintn_gt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_uintn_ge(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnUintnGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_uintn_ge(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_uintn_ge(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnUintnGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_uintn_ge(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_biguintn_ge(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnBiguintnGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_biguintn_ge(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguintn_biguintn_ge(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnBiguintnGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_biguintn_ge(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uintn_init(byte[])uint32 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_init(byte[])uint32' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_biguintn_init(byte[])uint256 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_init(byte[])uint256' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_uintn_from_bytes(byte[])uint32 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_from_bytes(byte[])uint32' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_biguintn_from_bytes(byte[])uint256 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_from_bytes(byte[])uint256' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_uintn_from_log(byte[])uint32 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintnFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn_from_log(byte[])uint32' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_biguintn_from_log(byte[])uint256 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_from_log(byte[])uint256' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_biguintn_as_uint64(byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnAsUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_as_uint64(byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_biguintn_as_biguint(byte[])uint512 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintnAsBiguint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguintn_as_biguint(byte[])uint512' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_uintn64_as_uint64(byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintn64AsUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn64_as_uint64(byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_uintn64_as_biguint(byte[])uint512 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUintn64AsBiguint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uintn64_as_biguint(byte[])uint512' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_ufixednxm_bytes(ufixed32x8)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUfixednxmBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ufixednxm_bytes(ufixed32x8)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bigufixednxm_bytes(ufixed256x16)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBigufixednxmBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bigufixednxm_bytes(ufixed256x16)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_ufixednxm_from_bytes(byte[])ufixed32x8 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUfixednxmFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ufixednxm_from_bytes(byte[])ufixed32x8' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bigufixednxm_from_bytes(byte[])ufixed256x16 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBigufixednxmFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bigufixednxm_from_bytes(byte[])ufixed256x16' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_ufixednxm_from_log(byte[])ufixed32x8 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUfixednxmFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ufixednxm_from_log(byte[])ufixed32x8' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bigufixednxm_from_log(byte[])ufixed256x16 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBigufixednxmFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bigufixednxm_from_log(byte[])ufixed256x16' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_string_init(string)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_init(string)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_string_add(string,string)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringAdd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_add(string,string)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_string_eq(string,string)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_eq(string,string)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_string_bytes(string)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_bytes(string)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_string_from_bytes(byte[])string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_from_bytes(byte[])string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_string_from_log(byte[])string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_from_log(byte[])string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bool_bytes(bool)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBoolBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bool_bytes(bool)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bool_from_bytes(byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBoolFromBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bool_from_bytes(byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bool_from_log(byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBoolFromLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bool_from_log(byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEmit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d, params.args.e, params.args.f, params.args.g, params.args.h, params.args.m, params.args.n, params.args.o, params.args.p, params.args.q, params.args.r, params.args.s, params.args.t], + } + } +} + +/** + * A factory to create and deploy one or more instance of the Arc4PrimitiveOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class Arc4PrimitiveOpsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `Arc4PrimitiveOpsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new Arc4PrimitiveOpsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new Arc4PrimitiveOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the Arc4PrimitiveOpsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: Arc4PrimitiveOpsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new Arc4PrimitiveOpsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Arc4PrimitiveOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Arc4PrimitiveOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Arc4PrimitiveOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new Arc4PrimitiveOpsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the Arc4PrimitiveOpsContract smart contract + */ +export class Arc4PrimitiveOpsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `Arc4PrimitiveOpsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the Arc4PrimitiveOpsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `Arc4PrimitiveOpsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `Arc4PrimitiveOpsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new Arc4PrimitiveOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `Arc4PrimitiveOpsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new Arc4PrimitiveOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the Arc4PrimitiveOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnUintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnUintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnBiguintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnBiguintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnUintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnUintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnBiguintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnBiguintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnUintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnUintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnBiguintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnBiguintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnUintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnUintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnBiguintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnBiguintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnUintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnUintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnBiguintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnBiguintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnUintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnUintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnBiguintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnBiguintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_init(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnInit(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_init(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnInit(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_bytes(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_bytes(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_log(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintnFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_log(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnAsUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsUint64(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_biguint(byte[])uint512` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintnAsBiguint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsBiguint(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintn64AsUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsUint64(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_biguint(byte[])uint512` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUintn64AsBiguint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsBiguint(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_bytes(ufixed32x8)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUfixednxmBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_bytes(ufixed256x16)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBigufixednxmBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_bytes(byte[])ufixed32x8` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUfixednxmFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_bytes(byte[])ufixed256x16` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBigufixednxmFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_log(byte[])ufixed32x8` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUfixednxmFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_log(byte[])ufixed256x16` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBigufixednxmFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringInit(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_add(string,string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringAdd(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_eq(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_bytes(string)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_bytes(byte[])string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_log(byte[])string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_bytes(bool)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBoolBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_bytes(byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBoolFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_log(byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBoolFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEmit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(Arc4PrimitiveOpsContractParamsFactory.verifyEmit(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the Arc4PrimitiveOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnUintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnUintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnBiguintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnBiguintnEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnUintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnUintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnBiguintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnBiguintnNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnNe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnUintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnUintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnBiguintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnBiguintnLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnUintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnUintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnBiguintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnBiguintnLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnUintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnUintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnBiguintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnBiguintnGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGt(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnUintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnUintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnBiguintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnBiguintnGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGe(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_init(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnInit(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_init(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnInit(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_bytes(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_bytes(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_log(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintnFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_log(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnAsUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsUint64(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_biguint(byte[])uint512` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintnAsBiguint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsBiguint(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintn64AsUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsUint64(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_biguint(byte[])uint512` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUintn64AsBiguint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsBiguint(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_bytes(ufixed32x8)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUfixednxmBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_bytes(ufixed256x16)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBigufixednxmBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_bytes(byte[])ufixed32x8` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUfixednxmFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_bytes(byte[])ufixed256x16` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBigufixednxmFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_log(byte[])ufixed32x8` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUfixednxmFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_log(byte[])ufixed256x16` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBigufixednxmFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringInit(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_add(string,string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringAdd(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_eq(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringEq(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_bytes(string)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_bytes(byte[])string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_log(byte[])string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_bytes(bool)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBoolBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_bytes(byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBoolFromBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromBytes(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_log(byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBoolFromLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromLog(params)) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEmit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(Arc4PrimitiveOpsContractParamsFactory.verifyEmit(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the Arc4PrimitiveOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnUintnEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnEq(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_eq(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnUintnEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnEq(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_eq(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnBiguintnEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnEq(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_eq(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnBiguintnEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnEq(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_eq(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnUintnNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnNe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ne(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnUintnNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnNe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ne(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnBiguintnNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnNe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ne(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnBiguintnNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnNe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ne(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnUintnLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_lt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnUintnLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_lt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnBiguintnLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_lt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnBiguintnLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_lt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnUintnLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnLe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_le(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnUintnLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnLe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_le(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnBiguintnLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnLe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_le(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnBiguintnLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnLe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_le(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnUintnGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_gt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnUintnGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_gt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnBiguintnGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_gt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnBiguintnGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGt(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_gt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_uintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnUintnGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnUintnGe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ge(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_uintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnUintnGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnUintnGe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ge(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_biguintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnBiguintnGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnBiguintnGe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ge(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_biguintn_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnBiguintnGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnBiguintnGe(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ge(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_init(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnInit(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_init(byte[])uint32'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_init(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnInit(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_init(byte[])uint256'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_bytes(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_from_bytes(byte[])uint32'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_bytes(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_from_bytes(byte[])uint256'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn_from_log(byte[])uint32` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintnFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintnFromLog(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn_from_log(byte[])uint32'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_from_log(byte[])uint256` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnFromLog(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_from_log(byte[])uint256'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnAsUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsUint64(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_as_uint64(byte[])uint64'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_biguintn_as_biguint(byte[])uint512` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintnAsBiguint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBiguintnAsBiguint(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_biguintn_as_biguint(byte[])uint512'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintn64AsUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsUint64(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn64_as_uint64(byte[])uint64'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_uintn64_as_biguint(byte[])uint512` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUintn64AsBiguint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUintn64AsBiguint(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_uintn64_as_biguint(byte[])uint512'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_bytes(ufixed32x8)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUfixednxmBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_ufixednxm_bytes(ufixed32x8)byte[]'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_bytes(ufixed256x16)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBigufixednxmBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_bytes(ufixed256x16)byte[]'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_bytes(byte[])ufixed32x8` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUfixednxmFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_bytes(byte[])ufixed32x8'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_bytes(byte[])ufixed256x16` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBigufixednxmFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_ufixednxm_from_log(byte[])ufixed32x8` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUfixednxmFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyUfixednxmFromLog(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_log(byte[])ufixed32x8'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bigufixednxm_from_log(byte[])ufixed256x16` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBigufixednxmFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBigufixednxmFromLog(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_log(byte[])ufixed256x16'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringInit(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_init(string)string'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_add(string,string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringAdd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringAdd(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_add(string,string)string'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_eq(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringEq(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_eq(string,string)bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_bytes(string)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_bytes(string)byte[]'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_bytes(byte[])string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_from_bytes(byte[])string'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_string_from_log(byte[])string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyStringFromLog(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_string_from_log(byte[])string'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_bytes(bool)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBoolBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bool_bytes(bool)byte[]'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_bytes(byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBoolFromBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromBytes(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bool_from_bytes(byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_bool_from_log(byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBoolFromLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyBoolFromLog(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_bool_from_log(byte[])bool'])} + }, + + /** + * Makes a call to the Arc4PrimitiveOpsContract smart contract using the `verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEmit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(Arc4PrimitiveOpsContractParamsFactory.verifyEmit(params)) + return {...result, return: result.return as unknown as (undefined | Arc4PrimitiveOpsContractReturns['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new Arc4PrimitiveOpsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current Arc4PrimitiveOpsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): Arc4PrimitiveOpsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_uintn_uintn_eq(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnUintnEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnEq(params))) + return this + }, + /** + * Add a verify_biguintn_uintn_eq(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnUintnEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnEq(params))) + return this + }, + /** + * Add a verify_uintn_biguintn_eq(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnBiguintnEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnEq(params))) + return this + }, + /** + * Add a verify_biguintn_biguintn_eq(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnBiguintnEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnEq(params))) + return this + }, + /** + * Add a verify_uintn_uintn_ne(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnUintnNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnNe(params))) + return this + }, + /** + * Add a verify_biguintn_uintn_ne(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnUintnNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnNe(params))) + return this + }, + /** + * Add a verify_uintn_biguintn_ne(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnBiguintnNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnNe(params))) + return this + }, + /** + * Add a verify_biguintn_biguintn_ne(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnBiguintnNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnNe(params))) + return this + }, + /** + * Add a verify_uintn_uintn_lt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnUintnLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnLt(params))) + return this + }, + /** + * Add a verify_biguintn_uintn_lt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnUintnLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnLt(params))) + return this + }, + /** + * Add a verify_uintn_biguintn_lt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnBiguintnLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnLt(params))) + return this + }, + /** + * Add a verify_biguintn_biguintn_lt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnBiguintnLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnLt(params))) + return this + }, + /** + * Add a verify_uintn_uintn_le(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnUintnLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnLe(params))) + return this + }, + /** + * Add a verify_biguintn_uintn_le(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnUintnLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnLe(params))) + return this + }, + /** + * Add a verify_uintn_biguintn_le(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnBiguintnLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnLe(params))) + return this + }, + /** + * Add a verify_biguintn_biguintn_le(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnBiguintnLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnLe(params))) + return this + }, + /** + * Add a verify_uintn_uintn_gt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnUintnGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnGt(params))) + return this + }, + /** + * Add a verify_biguintn_uintn_gt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnUintnGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnGt(params))) + return this + }, + /** + * Add a verify_uintn_biguintn_gt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnBiguintnGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnGt(params))) + return this + }, + /** + * Add a verify_biguintn_biguintn_gt(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnBiguintnGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnGt(params))) + return this + }, + /** + * Add a verify_uintn_uintn_ge(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnUintnGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnUintnGe(params))) + return this + }, + /** + * Add a verify_biguintn_uintn_ge(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnUintnGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnUintnGe(params))) + return this + }, + /** + * Add a verify_uintn_biguintn_ge(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnBiguintnGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnBiguintnGe(params))) + return this + }, + /** + * Add a verify_biguintn_biguintn_ge(byte[],byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnBiguintnGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnBiguintnGe(params))) + return this + }, + /** + * Add a verify_uintn_init(byte[])uint32 method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnInit(params))) + return this + }, + /** + * Add a verify_biguintn_init(byte[])uint256 method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnInit(params))) + return this + }, + /** + * Add a verify_uintn_from_bytes(byte[])uint32 method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnFromBytes(params))) + return this + }, + /** + * Add a verify_biguintn_from_bytes(byte[])uint256 method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnFromBytes(params))) + return this + }, + /** + * Add a verify_uintn_from_log(byte[])uint32 method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintnFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintnFromLog(params))) + return this + }, + /** + * Add a verify_biguintn_from_log(byte[])uint256 method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnFromLog(params))) + return this + }, + /** + * Add a verify_biguintn_as_uint64(byte[])uint64 method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnAsUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnAsUint64(params))) + return this + }, + /** + * Add a verify_biguintn_as_biguint(byte[])uint512 method call against the Arc4PrimitiveOpsContract contract + */ + verifyBiguintnAsBiguint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintnAsBiguint(params))) + return this + }, + /** + * Add a verify_uintn64_as_uint64(byte[])uint64 method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintn64AsUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintn64AsUint64(params))) + return this + }, + /** + * Add a verify_uintn64_as_biguint(byte[])uint512 method call against the Arc4PrimitiveOpsContract contract + */ + verifyUintn64AsBiguint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUintn64AsBiguint(params))) + return this + }, + /** + * Add a verify_ufixednxm_bytes(ufixed32x8)byte[] method call against the Arc4PrimitiveOpsContract contract + */ + verifyUfixednxmBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUfixednxmBytes(params))) + return this + }, + /** + * Add a verify_bigufixednxm_bytes(ufixed256x16)byte[] method call against the Arc4PrimitiveOpsContract contract + */ + verifyBigufixednxmBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBigufixednxmBytes(params))) + return this + }, + /** + * Add a verify_ufixednxm_from_bytes(byte[])ufixed32x8 method call against the Arc4PrimitiveOpsContract contract + */ + verifyUfixednxmFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUfixednxmFromBytes(params))) + return this + }, + /** + * Add a verify_bigufixednxm_from_bytes(byte[])ufixed256x16 method call against the Arc4PrimitiveOpsContract contract + */ + verifyBigufixednxmFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBigufixednxmFromBytes(params))) + return this + }, + /** + * Add a verify_ufixednxm_from_log(byte[])ufixed32x8 method call against the Arc4PrimitiveOpsContract contract + */ + verifyUfixednxmFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUfixednxmFromLog(params))) + return this + }, + /** + * Add a verify_bigufixednxm_from_log(byte[])ufixed256x16 method call against the Arc4PrimitiveOpsContract contract + */ + verifyBigufixednxmFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBigufixednxmFromLog(params))) + return this + }, + /** + * Add a verify_string_init(string)string method call against the Arc4PrimitiveOpsContract contract + */ + verifyStringInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringInit(params))) + return this + }, + /** + * Add a verify_string_add(string,string)string method call against the Arc4PrimitiveOpsContract contract + */ + verifyStringAdd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringAdd(params))) + return this + }, + /** + * Add a verify_string_eq(string,string)bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyStringEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringEq(params))) + return this + }, + /** + * Add a verify_string_bytes(string)byte[] method call against the Arc4PrimitiveOpsContract contract + */ + verifyStringBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringBytes(params))) + return this + }, + /** + * Add a verify_string_from_bytes(byte[])string method call against the Arc4PrimitiveOpsContract contract + */ + verifyStringFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringFromBytes(params))) + return this + }, + /** + * Add a verify_string_from_log(byte[])string method call against the Arc4PrimitiveOpsContract contract + */ + verifyStringFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringFromLog(params))) + return this + }, + /** + * Add a verify_bool_bytes(bool)byte[] method call against the Arc4PrimitiveOpsContract contract + */ + verifyBoolBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBoolBytes(params))) + return this + }, + /** + * Add a verify_bool_from_bytes(byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBoolFromBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBoolFromBytes(params))) + return this + }, + /** + * Add a verify_bool_from_log(byte[])bool method call against the Arc4PrimitiveOpsContract contract + */ + verifyBoolFromLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBoolFromLog(params))) + return this + }, + /** + * Add a verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void method call against the Arc4PrimitiveOpsContract contract + */ + verifyEmit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEmit(params))) + return this + }, + /** + * Add a clear state call to the Arc4PrimitiveOpsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as Arc4PrimitiveOpsContractComposer + } +} +export type Arc4PrimitiveOpsContractComposer = { + /** + * Calls the verify_uintn_uintn_eq(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnUintnEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_eq(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_uintn_eq(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnUintnEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_eq(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_biguintn_eq(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnBiguintnEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_eq(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_biguintn_eq(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnBiguintnEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_eq(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_uintn_ne(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnUintnNe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ne(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_uintn_ne(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnUintnNe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ne(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_biguintn_ne(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnBiguintnNe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ne(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_biguintn_ne(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnBiguintnNe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ne(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_uintn_lt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnUintnLt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_lt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_uintn_lt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnUintnLt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_lt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_biguintn_lt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnBiguintnLt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_lt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_biguintn_lt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnBiguintnLt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_lt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_uintn_le(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnUintnLe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_le(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_uintn_le(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnUintnLe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_le(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_biguintn_le(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnBiguintnLe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_le(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_biguintn_le(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnBiguintnLe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_le(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_uintn_gt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnUintnGt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_gt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_uintn_gt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnUintnGt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_gt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_biguintn_gt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnBiguintnGt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_gt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_biguintn_gt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnBiguintnGt(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_gt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_uintn_ge(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnUintnGe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_uintn_ge(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_uintn_ge(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnUintnGe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_uintn_ge(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_biguintn_ge(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnBiguintnGe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_biguintn_ge(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguintn_biguintn_ge(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnBiguintnGe(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_biguintn_ge(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_uintn_init(byte[])uint32 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnInit(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_init(byte[])uint32'] | undefined]> + + /** + * Calls the verify_biguintn_init(byte[])uint256 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnInit(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_init(byte[])uint256'] | undefined]> + + /** + * Calls the verify_uintn_from_bytes(byte[])uint32 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_from_bytes(byte[])uint32'] | undefined]> + + /** + * Calls the verify_biguintn_from_bytes(byte[])uint256 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_from_bytes(byte[])uint256'] | undefined]> + + /** + * Calls the verify_uintn_from_log(byte[])uint32 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintnFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn_from_log(byte[])uint32'] | undefined]> + + /** + * Calls the verify_biguintn_from_log(byte[])uint256 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_from_log(byte[])uint256'] | undefined]> + + /** + * Calls the verify_biguintn_as_uint64(byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnAsUint64(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_as_uint64(byte[])uint64'] | undefined]> + + /** + * Calls the verify_biguintn_as_biguint(byte[])uint512 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintnAsBiguint(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_biguintn_as_biguint(byte[])uint512'] | undefined]> + + /** + * Calls the verify_uintn64_as_uint64(byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintn64AsUint64(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn64_as_uint64(byte[])uint64'] | undefined]> + + /** + * Calls the verify_uintn64_as_biguint(byte[])uint512 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUintn64AsBiguint(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_uintn64_as_biguint(byte[])uint512'] | undefined]> + + /** + * Calls the verify_ufixednxm_bytes(ufixed32x8)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUfixednxmBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_ufixednxm_bytes(ufixed32x8)byte[]'] | undefined]> + + /** + * Calls the verify_bigufixednxm_bytes(ufixed256x16)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBigufixednxmBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_bytes(ufixed256x16)byte[]'] | undefined]> + + /** + * Calls the verify_ufixednxm_from_bytes(byte[])ufixed32x8 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUfixednxmFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_bytes(byte[])ufixed32x8'] | undefined]> + + /** + * Calls the verify_bigufixednxm_from_bytes(byte[])ufixed256x16 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBigufixednxmFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_bytes(byte[])ufixed256x16'] | undefined]> + + /** + * Calls the verify_ufixednxm_from_log(byte[])ufixed32x8 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUfixednxmFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_ufixednxm_from_log(byte[])ufixed32x8'] | undefined]> + + /** + * Calls the verify_bigufixednxm_from_log(byte[])ufixed256x16 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBigufixednxmFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bigufixednxm_from_log(byte[])ufixed256x16'] | undefined]> + + /** + * Calls the verify_string_init(string)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringInit(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_init(string)string'] | undefined]> + + /** + * Calls the verify_string_add(string,string)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringAdd(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_add(string,string)string'] | undefined]> + + /** + * Calls the verify_string_eq(string,string)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringEq(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_eq(string,string)bool'] | undefined]> + + /** + * Calls the verify_string_bytes(string)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_bytes(string)byte[]'] | undefined]> + + /** + * Calls the verify_string_from_bytes(byte[])string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_from_bytes(byte[])string'] | undefined]> + + /** + * Calls the verify_string_from_log(byte[])string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_string_from_log(byte[])string'] | undefined]> + + /** + * Calls the verify_bool_bytes(bool)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBoolBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bool_bytes(bool)byte[]'] | undefined]> + + /** + * Calls the verify_bool_from_bytes(byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBoolFromBytes(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bool_from_bytes(byte[])bool'] | undefined]> + + /** + * Calls the verify_bool_from_log(byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBoolFromLog(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_bool_from_log(byte[])bool'] | undefined]> + + /** + * Calls the verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEmit(params?: CallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, Arc4PrimitiveOpsContractReturns['verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the Arc4PrimitiveOpsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): Arc4PrimitiveOpsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): Arc4PrimitiveOpsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type Arc4PrimitiveOpsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/BoxContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/BoxContract.ts new file mode 100644 index 0000000..146a2d5 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/BoxContract.ts @@ -0,0 +1,2352 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"BoxContract","structs":{"InnerStruct":[{"name":"c","type":"uint64"},{"name":"arrArr","type":"uint64[][]"},{"name":"d","type":"uint64"}],"LargeStruct":[{"name":"a","type":"byte[1024]"},{"name":"b","type":"byte[1024]"},{"name":"c","type":"byte[1024]"},{"name":"d","type":"byte[1024]"},{"name":"e","type":"uint64"},{"name":"f","type":"byte[1024]"},{"name":"g","type":"byte[1024]"},{"name":"h","type":"uint64"}],"NestedStruct":[{"name":"a","type":"uint64"},{"name":"inner","type":"InnerStruct"},{"name":"woah","type":"(uint64,uint64[][],uint64)[]"},{"name":"b","type":"uint64"}]},"methods":[{"name":"store_enums","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"read_enums","args":[],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_boxes","args":[{"type":"uint64","name":"a"},{"type":"byte[]","name":"b"},{"type":"string","name":"c"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"boxes_exist","args":[],"returns":{"type":"(bool,bool,bool,bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"check_keys","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"read_boxes","args":[],"returns":{"type":"(uint64,byte[],string,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"indirect_extract_and_replace","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"delete_boxes","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"slice_box","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"arc4_box","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"create_many_ints","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_many_ints","args":[{"type":"uint64","name":"index"},{"type":"uint64","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"sum_many_ints","args":[],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_box_ref","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_nested_struct","args":[{"type":"(uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64)","struct":"NestedStruct","name":"struct"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"nested_write","args":[{"type":"uint64","name":"index"},{"type":"uint64","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"nested_read","args":[{"type":"uint64","name":"i1"},{"type":"uint64","name":"i2"},{"type":"uint64","name":"i3"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"create_bools","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_bool","args":[{"type":"uint64","name":"index"},{"type":"bool","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"sum_bools","args":[{"type":"uint64","name":"stop_at_total"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_test","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_set","args":[{"type":"uint64","name":"key"},{"type":"string","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_get","args":[{"type":"uint64","name":"key"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_del","args":[{"type":"uint64","name":"key"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"box_map_exists","args":[{"type":"uint64","name":"key"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{"oca":{"keyType":"AVMString","valueType":"uint64","key":"b2Nh"},"txn":{"keyType":"AVMString","valueType":"uint64","key":"dHhu"},"box_a":{"keyType":"AVMString","valueType":"uint64","key":"Ym94X2E="},"box_b":{"keyType":"AVMString","valueType":"byte[]","key":"Yg=="},"box_c":{"keyType":"AVMBytes","valueType":"string","key":"Qk9YX0M="},"box_d":{"keyType":"AVMString","valueType":"AVMBytes","key":"Ym94X2Q="},"many_ints":{"keyType":"AVMString","valueType":"uint64[513]","key":"bWFueV9pbnRz"},"box_ref":{"keyType":"AVMString","valueType":"AVMBytes","key":"Ym94X3JlZg=="},"box_large":{"keyType":"AVMString","valueType":"LargeStruct","key":"Ym94X2xhcmdl"},"too_many_bools":{"keyType":"AVMString","valueType":"bool[33000]","key":"dG9vX21hbnlfYm9vbHM="}}},"maps":{"global":{},"local":{},"box":{"box_map":{"keyType":"uint64","valueType":"AVMString","prefix":""}}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[842],"errorMessage":"check Box exists"},{"pc":[486],"errorMessage":"check self.box_a exists"},{"pc":[851],"errorMessage":"check self.box_b exists"},{"pc":[514,857],"errorMessage":"check self.box_c exists"},{"pc":[1932],"errorMessage":"check self.box_map entry exists"},{"pc":[1178],"errorMessage":"check self.many_ints exists"},{"pc":[378],"errorMessage":"check self.oca exists"},{"pc":[1795],"errorMessage":"check self.too_many_bools exists"},{"pc":[390],"errorMessage":"check self.txn exists"},{"pc":[1773],"errorMessage":"index access is out of bounds"},{"pc":[1398,1425,1492,1517,1539,1587,1614,1660,1685,1710],"errorMessage":"index out of bounds"},{"pc":[1228],"errorMessage":"no data"},{"pc":[1329],"errorMessage":"struct.a is truthy"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDIgMCA4IDQwOTYgNDA5OCA0MTM4CiAgICBieXRlY2Jsb2NrICJib3giIDB4NDI0ZjU4NWY0MyAiYmxvYiIgImJveF9sYXJnZSIgMHgxNTFmN2M3NSAiYm94X2EiICJib3hfZCIgImIiICJ0b29fbWFueV9ib29scyIgIm1hbnlfaW50cyIgIjAiIDB4MDAwMjM0MzIgMHg2ODY1NmM2YzZmIDB4NmY2MzYxIDB4NzQ3ODZlIDB4MDY4MTAxICJib3hfcmVmIiAiZGVmYXVsdCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo1OQogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDM0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhmMjZjNmQ0MiAweGVmMTg2Y2Y3IDB4N2QzNzI5NmUgMHhmMTNkZDkzNyAweDMzMzI1ZDNkIDB4YTYxNzQ4MTIgMHhmYWJjYjg4NSAweGQ1NjZjNjMyIDB4MDRlZjQ5NzEgMHgyM2VjYjMyYyAweDAxOTk0MDhkIDB4NzcyMDU5Y2EgMHgwMTI2M2RmNiAweGVlZjc1ODE2IDB4OTk2NDk3YWUgMHg2Y2VjNzJmZiAweDZmOWQxMDc1IDB4NTllZjM3NjAgMHhhYTY2NmI5NiAweGRmYmRkNjM2IDB4YjUzMjkxM2EgMHhjMjlmMTY2OSAweDljODg4YzA5IDB4ZTZmNjg1MDYgMHg4ZWUyYzM2NCAvLyBtZXRob2QgInN0b3JlX2VudW1zKCl2b2lkIiwgbWV0aG9kICJyZWFkX2VudW1zKCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInNldF9ib3hlcyh1aW50NjQsYnl0ZVtdLHN0cmluZyl2b2lkIiwgbWV0aG9kICJib3hlc19leGlzdCgpKGJvb2wsYm9vbCxib29sLGJvb2wpIiwgbWV0aG9kICJjaGVja19rZXlzKCl2b2lkIiwgbWV0aG9kICJyZWFkX2JveGVzKCkodWludDY0LGJ5dGVbXSxzdHJpbmcsdWludDY0KSIsIG1ldGhvZCAiaW5kaXJlY3RfZXh0cmFjdF9hbmRfcmVwbGFjZSgpdm9pZCIsIG1ldGhvZCAiZGVsZXRlX2JveGVzKCl2b2lkIiwgbWV0aG9kICJzbGljZV9ib3goKXZvaWQiLCBtZXRob2QgImFyYzRfYm94KCl2b2lkIiwgbWV0aG9kICJjcmVhdGVfbWFueV9pbnRzKCl2b2lkIiwgbWV0aG9kICJzZXRfbWFueV9pbnRzKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAic3VtX21hbnlfaW50cygpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2JveF9yZWYoKXZvaWQiLCBtZXRob2QgInNldF9uZXN0ZWRfc3RydWN0KCh1aW50NjQsKHVpbnQ2NCx1aW50NjRbXVtdLHVpbnQ2NCksKHVpbnQ2NCx1aW50NjRbXVtdLHVpbnQ2NClbXSx1aW50NjQpKXZvaWQiLCBtZXRob2QgIm5lc3RlZF93cml0ZSh1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgIm5lc3RlZF9yZWFkKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiY3JlYXRlX2Jvb2xzKCl2b2lkIiwgbWV0aG9kICJzZXRfYm9vbCh1aW50NjQsYm9vbCl2b2lkIiwgbWV0aG9kICJzdW1fYm9vbHModWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiYm94X21hcF90ZXN0KCl2b2lkIiwgbWV0aG9kICJib3hfbWFwX3NldCh1aW50NjQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImJveF9tYXBfZ2V0KHVpbnQ2NClzdHJpbmciLCBtZXRob2QgImJveF9tYXBfZGVsKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJib3hfbWFwX2V4aXN0cyh1aW50NjQpYm9vbCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHN0b3JlX2VudW1zIHJlYWRfZW51bXMgc2V0X2JveGVzIGJveGVzX2V4aXN0IG1haW5fY2hlY2tfa2V5c19yb3V0ZUAxMCByZWFkX2JveGVzIGluZGlyZWN0X2V4dHJhY3RfYW5kX3JlcGxhY2UgZGVsZXRlX2JveGVzIHNsaWNlX2JveCBtYWluX2FyYzRfYm94X3JvdXRlQDE1IG1haW5fY3JlYXRlX21hbnlfaW50c19yb3V0ZUAxNiBzZXRfbWFueV9pbnRzIHN1bV9tYW55X2ludHMgdGVzdF9ib3hfcmVmIHNldF9uZXN0ZWRfc3RydWN0IG5lc3RlZF93cml0ZSBuZXN0ZWRfcmVhZCBtYWluX2NyZWF0ZV9ib29sc19yb3V0ZUAyMyBzZXRfYm9vbCBzdW1fYm9vbHMgYm94X21hcF90ZXN0IGJveF9tYXBfc2V0IGJveF9tYXBfZ2V0IGJveF9tYXBfZGVsIGJveF9tYXBfZXhpc3RzCiAgICBlcnIKCm1haW5fY3JlYXRlX2Jvb2xzX3JvdXRlQDIzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI4MQogICAgLy8gc2VsZi50b29fbWFueV9ib29scy5jcmVhdGUoKQogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICBwdXNoaW50IDQxMjUKICAgIGJveF9jcmVhdGUKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NyZWF0ZV9tYW55X2ludHNfcm91dGVAMTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTgxCiAgICAvLyBzZWxmLm1hbnlfaW50cy5jcmVhdGUoKQogICAgYnl0ZWMgOSAvLyAibWFueV9pbnRzIgogICAgcHVzaGludCA0MTA0CiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzRfYm94X3JvdXRlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE3MS0xNzIKICAgIC8vIGJveF9kID0gQm94KFN0YXRpY0ludHMsIGtleT1CeXRlcyhiImQiKSkKICAgIC8vIGJveF9kLnZhbHVlID0gU3RhdGljSW50cyhhcmM0LlVJbnQ4KDApLCBhcmM0LlVJbnQ4KDEpLCBhcmM0LlVJbnQ4KDIpLCBhcmM0LlVJbnQ4KDMpKQogICAgcHVzaGJ5dGVzcyAweDY0IDB4MDAwMTAyMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNzIKICAgIC8vIGJveF9kLnZhbHVlID0gU3RhdGljSW50cyhhcmM0LlVJbnQ4KDApLCBhcmM0LlVJbnQ4KDEpLCBhcmM0LlVJbnQ4KDIpLCBhcmM0LlVJbnQ4KDMpKQogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoZWNrX2tleXNfcm91dGVAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMzQ6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdG9yZV9lbnVtc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnN0b3JlX2VudW1zOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBzZWxmLm9jYS52YWx1ZSA9IE9uQ29tcGxldGVBY3Rpb24uT3B0SW4KICAgIGludGNfMCAvLyBPcHRJbgogICAgaXRvYgogICAgYnl0ZWMgMTMgLy8gIm9jYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3NgogICAgLy8gc2VsZi50eG4udmFsdWUgPSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXRvYgogICAgYnl0ZWMgMTQgLy8gInR4biIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QucmVhZF9lbnVtc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlYWRfZW51bXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODAKICAgIC8vIGFzc2VydCBvcC5Cb3guZ2V0KGIib2NhIilbMF0gPT0gb3AuaXRvYihzZWxmLm9jYS52YWx1ZSkKICAgIGJ5dGVjIDEzIC8vIDB4NmY2MzYxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vY2EgZXhpc3RzCiAgICBkdXAKICAgIGJ0b2kKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODEKICAgIC8vIGFzc2VydCBvcC5Cb3guZ2V0KGIidHhuIilbMF0gPT0gb3AuaXRvYihzZWxmLnR4bi52YWx1ZSkKICAgIGJ5dGVjIDE0IC8vIDB4NzQ3ODZlCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50eG4gZXhpc3RzCiAgICBkdXAKICAgIGJ0b2kKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODMKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKChhcmM0LlVJbnQ2NChzZWxmLm9jYS52YWx1ZSksIGFyYzQuVUludDY0KHNlbGYudHhuLnZhbHVlKSkpCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3Quc2V0X2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2JveGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4NwogICAgLy8gc2VsZi5ib3hfYS52YWx1ZSA9IGEKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgYnl0ZWMgNSAvLyAiYm94X2EiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODgKICAgIC8vIHNlbGYuYm94X2IudmFsdWUgPSBiLmNvcHkoKQogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODkKICAgIC8vIHNlbGYuYm94X2MudmFsdWUgPSBjCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5MAogICAgLy8gc2VsZi5ib3hfZC52YWx1ZSA9IGIubmF0aXZlCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyA2IC8vICJib3hfZCIKICAgIGRpZyAxCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6OTEKICAgIC8vIHNlbGYuYm94X2xhcmdlLmNyZWF0ZSgpCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBwdXNoaW50IDYxNjAKICAgIGJveF9jcmVhdGUKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjkyCiAgICAvLyBzZWxmLmJveF9sYXJnZS52YWx1ZS5lID0gVUludDY0KDQyKQogICAgcHVzaGludCA0MgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgaW50YyA0IC8vIDQwOTYKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5MwogICAgLy8gc2VsZi5ib3hfbGFyZ2UucmVwbGFjZShzaXplX29mKEJ5dGVzMTAyNCkgKiA0LCBhcmM0LlVJbnQ2NCg0MikuYnl0ZXMpCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBpbnRjIDQgLy8gNDA5NgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAyYQogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5OAogICAgLy8gc2VsZi5ib3hfYS52YWx1ZSArPSAzCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9hIGV4aXN0cwogICAgYnRvaQogICAgcHVzaGludCAzCiAgICArCiAgICBpdG9iCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMDAtMTAxCiAgICAvLyAjIHRlc3QgLmxlbmd0aAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2EubGVuZ3RoID09IDgKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2IubGVuZ3RoID09IGIuYnl0ZXMubGVuZ3RoCiAgICBieXRlYyA3IC8vICJiIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkaWcgMwogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTAzCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy5sZW5ndGggPT0gYy5ieXRlcy5sZW5ndGgKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYyBleGlzdHMKICAgIGRpZyAyCiAgICBsZW4KICAgIGR1cDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMDQKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLmxlbmd0aCA9PSBiLm5hdGl2ZS5sZW5ndGgKICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkaWcgMwogICAgbGVuCiAgICBkdXAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTA2LTEwNwogICAgLy8gIyB0ZXN0IC52YWx1ZS5ieXRlcwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbMF0gPT0gYy5ieXRlc1swXQogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGludGNfMiAvLyAwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyA2CiAgICBleHRyYWN0IDAgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwOAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbLTFdID09IGMuYnl0ZXNbLTFdCiAgICBkaWcgMwogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZGlnIDcKICAgIHN3YXAKICAgIGludGNfMCAvLyAxCiAgICBleHRyYWN0MwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbOi0xXSA9PSBjLmJ5dGVzWzotMV0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgNAogICAgPAogICAgZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDEKICAgIGRpZyA0CiAgICA+PQogICAgaW50Y18wIC8vIDEKICAgIGRpZyA1CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHN3YXAKICAgIC0KICAgIGRpZyA3CiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTEwCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy52YWx1ZS5ieXRlc1s6Ml0gPT0gYy5ieXRlc1s6Ml0KICAgIGludGNfMSAvLyAyCiAgICBkaWcgNAogICAgPAogICAgdW5jb3ZlciA0CiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18xIC8vIDIKICAgIGRpZyA0CiAgICA+PQogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgNQogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExMi0xMTMKICAgIC8vICMgdGVzdCAudmFsdWUgd2l0aCBCeXRlcyB0eXBlCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVswXSA9PSBiLm5hdGl2ZVswXQogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICB1bmNvdmVyIDQKICAgIGV4dHJhY3QgMiAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTE0CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVstMV0gPT0gYi5uYXRpdmVbLTFdCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgc3dhcAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGRpZyA0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgZXh0cmFjdDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMTUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWzotMV0gPT0gYi5uYXRpdmVbOi0xXQogICAgaW50Y18wIC8vIDEKICAgIGRpZyAyCiAgICA8CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMgogICAgc3dhcAogICAgLQogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDEKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18wIC8vIDEKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDIKICAgIHN3YXAKICAgIC0KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVs6NV0gPT0gYi5uYXRpdmVbOjVdCiAgICBwdXNoaW50IDUKICAgIGRpZyAyCiAgICA8CiAgICBkaWcgMgogICAgcHVzaGludCA1CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgcHVzaGludCA1CiAgICBkaWcgMgogICAgPj0KICAgIHB1c2hpbnQgNQogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgNAogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExNwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2QudmFsdWVbOiBVSW50NjQoMildID09IGIubmF0aXZlWzogVUludDY0KDIpXQogICAgaW50Y18xIC8vIDIKICAgIGRpZyAyCiAgICA8CiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18xIC8vIDIKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExOQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2xhcmdlLmxlbmd0aCA9PSBzaXplX29mKExhcmdlU3RydWN0KQogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgYm94X2xlbgogICAgcG9wCiAgICBwdXNoaW50IDYxNjAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmJveGVzX2V4aXN0W3JvdXRpbmddKCkgLT4gdm9pZDoKYm94ZXNfZXhpc3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTIzCiAgICAvLyByZXR1cm4gYm9vbChzZWxmLmJveF9hKSwgYm9vbChzZWxmLmJveF9iKSwgYm9vbChzZWxmLmJveF9jKSwgYm9vbChzZWxmLmJveF9sYXJnZSkKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieXRlYyA3IC8vICJiIgogICAgYm94X2xlbgogICAgY292ZXIgMgogICAgcG9wCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2xlbgogICAgY292ZXIgMwogICAgcG9wCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBib3hfbGVuCiAgICBjb3ZlciA0CiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMwogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QucmVhZF9ib3hlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlYWRfYm94ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM1CiAgICAvLyBnZXRfYm94X3ZhbHVlX3BsdXNfMShzZWxmLmJveF9hKSAtIDEsCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozNDUKICAgIC8vIHJldHVybiBib3gudmFsdWUgKyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMzUKICAgIC8vIGdldF9ib3hfdmFsdWVfcGx1c18xKHNlbGYuYm94X2EpIC0gMSwKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM2CiAgICAvLyBzZWxmLmJveF9iLnZhbHVlLm5hdGl2ZSwKICAgIGJ5dGVjIDcgLy8gImIiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYiBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM3CiAgICAvLyBzZWxmLmJveF9jLnZhbHVlLAogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9jIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEzOAogICAgLy8gc2VsZi5ib3hfbGFyZ2UudmFsdWUuZSwKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIGludGMgNCAvLyA0MDk2CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMTQKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCAyMAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmluZGlyZWN0X2V4dHJhY3RfYW5kX3JlcGxhY2Vbcm91dGluZ10oKSAtPiB2b2lkOgppbmRpcmVjdF9leHRyYWN0X2FuZF9yZXBsYWNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0MwogICAgLy8gbGFyZ2UgPSBzZWxmLmJveF9sYXJnZS52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyBsYXJnZSA9IHNlbGYuYm94X2xhcmdlLnZhbHVlLmNvcHkoKQogICAgLy8gbGFyZ2UuZSArPSAxCiAgICBpbnRjIDQgLy8gNDA5NgogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTQ0CiAgICAvLyBsYXJnZS5lICs9IDEKICAgIGJ0b2kKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTQ1CiAgICAvLyBzZWxmLmJveF9sYXJnZS52YWx1ZSA9IGxhcmdlLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0My0xNDUKICAgIC8vIGxhcmdlID0gc2VsZi5ib3hfbGFyZ2UudmFsdWUuY29weSgpCiAgICAvLyBsYXJnZS5lICs9IDEKICAgIC8vIHNlbGYuYm94X2xhcmdlLnZhbHVlID0gbGFyZ2UuY29weSgpCiAgICBpbnRjIDQgLy8gNDA5NgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuZGVsZXRlX2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZGVsZXRlX2JveGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0OQogICAgLy8gZGVsIHNlbGYuYm94X2EudmFsdWUKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTUwCiAgICAvLyBkZWwgc2VsZi5ib3hfYi52YWx1ZQogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE1MQogICAgLy8gZGVsIHNlbGYuYm94X2MudmFsdWUKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTIKICAgIC8vIGFzc2VydCBzZWxmLmJveF9hLmdldChkZWZhdWx0PVVJbnQ2NCg0MikpID09IDQyCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIHB1c2hpbnQgNDIKICAgIGRpZyAxCiAgICBkaWcgMwogICAgc2VsZWN0CiAgICBwdXNoaW50IDQyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTUzCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYi5nZXQoZGVmYXVsdD1hcmM0LkR5bmFtaWNCeXRlcyhiIjQyIikpLm5hdGl2ZSA9PSBiIjQyIgogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9nZXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMjM0MzIKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAweDM0MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTQKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLmdldChkZWZhdWx0PWFyYzQuU3RyaW5nKCI0MiIpKSA9PSAiNDIiCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2dldAogICAgYnl0ZWMgMTEgLy8gMHgwMDAyMzQzMgogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlYyAxMSAvLyAweDAwMDIzNDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTU2CiAgICAvLyBhc3NlcnQgbm90IGFfZXhpc3RzCiAgICBzd2FwCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTcKICAgIC8vIGFzc2VydCBhID09IDAKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE1OAogICAgLy8gZGVsIHNlbGYuYm94X2xhcmdlLnZhbHVlCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zbGljZV9ib3hbcm91dGluZ10oKSAtPiB2b2lkOgpzbGljZV9ib3g6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYyCiAgICAvLyBib3hfMCA9IEJveChCeXRlcywga2V5PVN0cmluZygiMCIpKQogICAgYnl0ZWMgMTAgLy8gIjAiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYzCiAgICAvLyBib3hfMC52YWx1ZSA9IEJ5dGVzKGIiVGVzdGluZyB0ZXN0aW5nIDEyMyIpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjIKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyAxMCAvLyAiMCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjMKICAgIC8vIGJveF8wLnZhbHVlID0gQnl0ZXMoYiJUZXN0aW5nIHRlc3RpbmcgMTIzIikKICAgIHB1c2hieXRlcyAweDU0NjU3Mzc0Njk2ZTY3MjA3NDY1NzM3NDY5NmU2NzIwMzEzMjMzCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYyCiAgICAvLyBib3hfMCA9IEJveChCeXRlcywga2V5PVN0cmluZygiMCIpKQogICAgYnl0ZWMgMTAgLy8gIjAiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTY0CiAgICAvLyBhc3NlcnQgYm94XzAudmFsdWVbMDo3XSA9PSBiIlRlc3RpbmciCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGR1cAogICAgaW50Y18yIC8vIDAKICAgIGRpZyAyCiAgICBzZWxlY3QKICAgIHB1c2hpbnQgNwogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDEKICAgIC0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjIKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyAxMCAvLyAiMCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjQKICAgIC8vIGFzc2VydCBib3hfMC52YWx1ZVswOjddID09IGIiVGVzdGluZyIKICAgIGNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBwdXNoYnl0ZXMgMHg1NDY1NzM3NDY5NmU2NwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2NgogICAgLy8gc2VsZi5ib3hfYy52YWx1ZSA9IGFyYzQuU3RyaW5nKCJIZWxsbyIpCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgcHVzaGJ5dGVzIDB4MDAwNTQ4NjU2YzZjNmYKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjcKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLnZhbHVlLmJ5dGVzWzI6MTBdID09IGIiSGVsbG8iCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzEgLy8gMgogICAgZGlnIDEKICAgIDwKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHB1c2hpbnQgMTAKICAgIGRpZyAyCiAgICA8CiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgMTAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMQogICAgLQogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBwdXNoYnl0ZXMgMHg0ODY1NmM2YzZmCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3Quc2V0X21hbnlfaW50c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9tYW55X2ludHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE4NQogICAgLy8gc2VsZi5tYW55X2ludHMudmFsdWVbaW5kZXhdID0gdmFsdWUKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBieXRlYyA5IC8vICJtYW55X2ludHMiCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdW1fbWFueV9pbnRzW3JvdXRpbmddKCkgLT4gdm9pZDoKc3VtX21hbnlfaW50czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCgpzdW1fbWFueV9pbnRzX3doaWxlX3RvcEA3OgogICAgcHVzaGludCAxMDUxMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogc3VtX21hbnlfaW50c19hZnRlcl93aGlsZUAxMgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDE1IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMTUgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGludGNfMiAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgc3VtX21hbnlfaW50c193aGlsZV90b3BANwoKc3VtX21hbnlfaW50c19hZnRlcl93aGlsZUAxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTAKICAgIC8vIHRvdGFsID0gVUludDY0KDApCiAgICBpbnRjXzIgLy8gMAogICAgYnVyeSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTkxCiAgICAvLyBmb3IgdmFsIGluIHNlbGYubWFueV9pbnRzLnZhbHVlOgogICAgYnl0ZWMgOSAvLyAibWFueV9pbnRzIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYW55X2ludHMgZXhpc3RzCiAgICBpbnRjXzIgLy8gMAogICAgYnVyeSAyCgpzdW1fbWFueV9pbnRzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTEKICAgIC8vIGZvciB2YWwgaW4gc2VsZi5tYW55X2ludHMudmFsdWU6CiAgICBkaWcgMQogICAgcHVzaGludCA1MTMKICAgIDwKICAgIGJ6IHN1bV9tYW55X2ludHNfYWZ0ZXJfZm9yQDUKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBieXRlYyA5IC8vICJtYW55X2ludHMiCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTIKICAgIC8vIHRvdGFsID0gdG90YWwgKyB2YWwKICAgIGRpZyAyCiAgICArCiAgICBidXJ5IDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDIKICAgIGIgc3VtX21hbnlfaW50c19mb3JfaGVhZGVyQDIKCnN1bV9tYW55X2ludHNfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnRlc3RfYm94X3JlZltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYm94X3JlZjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTctMTk4CiAgICAvLyAjIGluaXQgcmVmLCB3aXRoIHZhbGlkIGtleSB0eXBlcwogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PSJibG9iIikKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTk5CiAgICAvLyBhc3NlcnQgbm90IGJveF9yZWYsICJubyBkYXRhIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gbm8gZGF0YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDctMjA4CiAgICAvLyAjIGNyZWF0ZQogICAgLy8gYXNzZXJ0IGJveF9yZWYuY3JlYXRlKHNpemU9VUludDY0KDMyKSkKICAgIHB1c2hpbnQgMzIKICAgIGJveF9jcmVhdGUKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxMS0yMTIKICAgIC8vICMgbWFuaXB1bGF0ZSBkYXRhCiAgICAvLyBzZW5kZXJfYnl0ZXMgPSBUeG4uc2VuZGVyLmJ5dGVzCiAgICB0eG4gU2VuZGVyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjEzCiAgICAvLyBhcHBfYWRkcmVzcyA9IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MuYnl0ZXMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxNQogICAgLy8gYm94X3JlZi5yZXBsYWNlKDAsIHNlbmRlcl9ieXRlcykKICAgIGludGNfMiAvLyAwCiAgICBkaWcgMwogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE2CiAgICAvLyBib3hfcmVmLnJlc2l6ZSg4MDAwKQogICAgcHVzaGludCA4MDAwCiAgICBib3hfcmVzaXplCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxNwogICAgLy8gYm94X3JlZi5zcGxpY2UoMCwgMCwgYXBwX2FkZHJlc3MpCiAgICBpbnRjXzIgLy8gMAogICAgZHVwCiAgICBkaWcgMwogICAgYm94X3NwbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTgKICAgIC8vIGJveF9yZWYucmVwbGFjZSg2NCwgdmFsdWVfMykKICAgIHB1c2hpbnQgNjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTQKICAgIC8vIHZhbHVlXzMgPSBCeXRlcyhiImhlbGxvIikKICAgIGJ5dGVjIDEyIC8vIDB4Njg2NTZjNmM2ZgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxOAogICAgLy8gYm94X3JlZi5yZXBsYWNlKDY0LCB2YWx1ZV8zKQogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE5CiAgICAvLyBwcmVmaXggPSBib3hfcmVmLmV4dHJhY3QoMCwgMzIgKiAyICsgdmFsdWVfMy5sZW5ndGgpCiAgICBpbnRjXzIgLy8gMAogICAgcHVzaGludCA2OQogICAgYm94X2V4dHJhY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMjAKICAgIC8vIGFzc2VydCBwcmVmaXggPT0gYXBwX2FkZHJlc3MgKyBzZW5kZXJfYnl0ZXMgKyB2YWx1ZV8zCiAgICBkaWcgMQogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxNAogICAgLy8gdmFsdWVfMyA9IEJ5dGVzKGIiaGVsbG8iKQogICAgYnl0ZWMgMTIgLy8gMHg2ODY1NmM2YzZmCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjIwCiAgICAvLyBhc3NlcnQgcHJlZml4ID09IGFwcF9hZGRyZXNzICsgc2VuZGVyX2J5dGVzICsgdmFsdWVfMwogICAgY29uY2F0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyMi0yMjMKICAgIC8vICMgZGVsZXRlCiAgICAvLyBkZWwgYm94X3JlZi52YWx1ZQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyNi0yMjcKICAgIC8vICMgcXVlcnkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBib3hfcmVmLm1heWJlKCkKICAgIGJveF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMjgKICAgIC8vIGFzc2VydCBub3QgZXhpc3RzCiAgICBkdXAKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyOQogICAgLy8gYXNzZXJ0IHZhbHVlID09IGIiIgogICAgZGlnIDEKICAgIHB1c2hieXRlcyAweAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzMAogICAgLy8gYXNzZXJ0IGJveF9yZWYuZ2V0KGRlZmF1bHQ9c2VuZGVyX2J5dGVzKSA9PSBzZW5kZXJfYnl0ZXMKICAgIGRpZyAzCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjMyLTIzMwogICAgLy8gIyB1cGRhdGUKICAgIC8vIGJveF9yZWYudmFsdWUgPSBzZW5kZXJfYnl0ZXMgKyBhcHBfYWRkcmVzcwogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzMi0yMzMKICAgIC8vICMgdXBkYXRlCiAgICAvLyBib3hfcmVmLnZhbHVlID0gc2VuZGVyX2J5dGVzICsgYXBwX2FkZHJlc3MKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMzItMjMzCiAgICAvLyAjIHVwZGF0ZQogICAgLy8gYm94X3JlZi52YWx1ZSA9IHNlbmRlcl9ieXRlcyArIGFwcF9hZGRyZXNzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzNAogICAgLy8gYXNzZXJ0IGJveF9yZWYsICJCbG9iIGV4aXN0cyIKICAgIGJveF9sZW4KICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzNQogICAgLy8gYXNzZXJ0IGJveF9yZWYubGVuZ3RoID09IDY0CiAgICBwdXNoaW50IDY0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjM4LTIzOQogICAgLy8gIyBpbnN0YW5jZSBib3ggcmVmCiAgICAvLyBzZWxmLmJveF9yZWYuY3JlYXRlKHNpemU9VUludDY0KDMyKSkKICAgIGJ5dGVjIDE2IC8vICJib3hfcmVmIgogICAgcHVzaGludCAzMgogICAgYm94X2NyZWF0ZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQxCiAgICAvLyBkZWwgc2VsZi5ib3hfcmVmLnZhbHVlCiAgICBieXRlYyAxNiAvLyAiYm94X3JlZiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnNldF9uZXN0ZWRfc3RydWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X25lc3RlZF9zdHJ1Y3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0NgogICAgLy8gYXNzZXJ0IHN0cnVjdC5hLCAic3RydWN0LmEgaXMgdHJ1dGh5IgogICAgaW50Y18yIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBhc3NlcnQgLy8gc3RydWN0LmEgaXMgdHJ1dGh5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ3CiAgICAvLyBzdHJ1Y3RfYnl0ZXMgPSBUeG4uYXBwbGljYXRpb25fYXJncygxKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0OAogICAgLy8gc3RydWN0X3NpemUgPSBzdHJ1Y3RfYnl0ZXMubGVuZ3RoCiAgICBkdXAKICAgIGxlbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0OQogICAgLy8gdGFpbF9vZmZzZXQgPSBVSW50NjQoNDA5NiArIDIpCiAgICBpbnRjIDUgLy8gNDA5OAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1MC0yNTEKICAgIC8vICMgaW5pdGlhbGl6ZSBib3ggdG8gemVybwogICAgLy8gYm94LmNyZWF0ZShzaXplPXRhaWxfb2Zmc2V0ICsgc3RydWN0X3NpemUpCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ1CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTAtMjUxCiAgICAvLyAjIGluaXRpYWxpemUgYm94IHRvIHplcm8KICAgIC8vIGJveC5jcmVhdGUoc2l6ZT10YWlsX29mZnNldCArIHN0cnVjdF9zaXplKQogICAgc3dhcAogICAgYm94X2NyZWF0ZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ1CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTItMjUzCiAgICAvLyAjIHNldCBjb3JyZWN0IG9mZnNldCBmb3IgZHluYW1pYyBwb3J0aW9uCiAgICAvLyBib3gucmVwbGFjZSh0YWlsX29mZnNldCAtIDIsIGFyYzQuVUludDE2KHRhaWxfb2Zmc2V0KS5ieXRlcykKICAgIGludGMgNCAvLyA0MDk2CiAgICBwdXNoYnl0ZXMgMHgxMDAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0NQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ5CiAgICAvLyB0YWlsX29mZnNldCA9IFVJbnQ2NCg0MDk2ICsgMikKICAgIGludGMgNSAvLyA0MDk4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU0LTI1NQogICAgLy8gIyBzZXQgZHluYW1pYyBkYXRhCiAgICAvLyBib3gucmVwbGFjZSh0YWlsX29mZnNldCwgc3RydWN0X2J5dGVzKQogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QubmVzdGVkX3dyaXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKbmVzdGVkX3dyaXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYwCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmEgPSB2YWx1ZQogICAgaW50YyA1IC8vIDQwOTgKICAgIHVuY292ZXIgMwogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjEKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuYiA9IHZhbHVlICsgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYxCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmIgPSB2YWx1ZSArIDEKICAgIHB1c2hpbnQgNDExMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MgogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MgogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDIKICAgIHB1c2hpbnQgNDEzNgogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMwogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICBkaWcgMwogICAgKgogICAgaW50YyA2IC8vIDQxMzgKICAgIGRpZyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGMgNiAvLyA0MTM4CiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNQogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkaWcgNAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYzCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmlubmVyLmMgPSB2YWx1ZSArIDMKICAgIGRpZyAyCiAgICBwdXNoaW50IDMKICAgICsKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MwogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5jID0gdmFsdWUgKyAzCiAgICBwdXNoaW50IDQxMTgKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjQKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuZCA9IHZhbHVlICsgNAogICAgZGlnIDIKICAgIHB1c2hpbnQgNAogICAgKwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY0CiAgICAvLyBib3gudmFsdWUubmVzdGVkLmlubmVyLmQgPSB2YWx1ZSArIDQKICAgIHB1c2hpbnQgNDEyOAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA1CiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjUKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQud29haFtpbmRleF0uYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyA1CiAgICBwdXNoaW50IDQxMDgKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA1IC8vIDQwOTgKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyA1CiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGR1cAogICAgZGlnIDQKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgKwogICAgcHVzaGludCAxOAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDUKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZHVwCiAgICB1bmNvdmVyIDQKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgdW5jb3ZlciA0CiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgICsKICAgIHVuY292ZXIgMgogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QubmVzdGVkX3JlYWRbcm91dGluZ10oKSAtPiB2b2lkOgpuZXN0ZWRfcmVhZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzAKICAgIC8vIGEgPSBib3gudmFsdWUubmVzdGVkLmEKICAgIGludGMgNSAvLyA0MDk4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MQogICAgLy8gYiA9IGJveC52YWx1ZS5uZXN0ZWQuYgogICAgcHVzaGludCA0MTEwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBwdXNoaW50IDQxMzYKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDUKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgZGlnIDUKICAgICoKICAgIGludGMgNiAvLyA0MTM4CiAgICBkaWcgMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjcyCiAgICAvLyBhcnJfYXJyID0gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2kxXVtpMl0KICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA2IC8vIDQxMzgKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNgogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkaWcgNQogICAgaW50Y18zIC8vIDgKICAgICoKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MwogICAgLy8gYyA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYwogICAgcHVzaGludCA0MTE4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3NAogICAgLy8gZCA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuZAogICAgcHVzaGludCA0MTI4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3NQogICAgLy8gd29haF9hcnJfYXJyID0gYm94LnZhbHVlLm5lc3RlZC53b2FoW2kxXS5hcnJfYXJyW2kyXVtpM10KICAgIHB1c2hpbnQgNDEwOAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjIDUgLy8gNDA5OAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgdW5jb3ZlciAxMAogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkdXAKICAgIHVuY292ZXIgNQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICArCiAgICBwdXNoaW50IDE4CiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgOAogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciA4CiAgICAqCiAgICBkaWcgMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNwogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICB1bmNvdmVyIDYKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzcKICAgIC8vIHJldHVybiBhICsgYiArIGFycl9hcnIgKyBjICsgZCArIHdvYWhfYXJyX2FycgogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDUKICAgICsKICAgIHVuY292ZXIgNAogICAgKwogICAgdW5jb3ZlciAzCiAgICArCiAgICB1bmNvdmVyIDIKICAgICsKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnNldF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGludGNfMiAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyODUKICAgIC8vIHNlbGYudG9vX21hbnlfYm9vbHMudmFsdWVbaW5kZXhdID0gdmFsdWUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgJQogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICBkaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGJ5dGVjIDggLy8gInRvb19tYW55X2Jvb2xzIgogICAgY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdW1fYm9vbHNbcm91dGluZ10oKSAtPiB2b2lkOgpzdW1fYm9vbHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI4OQogICAgLy8gdG90YWwgPSBVSW50NjQoKQogICAgaW50Y18yIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyOTAKICAgIC8vIGZvciB2YWx1ZSBpbiBzZWxmLnRvb19tYW55X2Jvb2xzLnZhbHVlOgogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvb19tYW55X2Jvb2xzIGV4aXN0cwogICAgaW50Y18yIC8vIDAKCnN1bV9ib29sc19mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjkwCiAgICAvLyBmb3IgdmFsdWUgaW4gc2VsZi50b29fbWFueV9ib29scy52YWx1ZToKICAgIGR1cAogICAgcHVzaGludCAzMzAwMAogICAgPAogICAgYnogc3VtX2Jvb2xzX2FmdGVyX2ZvckA5CiAgICBkdXBuIDIKICAgIGludGNfMyAvLyA4CiAgICAvCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgJQogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgc3dhcAogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjkxCiAgICAvLyBpZiB2YWx1ZToKICAgIGJ6IHN1bV9ib29sc19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyOTIKICAgIC8vIHRvdGFsICs9IDEKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSAyCgpzdW1fYm9vbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI5MwogICAgLy8gaWYgdG90YWwgPT0gc3RvcF9hdF90b3RhbDoKICAgIGRpZyAxCiAgICBkaWcgMwogICAgPT0KICAgIGJueiBzdW1fYm9vbHNfYWZ0ZXJfZm9yQDkKICAgIGR1cAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBzdW1fYm9vbHNfZm9yX2hlYWRlckAyCgpzdW1fYm9vbHNfYWZ0ZXJfZm9yQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGl0b2IKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF90ZXN0W3JvdXRpbmddKCkgLT4gdm9pZDoKYm94X21hcF90ZXN0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI5OQogICAgLy8ga2V5XzAgPSBVSW50NjQoMCkKICAgIGludGNfMiAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAyCiAgICAvLyBzZWxmLmJveF9tYXBba2V5XzBdID0gdmFsdWUKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDEKICAgIC8vIHZhbHVlID0gU3RyaW5nKCJIbW1tbW0iKQogICAgcHVzaGJ5dGVzICJIbW1tbW0iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAyCiAgICAvLyBzZWxmLmJveF9tYXBba2V5XzBdID0gdmFsdWUKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9tYXBba2V5XzBdLmJ5dGVzLmxlbmd0aCA9PSB2YWx1ZS5ieXRlcy5sZW5ndGgKICAgIGJveF9sZW4KICAgIHBvcAogICAgcHVzaGludCA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAwCiAgICAvLyBrZXlfMSA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDkKICAgIC8vIGFzc2VydCBzZWxmLmJveF9tYXAuZ2V0KGtleV8xLCBkZWZhdWx0PVN0cmluZygiZGVmYXVsdCIpKSA9PSBTdHJpbmcoImRlZmF1bHQiKQogICAgaXRvYgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBieXRlYyAxNyAvLyAiZGVmYXVsdCIKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgMTcgLy8gImRlZmF1bHQiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzEwCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gc2VsZi5ib3hfbWFwLm1heWJlKGtleV8xKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMTEKICAgIC8vIGFzc2VydCBub3QgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMTcKICAgIC8vIHRtcF9ib3hfbWFwW2tleV8xXSA9IFN0cmluZygiaGVsbG8iKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGR1cAogICAgYnl0ZWMgMTIgLy8gImhlbGxvIgogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMxOQogICAgLy8gZGVsIHRtcF9ib3hfbWFwW2tleV8xXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9zZXRbcm91dGluZ10oKSAtPiB2b2lkOgpib3hfbWFwX3NldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjMKICAgIC8vIHNlbGYuYm94X21hcFtrZXldID0gdmFsdWUKICAgIHN3YXAKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9nZXRbcm91dGluZ10oKSAtPiB2b2lkOgpib3hfbWFwX2dldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyNwogICAgLy8gcmV0dXJuIHNlbGYuYm94X21hcFtrZXldCiAgICBpdG9iCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfbWFwIGVudHJ5IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX2RlbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJveF9tYXBfZGVsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzMxCiAgICAvLyBkZWwgc2VsZi5ib3hfbWFwW2tleV0KICAgIGl0b2IKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmJveF9tYXBfZXhpc3RzW3JvdXRpbmddKCkgLT4gdm9pZDoKYm94X21hcF9leGlzdHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMzUKICAgIC8vIHJldHVybiBrZXkgaW4gc2VsZi5ib3hfbWFwCiAgICBpdG9iCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAHAQIACIAggiCqICYSA2JveAVCT1hfQwRibG9iCWJveF9sYXJnZQQVH3x1BWJveF9hBWJveF9kAWIOdG9vX21hbnlfYm9vbHMJbWFueV9pbnRzATAEAAI0MgVoZWxsbwNvY2EDdHhuAwaBAQdib3hfcmVmB2RlZmF1bHQxG0EA3jEZFEQxGESCGQTybG1CBO8YbPcEfTcpbgTxPdk3BDMyXT0EphdIEgT6vLiFBNVmxjIEBO9JcQQj7LMsBAGZQI0EdyBZygQBJj32BO73WBYEmWSXrgRs7HL/BG+dEHUEWe83YASqZmuWBN+91jYEtTKROgTCnxZpBJyIjAkE5vaFBgSO4sNkNhoAjhkAKQA4AFgB2AAfAggCTgJfAqAAEwAKAx0DLwOIA+0EDwTRAAEFkwW6BgEGNAZHBl0GZgAnCIGdILlIIkMnCYGIILlIIkOCAgFkBAABAgO/IkMiQzEZFDEYFBBDIhYnDUy/gQYWJw5MvyJDJw2+REkXFkxLARJEJw6+REkXFkxLARJEUCcETFCwIkM2GgEXNhoCNhoDTwIWJwVMvycHvEgnB0sCvym8SClLAb9LAVcCACcGvEgnBksBvyuBkDC5SIEqFishBE8CuyshBIAIAAAAAAAAACq7JwW+RBeBAwgWJwVMvycFvUglEkQnB71ISwMVEkQpvURLAhVKEkQnBr1ISwMVShJEKSQiuksGVwABEkRLAyIJKUwiuksDIglLB0wiWBJEIksEDEsEIk8CTUsETAkpJE8CuiJLBA8iSwVPAk1LBEwJSwckTwJSEkQjSwQMTwQjTwJNKSRPArojSwQPI08FTwJNTwUkTwJSEkQnBiQiuk8EVwIBEkRLASIJJwZMIrpLASIJSwRMIlgSRCJLAgxLAiJPAk1LAkwJJwYkTwK6IksCDyJLA08CTUsCTAlLBCRPAlISRIEFSwIMSwKBBU8CTScGJE8CuoEFSwIPgQVLA08CTUsEJE8CUhJEI0sCDE8CI08CTScGJE8CuiNLAg8jTwNPAk1PAiRPAlISRCu9SIGQMBJEIkMnBb1FAScHvU4CSCm9TgNIK71OBEiAAQAkTwJUIk8CVCNPAlSBA08CVCcETFCwIkMnBb5EFyIIIgknB75EVwIAKb5EKyEEJboXTwMWSwMVFlcGAk8EUEyAAgAUUEsBFYEUCBZXBgJQTwIWUExQTFAnBExQsCJDKyEEJboXIggWKyEETwK7IkMnBbxIJwe8SCm8SCcFvkwXgSpLAUsDTYEqEkQnB74nC04CTVcCAIACNDISRCm+JwtOAk0nCxJETBREFEQrvEgiQycKvEgnCoATVGVzdGluZyB0ZXN0aW5nIDEyM78nCr1ISSRLAk2BB0sCDE8CgQdPAk1LAQknCk4CuoAHVGVzdGluZxJEKbxIKYAHAAVIZWxsb78pvUgjSwEMSwEjTwJNgQpLAgxPAoEKTwJNSwEJKU4CuoAFSGVsbG8SRCJDNhoBFzYaAkwlCycJTE8CuyJDgABJgY5SMgwNQQAYsYEGshCBBbIZJw+yHicPsh8ksgGzQv/fJEUBJwm9RQFEJEUCSwGBgQQMQQAXSwFJJQsnCUwluhdLAghFAiIIRQJC/+BJFicETFCwIkMqvUUBFEQqgSC5RDEAMgoqJEsDuyqBwD7TKiRJSwPSKoFAJwy7KiSBRbpLAUsDUCcMUBJEKrxIKr5JFERLAYAAEkRLA04CTUsCEkRQKrxIKky/Kr1IgUASRCcQgSC5SCcQvEgiQzYaASRbRDYaAUkVIQUIKEy5SCghBIACEAK7KCEFTwK7IkM2GgEXNhoCSRcoIQVPA7tJIggWKIGOIE8Cu0kjCBYogaggI7oXSwMNRCNLAwshBksBCChMI7oXIQYIKEsBI7oXSwUNRCMISwQlC0xLAQgoTE8Eu0sCgQMIFiiBliBPArtLAoEECBYogaAgTwK7TwKBBQgWKIGMICO6FyEFCChLASO6F0sFDUQjCElLBAgoTCO6FwiBEggoSwEjuhdLBQ1EIwhJTwQIKEwjuhcIKEsBI7oXTwQNRCMITwIIKExPArsiQzYaARc2GgIXNhoDFyghBSW6FyiBjiAluhcogaggI7oXSwUNRCNLBQshBksBCChMI7oXIQYIKEsBI7oXSwYNRCMISwUlCwgoTCW6FyiBliAluhcogaAgJboXKIGMICO6FyEFCChLASO6F08KDUQjCElPBQgoTCO6FwiBEggoSwEjuhdLCA1EIwgjTwgLSwEIKEwjuhcIKEsBI7oXSwcNRCMITwYlCwgoTCW6F08FTwUITwQITwMITwIICBYnBExQsCJDNhoBFzYaAiRTSwElCk8CJRgnCEsCIrpLASUMRExPA1QnCE4CuyJDNhoBFyQnCL1FAUQkSYHogQIMQQAoRwIlCkwlGCcITwIiukxTQQAGSwEiCEUCSwFLAxJAAAhJIghFAUL/z0sBFicETFCwIkMkFkm8SEmABkhtbW1tbb+9SIEGEkQiFkm+JxFOAk0nERJESb1FARRESbxISScMv7xIIkM2GgEXNhoCVwIATBZJvEhMvyJDNhoBFxa+REkVFlcGAkxQJwRMULAiQzYaARcWvEgiQzYaARcWvUUBgAEAJE8CVCcETFCwIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +// Type definitions for ARC-56 structs + +export type InnerStruct = { + c: bigint, + arrArr: bigint[][], + d: bigint +} + + +/** + * Converts the ABI tuple representation of a InnerStruct to the struct representation + */ +export function InnerStructFromTuple(abiTuple: [bigint, bigint[][], bigint]) { + const abiStructType = ABIStructType.fromStruct('InnerStruct', APP_SPEC.structs) + return getStructValueFromTupleValue(abiStructType, abiTuple) as InnerStruct +} + +export type LargeStruct = { + a: Uint8Array, + b: Uint8Array, + c: Uint8Array, + d: Uint8Array, + e: bigint, + f: Uint8Array, + g: Uint8Array, + h: bigint +} + + +/** + * Converts the ABI tuple representation of a LargeStruct to the struct representation + */ +export function LargeStructFromTuple(abiTuple: [Uint8Array, Uint8Array, Uint8Array, Uint8Array, bigint, Uint8Array, Uint8Array, bigint]) { + const abiStructType = ABIStructType.fromStruct('LargeStruct', APP_SPEC.structs) + return getStructValueFromTupleValue(abiStructType, abiTuple) as LargeStruct +} + +export type NestedStruct = { + a: bigint, + inner: InnerStruct, + woah: [bigint, bigint[][], bigint][], + b: bigint +} + + +/** + * Converts the ABI tuple representation of a NestedStruct to the struct representation + */ +export function NestedStructFromTuple(abiTuple: [bigint, InnerStruct, [bigint, bigint[][], bigint][], bigint]) { + const abiStructType = ABIStructType.fromStruct('NestedStruct', APP_SPEC.structs) + return getStructValueFromTupleValue(abiStructType, abiTuple) as NestedStruct +} + +/** + * The argument types for the BoxContract contract + */ +export type BoxContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'store_enums()void': Record + 'read_enums()(uint64,uint64)': Record + 'set_boxes(uint64,byte[],string)void': { + a: bigint | number + b: Uint8Array + c: string + } + 'boxes_exist()(bool,bool,bool,bool)': Record + 'check_keys()void': Record + 'read_boxes()(uint64,byte[],string,uint64)': Record + 'indirect_extract_and_replace()void': Record + 'delete_boxes()void': Record + 'slice_box()void': Record + 'arc4_box()void': Record + 'create_many_ints()void': Record + 'set_many_ints(uint64,uint64)void': { + index: bigint | number + value: bigint | number + } + 'sum_many_ints()uint64': Record + 'test_box_ref()void': Record + 'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void': { + struct: NestedStruct + } + 'nested_write(uint64,uint64)void': { + index: bigint | number + value: bigint | number + } + 'nested_read(uint64,uint64,uint64)uint64': { + i1: bigint | number + i2: bigint | number + i3: bigint | number + } + 'create_bools()void': Record + 'set_bool(uint64,bool)void': { + index: bigint | number + value: boolean + } + 'sum_bools(uint64)uint64': { + stopAtTotal: bigint | number + } + 'box_map_test()void': Record + 'box_map_set(uint64,string)void': { + key: bigint | number + value: string + } + 'box_map_get(uint64)string': { + key: bigint | number + } + 'box_map_del(uint64)void': { + key: bigint | number + } + 'box_map_exists(uint64)bool': { + key: bigint | number + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'store_enums()void': [] + 'read_enums()(uint64,uint64)': [] + 'set_boxes(uint64,byte[],string)void': [a: bigint | number, b: Uint8Array, c: string] + 'boxes_exist()(bool,bool,bool,bool)': [] + 'check_keys()void': [] + 'read_boxes()(uint64,byte[],string,uint64)': [] + 'indirect_extract_and_replace()void': [] + 'delete_boxes()void': [] + 'slice_box()void': [] + 'arc4_box()void': [] + 'create_many_ints()void': [] + 'set_many_ints(uint64,uint64)void': [index: bigint | number, value: bigint | number] + 'sum_many_ints()uint64': [] + 'test_box_ref()void': [] + 'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void': [struct: NestedStruct] + 'nested_write(uint64,uint64)void': [index: bigint | number, value: bigint | number] + 'nested_read(uint64,uint64,uint64)uint64': [i1: bigint | number, i2: bigint | number, i3: bigint | number] + 'create_bools()void': [] + 'set_bool(uint64,bool)void': [index: bigint | number, value: boolean] + 'sum_bools(uint64)uint64': [stopAtTotal: bigint | number] + 'box_map_test()void': [] + 'box_map_set(uint64,string)void': [key: bigint | number, value: string] + 'box_map_get(uint64)string': [key: bigint | number] + 'box_map_del(uint64)void': [key: bigint | number] + 'box_map_exists(uint64)bool': [key: bigint | number] + } +} + +/** + * The return type for each method + */ +export type BoxContractReturns = { + 'store_enums()void': void + 'read_enums()(uint64,uint64)': [bigint, bigint] + 'set_boxes(uint64,byte[],string)void': void + 'boxes_exist()(bool,bool,bool,bool)': [boolean, boolean, boolean, boolean] + 'check_keys()void': void + 'read_boxes()(uint64,byte[],string,uint64)': [bigint, Uint8Array, string, bigint] + 'indirect_extract_and_replace()void': void + 'delete_boxes()void': void + 'slice_box()void': void + 'arc4_box()void': void + 'create_many_ints()void': void + 'set_many_ints(uint64,uint64)void': void + 'sum_many_ints()uint64': bigint + 'test_box_ref()void': void + 'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void': void + 'nested_write(uint64,uint64)void': void + 'nested_read(uint64,uint64,uint64)uint64': bigint + 'create_bools()void': void + 'set_bool(uint64,bool)void': void + 'sum_bools(uint64)uint64': bigint + 'box_map_test()void': void + 'box_map_set(uint64,string)void': void + 'box_map_get(uint64)string': string + 'box_map_del(uint64)void': void + 'box_map_exists(uint64)bool': boolean +} + +/** + * Defines the types of available calls and state of the BoxContract smart contract. + */ +export type BoxContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'store_enums()void' | 'store_enums', { + argsObj: BoxContractArgs['obj']['store_enums()void'] + argsTuple: BoxContractArgs['tuple']['store_enums()void'] + returns: BoxContractReturns['store_enums()void'] + }> + & Record<'read_enums()(uint64,uint64)' | 'read_enums', { + argsObj: BoxContractArgs['obj']['read_enums()(uint64,uint64)'] + argsTuple: BoxContractArgs['tuple']['read_enums()(uint64,uint64)'] + returns: BoxContractReturns['read_enums()(uint64,uint64)'] + }> + & Record<'set_boxes(uint64,byte[],string)void' | 'set_boxes', { + argsObj: BoxContractArgs['obj']['set_boxes(uint64,byte[],string)void'] + argsTuple: BoxContractArgs['tuple']['set_boxes(uint64,byte[],string)void'] + returns: BoxContractReturns['set_boxes(uint64,byte[],string)void'] + }> + & Record<'boxes_exist()(bool,bool,bool,bool)' | 'boxes_exist', { + argsObj: BoxContractArgs['obj']['boxes_exist()(bool,bool,bool,bool)'] + argsTuple: BoxContractArgs['tuple']['boxes_exist()(bool,bool,bool,bool)'] + returns: BoxContractReturns['boxes_exist()(bool,bool,bool,bool)'] + }> + & Record<'check_keys()void' | 'check_keys', { + argsObj: BoxContractArgs['obj']['check_keys()void'] + argsTuple: BoxContractArgs['tuple']['check_keys()void'] + returns: BoxContractReturns['check_keys()void'] + }> + & Record<'read_boxes()(uint64,byte[],string,uint64)' | 'read_boxes', { + argsObj: BoxContractArgs['obj']['read_boxes()(uint64,byte[],string,uint64)'] + argsTuple: BoxContractArgs['tuple']['read_boxes()(uint64,byte[],string,uint64)'] + returns: BoxContractReturns['read_boxes()(uint64,byte[],string,uint64)'] + }> + & Record<'indirect_extract_and_replace()void' | 'indirect_extract_and_replace', { + argsObj: BoxContractArgs['obj']['indirect_extract_and_replace()void'] + argsTuple: BoxContractArgs['tuple']['indirect_extract_and_replace()void'] + returns: BoxContractReturns['indirect_extract_and_replace()void'] + }> + & Record<'delete_boxes()void' | 'delete_boxes', { + argsObj: BoxContractArgs['obj']['delete_boxes()void'] + argsTuple: BoxContractArgs['tuple']['delete_boxes()void'] + returns: BoxContractReturns['delete_boxes()void'] + }> + & Record<'slice_box()void' | 'slice_box', { + argsObj: BoxContractArgs['obj']['slice_box()void'] + argsTuple: BoxContractArgs['tuple']['slice_box()void'] + returns: BoxContractReturns['slice_box()void'] + }> + & Record<'arc4_box()void' | 'arc4_box', { + argsObj: BoxContractArgs['obj']['arc4_box()void'] + argsTuple: BoxContractArgs['tuple']['arc4_box()void'] + returns: BoxContractReturns['arc4_box()void'] + }> + & Record<'create_many_ints()void' | 'create_many_ints', { + argsObj: BoxContractArgs['obj']['create_many_ints()void'] + argsTuple: BoxContractArgs['tuple']['create_many_ints()void'] + returns: BoxContractReturns['create_many_ints()void'] + }> + & Record<'set_many_ints(uint64,uint64)void' | 'set_many_ints', { + argsObj: BoxContractArgs['obj']['set_many_ints(uint64,uint64)void'] + argsTuple: BoxContractArgs['tuple']['set_many_ints(uint64,uint64)void'] + returns: BoxContractReturns['set_many_ints(uint64,uint64)void'] + }> + & Record<'sum_many_ints()uint64' | 'sum_many_ints', { + argsObj: BoxContractArgs['obj']['sum_many_ints()uint64'] + argsTuple: BoxContractArgs['tuple']['sum_many_ints()uint64'] + returns: BoxContractReturns['sum_many_ints()uint64'] + }> + & Record<'test_box_ref()void' | 'test_box_ref', { + argsObj: BoxContractArgs['obj']['test_box_ref()void'] + argsTuple: BoxContractArgs['tuple']['test_box_ref()void'] + returns: BoxContractReturns['test_box_ref()void'] + }> + & Record<'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void' | 'set_nested_struct', { + argsObj: BoxContractArgs['obj']['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'] + argsTuple: BoxContractArgs['tuple']['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'] + returns: BoxContractReturns['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'] + }> + & Record<'nested_write(uint64,uint64)void' | 'nested_write', { + argsObj: BoxContractArgs['obj']['nested_write(uint64,uint64)void'] + argsTuple: BoxContractArgs['tuple']['nested_write(uint64,uint64)void'] + returns: BoxContractReturns['nested_write(uint64,uint64)void'] + }> + & Record<'nested_read(uint64,uint64,uint64)uint64' | 'nested_read', { + argsObj: BoxContractArgs['obj']['nested_read(uint64,uint64,uint64)uint64'] + argsTuple: BoxContractArgs['tuple']['nested_read(uint64,uint64,uint64)uint64'] + returns: BoxContractReturns['nested_read(uint64,uint64,uint64)uint64'] + }> + & Record<'create_bools()void' | 'create_bools', { + argsObj: BoxContractArgs['obj']['create_bools()void'] + argsTuple: BoxContractArgs['tuple']['create_bools()void'] + returns: BoxContractReturns['create_bools()void'] + }> + & Record<'set_bool(uint64,bool)void' | 'set_bool', { + argsObj: BoxContractArgs['obj']['set_bool(uint64,bool)void'] + argsTuple: BoxContractArgs['tuple']['set_bool(uint64,bool)void'] + returns: BoxContractReturns['set_bool(uint64,bool)void'] + }> + & Record<'sum_bools(uint64)uint64' | 'sum_bools', { + argsObj: BoxContractArgs['obj']['sum_bools(uint64)uint64'] + argsTuple: BoxContractArgs['tuple']['sum_bools(uint64)uint64'] + returns: BoxContractReturns['sum_bools(uint64)uint64'] + }> + & Record<'box_map_test()void' | 'box_map_test', { + argsObj: BoxContractArgs['obj']['box_map_test()void'] + argsTuple: BoxContractArgs['tuple']['box_map_test()void'] + returns: BoxContractReturns['box_map_test()void'] + }> + & Record<'box_map_set(uint64,string)void' | 'box_map_set', { + argsObj: BoxContractArgs['obj']['box_map_set(uint64,string)void'] + argsTuple: BoxContractArgs['tuple']['box_map_set(uint64,string)void'] + returns: BoxContractReturns['box_map_set(uint64,string)void'] + }> + & Record<'box_map_get(uint64)string' | 'box_map_get', { + argsObj: BoxContractArgs['obj']['box_map_get(uint64)string'] + argsTuple: BoxContractArgs['tuple']['box_map_get(uint64)string'] + returns: BoxContractReturns['box_map_get(uint64)string'] + }> + & Record<'box_map_del(uint64)void' | 'box_map_del', { + argsObj: BoxContractArgs['obj']['box_map_del(uint64)void'] + argsTuple: BoxContractArgs['tuple']['box_map_del(uint64)void'] + returns: BoxContractReturns['box_map_del(uint64)void'] + }> + & Record<'box_map_exists(uint64)bool' | 'box_map_exists', { + argsObj: BoxContractArgs['obj']['box_map_exists(uint64)bool'] + argsTuple: BoxContractArgs['tuple']['box_map_exists(uint64)bool'] + returns: BoxContractReturns['box_map_exists(uint64)bool'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + box: { + keys: { + oca: bigint + txn: bigint + boxA: bigint + boxB: Uint8Array + boxC: string + boxD: BinaryState + manyInts: [bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint] + boxRef: BinaryState + boxLarge: LargeStruct + tooManyBools: [boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean] + } + maps: { + boxMap: Map + } + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type BoxContractSignatures = keyof BoxContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type BoxContractNonVoidMethodSignatures = keyof BoxContractTypes['methods'] extends infer T ? T extends keyof BoxContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the BoxContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = BoxContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the BoxContract smart contract to the method's return type + */ +export type MethodReturn = BoxContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed box state of the application. + */ +export type BoxKeysState = BoxContractTypes['state']['box']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type BoxContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type BoxContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: BoxContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the BoxContract smart contract + */ +export abstract class BoxContractParamsFactory { + /** + * Constructs a no op call for the store_enums()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static storeEnums(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'store_enums()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the read_enums()(uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static readEnums(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'read_enums()(uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the set_boxes(uint64,byte[],string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_boxes(uint64,byte[],string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the boxes_exist()(bool,bool,bool,bool) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static boxesExist(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'boxes_exist()(bool,bool,bool,bool)' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the check_keys()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static checkKeys(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'check_keys()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the read_boxes()(uint64,byte[],string,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static readBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'read_boxes()(uint64,byte[],string,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the indirect_extract_and_replace()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static indirectExtractAndReplace(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'indirect_extract_and_replace()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the delete_boxes()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static deleteBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'delete_boxes()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the slice_box()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static sliceBox(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'slice_box()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the arc4_box()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static arc4Box(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'arc4_box()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the create_many_ints()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static createManyInts(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'create_many_ints()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the set_many_ints(uint64,uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setManyInts(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_many_ints(uint64,uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.index, params.args.value], + } + } + /** + * Constructs a no op call for the sum_many_ints()uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static sumManyInts(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'sum_many_ints()uint64' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_box_ref()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testBoxRef(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_box_ref()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setNestedStruct(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.struct], + } + } + /** + * Constructs a no op call for the nested_write(uint64,uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static nestedWrite(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'nested_write(uint64,uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.index, params.args.value], + } + } + /** + * Constructs a no op call for the nested_read(uint64,uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static nestedRead(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'nested_read(uint64,uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.i1, params.args.i2, params.args.i3], + } + } + /** + * Constructs a no op call for the create_bools()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static createBools(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'create_bools()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the set_bool(uint64,bool)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setBool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_bool(uint64,bool)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.index, params.args.value], + } + } + /** + * Constructs a no op call for the sum_bools(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static sumBools(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'sum_bools(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.stopAtTotal], + } + } + /** + * Constructs a no op call for the box_map_test()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static boxMapTest(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'box_map_test()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the box_map_set(uint64,string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static boxMapSet(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'box_map_set(uint64,string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.key, params.args.value], + } + } + /** + * Constructs a no op call for the box_map_get(uint64)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static boxMapGet(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'box_map_get(uint64)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.key], + } + } + /** + * Constructs a no op call for the box_map_del(uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static boxMapDel(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'box_map_del(uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.key], + } + } + /** + * Constructs a no op call for the box_map_exists(uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static boxMapExists(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'box_map_exists(uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.key], + } + } +} + +/** + * A factory to create and deploy one or more instance of the BoxContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class BoxContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `BoxContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new BoxContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new BoxContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the BoxContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: BoxContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new BoxContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the BoxContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the BoxContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the BoxContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new BoxContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the BoxContract smart contract + */ +export class BoxContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `BoxContractClient` + * + * @param appClient An `AppClient` instance which has been created with the BoxContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `BoxContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `BoxContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new BoxContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `BoxContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new BoxContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the BoxContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the BoxContract smart contract using the `store_enums()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + storeEnums: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.storeEnums(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `read_enums()(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + readEnums: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.readEnums(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_boxes(uint64,byte[],string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.setBoxes(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `boxes_exist()(bool,bool,bool,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + boxesExist: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.boxesExist(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `check_keys()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + checkKeys: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.checkKeys(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `read_boxes()(uint64,byte[],string,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + readBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.readBoxes(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `indirect_extract_and_replace()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + indirectExtractAndReplace: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.indirectExtractAndReplace(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `delete_boxes()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + deleteBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.deleteBoxes(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `slice_box()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + sliceBox: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.sliceBox(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `arc4_box()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + arc4Box: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.arc4Box(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `create_many_ints()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + createManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.createManyInts(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_many_ints(uint64,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.setManyInts(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `sum_many_ints()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + sumManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.sumManyInts(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `test_box_ref()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testBoxRef: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.testBoxRef(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setNestedStruct: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.setNestedStruct(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `nested_write(uint64,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + nestedWrite: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.nestedWrite(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `nested_read(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + nestedRead: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.nestedRead(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `create_bools()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + createBools: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.createBools(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_bool(uint64,bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setBool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.setBool(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `sum_bools(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + sumBools: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.sumBools(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_test()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + boxMapTest: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(BoxContractParamsFactory.boxMapTest(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_set(uint64,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + boxMapSet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.boxMapSet(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_get(uint64)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + boxMapGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.boxMapGet(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_del(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + boxMapDel: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.boxMapDel(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_exists(uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + boxMapExists: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(BoxContractParamsFactory.boxMapExists(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the BoxContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the BoxContract smart contract using the `store_enums()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + storeEnums: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.storeEnums(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `read_enums()(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + readEnums: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.readEnums(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_boxes(uint64,byte[],string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.setBoxes(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `boxes_exist()(bool,bool,bool,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + boxesExist: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.boxesExist(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `check_keys()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + checkKeys: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.checkKeys(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `read_boxes()(uint64,byte[],string,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + readBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.readBoxes(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `indirect_extract_and_replace()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + indirectExtractAndReplace: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.indirectExtractAndReplace(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `delete_boxes()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + deleteBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.deleteBoxes(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `slice_box()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + sliceBox: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.sliceBox(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `arc4_box()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + arc4Box: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.arc4Box(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `create_many_ints()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + createManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.createManyInts(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_many_ints(uint64,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.setManyInts(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `sum_many_ints()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + sumManyInts: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.sumManyInts(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `test_box_ref()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testBoxRef: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.testBoxRef(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setNestedStruct: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.setNestedStruct(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `nested_write(uint64,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + nestedWrite: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.nestedWrite(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `nested_read(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + nestedRead: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.nestedRead(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `create_bools()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + createBools: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.createBools(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_bool(uint64,bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setBool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.setBool(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `sum_bools(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + sumBools: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.sumBools(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_test()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + boxMapTest: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapTest(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_set(uint64,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + boxMapSet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapSet(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_get(uint64)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + boxMapGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapGet(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_del(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + boxMapDel: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapDel(params)) + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_exists(uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + boxMapExists: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(BoxContractParamsFactory.boxMapExists(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the BoxContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the BoxContract smart contract using the `store_enums()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + storeEnums: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.storeEnums(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['store_enums()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `read_enums()(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + readEnums: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.readEnums(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['read_enums()(uint64,uint64)'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_boxes(uint64,byte[],string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.setBoxes(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['set_boxes(uint64,byte[],string)void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `boxes_exist()(bool,bool,bool,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + boxesExist: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.boxesExist(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['boxes_exist()(bool,bool,bool,bool)'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `check_keys()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + checkKeys: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.checkKeys(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['check_keys()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `read_boxes()(uint64,byte[],string,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + readBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.readBoxes(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['read_boxes()(uint64,byte[],string,uint64)'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `indirect_extract_and_replace()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + indirectExtractAndReplace: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.indirectExtractAndReplace(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['indirect_extract_and_replace()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `delete_boxes()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + deleteBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.deleteBoxes(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['delete_boxes()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `slice_box()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + sliceBox: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.sliceBox(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['slice_box()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `arc4_box()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + arc4Box: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.arc4Box(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['arc4_box()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `create_many_ints()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + createManyInts: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.createManyInts(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['create_many_ints()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_many_ints(uint64,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setManyInts: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.setManyInts(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['set_many_ints(uint64,uint64)void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `sum_many_ints()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + sumManyInts: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.sumManyInts(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['sum_many_ints()uint64'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `test_box_ref()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testBoxRef: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.testBoxRef(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['test_box_ref()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setNestedStruct: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.setNestedStruct(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `nested_write(uint64,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + nestedWrite: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.nestedWrite(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['nested_write(uint64,uint64)void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `nested_read(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + nestedRead: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.nestedRead(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['nested_read(uint64,uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `create_bools()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + createBools: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.createBools(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['create_bools()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `set_bool(uint64,bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setBool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.setBool(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['set_bool(uint64,bool)void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `sum_bools(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + sumBools: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.sumBools(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['sum_bools(uint64)uint64'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_test()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + boxMapTest: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapTest(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_test()void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_set(uint64,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + boxMapSet: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapSet(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_set(uint64,string)void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_get(uint64)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + boxMapGet: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapGet(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_get(uint64)string'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_del(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + boxMapDel: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapDel(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_del(uint64)void'])} + }, + + /** + * Makes a call to the BoxContract smart contract using the `box_map_exists(uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + boxMapExists: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(BoxContractParamsFactory.boxMapExists(params)) + return {...result, return: result.return as unknown as (undefined | BoxContractReturns['box_map_exists(uint64)bool'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new BoxContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current BoxContract app + */ + state = { + /** + * Methods to access box state for the current BoxContract app + */ + box: { + /** + * Get all current keyed values from box state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.box.getAll() + return { + oca: result.oca, + txn: result.txn, + boxA: result.box_a, + boxB: result.box_b, + boxC: result.box_c, + boxD: new BinaryStateValue(result.box_d), + manyInts: result.many_ints, + boxRef: new BinaryStateValue(result.box_ref), + boxLarge: result.box_large, + tooManyBools: result.too_many_bools, + } + }, + /** + * Get the current value of the oca key in box state + */ + oca: async (): Promise => { return (await this.appClient.state.box.getValue("oca")) as bigint | undefined }, + /** + * Get the current value of the txn key in box state + */ + txn: async (): Promise => { return (await this.appClient.state.box.getValue("txn")) as bigint | undefined }, + /** + * Get the current value of the box_a key in box state + */ + boxA: async (): Promise => { return (await this.appClient.state.box.getValue("box_a")) as bigint | undefined }, + /** + * Get the current value of the box_b key in box state + */ + boxB: async (): Promise => { return (await this.appClient.state.box.getValue("box_b")) as Uint8Array | undefined }, + /** + * Get the current value of the box_c key in box state + */ + boxC: async (): Promise => { return (await this.appClient.state.box.getValue("box_c")) as string | undefined }, + /** + * Get the current value of the box_d key in box state + */ + boxD: async (): Promise => { return new BinaryStateValue((await this.appClient.state.box.getValue("box_d")) as Uint8Array | undefined) }, + /** + * Get the current value of the many_ints key in box state + */ + manyInts: async (): Promise<[bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint] | undefined> => { return (await this.appClient.state.box.getValue("many_ints")) as [bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint] | undefined }, + /** + * Get the current value of the box_ref key in box state + */ + boxRef: async (): Promise => { return new BinaryStateValue((await this.appClient.state.box.getValue("box_ref")) as Uint8Array | undefined) }, + /** + * Get the current value of the box_large key in box state + */ + boxLarge: async (): Promise => { return (await this.appClient.state.box.getValue("box_large")) as LargeStruct | undefined }, + /** + * Get the current value of the too_many_bools key in box state + */ + tooManyBools: async (): Promise<[boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean] | undefined> => { return (await this.appClient.state.box.getValue("too_many_bools")) as [boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean] | undefined }, + /** + * Get values from the box_map map in box state + */ + boxMap: { + /** + * Get all current values of the box_map map in box state + */ + getMap: async (): Promise> => { return (await this.appClient.state.box.getMap("box_map")) as Map }, + /** + * Get a current value of the box_map map by key from box state + */ + value: async (key: bigint | number): Promise => { return await this.appClient.state.box.getMapValue("box_map", key) as string | undefined }, + }, + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): BoxContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a store_enums()void method call against the BoxContract contract + */ + storeEnums(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.storeEnums(params))) + return this + }, + /** + * Add a read_enums()(uint64,uint64) method call against the BoxContract contract + */ + readEnums(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.readEnums(params))) + return this + }, + /** + * Add a set_boxes(uint64,byte[],string)void method call against the BoxContract contract + */ + setBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setBoxes(params))) + return this + }, + /** + * Add a boxes_exist()(bool,bool,bool,bool) method call against the BoxContract contract + */ + boxesExist(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxesExist(params))) + return this + }, + /** + * Add a check_keys()void method call against the BoxContract contract + */ + checkKeys(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.checkKeys(params))) + return this + }, + /** + * Add a read_boxes()(uint64,byte[],string,uint64) method call against the BoxContract contract + */ + readBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.readBoxes(params))) + return this + }, + /** + * Add a indirect_extract_and_replace()void method call against the BoxContract contract + */ + indirectExtractAndReplace(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.indirectExtractAndReplace(params))) + return this + }, + /** + * Add a delete_boxes()void method call against the BoxContract contract + */ + deleteBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deleteBoxes(params))) + return this + }, + /** + * Add a slice_box()void method call against the BoxContract contract + */ + sliceBox(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sliceBox(params))) + return this + }, + /** + * Add a arc4_box()void method call against the BoxContract contract + */ + arc4Box(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.arc4Box(params))) + return this + }, + /** + * Add a create_many_ints()void method call against the BoxContract contract + */ + createManyInts(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createManyInts(params))) + return this + }, + /** + * Add a set_many_ints(uint64,uint64)void method call against the BoxContract contract + */ + setManyInts(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setManyInts(params))) + return this + }, + /** + * Add a sum_many_ints()uint64 method call against the BoxContract contract + */ + sumManyInts(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sumManyInts(params))) + return this + }, + /** + * Add a test_box_ref()void method call against the BoxContract contract + */ + testBoxRef(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBoxRef(params))) + return this + }, + /** + * Add a set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void method call against the BoxContract contract + */ + setNestedStruct(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setNestedStruct(params))) + return this + }, + /** + * Add a nested_write(uint64,uint64)void method call against the BoxContract contract + */ + nestedWrite(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.nestedWrite(params))) + return this + }, + /** + * Add a nested_read(uint64,uint64,uint64)uint64 method call against the BoxContract contract + */ + nestedRead(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.nestedRead(params))) + return this + }, + /** + * Add a create_bools()void method call against the BoxContract contract + */ + createBools(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createBools(params))) + return this + }, + /** + * Add a set_bool(uint64,bool)void method call against the BoxContract contract + */ + setBool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setBool(params))) + return this + }, + /** + * Add a sum_bools(uint64)uint64 method call against the BoxContract contract + */ + sumBools(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sumBools(params))) + return this + }, + /** + * Add a box_map_test()void method call against the BoxContract contract + */ + boxMapTest(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapTest(params))) + return this + }, + /** + * Add a box_map_set(uint64,string)void method call against the BoxContract contract + */ + boxMapSet(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapSet(params))) + return this + }, + /** + * Add a box_map_get(uint64)string method call against the BoxContract contract + */ + boxMapGet(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapGet(params))) + return this + }, + /** + * Add a box_map_del(uint64)void method call against the BoxContract contract + */ + boxMapDel(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapDel(params))) + return this + }, + /** + * Add a box_map_exists(uint64)bool method call against the BoxContract contract + */ + boxMapExists(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.boxMapExists(params))) + return this + }, + /** + * Add a clear state call to the BoxContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as BoxContractComposer + } +} +export type BoxContractComposer = { + /** + * Calls the store_enums()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + storeEnums(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['store_enums()void'] | undefined]> + + /** + * Calls the read_enums()(uint64,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + readEnums(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['read_enums()(uint64,uint64)'] | undefined]> + + /** + * Calls the set_boxes(uint64,byte[],string)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setBoxes(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['set_boxes(uint64,byte[],string)void'] | undefined]> + + /** + * Calls the boxes_exist()(bool,bool,bool,bool) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + boxesExist(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['boxes_exist()(bool,bool,bool,bool)'] | undefined]> + + /** + * Calls the check_keys()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + checkKeys(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['check_keys()void'] | undefined]> + + /** + * Calls the read_boxes()(uint64,byte[],string,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + readBoxes(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['read_boxes()(uint64,byte[],string,uint64)'] | undefined]> + + /** + * Calls the indirect_extract_and_replace()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + indirectExtractAndReplace(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['indirect_extract_and_replace()void'] | undefined]> + + /** + * Calls the delete_boxes()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + deleteBoxes(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['delete_boxes()void'] | undefined]> + + /** + * Calls the slice_box()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + sliceBox(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['slice_box()void'] | undefined]> + + /** + * Calls the arc4_box()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + arc4Box(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['arc4_box()void'] | undefined]> + + /** + * Calls the create_many_ints()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + createManyInts(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['create_many_ints()void'] | undefined]> + + /** + * Calls the set_many_ints(uint64,uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setManyInts(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['set_many_ints(uint64,uint64)void'] | undefined]> + + /** + * Calls the sum_many_ints()uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + sumManyInts(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['sum_many_ints()uint64'] | undefined]> + + /** + * Calls the test_box_ref()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testBoxRef(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['test_box_ref()void'] | undefined]> + + /** + * Calls the set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setNestedStruct(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void'] | undefined]> + + /** + * Calls the nested_write(uint64,uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + nestedWrite(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['nested_write(uint64,uint64)void'] | undefined]> + + /** + * Calls the nested_read(uint64,uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + nestedRead(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['nested_read(uint64,uint64,uint64)uint64'] | undefined]> + + /** + * Calls the create_bools()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + createBools(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['create_bools()void'] | undefined]> + + /** + * Calls the set_bool(uint64,bool)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setBool(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['set_bool(uint64,bool)void'] | undefined]> + + /** + * Calls the sum_bools(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + sumBools(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['sum_bools(uint64)uint64'] | undefined]> + + /** + * Calls the box_map_test()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + boxMapTest(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_test()void'] | undefined]> + + /** + * Calls the box_map_set(uint64,string)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + boxMapSet(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_set(uint64,string)void'] | undefined]> + + /** + * Calls the box_map_get(uint64)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + boxMapGet(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_get(uint64)string'] | undefined]> + + /** + * Calls the box_map_del(uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + boxMapDel(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_del(uint64)void'] | undefined]> + + /** + * Calls the box_map_exists(uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + boxMapExists(params?: CallParams): BoxContractComposer<[...TReturns, BoxContractReturns['box_map_exists(uint64)bool'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the BoxContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): BoxContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): BoxContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type BoxContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/Contract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/Contract.ts new file mode 100644 index 0000000..aa62d61 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/Contract.ts @@ -0,0 +1,621 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"Contract","structs":{},"methods":[{"name":"test_falcon_verify","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reject_version","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[138,226],"errorMessage":"application exists"},{"pc":[140],"errorMessage":"should be version 0"},{"pc":[229],"errorMessage":"should be version 1"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYgMAogICAgYnl0ZWNibG9jayBiYXNlNjQoRElFQlF3PT0pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQ29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMik6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhiZTU2NDk5YyAweGFjOGFhYjQyIC8vIG1ldGhvZCAidGVzdF9mYWxjb25fdmVyaWZ5KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X3JlamVjdF92ZXJzaW9uKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF9mYWxjb25fdmVyaWZ5IHRlc3RfcmVqZWN0X3ZlcnNpb24KICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQVZNMTIuY29udHJhY3QuQ29udHJhY3QudGVzdF9mYWxjb25fdmVyaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9mYWxjb25fdmVyaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjcKICAgIC8vIGFzc2VydCBub3Qgb3AuZmFsY29uX3ZlcmlmeShiIiIsIGIiIiwgb3AuYnplcm8oMTc5MykpCiAgICBwdXNoaW50IDE3OTMKICAgIGJ6ZXJvCiAgICBwdXNoYnl0ZXMgMHgKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBmYWxjb25fdmVyaWZ5CiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQVZNMTIuY29udHJhY3QuQ29udHJhY3QudGVzdF9yZWplY3RfdmVyc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfcmVqZWN0X3ZlcnNpb246CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTEKICAgIC8vIGFwcF92MF90eG4gPSBhcmM0LmFyYzRfY3JlYXRlKENvbnRyYWN0VjApCiAgICBpdHhuX2JlZ2luCiAgICBieXRlY18wIC8vIGJhc2U2NChESUVCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgcHVzaGJ5dGVzIGJhc2U2NChEREViUVFBYWdBU2c2Qmh5TmhvQWpnRUFBUUF4R1lFRUVqRVlFRVJDQUFneEdSUXhHQlFRUXpGRWdRRVNSSUVCUXc9PSkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTMKICAgIC8vIGFzc2VydCBhcHAudmVyc2lvbiA9PSAwLCAic2hvdWxkIGJlIHZlcnNpb24gMCIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwVmVyc2lvbgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIHNob3VsZCBiZSB2ZXJzaW9uIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToxNS0xNwogICAgLy8gYXJjNC5hcmM0X3VwZGF0ZSgKICAgIC8vICAgICBDb250cmFjdFYwLnVwZGF0ZSwgYXBwX2lkPWFwcCwgcmVqZWN0X3ZlcnNpb249MSwgY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdChDb250cmFjdFYxKQogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBDb250cmFjdFYwLnVwZGF0ZSwgYXBwX2lkPWFwcCwgcmVqZWN0X3ZlcnNpb249MSwgY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdChDb250cmFjdFYxKQogICAgYnl0ZWNfMCAvLyBiYXNlNjQoRElFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIHB1c2hieXRlcyBiYXNlNjQoRERFYlFRQWFnQVFrTjQwOE5ob0FqZ0VBQVFBeEdZRUZFakVZRUVSQ0FBZ3hHUlF4R0JRUVF6RkVnUUlTUklFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTUtMTcKICAgIC8vIGFyYzQuYXJjNF91cGRhdGUoCiAgICAvLyAgICAgQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIC8vICkKICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToxNgogICAgLy8gQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIGludGNfMCAvLyAxCiAgICBpdHhuX2ZpZWxkIFJlamVjdFZlcnNpb24KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTUtMTcKICAgIC8vIGFyYzQuYXJjNF91cGRhdGUoCiAgICAvLyAgICAgQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweGEwZTgxODcyIC8vIG1ldGhvZCAidXBkYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTgKICAgIC8vIGFzc2VydCBhcHAudmVyc2lvbiA9PSAxLCAic2hvdWxkIGJlIHZlcnNpb24gMSIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwVmVyc2lvbgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gc2hvdWxkIGJlIHZlcnNpb24gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjIwLTI5CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oCiAgICAvLyAgICAgICAgIGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgICAgICAgICBDb250cmFjdFYxLmRlbGV0ZSwKICAgIC8vICAgICAgICAgKSwKICAgIC8vICAgICApLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gICAgIHJlamVjdF92ZXJzaW9uPTIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjgKICAgIC8vIHJlamVjdF92ZXJzaW9uPTIsCiAgICBwdXNoaW50IDIKICAgIGl0eG5fZmllbGQgUmVqZWN0VmVyc2lvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjYKICAgIC8vIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToyMi0yNAogICAgLy8gYXJjNC5hcmM0X3NpZ25hdHVyZSgKICAgIC8vICAgICBDb250cmFjdFYxLmRlbGV0ZSwKICAgIC8vICksCiAgICBwdXNoYnl0ZXMgMHgyNDM3OGQzYyAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMiAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjIwLTI5CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oCiAgICAvLyAgICAgICAgIGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgICAgICAgICBDb250cmFjdFYxLmRlbGV0ZSwKICAgIC8vICAgICAgICAgKSwKICAgIC8vICAgICApLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gICAgIHJlamVjdF92ZXJzaW9uPTIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"DCADAQYAJgEEDIEBQzEbQQAdMRkURDEYRIICBL5WSZwErIqrQjYaAI4CAAkAFwAxGRQxGBQQQ4GBDq+AAElPAoUURCJDsSiyQoAxDDEbQQAagASg6BhyNhoAjgEAAQAxGYEEEjEYEERCAAgxGRQxGBQQQzFEgQESRIEBQ7JAI7IQJLIBs7Q9SXIJRBREsSiyQoAxDDEbQQAagAQkN408NhoAjgEAAQAxGYEFEjEYEERCAAgxGRQxGBQQQzFEgQISRIEBQ7JAgQSyGSKyREmyGIAEoOgYcrIaI7IQJLIBs0lyCUQiEkSxgQKyRLIYgQWyGYAEJDeNPLIaI7IQJLIBsyJD","clear":"DIEBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the Contract contract + */ +export type ContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'test_falcon_verify()void': Record + 'test_reject_version()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'test_falcon_verify()void': [] + 'test_reject_version()void': [] + } +} + +/** + * The return type for each method + */ +export type ContractReturns = { + 'test_falcon_verify()void': void + 'test_reject_version()void': void +} + +/** + * Defines the types of available calls and state of the Contract smart contract. + */ +export type ContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'test_falcon_verify()void' | 'test_falcon_verify', { + argsObj: ContractArgs['obj']['test_falcon_verify()void'] + argsTuple: ContractArgs['tuple']['test_falcon_verify()void'] + returns: ContractReturns['test_falcon_verify()void'] + }> + & Record<'test_reject_version()void' | 'test_reject_version', { + argsObj: ContractArgs['obj']['test_reject_version()void'] + argsTuple: ContractArgs['tuple']['test_reject_version()void'] + returns: ContractReturns['test_reject_version()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type ContractSignatures = keyof ContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the Contract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = ContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the Contract smart contract to the method's return type + */ +export type MethodReturn = ContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type ContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type ContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: ContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the Contract smart contract + */ +export abstract class ContractParamsFactory { + /** + * Constructs a no op call for the test_falcon_verify()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testFalconVerify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_falcon_verify()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_reject_version()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testRejectVersion(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_reject_version()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the Contract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class ContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `ContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new ContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new ContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the Contract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: ContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new ContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Contract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Contract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Contract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new ContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the Contract smart contract + */ +export class ContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `ContractClient` + * + * @param appClient An `AppClient` instance which has been created with the Contract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `ContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `ContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new ContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `ContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new ContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the Contract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the Contract smart contract using the `test_falcon_verify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testFalconVerify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ContractParamsFactory.testFalconVerify(params)) + }, + + /** + * Makes a call to the Contract smart contract using the `test_reject_version()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testRejectVersion: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ContractParamsFactory.testRejectVersion(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the Contract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the Contract smart contract using the `test_falcon_verify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testFalconVerify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ContractParamsFactory.testFalconVerify(params)) + }, + + /** + * Makes a call to the Contract smart contract using the `test_reject_version()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testRejectVersion: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ContractParamsFactory.testRejectVersion(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the Contract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the Contract smart contract using the `test_falcon_verify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testFalconVerify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ContractParamsFactory.testFalconVerify(params)) + return {...result, return: result.return as unknown as (undefined | ContractReturns['test_falcon_verify()void'])} + }, + + /** + * Makes a call to the Contract smart contract using the `test_reject_version()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testRejectVersion: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ContractParamsFactory.testRejectVersion(params)) + return {...result, return: result.return as unknown as (undefined | ContractReturns['test_reject_version()void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new ContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current Contract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): ContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a test_falcon_verify()void method call against the Contract contract + */ + testFalconVerify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testFalconVerify(params))) + return this + }, + /** + * Add a test_reject_version()void method call against the Contract contract + */ + testRejectVersion(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testRejectVersion(params))) + return this + }, + /** + * Add a clear state call to the Contract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as ContractComposer + } +} +export type ContractComposer = { + /** + * Calls the test_falcon_verify()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testFalconVerify(params?: CallParams): ContractComposer<[...TReturns, ContractReturns['test_falcon_verify()void'] | undefined]> + + /** + * Calls the test_reject_version()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testRejectVersion(params?: CallParams): ContractComposer<[...TReturns, ContractReturns['test_reject_version()void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the Contract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): ContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): ContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type ContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ContractV0.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ContractV0.ts new file mode 100644 index 0000000..4c42a4d --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/ContractV0.ts @@ -0,0 +1,621 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"ContractV0","structs":{},"methods":[{"name":"update","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["UpdateApplication"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[45],"errorMessage":"can only update if caller expects this to be currently be v0"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTozMgogICAgLy8gY2xhc3MgQ29udHJhY3RWMChBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTEyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweGEwZTgxODcyIC8vIG1ldGhvZCAidXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl91cGRhdGVfcm91dGVAMwogICAgZXJyCgptYWluX3VwZGF0ZV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz0oIlVwZGF0ZUFwcGxpY2F0aW9uIiwpKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgdXBkYXRlCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BVk0xMi5jb250cmFjdC5Db250cmFjdFYwLnVwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTozNgogICAgLy8gVHhuLnJlamVjdF92ZXJzaW9uID09IDEKICAgIHR4biBSZWplY3RWZXJzaW9uCiAgICBwdXNoaW50IDEKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MzUtMzcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnJlamVjdF92ZXJzaW9uID09IDEKICAgIC8vICksICJjYW4gb25seSB1cGRhdGUgaWYgY2FsbGVyIGV4cGVjdHMgdGhpcyB0byBiZSBjdXJyZW50bHkgYmUgdjAiCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgdXBkYXRlIGlmIGNhbGxlciBleHBlY3RzIHRoaXMgdG8gYmUgY3VycmVudGx5IGJlIHYwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPSgiVXBkYXRlQXBwbGljYXRpb24iLCkpCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"DDEbQQAagASg6BhyNhoAjgEAAQAxGYEEEjEYEERCAAgxGRQxGBQQQzFEgQESRIEBQw==","clear":"DIEBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the ContractV0 contract + */ +export type ContractV0Args = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'update()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'update()void': [] + } +} + +/** + * The return type for each method + */ +export type ContractV0Returns = { + 'update()void': void +} + +/** + * Defines the types of available calls and state of the ContractV0 smart contract. + */ +export type ContractV0Types = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'update()void' | 'update', { + argsObj: ContractV0Args['obj']['update()void'] + argsTuple: ContractV0Args['tuple']['update()void'] + returns: ContractV0Returns['update()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type ContractV0Signatures = keyof ContractV0Types['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the ContractV0 smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = ContractV0Types['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the ContractV0 smart contract to the method's return type + */ +export type MethodReturn = ContractV0Types['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type ContractV0CreateCallParams = + | Expand +/** + * Defines supported update method params for this smart contract + */ +export type ContractV0UpdateCallParams = + | Expand & {method: 'update'}> + | Expand & {method: 'update()void'}> +/** + * Defines arguments required for the deploy method. + */ +export type ContractV0DeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: ContractV0CreateCallParams + /** + * Update transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + updateParams?: ContractV0UpdateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the ContractV0 smart contract + */ +export abstract class ContractV0ParamsFactory { + /** + * Gets available update ABI call param factories + */ + static get update() { + return { + _resolveByMethod(params: TParams) { + switch(params.method) { + case 'update': + case 'update()void': + return ContractV0ParamsFactory.update.update(params) + } + throw new Error(`Unknown ' + verb + ' method`) + }, + + /** + * Constructs update ABI call params for the ContractV0 smart contract using the update()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + update(params: CallParams & AppClientCompilationParams): AppClientMethodCallParams & AppClientCompilationParams { + return { + ...params, + method: 'update()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + +} + +/** + * A factory to create and deploy one or more instance of the ContractV0 smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class ContractV0Factory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `ContractV0Factory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new ContractV0Client(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new ContractV0Client(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the ContractV0 smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: ContractV0DeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + updateParams: params.updateParams?.method ? ContractV0ParamsFactory.update._resolveByMethod(params.updateParams) : params.updateParams ? params.updateParams as (ContractV0UpdateCallParams & { args: Uint8Array[] }) : undefined, + }) + return { result: result.result, appClient: new ContractV0Client(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ContractV0 smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + /** + * Gets available deployUpdate methods + */ + deployUpdate: { + /** + * Updates an existing instance of the ContractV0 smart contract using the update()void ABI method. + * + * @param params The params for the smart contract call + * @returns The deployUpdate params + */ + update: (params: CallParams & AppClientCompilationParams = {args: []}) => { + return this.appFactory.params.deployUpdate(ContractV0ParamsFactory.update.update(params)) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ContractV0 smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ContractV0 smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new ContractV0Client(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the ContractV0 smart contract + */ +export class ContractV0Client { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `ContractV0Client` + * + * @param appClient An `AppClient` instance which has been created with the ContractV0 app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `ContractV0Client` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `ContractV0Client` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new ContractV0Client(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `ContractV0Client` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new ContractV0Client(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available update methods + */ + update: { + /** + * Updates an existing instance of the ContractV0 smart contract using the `update()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The update params + */ + update: (params: CallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.UpdateApplication } = {args: []}) => { + return this.appClient.params.update(ContractV0ParamsFactory.update.update(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the ContractV0 smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available update methods + */ + update: { + /** + * Updates an existing instance of the ContractV0 smart contract using the `update()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The update transaction + */ + update: (params: CallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.UpdateApplication } = {args: []}) => { + return this.appClient.createTransaction.update(ContractV0ParamsFactory.update.update(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the ContractV0 smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available update methods + */ + update: { + /** + * Updates an existing instance of the ContractV0 smart contract using the `update()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The update result + */ + update: async (params: CallParams & AppClientCompilationParams & SendParams & { onComplete?: OnApplicationComplete.UpdateApplication } = {args: []}) => { + const result = await this.appClient.send.update(ContractV0ParamsFactory.update.update(params)) + return {...result, return: result.return as unknown as (undefined | ContractV0Returns['update()void'])} + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the ContractV0 smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new ContractV0Client(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current ContractV0 app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): ContractV0Composer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + get update() { + return { + update: (params: CallParams & AppClientCompilationParams) => { + promiseChain = promiseChain.then(async () => composer.addAppUpdateMethodCall(await client.params.update.update(params))) + return this + }, + } + }, + /** + * Add a clear state call to the ContractV0 contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as ContractV0Composer + } +} +export type ContractV0Composer = { + /** + * Gets available update methods + */ + readonly update: { + /** + * Updates an existing instance of the ContractV0 smart contract using the update()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + update(params?: CallParams): ContractV0Composer<[...TReturns, ContractV0Returns['update()void'] | undefined]> + } + + /** + * Makes a clear_state call to an existing instance of the ContractV0 smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): ContractV0Composer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): ContractV0Composer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type ContractV0ComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ContractV1.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ContractV1.ts new file mode 100644 index 0000000..7f5e963 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/ContractV1.ts @@ -0,0 +1,621 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"ContractV1","structs":{},"methods":[{"name":"delete","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["DeleteApplication"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[45],"errorMessage":"can only update if caller expects this to be currently be v1"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo0MAogICAgLy8gY2xhc3MgQ29udHJhY3RWMShBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTEyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweDI0Mzc4ZDNjIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9kZWxldGVfcm91dGVAMwogICAgZXJyCgptYWluX2RlbGV0ZV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz0oIkRlbGV0ZUFwcGxpY2F0aW9uIiwpKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgZGVsZXRlCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BVk0xMi5jb250cmFjdC5Db250cmFjdFYxLmRlbGV0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlbGV0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo0NAogICAgLy8gVHhuLnJlamVjdF92ZXJzaW9uID09IDIKICAgIHR4biBSZWplY3RWZXJzaW9uCiAgICBwdXNoaW50IDIKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NDMtNDUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnJlamVjdF92ZXJzaW9uID09IDIKICAgIC8vICksICJjYW4gb25seSB1cGRhdGUgaWYgY2FsbGVyIGV4cGVjdHMgdGhpcyB0byBiZSBjdXJyZW50bHkgYmUgdjEiCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgdXBkYXRlIGlmIGNhbGxlciBleHBlY3RzIHRoaXMgdG8gYmUgY3VycmVudGx5IGJlIHYxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPSgiRGVsZXRlQXBwbGljYXRpb24iLCkpCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"DDEbQQAagAQkN408NhoAjgEAAQAxGYEFEjEYEERCAAgxGRQxGBQQQzFEgQISRIEBQw==","clear":"DIEBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the ContractV1 contract + */ +export type ContractV1Args = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'delete()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'delete()void': [] + } +} + +/** + * The return type for each method + */ +export type ContractV1Returns = { + 'delete()void': void +} + +/** + * Defines the types of available calls and state of the ContractV1 smart contract. + */ +export type ContractV1Types = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'delete()void' | 'delete', { + argsObj: ContractV1Args['obj']['delete()void'] + argsTuple: ContractV1Args['tuple']['delete()void'] + returns: ContractV1Returns['delete()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type ContractV1Signatures = keyof ContractV1Types['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the ContractV1 smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = ContractV1Types['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the ContractV1 smart contract to the method's return type + */ +export type MethodReturn = ContractV1Types['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type ContractV1CreateCallParams = + | Expand +/** + * Defines supported delete method params for this smart contract + */ +export type ContractV1DeleteCallParams = + | Expand & {method: 'delete'}> + | Expand & {method: 'delete()void'}> +/** + * Defines arguments required for the deploy method. + */ +export type ContractV1DeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: ContractV1CreateCallParams + /** + * Delete transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + deleteParams?: ContractV1DeleteCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the ContractV1 smart contract + */ +export abstract class ContractV1ParamsFactory { + /** + * Gets available delete ABI call param factories + */ + static get delete() { + return { + _resolveByMethod(params: TParams) { + switch(params.method) { + case 'delete': + case 'delete()void': + return ContractV1ParamsFactory.delete.delete(params) + } + throw new Error(`Unknown ' + verb + ' method`) + }, + + /** + * Constructs delete ABI call params for the ContractV1 smart contract using the delete()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + delete(params: CallParams): AppClientMethodCallParams { + return { + ...params, + method: 'delete()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + +} + +/** + * A factory to create and deploy one or more instance of the ContractV1 smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class ContractV1Factory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `ContractV1Factory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new ContractV1Client(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new ContractV1Client(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the ContractV1 smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: ContractV1DeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + deleteParams: params.deleteParams?.method ? ContractV1ParamsFactory.delete._resolveByMethod(params.deleteParams) : params.deleteParams ? params.deleteParams as (ContractV1DeleteCallParams & { args: Uint8Array[] }) : undefined, + }) + return { result: result.result, appClient: new ContractV1Client(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ContractV1 smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + /** + * Gets available deployDelete methods + */ + deployDelete: { + /** + * Deletes an existing instance of the ContractV1 smart contract using the delete()void ABI method. + * + * @param params The params for the smart contract call + * @returns The deployDelete params + */ + delete: (params: CallParams = {args: []}) => { + return this.appFactory.params.deployDelete(ContractV1ParamsFactory.delete.delete(params)) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ContractV1 smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ContractV1 smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new ContractV1Client(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the ContractV1 smart contract + */ +export class ContractV1Client { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `ContractV1Client` + * + * @param appClient An `AppClient` instance which has been created with the ContractV1 app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `ContractV1Client` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `ContractV1Client` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new ContractV1Client(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `ContractV1Client` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new ContractV1Client(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available delete methods + */ + delete: { + /** + * Deletes an existing instance of the ContractV1 smart contract using the `delete()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The delete params + */ + delete: (params: CallParams & { onComplete?: OnApplicationComplete.DeleteApplication } = {args: []}) => { + return this.appClient.params.delete(ContractV1ParamsFactory.delete.delete(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the ContractV1 smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available delete methods + */ + delete: { + /** + * Deletes an existing instance of the ContractV1 smart contract using the `delete()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The delete transaction + */ + delete: (params: CallParams & { onComplete?: OnApplicationComplete.DeleteApplication } = {args: []}) => { + return this.appClient.createTransaction.delete(ContractV1ParamsFactory.delete.delete(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the ContractV1 smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available delete methods + */ + delete: { + /** + * Deletes an existing instance of the ContractV1 smart contract using the `delete()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The delete result + */ + delete: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.DeleteApplication } = {args: []}) => { + const result = await this.appClient.send.delete(ContractV1ParamsFactory.delete.delete(params)) + return {...result, return: result.return as unknown as (undefined | ContractV1Returns['delete()void'])} + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the ContractV1 smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new ContractV1Client(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current ContractV1 app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): ContractV1Composer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + get delete() { + return { + delete: (params: CallParams) => { + promiseChain = promiseChain.then(async () => composer.addAppDeleteMethodCall(await client.params.delete.delete(params))) + return this + }, + } + }, + /** + * Add a clear state call to the ContractV1 contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as ContractV1Composer + } +} +export type ContractV1Composer = { + /** + * Gets available delete methods + */ + readonly delete: { + /** + * Deletes an existing instance of the ContractV1 smart contract using the delete()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + delete(params?: CallParams): ContractV1Composer<[...TReturns, ContractV1Returns['delete()void'] | undefined]> + } + + /** + * Makes a clear_state call to an existing instance of the ContractV1 smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): ContractV1Composer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): ContractV1Composer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type ContractV1ComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/CryptoOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/CryptoOpsContract.ts new file mode 100644 index 0000000..d63f44a --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/CryptoOpsContract.ts @@ -0,0 +1,1422 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"CryptoOpsContract","structs":{},"methods":[{"name":"verify_sha256","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_sha3_256","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_keccak_256","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_sha512_256","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ed25519verify","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ed25519verify_bare","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_verify_k1","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"},{"type":"byte[]","name":"e"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_verify_r1","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"},{"type":"byte[]","name":"e"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_recover_k1","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"}],"returns":{"type":"(byte[],byte[])"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_recover_r1","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"}],"returns":{"type":"(byte[],byte[])"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"desc":"Must fail, AVM does not support Secp256r1 for recover","events":[],"recommendations":{}},{"name":"verify_ecdsa_decompress_k1","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"(byte[],byte[])"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_ecdsa_decompress_r1","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"(byte[],byte[])"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_vrf_verify","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"(byte[],bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMzAwMCA0CiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHgwMCAweDE1MWY3Yzc1MDAyMCAweDAwMDQgMHgwNjgxMDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQ3J5cHRvT3BzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDIwCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHgzNDU2YzRjMyAweGU4NDQyYjg0IDB4NjVmNTY3YWEgMHgyNTg0NTViMSAweDM1YWYwZjM4IDB4NjU4MmM5OTcgMHg2Mjk4ZmZiYiAweDM4ODViNTRmIDB4MjE2NGUwYmYgMHg3NTViNzlhNSAweGYwNmJiMDc3IDB4MTMzZjhjY2MgMHgyZjdjNjhhOSAvLyBtZXRob2QgInZlcmlmeV9zaGEyNTYoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9zaGEzXzI1NihieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2tlY2Nha18yNTYoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9zaGE1MTJfMjU2KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZWQyNTUxOXZlcmlmeShieXRlW10sYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfZWQyNTUxOXZlcmlmeV9iYXJlKGJ5dGVbXSxieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9lY2RzYV92ZXJpZnlfazEoYnl0ZVtdLGJ5dGVbXSxieXRlW10sYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfZWNkc2FfdmVyaWZ5X3IxKGJ5dGVbXSxieXRlW10sYnl0ZVtdLGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX3JlY292ZXJfazEoYnl0ZVtdLHVpbnQ2NCxieXRlW10sYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX3JlY292ZXJfcjEoYnl0ZVtdLHVpbnQ2NCxieXRlW10sYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX2RlY29tcHJlc3NfazEoYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX2RlY29tcHJlc3NfcjEoYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X3ZyZl92ZXJpZnkoYnl0ZVtdLGJ5dGVbXSxieXRlW10pKGJ5dGVbXSxib29sKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9zaGEyNTYgdmVyaWZ5X3NoYTNfMjU2IHZlcmlmeV9rZWNjYWtfMjU2IHZlcmlmeV9zaGE1MTJfMjU2IHZlcmlmeV9lZDI1NTE5dmVyaWZ5IHZlcmlmeV9lZDI1NTE5dmVyaWZ5X2JhcmUgdmVyaWZ5X2VjZHNhX3ZlcmlmeV9rMSB2ZXJpZnlfZWNkc2FfdmVyaWZ5X3IxIHZlcmlmeV9lY2RzYV9yZWNvdmVyX2sxIHZlcmlmeV9lY2RzYV9yZWNvdmVyX3IxIHZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX2sxIHZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX3IxIHZlcmlmeV92cmZfdmVyaWZ5CiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMjA6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyA0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3aXRjaCBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMyBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANAoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICBpdHhuX3N1Ym1pdAogICAgYiBlbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxCgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANDoKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMzoKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2OgogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfc2hhMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NoYTI1NjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjcKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjgKICAgIC8vIHJlc3VsdCA9IG9wLnNoYTI1NihhKQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUwMDIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcnlwdG9PcHMuY29udHJhY3QuQ3J5cHRvT3BzQ29udHJhY3QudmVyaWZ5X3NoYTNfMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NoYTNfMjU2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBhID0gb3AuYnplcm8ocGFkX3NpemUpICsgYQogICAgYnplcm8KICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxNAogICAgLy8gcmVzdWx0ID0gb3Auc2hhM18yNTYoYSkKICAgIHNoYTNfMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3J5cHRvT3BzLmNvbnRyYWN0LkNyeXB0b09wc0NvbnRyYWN0LnZlcmlmeV9rZWNjYWtfMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2tlY2Nha18yNTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MTkKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyByZXN1bHQgPSBvcC5rZWNjYWsyNTYoYSkKICAgIGtlY2NhazI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfc2hhNTEyXzI1Nltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zaGE1MTJfMjU2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhID0gb3AuYnplcm8ocGFkX3NpemUpICsgYQogICAgYnplcm8KICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyNgogICAgLy8gcmVzdWx0ID0gb3Auc2hhNTEyXzI1NihhKQogICAgc2hhNTEyXzI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWQyNTUxOXZlcmlmeVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lZDI1NTE5dmVyaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzEKICAgIC8vIGVuc3VyZV9idWRnZXQoMTkwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgMTkwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozMgogICAgLy8gcmVzdWx0ID0gb3AuZWQyNTUxOXZlcmlmeShhLCBiLCBjKQogICAgZWQyNTUxOXZlcmlmeQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozMwogICAgLy8gcmV0dXJuIGFyYzQuQm9vbChyZXN1bHQpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3J5cHRvT3BzLmNvbnRyYWN0LkNyeXB0b09wc0NvbnRyYWN0LnZlcmlmeV9lZDI1NTE5dmVyaWZ5X2JhcmVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZWQyNTUxOXZlcmlmeV9iYXJlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzcKICAgIC8vIGVuc3VyZV9idWRnZXQoMTkwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgMTkwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozOAogICAgLy8gcmVzdWx0ID0gb3AuZWQyNTUxOXZlcmlmeV9iYXJlKGEsIGIsIGMpCiAgICBlZDI1NTE5dmVyaWZ5X2JhcmUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzkKICAgIC8vIHJldHVybiBhcmM0LkJvb2wocmVzdWx0KQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfdmVyaWZ5X2sxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2VjZHNhX3ZlcmlmeV9rMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDMKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyByZXN1bHRfazEgPSBvcC5lY2RzYV92ZXJpZnkob3AuRUNEU0EuU2VjcDI1NmsxLCBhLCBiLCBjLCBkLCBlKQogICAgZWNkc2FfdmVyaWZ5IFNlY3AyNTZrMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfdmVyaWZ5X3IxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2VjZHNhX3ZlcmlmeV9yMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDkKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjUwCiAgICAvLyByZXN1bHRfcjEgPSBvcC5lY2RzYV92ZXJpZnkob3AuRUNEU0EuU2VjcDI1NnIxLCBhLCBiLCBjLCBkLCBlKQogICAgZWNkc2FfdmVyaWZ5IFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfcmVjb3Zlcl9rMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9yZWNvdmVyX2sxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NTcKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjU4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfcmVjb3ZlcihvcC5FQ0RTQS5TZWNwMjU2azEsIGEsIGIsIGMsIGQpCiAgICBlY2RzYV9wa19yZWNvdmVyIFNlY3AyNTZrMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfcmVjb3Zlcl9yMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9yZWNvdmVyX3IxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NjcKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjY4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfcmVjb3ZlcihvcC5FQ0RTQS5TZWNwMjU2cjEsIGEsIGIsIGMsIGQpCiAgICBlY2RzYV9wa19yZWNvdmVyIFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19rMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX2sxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmVfYnVkZ2V0KDcwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNzAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjczCiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfZGVjb21wcmVzcyhvcC5FQ0RTQS5TZWNwMjU2azEsIGEpCiAgICBlY2RzYV9wa19kZWNvbXByZXNzIFNlY3AyNTZrMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19yMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX3IxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBlbnN1cmVfYnVkZ2V0KDcwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNzAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfZGVjb21wcmVzcyhvcC5FQ0RTQS5TZWNwMjU2cjEsIGEpCiAgICBlY2RzYV9wa19kZWNvbXByZXNzIFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfdnJmX3ZlcmlmeVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV92cmZfdmVyaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6ODIKICAgIC8vIGVuc3VyZV9idWRnZXQoNTcwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNTcwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo4MwogICAgLy8gcmVzdWx0ID0gb3AudnJmX3ZlcmlmeShvcC5WcmZWZXJpZnkuVnJmQWxnb3JhbmQsIGEsIGIsIGMpCiAgICB2cmZfdmVyaWZ5IFZyZkFsZ29yYW5kCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAAG4FwQmBQQVH3x1AQAGFR98dQAgAgAEAwaBATEbQQBqMRkURDEYRIINBDRWxMME6EQrhARl9WeqBCWEVbEENa8POARlgsmXBGKY/7sEOIW1TwQhZOC/BHVbeaUE8GuwdwQTP4zMBC98aKk2GgCODQBEAFgAbACAAJQAuQDeAQ4BPgGGAc4CCAJCADEZFDEYFBBDigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScEsh4nBLIfi/+NAgALAASzQv/bMgCyAUL/9SKyAUL/74k2GgFXAgA2GgIXr0xQASpMULAjQzYaAVcCADYaAhevTFCYKkxQsCNDNhoBVwIANhoCF69MUAIqTFCwI0M2GgFXAgA2GgIXr0xQAypMULAjQzYaAVcCADYaAlcCADYaA1cCAIHsDiKI/1wEKSJPAlQoTFCwI0M2GgFXAgA2GgJXAgA2GgNXAgCB7A4iiP83hCkiTwJUKExQsCNDNhoBVwIANhoCVwIANhoDVwIANhoEVwIANhoFVwIAJCKI/wgFACkiTwJUKExQsCNDNhoBVwIANhoCVwIANhoDVwIANhoEVwIANhoFVwIAJCKI/tgFASkiTwJUKExQsCNDNhoBVwIANhoCFzYaA1cCADYaBFcCACQiiP6wBwBLARUWVwYCTwJQSRUlCEsCFRZXBgJPA1BMFlcGAitMUE8CUExQKExQsCNDNhoBVwIANhoCFzYaA1cCADYaBFcCACQiiP5oBwFLARUWVwYCTwJQSRUlCEsCFRZXBgJPA1BMFlcGAitMUE8CUExQKExQsCNDNhoBVwIAgbwFIoj+LgYASwEVFlcGAk8CUEkVJQhLAhUWVwYCTwNQTBZXBgIrTFBPAlBMUChMULAjQzYaAVcCAIG8BSKI/fQGAUsBFRZXBgJPAlBJFSUISwIVFlcGAk8DUEwWVwYCK0xQTwJQTFAoTFCwI0M2GgFXAgA2GgJXAgA2GgNXAgCBxCwiiP2u0ABLARUWVwYCTwJQKSJPA1SAAgADTFBMUChMULAjQw==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the CryptoOpsContract contract + */ +export type CryptoOpsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_sha256(byte[],uint64)byte[]': { + a: Uint8Array + padSize: bigint | number + } + 'verify_sha3_256(byte[],uint64)byte[]': { + a: Uint8Array + padSize: bigint | number + } + 'verify_keccak_256(byte[],uint64)byte[]': { + a: Uint8Array + padSize: bigint | number + } + 'verify_sha512_256(byte[],uint64)byte[]': { + a: Uint8Array + padSize: bigint | number + } + 'verify_ed25519verify(byte[],byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + c: Uint8Array + } + 'verify_ed25519verify_bare(byte[],byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + c: Uint8Array + } + 'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + c: Uint8Array + d: Uint8Array + e: Uint8Array + } + 'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + c: Uint8Array + d: Uint8Array + e: Uint8Array + } + 'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])': { + a: Uint8Array + b: bigint | number + c: Uint8Array + d: Uint8Array + } + 'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])': { + a: Uint8Array + b: bigint | number + c: Uint8Array + d: Uint8Array + } + 'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])': { + a: Uint8Array + } + 'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])': { + a: Uint8Array + } + 'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)': { + a: Uint8Array + b: Uint8Array + c: Uint8Array + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_sha256(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] + 'verify_sha3_256(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] + 'verify_keccak_256(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] + 'verify_sha512_256(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] + 'verify_ed25519verify(byte[],byte[],byte[])bool': [a: Uint8Array, b: Uint8Array, c: Uint8Array] + 'verify_ed25519verify_bare(byte[],byte[],byte[])bool': [a: Uint8Array, b: Uint8Array, c: Uint8Array] + 'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool': [a: Uint8Array, b: Uint8Array, c: Uint8Array, d: Uint8Array, e: Uint8Array] + 'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool': [a: Uint8Array, b: Uint8Array, c: Uint8Array, d: Uint8Array, e: Uint8Array] + 'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])': [a: Uint8Array, b: bigint | number, c: Uint8Array, d: Uint8Array] + 'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])': [a: Uint8Array, b: bigint | number, c: Uint8Array, d: Uint8Array] + 'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])': [a: Uint8Array] + 'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])': [a: Uint8Array] + 'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)': [a: Uint8Array, b: Uint8Array, c: Uint8Array] + } +} + +/** + * The return type for each method + */ +export type CryptoOpsContractReturns = { + 'verify_sha256(byte[],uint64)byte[]': Uint8Array + 'verify_sha3_256(byte[],uint64)byte[]': Uint8Array + 'verify_keccak_256(byte[],uint64)byte[]': Uint8Array + 'verify_sha512_256(byte[],uint64)byte[]': Uint8Array + 'verify_ed25519verify(byte[],byte[],byte[])bool': boolean + 'verify_ed25519verify_bare(byte[],byte[],byte[])bool': boolean + 'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool': boolean + 'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool': boolean + 'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])': [Uint8Array, Uint8Array] + 'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])': [Uint8Array, Uint8Array] + 'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])': [Uint8Array, Uint8Array] + 'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])': [Uint8Array, Uint8Array] + 'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)': [Uint8Array, boolean] +} + +/** + * Defines the types of available calls and state of the CryptoOpsContract smart contract. + */ +export type CryptoOpsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_sha256(byte[],uint64)byte[]' | 'verify_sha256', { + argsObj: CryptoOpsContractArgs['obj']['verify_sha256(byte[],uint64)byte[]'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_sha256(byte[],uint64)byte[]'] + returns: CryptoOpsContractReturns['verify_sha256(byte[],uint64)byte[]'] + }> + & Record<'verify_sha3_256(byte[],uint64)byte[]' | 'verify_sha3_256', { + argsObj: CryptoOpsContractArgs['obj']['verify_sha3_256(byte[],uint64)byte[]'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_sha3_256(byte[],uint64)byte[]'] + returns: CryptoOpsContractReturns['verify_sha3_256(byte[],uint64)byte[]'] + }> + & Record<'verify_keccak_256(byte[],uint64)byte[]' | 'verify_keccak_256', { + argsObj: CryptoOpsContractArgs['obj']['verify_keccak_256(byte[],uint64)byte[]'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_keccak_256(byte[],uint64)byte[]'] + returns: CryptoOpsContractReturns['verify_keccak_256(byte[],uint64)byte[]'] + }> + & Record<'verify_sha512_256(byte[],uint64)byte[]' | 'verify_sha512_256', { + argsObj: CryptoOpsContractArgs['obj']['verify_sha512_256(byte[],uint64)byte[]'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_sha512_256(byte[],uint64)byte[]'] + returns: CryptoOpsContractReturns['verify_sha512_256(byte[],uint64)byte[]'] + }> + & Record<'verify_ed25519verify(byte[],byte[],byte[])bool' | 'verify_ed25519verify', { + argsObj: CryptoOpsContractArgs['obj']['verify_ed25519verify(byte[],byte[],byte[])bool'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ed25519verify(byte[],byte[],byte[])bool'] + returns: CryptoOpsContractReturns['verify_ed25519verify(byte[],byte[],byte[])bool'] + }> + & Record<'verify_ed25519verify_bare(byte[],byte[],byte[])bool' | 'verify_ed25519verify_bare', { + argsObj: CryptoOpsContractArgs['obj']['verify_ed25519verify_bare(byte[],byte[],byte[])bool'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ed25519verify_bare(byte[],byte[],byte[])bool'] + returns: CryptoOpsContractReturns['verify_ed25519verify_bare(byte[],byte[],byte[])bool'] + }> + & Record<'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool' | 'verify_ecdsa_verify_k1', { + argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'] + returns: CryptoOpsContractReturns['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'] + }> + & Record<'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool' | 'verify_ecdsa_verify_r1', { + argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'] + returns: CryptoOpsContractReturns['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'] + }> + & Record<'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])' | 'verify_ecdsa_recover_k1', { + argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'] + returns: CryptoOpsContractReturns['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'] + }> + & Record<'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])' | 'verify_ecdsa_recover_r1', { + argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'] + returns: CryptoOpsContractReturns['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'] + }> + & Record<'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])' | 'verify_ecdsa_decompress_k1', { + argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'] + returns: CryptoOpsContractReturns['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'] + }> + & Record<'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])' | 'verify_ecdsa_decompress_r1', { + argsObj: CryptoOpsContractArgs['obj']['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'] + returns: CryptoOpsContractReturns['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'] + }> + & Record<'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)' | 'verify_vrf_verify', { + argsObj: CryptoOpsContractArgs['obj']['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'] + argsTuple: CryptoOpsContractArgs['tuple']['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'] + returns: CryptoOpsContractReturns['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type CryptoOpsContractSignatures = keyof CryptoOpsContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type CryptoOpsContractNonVoidMethodSignatures = keyof CryptoOpsContractTypes['methods'] extends infer T ? T extends keyof CryptoOpsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the CryptoOpsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = CryptoOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the CryptoOpsContract smart contract to the method's return type + */ +export type MethodReturn = CryptoOpsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type CryptoOpsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type CryptoOpsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: CryptoOpsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the CryptoOpsContract smart contract + */ +export abstract class CryptoOpsContractParamsFactory { + /** + * Constructs a no op call for the verify_sha256(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySha256(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_sha256(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], + } + } + /** + * Constructs a no op call for the verify_sha3_256(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySha3_256(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_sha3_256(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], + } + } + /** + * Constructs a no op call for the verify_keccak_256(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyKeccak_256(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_keccak_256(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], + } + } + /** + * Constructs a no op call for the verify_sha512_256(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySha512_256(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_sha512_256(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], + } + } + /** + * Constructs a no op call for the verify_ed25519verify(byte[],byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEd25519verify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ed25519verify(byte[],byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_ed25519verify_bare(byte[],byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEd25519verifyBare(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ed25519verify_bare(byte[],byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEcdsaVerifyK1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d, params.args.e], + } + } + /** + * Constructs a no op call for the verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEcdsaVerifyR1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d, params.args.e], + } + } + /** + * Constructs a no op call for the verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[]) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEcdsaRecoverK1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d], + } + } + /** + * Constructs a no op call for the verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[]) ABI method + * + * Must fail, AVM does not support Secp256r1 for recover + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEcdsaRecoverR1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d], + } + } + /** + * Constructs a no op call for the verify_ecdsa_decompress_k1(byte[])(byte[],byte[]) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEcdsaDecompressK1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ecdsa_decompress_k1(byte[])(byte[],byte[])' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_ecdsa_decompress_r1(byte[])(byte[],byte[]) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyEcdsaDecompressR1(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_ecdsa_decompress_r1(byte[])(byte[],byte[])' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_vrf_verify(byte[],byte[],byte[])(byte[],bool) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyVrfVerify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } +} + +/** + * A factory to create and deploy one or more instance of the CryptoOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class CryptoOpsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `CryptoOpsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new CryptoOpsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new CryptoOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the CryptoOpsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: CryptoOpsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new CryptoOpsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the CryptoOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the CryptoOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the CryptoOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new CryptoOpsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the CryptoOpsContract smart contract + */ +export class CryptoOpsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `CryptoOpsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the CryptoOpsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `CryptoOpsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `CryptoOpsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new CryptoOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `CryptoOpsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new CryptoOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the CryptoOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySha256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifySha256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha3_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySha3_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifySha3_256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_keccak_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyKeccak_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyKeccak_256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha512_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySha512_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifySha512_256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify(byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEd25519verify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEd25519verify(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify_bare(byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEd25519verifyBare: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEd25519verifyBare(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEcdsaVerifyK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyK1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEcdsaVerifyR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyR1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEcdsaRecoverK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverK1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. + * + * Must fail, AVM does not support Secp256r1 for recover + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEcdsaRecoverR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverR1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_k1(byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEcdsaDecompressK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressK1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_r1(byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyEcdsaDecompressR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressR1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyVrfVerify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(CryptoOpsContractParamsFactory.verifyVrfVerify(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the CryptoOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySha256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifySha256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha3_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySha3_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifySha3_256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_keccak_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyKeccak_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyKeccak_256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha512_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySha512_256: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifySha512_256(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify(byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEd25519verify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEd25519verify(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify_bare(byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEd25519verifyBare: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEd25519verifyBare(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEcdsaVerifyK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyK1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEcdsaVerifyR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyR1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEcdsaRecoverK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverK1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. + * + * Must fail, AVM does not support Secp256r1 for recover + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEcdsaRecoverR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverR1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_k1(byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEcdsaDecompressK1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressK1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_r1(byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyEcdsaDecompressR1: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressR1(params)) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyVrfVerify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(CryptoOpsContractParamsFactory.verifyVrfVerify(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the CryptoOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySha256: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifySha256(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_sha256(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha3_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySha3_256: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifySha3_256(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_sha3_256(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_keccak_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyKeccak_256: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyKeccak_256(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_keccak_256(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_sha512_256(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySha512_256: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifySha512_256(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_sha512_256(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify(byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEd25519verify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEd25519verify(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ed25519verify(byte[],byte[],byte[])bool'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ed25519verify_bare(byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEd25519verifyBare: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEd25519verifyBare(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ed25519verify_bare(byte[],byte[],byte[])bool'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEcdsaVerifyK1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyK1(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEcdsaVerifyR1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaVerifyR1(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEcdsaRecoverK1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverK1(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])` ABI method. + * + * Must fail, AVM does not support Secp256r1 for recover + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEcdsaRecoverR1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaRecoverR1(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_k1(byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEcdsaDecompressK1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressK1(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_ecdsa_decompress_r1(byte[])(byte[],byte[])` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyEcdsaDecompressR1: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyEcdsaDecompressR1(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'])} + }, + + /** + * Makes a call to the CryptoOpsContract smart contract using the `verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyVrfVerify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(CryptoOpsContractParamsFactory.verifyVrfVerify(params)) + return {...result, return: result.return as unknown as (undefined | CryptoOpsContractReturns['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new CryptoOpsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current CryptoOpsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): CryptoOpsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_sha256(byte[],uint64)byte[] method call against the CryptoOpsContract contract + */ + verifySha256(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySha256(params))) + return this + }, + /** + * Add a verify_sha3_256(byte[],uint64)byte[] method call against the CryptoOpsContract contract + */ + verifySha3_256(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySha3_256(params))) + return this + }, + /** + * Add a verify_keccak_256(byte[],uint64)byte[] method call against the CryptoOpsContract contract + */ + verifyKeccak_256(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyKeccak_256(params))) + return this + }, + /** + * Add a verify_sha512_256(byte[],uint64)byte[] method call against the CryptoOpsContract contract + */ + verifySha512_256(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySha512_256(params))) + return this + }, + /** + * Add a verify_ed25519verify(byte[],byte[],byte[])bool method call against the CryptoOpsContract contract + */ + verifyEd25519verify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEd25519verify(params))) + return this + }, + /** + * Add a verify_ed25519verify_bare(byte[],byte[],byte[])bool method call against the CryptoOpsContract contract + */ + verifyEd25519verifyBare(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEd25519verifyBare(params))) + return this + }, + /** + * Add a verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool method call against the CryptoOpsContract contract + */ + verifyEcdsaVerifyK1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaVerifyK1(params))) + return this + }, + /** + * Add a verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool method call against the CryptoOpsContract contract + */ + verifyEcdsaVerifyR1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaVerifyR1(params))) + return this + }, + /** + * Add a verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[]) method call against the CryptoOpsContract contract + */ + verifyEcdsaRecoverK1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaRecoverK1(params))) + return this + }, + /** + * Add a verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[]) method call against the CryptoOpsContract contract + */ + verifyEcdsaRecoverR1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaRecoverR1(params))) + return this + }, + /** + * Add a verify_ecdsa_decompress_k1(byte[])(byte[],byte[]) method call against the CryptoOpsContract contract + */ + verifyEcdsaDecompressK1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaDecompressK1(params))) + return this + }, + /** + * Add a verify_ecdsa_decompress_r1(byte[])(byte[],byte[]) method call against the CryptoOpsContract contract + */ + verifyEcdsaDecompressR1(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyEcdsaDecompressR1(params))) + return this + }, + /** + * Add a verify_vrf_verify(byte[],byte[],byte[])(byte[],bool) method call against the CryptoOpsContract contract + */ + verifyVrfVerify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyVrfVerify(params))) + return this + }, + /** + * Add a clear state call to the CryptoOpsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as CryptoOpsContractComposer + } +} +export type CryptoOpsContractComposer = { + /** + * Calls the verify_sha256(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySha256(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_sha256(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_sha3_256(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySha3_256(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_sha3_256(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_keccak_256(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyKeccak_256(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_keccak_256(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_sha512_256(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySha512_256(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_sha512_256(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_ed25519verify(byte[],byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEd25519verify(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ed25519verify(byte[],byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_ed25519verify_bare(byte[],byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEd25519verifyBare(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ed25519verify_bare(byte[],byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEcdsaVerifyK1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEcdsaVerifyR1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[]) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEcdsaRecoverK1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])'] | undefined]> + + /** + * Calls the verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[]) ABI method. + * + * Must fail, AVM does not support Secp256r1 for recover + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEcdsaRecoverR1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])'] | undefined]> + + /** + * Calls the verify_ecdsa_decompress_k1(byte[])(byte[],byte[]) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEcdsaDecompressK1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_decompress_k1(byte[])(byte[],byte[])'] | undefined]> + + /** + * Calls the verify_ecdsa_decompress_r1(byte[])(byte[],byte[]) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyEcdsaDecompressR1(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_ecdsa_decompress_r1(byte[])(byte[],byte[])'] | undefined]> + + /** + * Calls the verify_vrf_verify(byte[],byte[],byte[])(byte[],bool) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyVrfVerify(params?: CallParams): CryptoOpsContractComposer<[...TReturns, CryptoOpsContractReturns['verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the CryptoOpsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): CryptoOpsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): CryptoOpsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type CryptoOpsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/DynamicArrayInitContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/DynamicArrayInitContract.ts new file mode 100644 index 0000000..3ed4087 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/DynamicArrayInitContract.ts @@ -0,0 +1,755 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"DynamicArrayInitContract","structs":{},"methods":[{"name":"test_immutable_array_init","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_immutable_array_init_without_type_generic","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reference_array_init","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reference_array_init_without_type_generic","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDggMyAwCiAgICBieXRlY2Jsb2NrIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0ODAKICAgIC8vIGNsYXNzIER5bmFtaWNBcnJheUluaXRDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4ODQzNGJhMmEgMHg2M2FhYmJhMCAweGRiYWYwMzRlIDB4YTlkMTQ1NTQgLy8gbWV0aG9kICJ0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdCB0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljIHRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXQgdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDExOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5EeW5hbWljQXJyYXlJbml0Q29udHJhY3QudGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0ODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuRHluYW1pY0FycmF5SW5pdENvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkR5bmFtaWNBcnJheUluaXRDb250cmFjdC50ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNwogICAgLy8gYTEgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzMAogICAgLy8gYXNzZXJ0IGExLmxlbmd0aCA9PSBhMi5sZW5ndGgKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgLwogICAgaW50Y18yIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzMQogICAgLy8gYXNzZXJ0IGExWzBdID09IGEyWzBdCiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzMgogICAgLy8gYXNzZXJ0IGExWzFdID09IGEyWzFdCiAgICBkdXAKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzMKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhMlsyXQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzNwogICAgLy8gYXNzZXJ0IGExWzBdID09IGEzWzBdCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzgKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhM1sxXQogICAgZHVwCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTM5CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTNbMl0KICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQyCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGE0Lmxlbmd0aAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQzCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTRbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ0CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTRbMV0KICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0NQogICAgLy8gYXNzZXJ0IGExWzJdID09IGE0WzJdCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5EeW5hbWljQXJyYXlJbml0Q29udHJhY3QudGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpY1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NDkKICAgIC8vIGExID0gUmVmZXJlbmNlQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUyCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGEyLmxlbmd0aAogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUzCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTJbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU0CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTJbMV0KICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1NQogICAgLy8gYXNzZXJ0IGExWzJdID09IGEyWzJdCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU5CiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTNbMF0KICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU2MAogICAgLy8gYXNzZXJ0IGExWzFdID09IGEzWzFdCiAgICBkdXAKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjEKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhM1syXQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjQKICAgIC8vIGFzc2VydCBhMS5sZW5ndGggPT0gYTQubGVuZ3RoCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIGludGNfMiAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjUKICAgIC8vIGFzc2VydCBhMVswXSA9PSBhNFswXQogICAgZHVwCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjYKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhNFsxXQogICAgZHVwCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY3CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTRbMl0KICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAQgDACYBGAAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAzEbQQArMRkURDEYRIIEBIQ0uioEY6q7oATbrwNOBKnRRVQ2GgCOBAAJAAsADQBZADEZFDEYFBBDIkMiQyhHAhUjCiQSREklWyISREkjW4ECEkSBEFskEkRHAiVbIhJESSNbgQISRIEQWyQSREkVIwokEkRJJVsiEkRJI1uBAhJEgRBbJBJEIkMoRwIVIwokEkRJJVsiEkRJI1uBAhJEgRBbJBJERwIlWyISREkjW4ECEkSBEFskEkRJFSMKJBJESSVbIhJESSNbgQISRIEQWyQSRCJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the DynamicArrayInitContract contract + */ +export type DynamicArrayInitContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'test_immutable_array_init()void': Record + 'test_immutable_array_init_without_type_generic()void': Record + 'test_reference_array_init()void': Record + 'test_reference_array_init_without_type_generic()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'test_immutable_array_init()void': [] + 'test_immutable_array_init_without_type_generic()void': [] + 'test_reference_array_init()void': [] + 'test_reference_array_init_without_type_generic()void': [] + } +} + +/** + * The return type for each method + */ +export type DynamicArrayInitContractReturns = { + 'test_immutable_array_init()void': void + 'test_immutable_array_init_without_type_generic()void': void + 'test_reference_array_init()void': void + 'test_reference_array_init_without_type_generic()void': void +} + +/** + * Defines the types of available calls and state of the DynamicArrayInitContract smart contract. + */ +export type DynamicArrayInitContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'test_immutable_array_init()void' | 'test_immutable_array_init', { + argsObj: DynamicArrayInitContractArgs['obj']['test_immutable_array_init()void'] + argsTuple: DynamicArrayInitContractArgs['tuple']['test_immutable_array_init()void'] + returns: DynamicArrayInitContractReturns['test_immutable_array_init()void'] + }> + & Record<'test_immutable_array_init_without_type_generic()void' | 'test_immutable_array_init_without_type_generic', { + argsObj: DynamicArrayInitContractArgs['obj']['test_immutable_array_init_without_type_generic()void'] + argsTuple: DynamicArrayInitContractArgs['tuple']['test_immutable_array_init_without_type_generic()void'] + returns: DynamicArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'] + }> + & Record<'test_reference_array_init()void' | 'test_reference_array_init', { + argsObj: DynamicArrayInitContractArgs['obj']['test_reference_array_init()void'] + argsTuple: DynamicArrayInitContractArgs['tuple']['test_reference_array_init()void'] + returns: DynamicArrayInitContractReturns['test_reference_array_init()void'] + }> + & Record<'test_reference_array_init_without_type_generic()void' | 'test_reference_array_init_without_type_generic', { + argsObj: DynamicArrayInitContractArgs['obj']['test_reference_array_init_without_type_generic()void'] + argsTuple: DynamicArrayInitContractArgs['tuple']['test_reference_array_init_without_type_generic()void'] + returns: DynamicArrayInitContractReturns['test_reference_array_init_without_type_generic()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type DynamicArrayInitContractSignatures = keyof DynamicArrayInitContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the DynamicArrayInitContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = DynamicArrayInitContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the DynamicArrayInitContract smart contract to the method's return type + */ +export type MethodReturn = DynamicArrayInitContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type DynamicArrayInitContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type DynamicArrayInitContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: DynamicArrayInitContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the DynamicArrayInitContract smart contract + */ +export abstract class DynamicArrayInitContractParamsFactory { + /** + * Constructs a no op call for the test_immutable_array_init()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImmutableArrayInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_immutable_array_init()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_immutable_array_init_without_type_generic()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImmutableArrayInitWithoutTypeGeneric(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_immutable_array_init_without_type_generic()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_reference_array_init()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testReferenceArrayInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_reference_array_init()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_reference_array_init_without_type_generic()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testReferenceArrayInitWithoutTypeGeneric(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_reference_array_init_without_type_generic()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the DynamicArrayInitContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class DynamicArrayInitContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `DynamicArrayInitContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new DynamicArrayInitContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new DynamicArrayInitContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the DynamicArrayInitContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: DynamicArrayInitContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new DynamicArrayInitContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the DynamicArrayInitContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the DynamicArrayInitContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the DynamicArrayInitContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new DynamicArrayInitContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the DynamicArrayInitContract smart contract + */ +export class DynamicArrayInitContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `DynamicArrayInitContractClient` + * + * @param appClient An `AppClient` instance which has been created with the DynamicArrayInitContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `DynamicArrayInitContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `DynamicArrayInitContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new DynamicArrayInitContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `DynamicArrayInitContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new DynamicArrayInitContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the DynamicArrayInitContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImmutableArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInit(params)) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImmutableArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testReferenceArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInit(params)) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testReferenceArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the DynamicArrayInitContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImmutableArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInit(params)) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImmutableArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testReferenceArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInit(params)) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testReferenceArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the DynamicArrayInitContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImmutableArrayInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInit(params)) + return {...result, return: result.return as unknown as (undefined | DynamicArrayInitContractReturns['test_immutable_array_init()void'])} + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImmutableArrayInitWithoutTypeGeneric: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(DynamicArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) + return {...result, return: result.return as unknown as (undefined | DynamicArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'])} + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testReferenceArrayInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInit(params)) + return {...result, return: result.return as unknown as (undefined | DynamicArrayInitContractReturns['test_reference_array_init()void'])} + }, + + /** + * Makes a call to the DynamicArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testReferenceArrayInitWithoutTypeGeneric: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(DynamicArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) + return {...result, return: result.return as unknown as (undefined | DynamicArrayInitContractReturns['test_reference_array_init_without_type_generic()void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new DynamicArrayInitContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current DynamicArrayInitContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): DynamicArrayInitContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a test_immutable_array_init()void method call against the DynamicArrayInitContract contract + */ + testImmutableArrayInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArrayInit(params))) + return this + }, + /** + * Add a test_immutable_array_init_without_type_generic()void method call against the DynamicArrayInitContract contract + */ + testImmutableArrayInitWithoutTypeGeneric(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArrayInitWithoutTypeGeneric(params))) + return this + }, + /** + * Add a test_reference_array_init()void method call against the DynamicArrayInitContract contract + */ + testReferenceArrayInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testReferenceArrayInit(params))) + return this + }, + /** + * Add a test_reference_array_init_without_type_generic()void method call against the DynamicArrayInitContract contract + */ + testReferenceArrayInitWithoutTypeGeneric(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testReferenceArrayInitWithoutTypeGeneric(params))) + return this + }, + /** + * Add a clear state call to the DynamicArrayInitContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as DynamicArrayInitContractComposer + } +} +export type DynamicArrayInitContractComposer = { + /** + * Calls the test_immutable_array_init()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImmutableArrayInit(params?: CallParams): DynamicArrayInitContractComposer<[...TReturns, DynamicArrayInitContractReturns['test_immutable_array_init()void'] | undefined]> + + /** + * Calls the test_immutable_array_init_without_type_generic()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImmutableArrayInitWithoutTypeGeneric(params?: CallParams): DynamicArrayInitContractComposer<[...TReturns, DynamicArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'] | undefined]> + + /** + * Calls the test_reference_array_init()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testReferenceArrayInit(params?: CallParams): DynamicArrayInitContractComposer<[...TReturns, DynamicArrayInitContractReturns['test_reference_array_init()void'] | undefined]> + + /** + * Calls the test_reference_array_init_without_type_generic()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testReferenceArrayInitWithoutTypeGeneric(params?: CallParams): DynamicArrayInitContractComposer<[...TReturns, DynamicArrayInitContractReturns['test_reference_array_init_without_type_generic()void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the DynamicArrayInitContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): DynamicArrayInitContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): DynamicArrayInitContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type DynamicArrayInitContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/DynamicItxnGroup.ts b/examples/p-py/projects/p-py-frontend/src/contracts/DynamicItxnGroup.ts new file mode 100644 index 0000000..8c63c52 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/DynamicItxnGroup.ts @@ -0,0 +1,629 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"DynamicItxnGroup","structs":{},"methods":[{"name":"test_firstly","args":[{"type":"address[]","name":"addresses"},{"type":"pay","name":"funds"},{"type":"uint64","name":"verifier"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_looply","args":[{"type":"address[]","name":"addresses"},{"type":"pay","name":"funds"},{"type":"uint64","name":"verifier"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[85,217],"errorMessage":"Funds must be sent to app"},{"pc":[141,250],"errorMessage":"index access is out of bounds"},{"pc":[89,220],"errorMessage":"invalid array length header"},{"pc":[94,225],"errorMessage":"must provide some accounts"},{"pc":[72,204],"errorMessage":"transaction type is pay"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgNgogICAgYnl0ZWNibG9jayAweDY1YTlhZWNjICJhYmMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBjbGFzcyBEeW5hbWljSXR4bkdyb3VwKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHgxNzM5MTc4NCAweDNmMTBhZWE3IC8vIG1ldGhvZCAidGVzdF9maXJzdGx5KGFkZHJlc3NbXSxwYXksdWludDY0KXZvaWQiLCBtZXRob2QgInRlc3RfbG9vcGx5KGFkZHJlc3NbXSxwYXksdWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB0ZXN0X2ZpcnN0bHkgdGVzdF9sb29wbHkKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuZHluYW1pY19pdHhuX2dyb3VwLmNvbnRyYWN0LkR5bmFtaWNJdHhuR3JvdXAudGVzdF9maXJzdGx5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9maXJzdGx5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MTgKICAgIC8vIGFzc2VydCBmdW5kcy5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLCAiRnVuZHMgbXVzdCBiZSBzZW50IHRvIGFwcCIKICAgIGR1cAogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEZ1bmRzIG11c3QgYmUgc2VudCB0byBhcHAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MjAKICAgIC8vIGFzc2VydCBhZGRyZXNzZXMubGVuZ3RoLCAibXVzdCBwcm92aWRlIHNvbWUgYWNjb3VudHMiCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBhc3NlcnQgLy8gbXVzdCBwcm92aWRlIHNvbWUgYWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MjIKICAgIC8vIHNoYXJlID0gZnVuZHMuYW1vdW50IC8vIGFkZHJlc3Nlcy5sZW5ndGgKICAgIHN3YXAKICAgIGd0eG5zIEFtb3VudAogICAgc3dhcAogICAgLwogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBpdHhuLlBheW1lbnQoYW1vdW50PXNoYXJlLCByZWNlaXZlcj1hZGRyZXNzZXNbMF0ubmF0aXZlKS5zdGFnZShiZWdpbl9ncm91cD1UcnVlKQogICAgaXR4bl9iZWdpbgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBleHRyYWN0IDIgMzIKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpbnRjXzAgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MjYKICAgIC8vIGZvciBpIGluIHVyYW5nZSgxLCBhZGRyZXNzZXMubGVuZ3RoKToKICAgIGludGNfMCAvLyAxCgp0ZXN0X2ZpcnN0bHlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weToyNgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGFkZHJlc3Nlcy5sZW5ndGgpOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogdGVzdF9maXJzdGx5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBhZGRyID0gYWRkcmVzc2VzW2ldCiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAzMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBpdHhuLlBheW1lbnQoYW1vdW50PXNoYXJlLCByZWNlaXZlcj1hZGRyLm5hdGl2ZSkuc3RhZ2UoKQogICAgaXR4bl9uZXh0CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBkaWcgMwogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGludGNfMCAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weToyNgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGFkZHJlc3Nlcy5sZW5ndGgpOgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2ZpcnN0bHlfZm9yX2hlYWRlckAyCgp0ZXN0X2ZpcnN0bHlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjMwLTMyCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9dmVyaWZpZXIuaWQsIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJ2ZXJpZnkoKXZvaWQiKSwpCiAgICAvLyApLnN0YWdlKCkKICAgIGl0eG5fbmV4dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTozMQogICAgLy8gYXBwX2lkPXZlcmlmaWVyLmlkLCBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgidmVyaWZ5KCl2b2lkIiksKQogICAgYnl0ZWNfMCAvLyBtZXRob2QgInZlcmlmeSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6MzQKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoYXNzZXRfbmFtZT0iYWJjIikuc3RhZ2UoKQogICAgaXR4bl9uZXh0CiAgICBieXRlY18xIC8vICJhYmMiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TmFtZQogICAgcHVzaGludCAzIC8vIGFjZmcKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTozNgogICAgLy8gaXR4bi5zdWJtaXRfc3RhZ2VkKCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuZHluYW1pY19pdHhuX2dyb3VwLmNvbnRyYWN0LkR5bmFtaWNJdHhuR3JvdXAudGVzdF9sb29wbHlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2xvb3BseToKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBhc3NlcnQgZnVuZHMucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywgIkZ1bmRzIG11c3QgYmUgc2VudCB0byBhcHAiCiAgICBkdXAKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBGdW5kcyBtdXN0IGJlIHNlbnQgdG8gYXBwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBhc3NlcnQgYWRkcmVzc2VzLmxlbmd0aCwgIm11c3QgcHJvdmlkZSBzb21lIGFjY291bnRzIgogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBhc3NlcnQgLy8gbXVzdCBwcm92aWRlIHNvbWUgYWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NDkKICAgIC8vIHNoYXJlID0gZnVuZHMuYW1vdW50IC8vIGFkZHJlc3Nlcy5sZW5ndGgKICAgIHN3YXAKICAgIGd0eG5zIEFtb3VudAogICAgc3dhcAogICAgLwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTo1MQogICAgLy8gaXNfZmlyc3QgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgaW50Y18xIC8vIDAKCnRlc3RfbG9vcGx5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NTIKICAgIC8vIGZvciBhZGRyIGluIGFkZHJlc3NlczoKICAgIGR1cAogICAgZGlnIDQKICAgIDwKICAgIGJ6IHRlc3RfbG9vcGx5X2FmdGVyX2ZvckA4CiAgICBkaWcgNQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMzIKICAgICoKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidXJ5IDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NTQKICAgIC8vIG15X3R4bi5zdGFnZShiZWdpbl9ncm91cD1pc19maXJzdCkKICAgIGRpZyAxCiAgICBieiB0ZXN0X2xvb3BseV9pdHhuX25leHRANQogICAgaXR4bl9iZWdpbgoKdGVzdF9sb29wbHlfYWZ0ZXJfaXR4bl9iZWdpbl9uZXh0QDY6CiAgICBkaWcgNgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZGlnIDIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBteV90eG4gPSBpdHhuLlBheW1lbnQoYW1vdW50PXNoYXJlLCByZWNlaXZlcj1hZGRyLm5hdGl2ZSkKICAgIGludGNfMCAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTo1NQogICAgLy8gaXNfZmlyc3QgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGJ1cnkgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfbG9vcGx5X2Zvcl9oZWFkZXJAMgoKdGVzdF9sb29wbHlfaXR4bl9uZXh0QDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBteV90eG4uc3RhZ2UoYmVnaW5fZ3JvdXA9aXNfZmlyc3QpCiAgICBpdHhuX25leHQKICAgIGIgdGVzdF9sb29wbHlfYWZ0ZXJfaXR4bl9iZWdpbl9uZXh0QDYKCnRlc3RfbG9vcGx5X2FmdGVyX2ZvckA4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTo1Ny01OQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPXZlcmlmaWVyLmlkLCBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgidmVyaWZ5KCl2b2lkIiksKQogICAgLy8gKS5zdGFnZSgpCiAgICBpdHhuX25leHQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NTgKICAgIC8vIGFwcF9pZD12ZXJpZmllci5pZCwgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoInZlcmlmeSgpdm9pZCIpLCkKICAgIGJ5dGVjXzAgLy8gbWV0aG9kICJ2ZXJpZnkoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTo1NwogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKGFzc2V0X25hbWU9ImFiYyIpLnN0YWdlKCkKICAgIGl0eG5fbmV4dAogICAgYnl0ZWNfMSAvLyAiYWJjIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIHB1c2hpbnQgMyAvLyBhY2ZnCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvY29udHJhY3QucHk6NjMKICAgIC8vIGl0eG4uc3VibWl0X3N0YWdlZCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC9jb250cmFjdC5weTozOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAQAgBiYCBGWprswDYWJjMRtBAB0xGRREMRhEggIEFzkXhAQ/EK6nNhoAjgIACQCLADEZFDEYFBBDNhoBMRYiCUk4ECISRDYaAhdOAkk4BzIKEkRLASNZSU4DSURMOAhMCklOArFLAVcCAE4CTFcCILIHsggishAjsgEiSUsEDEEAHUcCJAtLA0wkWLayB0sDsggishAjsgEiCEUBQv/ctiiyGksEshglshAjsgG2KbImgQOyECOyAbMiQyM2GgFJMRYiCUk4ECISRDYaAhdOAkk4BzIKEkRMI1lJTgJJREw4CEwKIiNJSwQMQQAwSwVXAgBLASQLJFhFB0sBQQAasUsGsgdLArIIIrIQI7IBI0UCSSIIRQFC/822Qv/jtiiyGksEshglshAjsgG2KbImgQOyECOyAbMiQw==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the DynamicItxnGroup contract + */ +export type DynamicItxnGroupArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'test_firstly(address[],pay,uint64)void': { + addresses: string[] + funds: AppMethodCallTransactionArgument + verifier: bigint | number + } + 'test_looply(address[],pay,uint64)void': { + addresses: string[] + funds: AppMethodCallTransactionArgument + verifier: bigint | number + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'test_firstly(address[],pay,uint64)void': [addresses: string[], funds: AppMethodCallTransactionArgument, verifier: bigint | number] + 'test_looply(address[],pay,uint64)void': [addresses: string[], funds: AppMethodCallTransactionArgument, verifier: bigint | number] + } +} + +/** + * The return type for each method + */ +export type DynamicItxnGroupReturns = { + 'test_firstly(address[],pay,uint64)void': void + 'test_looply(address[],pay,uint64)void': void +} + +/** + * Defines the types of available calls and state of the DynamicItxnGroup smart contract. + */ +export type DynamicItxnGroupTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'test_firstly(address[],pay,uint64)void' | 'test_firstly', { + argsObj: DynamicItxnGroupArgs['obj']['test_firstly(address[],pay,uint64)void'] + argsTuple: DynamicItxnGroupArgs['tuple']['test_firstly(address[],pay,uint64)void'] + returns: DynamicItxnGroupReturns['test_firstly(address[],pay,uint64)void'] + }> + & Record<'test_looply(address[],pay,uint64)void' | 'test_looply', { + argsObj: DynamicItxnGroupArgs['obj']['test_looply(address[],pay,uint64)void'] + argsTuple: DynamicItxnGroupArgs['tuple']['test_looply(address[],pay,uint64)void'] + returns: DynamicItxnGroupReturns['test_looply(address[],pay,uint64)void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type DynamicItxnGroupSignatures = keyof DynamicItxnGroupTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the DynamicItxnGroup smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = DynamicItxnGroupTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the DynamicItxnGroup smart contract to the method's return type + */ +export type MethodReturn = DynamicItxnGroupTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type DynamicItxnGroupCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type DynamicItxnGroupDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: DynamicItxnGroupCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the DynamicItxnGroup smart contract + */ +export abstract class DynamicItxnGroupParamsFactory { + /** + * Constructs a no op call for the test_firstly(address[],pay,uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testFirstly(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_firstly(address[],pay,uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.addresses, params.args.funds, params.args.verifier], + } + } + /** + * Constructs a no op call for the test_looply(address[],pay,uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testLooply(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_looply(address[],pay,uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.addresses, params.args.funds, params.args.verifier], + } + } +} + +/** + * A factory to create and deploy one or more instance of the DynamicItxnGroup smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class DynamicItxnGroupFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `DynamicItxnGroupFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new DynamicItxnGroupClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new DynamicItxnGroupClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the DynamicItxnGroup smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: DynamicItxnGroupDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new DynamicItxnGroupClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the DynamicItxnGroup smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the DynamicItxnGroup smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the DynamicItxnGroup smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new DynamicItxnGroupClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the DynamicItxnGroup smart contract + */ +export class DynamicItxnGroupClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `DynamicItxnGroupClient` + * + * @param appClient An `AppClient` instance which has been created with the DynamicItxnGroup app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `DynamicItxnGroupClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `DynamicItxnGroupClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new DynamicItxnGroupClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `DynamicItxnGroupClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new DynamicItxnGroupClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the DynamicItxnGroup smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the DynamicItxnGroup smart contract using the `test_firstly(address[],pay,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testFirstly: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(DynamicItxnGroupParamsFactory.testFirstly(params)) + }, + + /** + * Makes a call to the DynamicItxnGroup smart contract using the `test_looply(address[],pay,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testLooply: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(DynamicItxnGroupParamsFactory.testLooply(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the DynamicItxnGroup smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the DynamicItxnGroup smart contract using the `test_firstly(address[],pay,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testFirstly: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(DynamicItxnGroupParamsFactory.testFirstly(params)) + }, + + /** + * Makes a call to the DynamicItxnGroup smart contract using the `test_looply(address[],pay,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testLooply: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(DynamicItxnGroupParamsFactory.testLooply(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the DynamicItxnGroup smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the DynamicItxnGroup smart contract using the `test_firstly(address[],pay,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testFirstly: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(DynamicItxnGroupParamsFactory.testFirstly(params)) + return {...result, return: result.return as unknown as (undefined | DynamicItxnGroupReturns['test_firstly(address[],pay,uint64)void'])} + }, + + /** + * Makes a call to the DynamicItxnGroup smart contract using the `test_looply(address[],pay,uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testLooply: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(DynamicItxnGroupParamsFactory.testLooply(params)) + return {...result, return: result.return as unknown as (undefined | DynamicItxnGroupReturns['test_looply(address[],pay,uint64)void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new DynamicItxnGroupClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current DynamicItxnGroup app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): DynamicItxnGroupComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a test_firstly(address[],pay,uint64)void method call against the DynamicItxnGroup contract + */ + testFirstly(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testFirstly(params))) + return this + }, + /** + * Add a test_looply(address[],pay,uint64)void method call against the DynamicItxnGroup contract + */ + testLooply(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testLooply(params))) + return this + }, + /** + * Add a clear state call to the DynamicItxnGroup contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as DynamicItxnGroupComposer + } +} +export type DynamicItxnGroupComposer = { + /** + * Calls the test_firstly(address[],pay,uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testFirstly(params?: CallParams): DynamicItxnGroupComposer<[...TReturns, DynamicItxnGroupReturns['test_firstly(address[],pay,uint64)void'] | undefined]> + + /** + * Calls the test_looply(address[],pay,uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testLooply(params?: CallParams): DynamicItxnGroupComposer<[...TReturns, DynamicItxnGroupReturns['test_looply(address[],pay,uint64)void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the DynamicItxnGroup smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): DynamicItxnGroupComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): DynamicItxnGroupComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type DynamicItxnGroupComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateContract.ts new file mode 100644 index 0000000..0d69d22 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateContract.ts @@ -0,0 +1,2649 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"GlobalStateContract","structs":{},"methods":[{"name":"get_implicit_key_arc4_uint","args":[],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_string","args":[],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_byte","args":[],"returns":{"type":"byte"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_bool","args":[],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_address","args":[],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_uint128","args":[],"returns":{"type":"uint128"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_dynamic_bytes","args":[],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_tuple","args":[],"returns":{"type":"(uint64,byte[],bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_uint","args":[],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_string","args":[],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_byte","args":[],"returns":{"type":"byte"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_bool","args":[],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_address","args":[],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_uint128","args":[],"returns":{"type":"uint128"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_dynamic_bytes","args":[],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_uint","args":[{"type":"uint64","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_string","args":[{"type":"string","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_byte","args":[{"type":"byte","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_bool","args":[{"type":"bool","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_address","args":[{"type":"address","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_uint128","args":[{"type":"uint128","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_arc4_dynamic_bytes","args":[{"type":"byte[]","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_implicit_key_tuple","args":[{"type":"(uint64,byte[],bool)","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_uint","args":[{"type":"uint64","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_string","args":[{"type":"string","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_byte","args":[{"type":"byte","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_bool","args":[{"type":"bool","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_address","args":[{"type":"address","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_uint128","args":[{"type":"uint128","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"set_arc4_dynamic_bytes","args":[{"type":"byte[]","name":"value"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":15},"local":{"ints":0,"bytes":0}},"keys":{"global":{"implicit_key_arc4_uint":{"keyType":"AVMString","valueType":"uint64","key":"aW1wbGljaXRfa2V5X2FyYzRfdWludA=="},"implicit_key_arc4_string":{"keyType":"AVMString","valueType":"string","key":"aW1wbGljaXRfa2V5X2FyYzRfc3RyaW5n"},"implicit_key_arc4_byte":{"keyType":"AVMString","valueType":"byte","key":"aW1wbGljaXRfa2V5X2FyYzRfYnl0ZQ=="},"implicit_key_arc4_bool":{"keyType":"AVMString","valueType":"bool","key":"aW1wbGljaXRfa2V5X2FyYzRfYm9vbA=="},"implicit_key_arc4_address":{"keyType":"AVMString","valueType":"address","key":"aW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcw=="},"implicit_key_arc4_uint128":{"keyType":"AVMString","valueType":"uint128","key":"aW1wbGljaXRfa2V5X2FyYzRfdWludDEyOA=="},"implicit_key_arc4_dynamic_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"aW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcw=="},"implicit_key_tuple":{"keyType":"AVMString","valueType":"(uint64,byte[],bool)","key":"aW1wbGljaXRfa2V5X3R1cGxl"},"arc4_uint":{"keyType":"AVMString","valueType":"uint64","key":"ZXhwbGljaXRfa2V5X2FyYzRfdWludA=="},"arc4_string":{"keyType":"AVMString","valueType":"string","key":"ZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5n"},"arc4_byte":{"keyType":"AVMString","valueType":"byte","key":"ZXhwbGljaXRfa2V5X2FyYzRfYnl0ZQ=="},"arc4_bool":{"keyType":"AVMString","valueType":"bool","key":"ZXhwbGljaXRfa2V5X2FyYzRfYm9vbA=="},"arc4_address":{"keyType":"AVMString","valueType":"address","key":"ZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcw=="},"arc4_uint128":{"keyType":"AVMString","valueType":"uint128","key":"ZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOA=="},"arc4_dynamic_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"ZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcw=="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[906],"errorMessage":"check self.arc4_address exists"},{"pc":[895],"errorMessage":"check self.arc4_bool exists"},{"pc":[884],"errorMessage":"check self.arc4_byte exists"},{"pc":[928],"errorMessage":"check self.arc4_dynamic_bytes exists"},{"pc":[873],"errorMessage":"check self.arc4_string exists"},{"pc":[862],"errorMessage":"check self.arc4_uint exists"},{"pc":[917],"errorMessage":"check self.arc4_uint128 exists"},{"pc":[818],"errorMessage":"check self.implicit_key_arc4_address exists"},{"pc":[807],"errorMessage":"check self.implicit_key_arc4_bool exists"},{"pc":[796],"errorMessage":"check self.implicit_key_arc4_byte exists"},{"pc":[840],"errorMessage":"check self.implicit_key_arc4_dynamic_bytes exists"},{"pc":[786],"errorMessage":"check self.implicit_key_arc4_string exists"},{"pc":[776],"errorMessage":"check self.implicit_key_arc4_uint exists"},{"pc":[829],"errorMessage":"check self.implicit_key_arc4_uint128 exists"},{"pc":[851],"errorMessage":"check self.implicit_key_tuple exists"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIgImltcGxpY2l0X2tleV9hcmM0X3N0cmluZyIgImltcGxpY2l0X2tleV9hcmM0X2J5dGUiICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIiAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAiaW1wbGljaXRfa2V5X3R1cGxlIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIgImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIgImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIiAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAweDAwMDAwMDAwMDAwMDA1MzkgMHgwMDA1NDg2NTZjNmM2ZiAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE1LTUxNgogICAgLy8gIyBJbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQgPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQ2NCgxMzM3KSkKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlYyAxNiAvLyAweDAwMDAwMDAwMDAwMDA1MzkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE3CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyA9IEdsb2JhbFN0YXRlKGFyYzQuU3RyaW5nKCJIZWxsbyIpKQogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYnl0ZWMgMTcgLy8gMHgwMDA1NDg2NTZjNmM2ZgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSA9IEdsb2JhbFN0YXRlKGFyYzQuQnl0ZSgwKSkKICAgIGJ5dGVjXzMgLy8gImltcGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTkKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbCA9IEdsb2JhbFN0YXRlKGFyYzQuQm9vbChUcnVlKSkKICAgIGJ5dGVjIDQgLy8gImltcGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjAKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyA9IEdsb2JhbFN0YXRlKGFyYzQuQWRkcmVzcyhHbG9iYWwuY3JlYXRvcl9hZGRyZXNzKSkKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTIxCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQxMjgoMioqMTAwKSkKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBieXRlYyAxOCAvLyAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyMgogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzID0gR2xvYmFsU3RhdGUoYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikpCiAgICBieXRlYyA3IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYnl0ZWMgMTkgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV90dXBsZSA9IEdsb2JhbFN0YXRlKChVSW50NjQoMTApLCBCeXRlcyhiInRlc3QiKSwgRmFsc2UpKQogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwYTAwMGIwMDAwMDQ3NDY1NzM3NAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjUtNTI2CiAgICAvLyAjIEV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIHNlbGYuYXJjNF91aW50ID0gR2xvYmFsU3RhdGUoYXJjNC5VSW50NjQoMTMzNyksIGtleT0iZXhwbGljaXRfa2V5X2FyYzRfdWludCIpCiAgICBieXRlYyA5IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYnl0ZWMgMTYgLy8gMHgwMDAwMDAwMDAwMDAwNTM5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyNwogICAgLy8gc2VsZi5hcmM0X3N0cmluZyA9IEdsb2JhbFN0YXRlKGFyYzQuU3RyaW5nKCJIZWxsbyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIpCiAgICBieXRlYyAxMCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUxNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcgPSBHbG9iYWxTdGF0ZShhcmM0LlN0cmluZygiSGVsbG8iKSkKICAgIGJ5dGVjIDE3IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjcKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmcgPSBHbG9iYWxTdGF0ZShhcmM0LlN0cmluZygiSGVsbG8iKSwga2V5PSJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjgKICAgIC8vIHNlbGYuYXJjNF9ieXRlID0gR2xvYmFsU3RhdGUoYXJjNC5CeXRlKDApLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiKQogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjkKICAgIC8vIHNlbGYuYXJjNF9ib29sID0gR2xvYmFsU3RhdGUoYXJjNC5Cb29sKFRydWUpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiKQogICAgYnl0ZWMgMTIgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2wgPSBHbG9iYWxTdGF0ZShhcmM0LkJvb2woVHJ1ZSkpCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyOQogICAgLy8gc2VsZi5hcmM0X2Jvb2wgPSBHbG9iYWxTdGF0ZShhcmM0LkJvb2woVHJ1ZSksIGtleT0iZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIpCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMQogICAgLy8gYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMC01MzIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMwogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjggPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQxMjgoMioqMTAwKSwga2V5PSJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IikKICAgIGJ5dGVjIDE0IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYnl0ZWMgMTggLy8gMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzUKICAgIC8vIGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICBieXRlYyAxNSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjIKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyA9IEdsb2JhbFN0YXRlKGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpKQogICAgYnl0ZWMgMTkgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzQtNTM2CiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyA9IEdsb2JhbFN0YXRlKAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTEzCiAgICAvLyBjbGFzcyBHbG9iYWxTdGF0ZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzOQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4MWNjOTY2ZWUgMHgyMzY3Y2Q0YiAweDY5MTI4ZTkwIDB4NjhkNTkwZTIgMHg0NGVmMDY4MSAweDFjZDI5NGVjIDB4YWFjOGVjYjEgMHgxNjZjNmFmZCAweDNjYzNiYjdiIDB4OWE2OTQ2YWQgMHhkZWQ3NTAzMyAweDY2Mjc5ZTkzIDB4MDk2ZTkyN2IgMHg5NzUzMWZiYyAweDZlYTNmOTk2IDB4YTdmNGY0MDIgMHhhYWRkY2M0YyAweDVlYzMxMTZkIDB4MjBmNTZlZWUgMHgxYzE0OWE0MyAweGE1NzVhYzdkIDB4ODdmMDg2OWIgMHg0NjFhZmM2ZCAweDA0ODExNmVhIDB4MzBlMzRhOTMgMHhkMmU2NDZlZiAweGU2NzRhMjcwIDB4YTg3ZTU0MGQgMHg3MjBhM2NhMCAweDI1NzcwOGY3IC8vIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQoKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZygpc3RyaW5nIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSgpYnl0ZSIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woKWJvb2wiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKClhZGRyZXNzIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCgpdWludDEyOCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMoKWJ5dGVbXSIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV90dXBsZSgpKHVpbnQ2NCxieXRlW10sYm9vbCkiLCBtZXRob2QgImdldF9hcmM0X3VpbnQoKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2FyYzRfc3RyaW5nKClzdHJpbmciLCBtZXRob2QgImdldF9hcmM0X2J5dGUoKWJ5dGUiLCBtZXRob2QgImdldF9hcmM0X2Jvb2woKWJvb2wiLCBtZXRob2QgImdldF9hcmM0X2FkZHJlc3MoKWFkZHJlc3MiLCBtZXRob2QgImdldF9hcmM0X3VpbnQxMjgoKXVpbnQxMjgiLCBtZXRob2QgImdldF9hcmM0X2R5bmFtaWNfYnl0ZXMoKWJ5dGVbXSIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQodWludDY0KXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcoc3RyaW5nKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKGJ5dGUpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woYm9vbCl2b2lkIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyhhZGRyZXNzKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4KHVpbnQxMjgpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMoYnl0ZVtdKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfdHVwbGUoKHVpbnQ2NCxieXRlW10sYm9vbCkpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfdWludCh1aW50NjQpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfc3RyaW5nKHN0cmluZyl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9ieXRlKGJ5dGUpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfYm9vbChib29sKXZvaWQiLCBtZXRob2QgInNldF9hcmM0X2FkZHJlc3MoYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF91aW50MTI4KHVpbnQxMjgpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfZHluYW1pY19ieXRlcyhieXRlW10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50IGdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGUgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2wgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMgZ2V0X2ltcGxpY2l0X2tleV90dXBsZSBnZXRfYXJjNF91aW50IGdldF9hcmM0X3N0cmluZyBnZXRfYXJjNF9ieXRlIGdldF9hcmM0X2Jvb2wgZ2V0X2FyYzRfYWRkcmVzcyBnZXRfYXJjNF91aW50MTI4IGdldF9hcmM0X2R5bmFtaWNfYnl0ZXMgc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQgc2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBzZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSBzZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCBzZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCBzZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBzZXRfaW1wbGljaXRfa2V5X3R1cGxlIHNldF9hcmM0X3VpbnQgc2V0X2FyYzRfc3RyaW5nIHNldF9hcmM0X2J5dGUgc2V0X2FyYzRfYm9vbCBzZXRfYXJjNF9hZGRyZXNzIHNldF9hcmM0X3VpbnQxMjggc2V0X2FyYzRfZHluYW1pY19ieXRlcwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDM5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0MQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludCBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzgtNTM5CiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0NQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NDkKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTUzCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1NwogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NjEKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTY1CiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NjkKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV90dXBsZS52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDggLy8gImltcGxpY2l0X2tleV90dXBsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGUgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU3NAogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50LnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X3VpbnQgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTcxLTU3MgogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgZXhwbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTc4CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3N0cmluZy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9zdHJpbmcgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4MgogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9ieXRlLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ieXRlIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1ODYKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYm9vbC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfYm9vbCBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTkwCiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2FkZHJlc3MudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X2FkZHJlc3MgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5NAogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50MTI4LnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF91aW50MTI4IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OTgKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfZHluYW1pY19ieXRlcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDMKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludC52YWx1ZSA9IHZhbHVlCiAgICBieXRlY18xIC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwMC02MDEKICAgIC8vICMgU2V0dGVyIG1ldGhvZHMgZm9yIGltcGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjAzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDAtNjAxCiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDcKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjExCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWNfMyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjExCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTUKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyA0IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTUKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxOQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxOQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4W3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgNiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjcKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcy52YWx1ZSA9IHZhbHVlLmNvcHkoKQogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI3CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMudmFsdWUgPSB2YWx1ZS5jb3B5KCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfdHVwbGVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzMQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzEKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gc2VsZi5hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzMtNjM0CiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gc2VsZi5hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzMtNjM0CiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X3N0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDAKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmcudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTAgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQwCiAgICAvLyBzZWxmLmFyYzRfc3RyaW5nLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NAogICAgLy8gc2VsZi5hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NAogICAgLy8gc2VsZi5hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfYm9vbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ4CiAgICAvLyBzZWxmLmFyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyAxMiAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ4CiAgICAvLyBzZWxmLmFyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2FyYzRfYWRkcmVzczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjIDEzIC8vICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfZHluYW1pY19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjYwCiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlcy52YWx1ZSA9IHZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMTUgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY2MAogICAgLy8gc2VsZi5hcmM0X2R5bmFtaWNfYnl0ZXMudmFsdWUgPSB2YWx1ZS5jb3B5KCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmFAQVH3x1FmltcGxpY2l0X2tleV9hcmM0X3VpbnQYaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nFmltcGxpY2l0X2tleV9hcmM0X2J5dGUWaW1wbGljaXRfa2V5X2FyYzRfYm9vbBlpbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzGWltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcxJpbXBsaWNpdF9rZXlfdHVwbGUWZXhwbGljaXRfa2V5X2FyYzRfdWludBhleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmcWZXhwbGljaXRfa2V5X2FyYzRfYnl0ZRZleHBsaWNpdF9rZXlfYXJjNF9ib29sGWV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MZZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOB9leHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzCAAAAAAAAAU5BwAFSGVsbG8QAAAAEAAAAAAAAAAAAAAAAA8ADWR5bmFtaWMgYnl0ZXMxGEAAXSknEGcqJxFnK4ABAGcnBIABgGcnBTIJZycGJxJnJwcnE2cnCIARAAAAAAAAAAoACwAABHRlc3RnJwknEGcnCicRZycLgAEAZycMgAGAZycNMglnJw4nEmcnDycTZzEbQQDhMRkURDEYRIIeBBzJZu4EI2fNSwRpEo6QBGjVkOIERO8GgQQc0pTsBKrI7LEEFmxq/QQ8w7t7BJppRq0E3tdQMwRmJ56TBAluknsEl1MfvARuo/mWBKf09AIEqt3MTARewxFtBCD1bu4EHBSaQwSldax9BIfwhpsERhr8bQQEgRbqBDDjSpME0uZG7wTmdKJwBKh+VA0Ecgo8oAQldwj3NhoAjh4ACQATAB0AJwAyAD0ASABTAF4AaQB0AH8AigCVAKAAqwCyALkAwADIANAA2ADgAOgA8AD4AQABCAEQARgAMRkUMRgUEEMjKWVEKExQsCJDIyplRChMULAiQyMrZUQoTFCwIkMjJwRlRChMULAiQyMnBWVEKExQsCJDIycGZUQoTFCwIkMjJwdlRChMULAiQyMnCGVEKExQsCJDIycJZUQoTFCwIkMjJwplRChMULAiQyMnC2VEKExQsCJDIycMZUQoTFCwIkMjJw1lRChMULAiQyMnDmVEKExQsCJDIycPZUQoTFCwIkMpNhoBZyJDKjYaAWciQys2GgFnIkMnBDYaAWciQycFNhoBZyJDJwY2GgFnIkMnBzYaAWciQycINhoBZyJDJwk2GgFnIkMnCjYaAWciQycLNhoBZyJDJww2GgFnIkMnDTYaAWciQycONhoBZyJDJw82GgFnIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the GlobalStateContract contract + */ +export type GlobalStateContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'get_implicit_key_arc4_uint()uint64': Record + 'get_implicit_key_arc4_string()string': Record + 'get_implicit_key_arc4_byte()byte': Record + 'get_implicit_key_arc4_bool()bool': Record + 'get_implicit_key_arc4_address()address': Record + 'get_implicit_key_arc4_uint128()uint128': Record + 'get_implicit_key_arc4_dynamic_bytes()byte[]': Record + 'get_implicit_key_tuple()(uint64,byte[],bool)': Record + 'get_arc4_uint()uint64': Record + 'get_arc4_string()string': Record + 'get_arc4_byte()byte': Record + 'get_arc4_bool()bool': Record + 'get_arc4_address()address': Record + 'get_arc4_uint128()uint128': Record + 'get_arc4_dynamic_bytes()byte[]': Record + 'set_implicit_key_arc4_uint(uint64)void': { + value: bigint | number + } + 'set_implicit_key_arc4_string(string)void': { + value: string + } + 'set_implicit_key_arc4_byte(byte)void': { + value: number + } + 'set_implicit_key_arc4_bool(bool)void': { + value: boolean + } + 'set_implicit_key_arc4_address(address)void': { + value: string + } + 'set_implicit_key_arc4_uint128(uint128)void': { + value: bigint | number + } + 'set_implicit_key_arc4_dynamic_bytes(byte[])void': { + value: Uint8Array + } + 'set_implicit_key_tuple((uint64,byte[],bool))void': { + value: [bigint | number, Uint8Array, boolean] + } + 'set_arc4_uint(uint64)void': { + value: bigint | number + } + 'set_arc4_string(string)void': { + value: string + } + 'set_arc4_byte(byte)void': { + value: number + } + 'set_arc4_bool(bool)void': { + value: boolean + } + 'set_arc4_address(address)void': { + value: string + } + 'set_arc4_uint128(uint128)void': { + value: bigint | number + } + 'set_arc4_dynamic_bytes(byte[])void': { + value: Uint8Array + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'get_implicit_key_arc4_uint()uint64': [] + 'get_implicit_key_arc4_string()string': [] + 'get_implicit_key_arc4_byte()byte': [] + 'get_implicit_key_arc4_bool()bool': [] + 'get_implicit_key_arc4_address()address': [] + 'get_implicit_key_arc4_uint128()uint128': [] + 'get_implicit_key_arc4_dynamic_bytes()byte[]': [] + 'get_implicit_key_tuple()(uint64,byte[],bool)': [] + 'get_arc4_uint()uint64': [] + 'get_arc4_string()string': [] + 'get_arc4_byte()byte': [] + 'get_arc4_bool()bool': [] + 'get_arc4_address()address': [] + 'get_arc4_uint128()uint128': [] + 'get_arc4_dynamic_bytes()byte[]': [] + 'set_implicit_key_arc4_uint(uint64)void': [value: bigint | number] + 'set_implicit_key_arc4_string(string)void': [value: string] + 'set_implicit_key_arc4_byte(byte)void': [value: number] + 'set_implicit_key_arc4_bool(bool)void': [value: boolean] + 'set_implicit_key_arc4_address(address)void': [value: string] + 'set_implicit_key_arc4_uint128(uint128)void': [value: bigint | number] + 'set_implicit_key_arc4_dynamic_bytes(byte[])void': [value: Uint8Array] + 'set_implicit_key_tuple((uint64,byte[],bool))void': [value: [bigint | number, Uint8Array, boolean]] + 'set_arc4_uint(uint64)void': [value: bigint | number] + 'set_arc4_string(string)void': [value: string] + 'set_arc4_byte(byte)void': [value: number] + 'set_arc4_bool(bool)void': [value: boolean] + 'set_arc4_address(address)void': [value: string] + 'set_arc4_uint128(uint128)void': [value: bigint | number] + 'set_arc4_dynamic_bytes(byte[])void': [value: Uint8Array] + } +} + +/** + * The return type for each method + */ +export type GlobalStateContractReturns = { + 'get_implicit_key_arc4_uint()uint64': bigint + 'get_implicit_key_arc4_string()string': string + 'get_implicit_key_arc4_byte()byte': number + 'get_implicit_key_arc4_bool()bool': boolean + 'get_implicit_key_arc4_address()address': string + 'get_implicit_key_arc4_uint128()uint128': bigint + 'get_implicit_key_arc4_dynamic_bytes()byte[]': Uint8Array + 'get_implicit_key_tuple()(uint64,byte[],bool)': [bigint, Uint8Array, boolean] + 'get_arc4_uint()uint64': bigint + 'get_arc4_string()string': string + 'get_arc4_byte()byte': number + 'get_arc4_bool()bool': boolean + 'get_arc4_address()address': string + 'get_arc4_uint128()uint128': bigint + 'get_arc4_dynamic_bytes()byte[]': Uint8Array + 'set_implicit_key_arc4_uint(uint64)void': void + 'set_implicit_key_arc4_string(string)void': void + 'set_implicit_key_arc4_byte(byte)void': void + 'set_implicit_key_arc4_bool(bool)void': void + 'set_implicit_key_arc4_address(address)void': void + 'set_implicit_key_arc4_uint128(uint128)void': void + 'set_implicit_key_arc4_dynamic_bytes(byte[])void': void + 'set_implicit_key_tuple((uint64,byte[],bool))void': void + 'set_arc4_uint(uint64)void': void + 'set_arc4_string(string)void': void + 'set_arc4_byte(byte)void': void + 'set_arc4_bool(bool)void': void + 'set_arc4_address(address)void': void + 'set_arc4_uint128(uint128)void': void + 'set_arc4_dynamic_bytes(byte[])void': void +} + +/** + * Defines the types of available calls and state of the GlobalStateContract smart contract. + */ +export type GlobalStateContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'get_implicit_key_arc4_uint()uint64' | 'get_implicit_key_arc4_uint', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_uint()uint64'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_uint()uint64'] + returns: GlobalStateContractReturns['get_implicit_key_arc4_uint()uint64'] + }> + & Record<'get_implicit_key_arc4_string()string' | 'get_implicit_key_arc4_string', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_string()string'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_string()string'] + returns: GlobalStateContractReturns['get_implicit_key_arc4_string()string'] + }> + & Record<'get_implicit_key_arc4_byte()byte' | 'get_implicit_key_arc4_byte', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_byte()byte'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_byte()byte'] + returns: GlobalStateContractReturns['get_implicit_key_arc4_byte()byte'] + }> + & Record<'get_implicit_key_arc4_bool()bool' | 'get_implicit_key_arc4_bool', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_bool()bool'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_bool()bool'] + returns: GlobalStateContractReturns['get_implicit_key_arc4_bool()bool'] + }> + & Record<'get_implicit_key_arc4_address()address' | 'get_implicit_key_arc4_address', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_address()address'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_address()address'] + returns: GlobalStateContractReturns['get_implicit_key_arc4_address()address'] + }> + & Record<'get_implicit_key_arc4_uint128()uint128' | 'get_implicit_key_arc4_uint128', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_uint128()uint128'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_uint128()uint128'] + returns: GlobalStateContractReturns['get_implicit_key_arc4_uint128()uint128'] + }> + & Record<'get_implicit_key_arc4_dynamic_bytes()byte[]' | 'get_implicit_key_arc4_dynamic_bytes', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_arc4_dynamic_bytes()byte[]'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_arc4_dynamic_bytes()byte[]'] + returns: GlobalStateContractReturns['get_implicit_key_arc4_dynamic_bytes()byte[]'] + }> + & Record<'get_implicit_key_tuple()(uint64,byte[],bool)' | 'get_implicit_key_tuple', { + argsObj: GlobalStateContractArgs['obj']['get_implicit_key_tuple()(uint64,byte[],bool)'] + argsTuple: GlobalStateContractArgs['tuple']['get_implicit_key_tuple()(uint64,byte[],bool)'] + returns: GlobalStateContractReturns['get_implicit_key_tuple()(uint64,byte[],bool)'] + }> + & Record<'get_arc4_uint()uint64' | 'get_arc4_uint', { + argsObj: GlobalStateContractArgs['obj']['get_arc4_uint()uint64'] + argsTuple: GlobalStateContractArgs['tuple']['get_arc4_uint()uint64'] + returns: GlobalStateContractReturns['get_arc4_uint()uint64'] + }> + & Record<'get_arc4_string()string' | 'get_arc4_string', { + argsObj: GlobalStateContractArgs['obj']['get_arc4_string()string'] + argsTuple: GlobalStateContractArgs['tuple']['get_arc4_string()string'] + returns: GlobalStateContractReturns['get_arc4_string()string'] + }> + & Record<'get_arc4_byte()byte' | 'get_arc4_byte', { + argsObj: GlobalStateContractArgs['obj']['get_arc4_byte()byte'] + argsTuple: GlobalStateContractArgs['tuple']['get_arc4_byte()byte'] + returns: GlobalStateContractReturns['get_arc4_byte()byte'] + }> + & Record<'get_arc4_bool()bool' | 'get_arc4_bool', { + argsObj: GlobalStateContractArgs['obj']['get_arc4_bool()bool'] + argsTuple: GlobalStateContractArgs['tuple']['get_arc4_bool()bool'] + returns: GlobalStateContractReturns['get_arc4_bool()bool'] + }> + & Record<'get_arc4_address()address' | 'get_arc4_address', { + argsObj: GlobalStateContractArgs['obj']['get_arc4_address()address'] + argsTuple: GlobalStateContractArgs['tuple']['get_arc4_address()address'] + returns: GlobalStateContractReturns['get_arc4_address()address'] + }> + & Record<'get_arc4_uint128()uint128' | 'get_arc4_uint128', { + argsObj: GlobalStateContractArgs['obj']['get_arc4_uint128()uint128'] + argsTuple: GlobalStateContractArgs['tuple']['get_arc4_uint128()uint128'] + returns: GlobalStateContractReturns['get_arc4_uint128()uint128'] + }> + & Record<'get_arc4_dynamic_bytes()byte[]' | 'get_arc4_dynamic_bytes', { + argsObj: GlobalStateContractArgs['obj']['get_arc4_dynamic_bytes()byte[]'] + argsTuple: GlobalStateContractArgs['tuple']['get_arc4_dynamic_bytes()byte[]'] + returns: GlobalStateContractReturns['get_arc4_dynamic_bytes()byte[]'] + }> + & Record<'set_implicit_key_arc4_uint(uint64)void' | 'set_implicit_key_arc4_uint', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_uint(uint64)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_uint(uint64)void'] + returns: GlobalStateContractReturns['set_implicit_key_arc4_uint(uint64)void'] + }> + & Record<'set_implicit_key_arc4_string(string)void' | 'set_implicit_key_arc4_string', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_string(string)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_string(string)void'] + returns: GlobalStateContractReturns['set_implicit_key_arc4_string(string)void'] + }> + & Record<'set_implicit_key_arc4_byte(byte)void' | 'set_implicit_key_arc4_byte', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_byte(byte)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_byte(byte)void'] + returns: GlobalStateContractReturns['set_implicit_key_arc4_byte(byte)void'] + }> + & Record<'set_implicit_key_arc4_bool(bool)void' | 'set_implicit_key_arc4_bool', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_bool(bool)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_bool(bool)void'] + returns: GlobalStateContractReturns['set_implicit_key_arc4_bool(bool)void'] + }> + & Record<'set_implicit_key_arc4_address(address)void' | 'set_implicit_key_arc4_address', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_address(address)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_address(address)void'] + returns: GlobalStateContractReturns['set_implicit_key_arc4_address(address)void'] + }> + & Record<'set_implicit_key_arc4_uint128(uint128)void' | 'set_implicit_key_arc4_uint128', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_uint128(uint128)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_uint128(uint128)void'] + returns: GlobalStateContractReturns['set_implicit_key_arc4_uint128(uint128)void'] + }> + & Record<'set_implicit_key_arc4_dynamic_bytes(byte[])void' | 'set_implicit_key_arc4_dynamic_bytes', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_arc4_dynamic_bytes(byte[])void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_arc4_dynamic_bytes(byte[])void'] + returns: GlobalStateContractReturns['set_implicit_key_arc4_dynamic_bytes(byte[])void'] + }> + & Record<'set_implicit_key_tuple((uint64,byte[],bool))void' | 'set_implicit_key_tuple', { + argsObj: GlobalStateContractArgs['obj']['set_implicit_key_tuple((uint64,byte[],bool))void'] + argsTuple: GlobalStateContractArgs['tuple']['set_implicit_key_tuple((uint64,byte[],bool))void'] + returns: GlobalStateContractReturns['set_implicit_key_tuple((uint64,byte[],bool))void'] + }> + & Record<'set_arc4_uint(uint64)void' | 'set_arc4_uint', { + argsObj: GlobalStateContractArgs['obj']['set_arc4_uint(uint64)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_arc4_uint(uint64)void'] + returns: GlobalStateContractReturns['set_arc4_uint(uint64)void'] + }> + & Record<'set_arc4_string(string)void' | 'set_arc4_string', { + argsObj: GlobalStateContractArgs['obj']['set_arc4_string(string)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_arc4_string(string)void'] + returns: GlobalStateContractReturns['set_arc4_string(string)void'] + }> + & Record<'set_arc4_byte(byte)void' | 'set_arc4_byte', { + argsObj: GlobalStateContractArgs['obj']['set_arc4_byte(byte)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_arc4_byte(byte)void'] + returns: GlobalStateContractReturns['set_arc4_byte(byte)void'] + }> + & Record<'set_arc4_bool(bool)void' | 'set_arc4_bool', { + argsObj: GlobalStateContractArgs['obj']['set_arc4_bool(bool)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_arc4_bool(bool)void'] + returns: GlobalStateContractReturns['set_arc4_bool(bool)void'] + }> + & Record<'set_arc4_address(address)void' | 'set_arc4_address', { + argsObj: GlobalStateContractArgs['obj']['set_arc4_address(address)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_arc4_address(address)void'] + returns: GlobalStateContractReturns['set_arc4_address(address)void'] + }> + & Record<'set_arc4_uint128(uint128)void' | 'set_arc4_uint128', { + argsObj: GlobalStateContractArgs['obj']['set_arc4_uint128(uint128)void'] + argsTuple: GlobalStateContractArgs['tuple']['set_arc4_uint128(uint128)void'] + returns: GlobalStateContractReturns['set_arc4_uint128(uint128)void'] + }> + & Record<'set_arc4_dynamic_bytes(byte[])void' | 'set_arc4_dynamic_bytes', { + argsObj: GlobalStateContractArgs['obj']['set_arc4_dynamic_bytes(byte[])void'] + argsTuple: GlobalStateContractArgs['tuple']['set_arc4_dynamic_bytes(byte[])void'] + returns: GlobalStateContractReturns['set_arc4_dynamic_bytes(byte[])void'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + global: { + keys: { + implicitKeyArc4Uint: bigint + implicitKeyArc4String: string + implicitKeyArc4Byte: number + implicitKeyArc4Bool: boolean + implicitKeyArc4Address: string + implicitKeyArc4Uint128: bigint + implicitKeyArc4DynamicBytes: Uint8Array + implicitKeyTuple: [bigint, Uint8Array, boolean] + arc4Uint: bigint + arc4String: string + arc4Byte: number + arc4Bool: boolean + arc4Address: string + arc4Uint128: bigint + arc4DynamicBytes: Uint8Array + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type GlobalStateContractSignatures = keyof GlobalStateContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type GlobalStateContractNonVoidMethodSignatures = keyof GlobalStateContractTypes['methods'] extends infer T ? T extends keyof GlobalStateContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the GlobalStateContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = GlobalStateContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the GlobalStateContract smart contract to the method's return type + */ +export type MethodReturn = GlobalStateContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed global state of the application. + */ +export type GlobalKeysState = GlobalStateContractTypes['state']['global']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type GlobalStateContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type GlobalStateContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: GlobalStateContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the GlobalStateContract smart contract + */ +export abstract class GlobalStateContractParamsFactory { + /** + * Constructs a no op call for the get_implicit_key_arc4_uint()uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_uint()uint64' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_string()string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_string()string' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_byte()byte ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_byte()byte' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_bool()bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_bool()bool' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_address()address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_address()address' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_uint128()uint128 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_uint128()uint128' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_dynamic_bytes()byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_dynamic_bytes()byte[]' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_implicit_key_tuple()(uint64,byte[],bool) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_tuple()(uint64,byte[],bool)' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_arc4_uint()uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_uint()uint64' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_arc4_string()string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_string()string' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_arc4_byte()byte ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_byte()byte' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_arc4_bool()bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_bool()bool' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_arc4_address()address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_address()address' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_arc4_uint128()uint128 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_uint128()uint128' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get_arc4_dynamic_bytes()byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_dynamic_bytes()byte[]' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the set_implicit_key_arc4_uint(uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_arc4_uint(uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_implicit_key_arc4_string(string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_arc4_string(string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_implicit_key_arc4_byte(byte)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_arc4_byte(byte)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_implicit_key_arc4_bool(bool)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_arc4_bool(bool)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_implicit_key_arc4_address(address)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_arc4_address(address)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_implicit_key_arc4_uint128(uint128)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_arc4_uint128(uint128)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_implicit_key_arc4_dynamic_bytes(byte[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_arc4_dynamic_bytes(byte[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_implicit_key_tuple((uint64,byte[],bool))void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setImplicitKeyTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_implicit_key_tuple((uint64,byte[],bool))void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_arc4_uint(uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_arc4_uint(uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_arc4_string(string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_arc4_string(string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_arc4_byte(byte)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_arc4_byte(byte)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_arc4_bool(bool)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_arc4_bool(bool)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_arc4_address(address)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_arc4_address(address)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_arc4_uint128(uint128)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_arc4_uint128(uint128)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } + /** + * Constructs a no op call for the set_arc4_dynamic_bytes(byte[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'set_arc4_dynamic_bytes(byte[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value], + } + } +} + +/** + * A factory to create and deploy one or more instance of the GlobalStateContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class GlobalStateContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `GlobalStateContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new GlobalStateContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new GlobalStateContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the GlobalStateContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: GlobalStateContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new GlobalStateContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the GlobalStateContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the GlobalStateContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the GlobalStateContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new GlobalStateContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the GlobalStateContract smart contract + */ +export class GlobalStateContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `GlobalStateContractClient` + * + * @param appClient An `AppClient` instance which has been created with the GlobalStateContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `GlobalStateContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `GlobalStateContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new GlobalStateContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `GlobalStateContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new GlobalStateContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the GlobalStateContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_string()string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_byte()byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_bool()bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_address()address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint128()uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes()byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_tuple()(uint64,byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getImplicitKeyTuple(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_string()string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_byte()byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_bool()bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_address()address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint128()uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_dynamic_bytes()byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.getArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_string(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_byte(byte)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_bool(bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_address(address)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint128(uint128)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_dynamic_bytes(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_tuple((uint64,byte[],bool))void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setImplicitKeyTuple(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_string(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_byte(byte)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_bool(bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_address(address)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint128(uint128)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_dynamic_bytes(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + setArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateContractParamsFactory.setArc4DynamicBytes(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the GlobalStateContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_string()string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_byte()byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_bool()bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_address()address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint128()uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes()byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_tuple()(uint64,byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getImplicitKeyTuple(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_string()string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_byte()byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_bool()bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_address()address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint128()uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_dynamic_bytes()byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.getArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_string(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_byte(byte)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_bool(bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_address(address)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint128(uint128)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_dynamic_bytes(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_tuple((uint64,byte[],bool))void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setImplicitKeyTuple(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Uint(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_string(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4String(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_byte(byte)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Byte(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_bool(bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Bool(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_address(address)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Address(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint128(uint128)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4Uint128(params)) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_dynamic_bytes(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + setArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateContractParamsFactory.setArc4DynamicBytes(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the GlobalStateContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_uint()uint64'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_string()string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4String(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_string()string'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_byte()byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_byte()byte'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_bool()bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_bool()bool'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_address()address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Address(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_address()address'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_uint128()uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_uint128()uint128'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes()byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_arc4_dynamic_bytes()byte[]'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_implicit_key_tuple()(uint64,byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getImplicitKeyTuple(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_implicit_key_tuple()(uint64,byte[],bool)'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint()uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Uint(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_uint()uint64'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_string()string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4String(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_string()string'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_byte()byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Byte(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_byte()byte'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_bool()bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Bool(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_bool()bool'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_address()address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Address(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_address()address'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_uint128()uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4Uint128(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_uint128()uint128'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `get_arc4_dynamic_bytes()byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.getArc4DynamicBytes(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['get_arc4_dynamic_bytes()byte[]'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_uint(uint64)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_string(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4String(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_string(string)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_byte(byte)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Byte(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_byte(byte)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_bool(bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Bool(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_bool(bool)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_address(address)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Address(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_address(address)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_uint128(uint128)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4Uint128(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_uint128(uint128)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_arc4_dynamic_bytes(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyArc4DynamicBytes(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_arc4_dynamic_bytes(byte[])void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_implicit_key_tuple((uint64,byte[],bool))void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setImplicitKeyTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setImplicitKeyTuple(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_implicit_key_tuple((uint64,byte[],bool))void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Uint(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_uint(uint64)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_string(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4String(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_string(string)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_byte(byte)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Byte(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_byte(byte)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_bool(bool)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Bool(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_bool(bool)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_address(address)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Address(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_address(address)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_uint128(uint128)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4Uint128(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_uint128(uint128)void'])} + }, + + /** + * Makes a call to the GlobalStateContract smart contract using the `set_arc4_dynamic_bytes(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + setArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateContractParamsFactory.setArc4DynamicBytes(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateContractReturns['set_arc4_dynamic_bytes(byte[])void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new GlobalStateContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current GlobalStateContract app + */ + state = { + /** + * Methods to access global state for the current GlobalStateContract app + */ + global: { + /** + * Get all current keyed values from global state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.global.getAll() + return { + implicitKeyArc4Uint: result.implicit_key_arc4_uint, + implicitKeyArc4String: result.implicit_key_arc4_string, + implicitKeyArc4Byte: result.implicit_key_arc4_byte, + implicitKeyArc4Bool: result.implicit_key_arc4_bool, + implicitKeyArc4Address: result.implicit_key_arc4_address, + implicitKeyArc4Uint128: result.implicit_key_arc4_uint128, + implicitKeyArc4DynamicBytes: result.implicit_key_arc4_dynamic_bytes, + implicitKeyTuple: result.implicit_key_tuple, + arc4Uint: result.arc4_uint, + arc4String: result.arc4_string, + arc4Byte: result.arc4_byte, + arc4Bool: result.arc4_bool, + arc4Address: result.arc4_address, + arc4Uint128: result.arc4_uint128, + arc4DynamicBytes: result.arc4_dynamic_bytes, + } + }, + /** + * Get the current value of the implicit_key_arc4_uint key in global state + */ + implicitKeyArc4Uint: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_uint")) as bigint | undefined }, + /** + * Get the current value of the implicit_key_arc4_string key in global state + */ + implicitKeyArc4String: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_string")) as string | undefined }, + /** + * Get the current value of the implicit_key_arc4_byte key in global state + */ + implicitKeyArc4Byte: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_byte")) as number | undefined }, + /** + * Get the current value of the implicit_key_arc4_bool key in global state + */ + implicitKeyArc4Bool: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_bool")) as boolean | undefined }, + /** + * Get the current value of the implicit_key_arc4_address key in global state + */ + implicitKeyArc4Address: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_address")) as string | undefined }, + /** + * Get the current value of the implicit_key_arc4_uint128 key in global state + */ + implicitKeyArc4Uint128: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_uint128")) as bigint | undefined }, + /** + * Get the current value of the implicit_key_arc4_dynamic_bytes key in global state + */ + implicitKeyArc4DynamicBytes: async (): Promise => { return (await this.appClient.state.global.getValue("implicit_key_arc4_dynamic_bytes")) as Uint8Array | undefined }, + /** + * Get the current value of the implicit_key_tuple key in global state + */ + implicitKeyTuple: async (): Promise<[bigint, Uint8Array, boolean] | undefined> => { return (await this.appClient.state.global.getValue("implicit_key_tuple")) as [bigint, Uint8Array, boolean] | undefined }, + /** + * Get the current value of the arc4_uint key in global state + */ + arc4Uint: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_uint")) as bigint | undefined }, + /** + * Get the current value of the arc4_string key in global state + */ + arc4String: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_string")) as string | undefined }, + /** + * Get the current value of the arc4_byte key in global state + */ + arc4Byte: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_byte")) as number | undefined }, + /** + * Get the current value of the arc4_bool key in global state + */ + arc4Bool: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_bool")) as boolean | undefined }, + /** + * Get the current value of the arc4_address key in global state + */ + arc4Address: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_address")) as string | undefined }, + /** + * Get the current value of the arc4_uint128 key in global state + */ + arc4Uint128: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_uint128")) as bigint | undefined }, + /** + * Get the current value of the arc4_dynamic_bytes key in global state + */ + arc4DynamicBytes: async (): Promise => { return (await this.appClient.state.global.getValue("arc4_dynamic_bytes")) as Uint8Array | undefined }, + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): GlobalStateContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a get_implicit_key_arc4_uint()uint64 method call against the GlobalStateContract contract + */ + getImplicitKeyArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Uint(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_string()string method call against the GlobalStateContract contract + */ + getImplicitKeyArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4String(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_byte()byte method call against the GlobalStateContract contract + */ + getImplicitKeyArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Byte(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_bool()bool method call against the GlobalStateContract contract + */ + getImplicitKeyArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Bool(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_address()address method call against the GlobalStateContract contract + */ + getImplicitKeyArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Address(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_uint128()uint128 method call against the GlobalStateContract contract + */ + getImplicitKeyArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Uint128(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_dynamic_bytes()byte[] method call against the GlobalStateContract contract + */ + getImplicitKeyArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4DynamicBytes(params))) + return this + }, + /** + * Add a get_implicit_key_tuple()(uint64,byte[],bool) method call against the GlobalStateContract contract + */ + getImplicitKeyTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyTuple(params))) + return this + }, + /** + * Add a get_arc4_uint()uint64 method call against the GlobalStateContract contract + */ + getArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Uint(params))) + return this + }, + /** + * Add a get_arc4_string()string method call against the GlobalStateContract contract + */ + getArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4String(params))) + return this + }, + /** + * Add a get_arc4_byte()byte method call against the GlobalStateContract contract + */ + getArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Byte(params))) + return this + }, + /** + * Add a get_arc4_bool()bool method call against the GlobalStateContract contract + */ + getArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Bool(params))) + return this + }, + /** + * Add a get_arc4_address()address method call against the GlobalStateContract contract + */ + getArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Address(params))) + return this + }, + /** + * Add a get_arc4_uint128()uint128 method call against the GlobalStateContract contract + */ + getArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Uint128(params))) + return this + }, + /** + * Add a get_arc4_dynamic_bytes()byte[] method call against the GlobalStateContract contract + */ + getArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4DynamicBytes(params))) + return this + }, + /** + * Add a set_implicit_key_arc4_uint(uint64)void method call against the GlobalStateContract contract + */ + setImplicitKeyArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Uint(params))) + return this + }, + /** + * Add a set_implicit_key_arc4_string(string)void method call against the GlobalStateContract contract + */ + setImplicitKeyArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4String(params))) + return this + }, + /** + * Add a set_implicit_key_arc4_byte(byte)void method call against the GlobalStateContract contract + */ + setImplicitKeyArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Byte(params))) + return this + }, + /** + * Add a set_implicit_key_arc4_bool(bool)void method call against the GlobalStateContract contract + */ + setImplicitKeyArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Bool(params))) + return this + }, + /** + * Add a set_implicit_key_arc4_address(address)void method call against the GlobalStateContract contract + */ + setImplicitKeyArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Address(params))) + return this + }, + /** + * Add a set_implicit_key_arc4_uint128(uint128)void method call against the GlobalStateContract contract + */ + setImplicitKeyArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4Uint128(params))) + return this + }, + /** + * Add a set_implicit_key_arc4_dynamic_bytes(byte[])void method call against the GlobalStateContract contract + */ + setImplicitKeyArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyArc4DynamicBytes(params))) + return this + }, + /** + * Add a set_implicit_key_tuple((uint64,byte[],bool))void method call against the GlobalStateContract contract + */ + setImplicitKeyTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setImplicitKeyTuple(params))) + return this + }, + /** + * Add a set_arc4_uint(uint64)void method call against the GlobalStateContract contract + */ + setArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Uint(params))) + return this + }, + /** + * Add a set_arc4_string(string)void method call against the GlobalStateContract contract + */ + setArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4String(params))) + return this + }, + /** + * Add a set_arc4_byte(byte)void method call against the GlobalStateContract contract + */ + setArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Byte(params))) + return this + }, + /** + * Add a set_arc4_bool(bool)void method call against the GlobalStateContract contract + */ + setArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Bool(params))) + return this + }, + /** + * Add a set_arc4_address(address)void method call against the GlobalStateContract contract + */ + setArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Address(params))) + return this + }, + /** + * Add a set_arc4_uint128(uint128)void method call against the GlobalStateContract contract + */ + setArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4Uint128(params))) + return this + }, + /** + * Add a set_arc4_dynamic_bytes(byte[])void method call against the GlobalStateContract contract + */ + setArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setArc4DynamicBytes(params))) + return this + }, + /** + * Add a clear state call to the GlobalStateContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as GlobalStateContractComposer + } +} +export type GlobalStateContractComposer = { + /** + * Calls the get_implicit_key_arc4_uint()uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Uint(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_uint()uint64'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_string()string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4String(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_string()string'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_byte()byte ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Byte(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_byte()byte'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_bool()bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Bool(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_bool()bool'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_address()address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Address(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_address()address'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_uint128()uint128 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Uint128(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_uint128()uint128'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_dynamic_bytes()byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4DynamicBytes(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_arc4_dynamic_bytes()byte[]'] | undefined]> + + /** + * Calls the get_implicit_key_tuple()(uint64,byte[],bool) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyTuple(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_implicit_key_tuple()(uint64,byte[],bool)'] | undefined]> + + /** + * Calls the get_arc4_uint()uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Uint(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_uint()uint64'] | undefined]> + + /** + * Calls the get_arc4_string()string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4String(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_string()string'] | undefined]> + + /** + * Calls the get_arc4_byte()byte ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Byte(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_byte()byte'] | undefined]> + + /** + * Calls the get_arc4_bool()bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Bool(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_bool()bool'] | undefined]> + + /** + * Calls the get_arc4_address()address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Address(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_address()address'] | undefined]> + + /** + * Calls the get_arc4_uint128()uint128 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Uint128(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_uint128()uint128'] | undefined]> + + /** + * Calls the get_arc4_dynamic_bytes()byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4DynamicBytes(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['get_arc4_dynamic_bytes()byte[]'] | undefined]> + + /** + * Calls the set_implicit_key_arc4_uint(uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyArc4Uint(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_uint(uint64)void'] | undefined]> + + /** + * Calls the set_implicit_key_arc4_string(string)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyArc4String(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_string(string)void'] | undefined]> + + /** + * Calls the set_implicit_key_arc4_byte(byte)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyArc4Byte(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_byte(byte)void'] | undefined]> + + /** + * Calls the set_implicit_key_arc4_bool(bool)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyArc4Bool(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_bool(bool)void'] | undefined]> + + /** + * Calls the set_implicit_key_arc4_address(address)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyArc4Address(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_address(address)void'] | undefined]> + + /** + * Calls the set_implicit_key_arc4_uint128(uint128)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyArc4Uint128(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_uint128(uint128)void'] | undefined]> + + /** + * Calls the set_implicit_key_arc4_dynamic_bytes(byte[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyArc4DynamicBytes(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_arc4_dynamic_bytes(byte[])void'] | undefined]> + + /** + * Calls the set_implicit_key_tuple((uint64,byte[],bool))void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setImplicitKeyTuple(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_implicit_key_tuple((uint64,byte[],bool))void'] | undefined]> + + /** + * Calls the set_arc4_uint(uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setArc4Uint(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_uint(uint64)void'] | undefined]> + + /** + * Calls the set_arc4_string(string)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setArc4String(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_string(string)void'] | undefined]> + + /** + * Calls the set_arc4_byte(byte)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setArc4Byte(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_byte(byte)void'] | undefined]> + + /** + * Calls the set_arc4_bool(bool)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setArc4Bool(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_bool(bool)void'] | undefined]> + + /** + * Calls the set_arc4_address(address)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setArc4Address(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_address(address)void'] | undefined]> + + /** + * Calls the set_arc4_uint128(uint128)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setArc4Uint128(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_uint128(uint128)void'] | undefined]> + + /** + * Calls the set_arc4_dynamic_bytes(byte[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setArc4DynamicBytes(params?: CallParams): GlobalStateContractComposer<[...TReturns, GlobalStateContractReturns['set_arc4_dynamic_bytes(byte[])void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the GlobalStateContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): GlobalStateContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): GlobalStateContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type GlobalStateContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateValidator.ts b/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateValidator.ts new file mode 100644 index 0000000..483c414 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/GlobalStateValidator.ts @@ -0,0 +1,557 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"GlobalStateValidator","structs":{},"methods":[{"name":"validate_g_args","args":[{"type":"uint64","name":"arg1"},{"type":"string","name":"arg2"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[72],"errorMessage":"transaction type is appl"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHhjMGViNWM2NwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIEdsb2JhbFN0YXRlVmFsaWRhdG9yKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBieXRlY18wIC8vIG1ldGhvZCAidmFsaWRhdGVfZ19hcmdzKHVpbnQ2NCxzdHJpbmcpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdmFsaWRhdGVfZ19hcmdzX3JvdXRlQDMKICAgIGVycgoKbWFpbl92YWxpZGF0ZV9nX2FyZ3Nfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIHZhbGlkYXRlX2dfYXJncwoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuR2xvYmFsU3RhdGVWYWxpZGF0b3IuY29udHJhY3QuR2xvYmFsU3RhdGVWYWxpZGF0b3IudmFsaWRhdGVfZ19hcmdzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmFsaWRhdGVfZ19hcmdzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjcKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygwKSA9PSBhcmM0LmFyYzRfc2lnbmF0dXJlKCJ2YWxpZGF0ZV9nX2FyZ3ModWludDY0LHN0cmluZyl2b2lkIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIGJ5dGVjXzAgLy8gbWV0aG9kICJ2YWxpZGF0ZV9nX2FyZ3ModWludDY0LHN0cmluZyl2b2lkIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjgKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygxKSA9PSBhcmcxLmJ5dGVzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjkKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygyKSA9PSBhcmcyLmJ5dGVzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6MTAKICAgIC8vIGFzc2VydCBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKFR4bi5ncm91cF9pbmRleCkuYXBwX2FyZ3MoMSkgPT0gYXJnMS5ieXRlcwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgcHVzaGludCAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weToxMQogICAgLy8gYXNzZXJ0IGd0eG4uVHJhbnNhY3Rpb24oVHhuLmdyb3VwX2luZGV4KS5hcHBfYXJncygxKSA9PSBhcmcxLmJ5dGVzCiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weToxMgogICAgLy8gYXNzZXJ0IG9wLkdUeG4uYXBwbGljYXRpb25fYXJncyhUeG4uZ3JvdXBfaW5kZXgsIDEpID09IGFyZzEuYnl0ZXMKICAgIHR4biBHcm91cEluZGV4CiAgICBndHhuc2EgQXBwbGljYXRpb25BcmdzIDEKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6MTMKICAgIC8vIGFzc2VydCBvcC5UeG4uYXBwbGljYXRpb25fYXJncygxKSA9PSBhcmcxLmJ5dGVzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyYBBMDrXGcxG0EAEyg2GgCOAQABADEZFDEYEERCAAgxGRQxGBQQQzYaATYaAjYaACgSRDYaAUsCEkQ2GgISRDEWSTgQgQYSRIEBwhpLARJEMRaBAcIaSwESRDEWORoBSwESRDYaARJEgQFD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the GlobalStateValidator contract + */ +export type GlobalStateValidatorArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'validate_g_args(uint64,string)void': { + arg1: bigint | number + arg2: string + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'validate_g_args(uint64,string)void': [arg1: bigint | number, arg2: string] + } +} + +/** + * The return type for each method + */ +export type GlobalStateValidatorReturns = { + 'validate_g_args(uint64,string)void': void +} + +/** + * Defines the types of available calls and state of the GlobalStateValidator smart contract. + */ +export type GlobalStateValidatorTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'validate_g_args(uint64,string)void' | 'validate_g_args', { + argsObj: GlobalStateValidatorArgs['obj']['validate_g_args(uint64,string)void'] + argsTuple: GlobalStateValidatorArgs['tuple']['validate_g_args(uint64,string)void'] + returns: GlobalStateValidatorReturns['validate_g_args(uint64,string)void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type GlobalStateValidatorSignatures = keyof GlobalStateValidatorTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the GlobalStateValidator smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = GlobalStateValidatorTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the GlobalStateValidator smart contract to the method's return type + */ +export type MethodReturn = GlobalStateValidatorTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type GlobalStateValidatorCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type GlobalStateValidatorDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: GlobalStateValidatorCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the GlobalStateValidator smart contract + */ +export abstract class GlobalStateValidatorParamsFactory { + /** + * Constructs a no op call for the validate_g_args(uint64,string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static validateGArgs(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'validate_g_args(uint64,string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arg1, params.args.arg2], + } + } +} + +/** + * A factory to create and deploy one or more instance of the GlobalStateValidator smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class GlobalStateValidatorFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `GlobalStateValidatorFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new GlobalStateValidatorClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new GlobalStateValidatorClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the GlobalStateValidator smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: GlobalStateValidatorDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new GlobalStateValidatorClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the GlobalStateValidator smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the GlobalStateValidator smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the GlobalStateValidator smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new GlobalStateValidatorClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the GlobalStateValidator smart contract + */ +export class GlobalStateValidatorClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `GlobalStateValidatorClient` + * + * @param appClient An `AppClient` instance which has been created with the GlobalStateValidator app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `GlobalStateValidatorClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `GlobalStateValidatorClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new GlobalStateValidatorClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `GlobalStateValidatorClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new GlobalStateValidatorClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the GlobalStateValidator smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the GlobalStateValidator smart contract using the `validate_g_args(uint64,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + validateGArgs: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(GlobalStateValidatorParamsFactory.validateGArgs(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the GlobalStateValidator smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the GlobalStateValidator smart contract using the `validate_g_args(uint64,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + validateGArgs: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(GlobalStateValidatorParamsFactory.validateGArgs(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the GlobalStateValidator smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the GlobalStateValidator smart contract using the `validate_g_args(uint64,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + validateGArgs: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(GlobalStateValidatorParamsFactory.validateGArgs(params)) + return {...result, return: result.return as unknown as (undefined | GlobalStateValidatorReturns['validate_g_args(uint64,string)void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new GlobalStateValidatorClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current GlobalStateValidator app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): GlobalStateValidatorComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a validate_g_args(uint64,string)void method call against the GlobalStateValidator contract + */ + validateGArgs(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.validateGArgs(params))) + return this + }, + /** + * Add a clear state call to the GlobalStateValidator contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as GlobalStateValidatorComposer + } +} +export type GlobalStateValidatorComposer = { + /** + * Calls the validate_g_args(uint64,string)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + validateGArgs(params?: CallParams): GlobalStateValidatorComposer<[...TReturns, GlobalStateValidatorReturns['validate_g_args(uint64,string)void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the GlobalStateValidator smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): GlobalStateValidatorComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): GlobalStateValidatorComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type GlobalStateValidatorComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/HelloWorld.ts b/examples/p-py/projects/p-py-frontend/src/contracts/HelloWorld.ts new file mode 100644 index 0000000..e60b7c5 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/HelloWorld.ts @@ -0,0 +1,560 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"HelloWorld","structs":{},"methods":[{"name":"hello","args":[{"type":"string","name":"name"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[44],"errorMessage":"invalid array length header"},{"pc":[52],"errorMessage":"invalid number of bytes for arc4.dynamic_array"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5weTo1CiAgICAvLyBjbGFzcyBIZWxsb1dvcmxkKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2hlbGxvX3JvdXRlQDMKICAgIGVycgoKbWFpbl9oZWxsb19yb3V0ZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LnB5OjYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgaGVsbG8KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLmhlbGxvX3dvcmxkLmNvbnRyYWN0LkhlbGxvV29ybGQuaGVsbG9bcm91dGluZ10oKSAtPiB2b2lkOgpoZWxsbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5weTo2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgcHVzaGludCAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5weTo4CiAgICAvLyByZXR1cm4gIkhlbGxvLCAiICsgbmFtZQogICAgcHVzaGJ5dGVzICJIZWxsbywgIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QucHk6NgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgAQCvs4RNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEM2GgFJgQBZgQIISwEVEkRXAgCAB0hlbGxvLCBMUEkVFlcGAkxQgAQVH3x1TFCwgQFD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the HelloWorld contract + */ +export type HelloWorldArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'hello(string)string': { + name: string + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'hello(string)string': [name: string] + } +} + +/** + * The return type for each method + */ +export type HelloWorldReturns = { + 'hello(string)string': string +} + +/** + * Defines the types of available calls and state of the HelloWorld smart contract. + */ +export type HelloWorldTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'hello(string)string' | 'hello', { + argsObj: HelloWorldArgs['obj']['hello(string)string'] + argsTuple: HelloWorldArgs['tuple']['hello(string)string'] + returns: HelloWorldReturns['hello(string)string'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type HelloWorldSignatures = keyof HelloWorldTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type HelloWorldNonVoidMethodSignatures = keyof HelloWorldTypes['methods'] extends infer T ? T extends keyof HelloWorldTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the HelloWorld smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = HelloWorldTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the HelloWorld smart contract to the method's return type + */ +export type MethodReturn = HelloWorldTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type HelloWorldCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type HelloWorldDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: HelloWorldCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the HelloWorld smart contract + */ +export abstract class HelloWorldParamsFactory { + /** + * Constructs a no op call for the hello(string)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static hello(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'hello(string)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.name], + } + } +} + +/** + * A factory to create and deploy one or more instance of the HelloWorld smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class HelloWorldFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `HelloWorldFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new HelloWorldClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new HelloWorldClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the HelloWorld smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: HelloWorldDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new HelloWorldClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the HelloWorld smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the HelloWorld smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the HelloWorld smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new HelloWorldClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the HelloWorld smart contract + */ +export class HelloWorldClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `HelloWorldClient` + * + * @param appClient An `AppClient` instance which has been created with the HelloWorld app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `HelloWorldClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `HelloWorldClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new HelloWorldClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `HelloWorldClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new HelloWorldClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the HelloWorld smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + hello: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(HelloWorldParamsFactory.hello(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the HelloWorld smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + hello: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(HelloWorldParamsFactory.hello(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the HelloWorld smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + hello: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(HelloWorldParamsFactory.hello(params)) + return {...result, return: result.return as unknown as (undefined | HelloWorldReturns['hello(string)string'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new HelloWorldClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current HelloWorld app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): HelloWorldComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a hello(string)string method call against the HelloWorld contract + */ + hello(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hello(params))) + return this + }, + /** + * Add a clear state call to the HelloWorld contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as HelloWorldComposer + } +} +export type HelloWorldComposer = { + /** + * Calls the hello(string)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + hello(params?: CallParams): HelloWorldComposer<[...TReturns, HelloWorldReturns['hello(string)string'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the HelloWorld smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): HelloWorldComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): HelloWorldComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type HelloWorldComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ITxnOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ITxnOpsContract.ts new file mode 100644 index 0000000..a3d8854 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/ITxnOpsContract.ts @@ -0,0 +1,554 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"ITxnOpsContract","structs":{},"methods":[{"name":"verify_itxn_ops","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYgMTAwMAogICAgYnl0ZWNibG9jayAweDA2ODEwMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ4OAogICAgLy8gY2xhc3MgSVR4bk9wc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHg0ZTdjZDljYiAvLyBtZXRob2QgInZlcmlmeV9pdHhuX29wcygpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdmVyaWZ5X2l0eG5fb3BzX3JvdXRlQDMKICAgIGVycgoKbWFpbl92ZXJpZnlfaXR4bl9vcHNfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiB2ZXJpZnlfaXR4bl9vcHMKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LklUeG5PcHNDb250cmFjdC52ZXJpZnlfaXR4bl9vcHNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfaXR4bl9vcHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDkxCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5iZWdpbigpCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDkyCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfdHlwZV9lbnVtKGFsZ29weS5UcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTMKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9vbl9jb21wbGV0aW9uKGFsZ29weS5PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uKQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ5NAogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc2V0X2FwcHJvdmFsX3Byb2dyYW0oQnl0ZXMuZnJvbV9oZXgoIjA2ODEwMSIpKQogICAgYnl0ZWNfMCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTUtNDk2CiAgICAvLyAjIHBhZ2VzIGVzc2VudGlhbGx5IGFwcGVuZHMKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9hcHByb3ZhbF9wcm9ncmFtX3BhZ2VzKEJ5dGVzLmZyb21faGV4KCIwNjgxMDEiKSkKICAgIGJ5dGVjXzAgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTcKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9jbGVhcl9zdGF0ZV9wcm9ncmFtKEJ5dGVzLmZyb21faGV4KCIwNjgxMDEiKSkKICAgIGJ5dGVjXzAgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTgKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9mZWUoYWxnb3B5Lm9wLkdsb2JhbC5taW5fdHhuX2ZlZSkKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDk5CiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5uZXh0KCkKICAgIGl0eG5fbmV4dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwMAogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc2V0X3R5cGVfZW51bShhbGdvcHkuVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpCiAgICBpbnRjXzAgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTAxCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfcmVjZWl2ZXIoYWxnb3B5Lm9wLkdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MDIKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9hbW91bnQoYWxnb3B5LlVJbnQ2NCgxMDAwKSkKICAgIGludGNfMiAvLyAxMDAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwMwogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA1CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLklUeG4ucmVjZWl2ZXIoKSA9PSBhbGdvcHkub3AuR2xvYmFsLmNyZWF0b3JfYWRkcmVzcwogICAgaXR4biBSZWNlaXZlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA2CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLklUeG4uYW1vdW50KCkgPT0gYWxnb3B5LlVJbnQ2NCgxMDAwKQogICAgaXR4biBBbW91bnQKICAgIGludGNfMiAvLyAxMDAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA3CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLklUeG4udHlwZV9lbnVtKCkgPT0gYWxnb3B5LlRyYW5zYWN0aW9uVHlwZS5QYXltZW50CiAgICBpdHhuIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA5CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLkdJVHhuLnR5cGVfZW51bSgwKSA9PSBhbGdvcHkuVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgZ2l0eG4gMCBUeXBlRW51bQogICAgaW50Y18xIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTAKICAgIC8vIGFzc2VydCBhbGdvcHkub3AuR0lUeG4udHlwZV9lbnVtKDEpID09IGFsZ29weS5UcmFuc2FjdGlvblR5cGUuUGF5bWVudAogICAgZ2l0eG4gMSBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyADAQboByYBAwaBATEbQQAYgAROfNnLNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEOxI7IQgQWyGSiyHiiyQCiyHzIAsgG2IrIQMgmyBySyCLO0BzIJEkS0CCQSRLQQIhJEtwAQIxJEtwEQIhJEIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the ITxnOpsContract contract + */ +export type ITxnOpsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_itxn_ops()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_itxn_ops()void': [] + } +} + +/** + * The return type for each method + */ +export type ITxnOpsContractReturns = { + 'verify_itxn_ops()void': void +} + +/** + * Defines the types of available calls and state of the ITxnOpsContract smart contract. + */ +export type ITxnOpsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_itxn_ops()void' | 'verify_itxn_ops', { + argsObj: ITxnOpsContractArgs['obj']['verify_itxn_ops()void'] + argsTuple: ITxnOpsContractArgs['tuple']['verify_itxn_ops()void'] + returns: ITxnOpsContractReturns['verify_itxn_ops()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type ITxnOpsContractSignatures = keyof ITxnOpsContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the ITxnOpsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = ITxnOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the ITxnOpsContract smart contract to the method's return type + */ +export type MethodReturn = ITxnOpsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type ITxnOpsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type ITxnOpsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: ITxnOpsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the ITxnOpsContract smart contract + */ +export abstract class ITxnOpsContractParamsFactory { + /** + * Constructs a no op call for the verify_itxn_ops()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyItxnOps(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_itxn_ops()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the ITxnOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class ITxnOpsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `ITxnOpsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new ITxnOpsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new ITxnOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the ITxnOpsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: ITxnOpsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new ITxnOpsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ITxnOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ITxnOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ITxnOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new ITxnOpsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the ITxnOpsContract smart contract + */ +export class ITxnOpsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `ITxnOpsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the ITxnOpsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `ITxnOpsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `ITxnOpsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new ITxnOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `ITxnOpsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new ITxnOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the ITxnOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the ITxnOpsContract smart contract using the `verify_itxn_ops()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyItxnOps: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ITxnOpsContractParamsFactory.verifyItxnOps(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the ITxnOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the ITxnOpsContract smart contract using the `verify_itxn_ops()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyItxnOps: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ITxnOpsContractParamsFactory.verifyItxnOps(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the ITxnOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the ITxnOpsContract smart contract using the `verify_itxn_ops()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyItxnOps: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ITxnOpsContractParamsFactory.verifyItxnOps(params)) + return {...result, return: result.return as unknown as (undefined | ITxnOpsContractReturns['verify_itxn_ops()void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new ITxnOpsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current ITxnOpsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): ITxnOpsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_itxn_ops()void method call against the ITxnOpsContract contract + */ + verifyItxnOps(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyItxnOps(params))) + return this + }, + /** + * Add a clear state call to the ITxnOpsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as ITxnOpsContractComposer + } +} +export type ITxnOpsContractComposer = { + /** + * Calls the verify_itxn_ops()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyItxnOps(params?: CallParams): ITxnOpsContractComposer<[...TReturns, ITxnOpsContractReturns['verify_itxn_ops()void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the ITxnOpsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): ITxnOpsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): ITxnOpsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type ITxnOpsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayContract.ts new file mode 100644 index 0000000..ff91ca4 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayContract.ts @@ -0,0 +1,2231 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"ImmutableArrayContract","structs":{},"methods":[{"name":"test_uint64_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_biguint_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_bool_array","args":[{"type":"uint64","name":"length"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_fixed_size_tuple_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_fixed_size_named_tuple_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_sized_tuple_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_sized_named_tuple_array","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_implicit_conversion_log","args":[{"type":"uint64[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_implicit_conversion_emit","args":[{"type":"uint64[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[{"name":"emit_test","args":[{"type":"uint64[]","name":"field1"}]}],"recommendations":{}},{"name":"test_nested_array","args":[{"type":"uint64","name":"arr_to_add"},{"type":"uint64[][]","name":"arr"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_bit_packed_tuples","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"sum_uints_and_lengths_and_trues","args":[{"type":"uint64[]","name":"arr1"},{"type":"bool[]","name":"arr2"},{"type":"(uint64,bool,bool)[]","name":"arr3"},{"type":"(uint64,string)[]","name":"arr4"}],"returns":{"type":"(uint64,uint64,uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_uint64_return","args":[{"type":"uint64","name":"append"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_bool_return","args":[{"type":"uint64","name":"append"}],"returns":{"type":"bool[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_tuple_return","args":[{"type":"uint64","name":"append"}],"returns":{"type":"(uint64,bool,bool)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_tuple_return","args":[{"type":"uint64","name":"append"}],"returns":{"type":"(uint64,string)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_convert_to_array_and_back","args":[{"type":"(uint64,bool,bool)[]","name":"arr"},{"type":"uint64","name":"append"}],"returns":{"type":"(uint64,bool,bool)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_concat_with_arc4_tuple","args":[{"type":"(uint64,uint64)","name":"arg"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_concat_with_native_tuple","args":[{"type":"(uint64,uint64)","name":"arg"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_concat_with_arc4_tuple","args":[{"type":"(string,string)","name":"arg"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_dynamic_concat_with_native_tuple","args":[{"type":"(string,string)","name":"arg"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_concat_immutable_dynamic","args":[{"type":"(uint64,string)[]","name":"imm1"},{"type":"(uint64,string)[]","name":"imm2"}],"returns":{"type":"(uint64,string)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_immutable_arc4","args":[{"type":"(uint64,uint64)[]","name":"imm"}],"returns":{"type":"(uint64,uint64)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_imm_fixed_arr","args":[],"returns":{"type":"(uint64,uint64)[3]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":11},"local":{"ints":0,"bytes":0}},"keys":{"global":{"a":{"keyType":"AVMString","valueType":"uint64[]","key":"YQ=="},"g":{"keyType":"AVMString","valueType":"bool[]","key":"Zw=="},"c":{"keyType":"AVMString","valueType":"(uint64,uint64)[]","key":"Yw=="},"d":{"keyType":"AVMString","valueType":"(uint64,bool,bool)[]","key":"ZA=="},"e":{"keyType":"AVMString","valueType":"(uint64,byte[])[]","key":"ZQ=="},"f":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"Zg=="},"bool2":{"keyType":"AVMString","valueType":"(bool,bool)[]","key":"Ym9vbDI="},"bool7":{"keyType":"AVMString","valueType":"(uint64,bool,bool,bool,bool,bool,bool,bool,uint64)[]","key":"Ym9vbDc="},"bool8":{"keyType":"AVMString","valueType":"(uint64,bool,bool,bool,bool,bool,bool,bool,bool,uint64)[]","key":"Ym9vbDg="},"bool9":{"keyType":"AVMString","valueType":"(uint64,bool,bool,bool,bool,bool,bool,bool,bool,bool,uint64)[]","key":"Ym9vbDk="},"imm_fixed_arr":{"keyType":"AVMString","valueType":"(uint64,uint64)[3]","key":"aW1tX2ZpeGVkX2Fycg=="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[4104],"errorMessage":"check self.imm_fixed_arr exists"},{"pc":[2179,2487],"errorMessage":"expected 1, 0"},{"pc":[2094,2402],"errorMessage":"expected 1st element to be correct"},{"pc":[2099,2409],"errorMessage":"expected 2nd element to be correct"},{"pc":[2240,2549],"errorMessage":"expected 4, 3"},{"pc":[3988],"errorMessage":"expected arrays to be different"},{"pc":[4022],"errorMessage":"expected arrays to be the same"},{"pc":[1548],"errorMessage":"expected element 0 to be False"},{"pc":[1567],"errorMessage":"expected element 1 to be False"},{"pc":[1585],"errorMessage":"expected element 2 to be True"},{"pc":[4049],"errorMessage":"expected items on iteration to be the same"},{"pc":[1611],"errorMessage":"expected last element to be False"},{"pc":[3935],"errorMessage":"expected non empty array"},{"pc":[3363],"errorMessage":"expected string length to match index"},{"pc":[4099],"errorMessage":"expected sum to be 10"},{"pc":[4072],"errorMessage":"expected sum to be 15"},{"pc":[852,1156,1221,1289,1346,1456,1541,1560,1579,1602,1753,1817,2050,2131,2196,2358,2441,2504,3214,3307,3950,4007,4045,4091],"errorMessage":"index access is out of bounds"},{"pc":[968,1009,1065,1092,1132,1160,1204,1269,1326,1438,1525,1656,1715,1779,1906,2008,2114,2316,2424,2681,2722,3012,3021,3030,3039,3107,3144,3188,3269,3910,3933],"errorMessage":"invalid array length header"},{"pc":[923,996,1120,1194,1244,1314,1426,1692,1881,2622,2769,2833,2919,2958,2989,3438,3571,3745,3779,3814],"errorMessage":"max array length exceeded"},{"pc":[1307],"errorMessage":"overflow"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA4CiAgICBieXRlY2Jsb2NrIDB4IDB4MTUxZjdjNzUgMHgwMDAwIDB4MDAgMHgwMDAyIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYgMHgwMDBhIDB4NjI2OTY3NzU2OTZlNzQgMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIgMHgwMDAyMDAwNDAwMDcwMDAxNjEwMDAxNjIgImltbV9maXhlZF9hcnIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo5MwogICAgLy8gY2xhc3MgSW1tdXRhYmxlQXJyYXlDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NDRkNDJmOTkgMHhiN2VhYTYwYiAweDc0M2Q3MGVkIDB4MWM3ZTA0OTQgMHhhMmQ1ODYwYiAweGUwNWZjNTY0IDB4MWUwOTJiODMgMHgwMTMxMDI2MiAweGM4NjU0YTk4IDB4ODlkMTk2ZjggMHg2Y2I3Yzk5MSAweDk4OThiZjAyIDB4ZjZiNjFlZTggMHg2MGI4NmE3YiAweDczYWQyODNmIDB4NTI5ZGZhZTkgMHgyMDZkNTE0ZiAweGUwNjQ2NWUyIDB4ZWMwMzAwYTIgMHhlY2RmMTRhZiAweDUxMWFjYTY0IDB4Mjk4NTJlNGYgMHg2ZDRhYTM1OCAweGI3Y2I5NmJkIC8vIG1ldGhvZCAidGVzdF91aW50NjRfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfYmlndWludF9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9ib29sX2FycmF5KHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2ZpeGVkX3NpemVfdHVwbGVfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfZml4ZWRfc2l6ZV9uYW1lZF90dXBsZV9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9sb2codWludDY0W10pdm9pZCIsIG1ldGhvZCAidGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2VtaXQodWludDY0W10pdm9pZCIsIG1ldGhvZCAidGVzdF9uZXN0ZWRfYXJyYXkodWludDY0LHVpbnQ2NFtdW10pdWludDY0W10iLCBtZXRob2QgInRlc3RfYml0X3BhY2tlZF90dXBsZXMoKXZvaWQiLCBtZXRob2QgInN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXModWludDY0W10sYm9vbFtdLCh1aW50NjQsYm9vbCxib29sKVtdLCh1aW50NjQsc3RyaW5nKVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ0ZXN0X3VpbnQ2NF9yZXR1cm4odWludDY0KXVpbnQ2NFtdIiwgbWV0aG9kICJ0ZXN0X2Jvb2xfcmV0dXJuKHVpbnQ2NClib29sW10iLCBtZXRob2QgInRlc3RfdHVwbGVfcmV0dXJuKHVpbnQ2NCkodWludDY0LGJvb2wsYm9vbClbXSIsIG1ldGhvZCAidGVzdF9keW5hbWljX3R1cGxlX3JldHVybih1aW50NjQpKHVpbnQ2NCxzdHJpbmcpW10iLCBtZXRob2QgInRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFjaygodWludDY0LGJvb2wsYm9vbClbXSx1aW50NjQpKHVpbnQ2NCxib29sLGJvb2wpW10iLCBtZXRob2QgInRlc3RfY29uY2F0X3dpdGhfYXJjNF90dXBsZSgodWludDY0LHVpbnQ2NCkpdWludDY0W10iLCBtZXRob2QgInRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlKCh1aW50NjQsdWludDY0KSl1aW50NjRbXSIsIG1ldGhvZCAidGVzdF9keW5hbWljX2NvbmNhdF93aXRoX2FyYzRfdHVwbGUoKHN0cmluZyxzdHJpbmcpKXN0cmluZ1tdIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlKChzdHJpbmcsc3RyaW5nKSlzdHJpbmdbXSIsIG1ldGhvZCAidGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWMoKHVpbnQ2NCxzdHJpbmcpW10sKHVpbnQ2NCxzdHJpbmcpW10pKHVpbnQ2NCxzdHJpbmcpW10iLCBtZXRob2QgInRlc3RfaW1tdXRhYmxlX2FyYzQoKHVpbnQ2NCx1aW50NjQpW10pKHVpbnQ2NCx1aW50NjQpW10iLCBtZXRob2QgInRlc3RfaW1tX2ZpeGVkX2FycigpKHVpbnQ2NCx1aW50NjQpWzNdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF91aW50NjRfYXJyYXkgdGVzdF9iaWd1aW50X2FycmF5IHRlc3RfYm9vbF9hcnJheSB0ZXN0X2ZpeGVkX3NpemVfdHVwbGVfYXJyYXkgdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5IHRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheSB0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXkgdGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2xvZyB0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fZW1pdCB0ZXN0X25lc3RlZF9hcnJheSB0ZXN0X2JpdF9wYWNrZWRfdHVwbGVzIHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXMgdGVzdF91aW50NjRfcmV0dXJuIHRlc3RfYm9vbF9yZXR1cm4gdGVzdF90dXBsZV9yZXR1cm4gdGVzdF9keW5hbWljX3R1cGxlX3JldHVybiB0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2sgdGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlIHRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlIHRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9hcmM0X3R1cGxlIHRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9uYXRpdmVfdHVwbGUgdGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWMgdGVzdF9pbW11dGFibGVfYXJjNCB0ZXN0X2ltbV9maXhlZF9hcnIKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzMToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZShhcnJheTogYnl0ZXMsIGZpeGVkX2J5dGVfc2l6ZTogdWludDY0KSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemU6CiAgICBwcm90byAyIDIKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZHVwCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgZHVwMgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0MwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQoYXJyYXk6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDEgMgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgMwogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9idXJ5IDEKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMoYXJyYXk6IGJ5dGVzLCBuZXdfaXRlbXNfYnl0ZXM6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgcmVhZF9zdGVwOiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzOgogICAgcHJvdG8gNCAxCiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDIKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXBuIDIKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICByZXBsYWNlMiAwCiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBwdXNoaW50IDcKICAgICsKICAgIGludGNfMyAvLyA4CiAgICAvCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3CiAgICArCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX2lmX2Vsc2VAMgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyA1CiAgICAtCiAgICBiemVybwogICAgZnJhbWVfZGlnIDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIGZyYW1lX2RpZyAzCiAgICBwdXNoaW50IDE2CiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBmcmFtZV9idXJ5IDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfd2hpbGVfdG9wQDM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfYWZ0ZXJfd2hpbGVANQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBnZXRiaXQKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX3doaWxlX3RvcEAzCgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX3doaWxlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18wIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuc3VtX2ltbV9maXhlZChhcnI6IGJ5dGVzKSAtPiB1aW50NjQ6CnN1bV9pbW1fZml4ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzAtNTcxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHN1bV9pbW1fZml4ZWQoYXJyOiBOYXRpdmVTdHJ1Y3QzKSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3MgogICAgLy8gdG90YWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBkdXAKCnN1bV9pbW1fZml4ZWRfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTczCiAgICAvLyBmb3IgaXRlbSBpbiBhcnI6CiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGludCAzCiAgICA8CiAgICBieiBzdW1faW1tX2ZpeGVkX2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzMtNTc0CiAgICAvLyBmb3IgaXRlbSBpbiBhcnI6CiAgICAvLyAgICAgdG90YWwgKz0gaXRlbS5mb28KICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgcHVzaGludCAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzQKICAgIC8vIHRvdGFsICs9IGl0ZW0uZm9vCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3My01NzQKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIC8vICAgICB0b3RhbCArPSBpdGVtLmZvbwogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3NAogICAgLy8gdG90YWwgKz0gaXRlbS5mb28KICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTc1CiAgICAvLyB0b3RhbCArPSBpdGVtLmJhcgogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgc3VtX2ltbV9maXhlZF9mb3JfaGVhZGVyQDEKCnN1bV9pbW1fZml4ZWRfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzYKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUudGltZXMobjogdWludDY0KSAtPiBieXRlczoKdGltZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzktNTgwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHRpbWVzKG46IFVJbnQ2NCkgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODEKICAgIC8vIHJlc3VsdCA9IFN0cmluZygpCiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODIKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2Uobik6CiAgICBpbnRjXzAgLy8gMAoKdGltZXNfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTgyCiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKG4pOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMQogICAgPAogICAgYnogdGltZXNfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU4MwogICAgLy8gcmVzdWx0ICs9IFN0cmluZygiICIpCiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGJ5dGVzICIgIgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU4MgogICAgLy8gZm9yIF9pIGluIHVyYW5nZShuKToKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHRpbWVzX2Zvcl9oZWFkZXJAMQoKdGltZXNfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODQKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLmFkZF94KGFycjogYnl0ZXMsIHg6IHVpbnQ2NCkgLT4gYnl0ZXM6CmFkZF94OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg3LTU4OAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZGRfeChhcnI6IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0sIHg6IFVJbnQ2NCkgLT4gSW1tdXRhYmxlQXJyYXlbVUludDY0XToKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzAgLy8gMAoKYWRkX3hfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBieiBhZGRfeF9hZnRlcl9mb3JANAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTkwCiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKGkpCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIGFkZF94X2Zvcl9oZWFkZXJAMQoKYWRkX3hfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1OTEKICAgIC8vIHJldHVybiBhcnIKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X3VpbnQ2NF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfdWludDY0X2FycmF5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6OTkKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoVUludDY0KDQyKSkKICAgIHB1c2hieXRlcyAweDAwMDEwMDAwMDAwMDAwMDAwMDJhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDMKICAgIC8vIGFyciA9IGFkZF94KGFyciwgVUludDY0KDUpKQogICAgcHVzaGludCA1CiAgICBjYWxsc3ViIGFkZF94CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDQKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDUKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEwNwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChVSW50NjQoNDMpKQogICAgcHVzaGludCA0MwogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDgKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDcKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgNwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTA5CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSA0MwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQzCiAgICA9PQogICAgYXNzZXJ0CiAgICBpbnRjXzIgLy8gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEwCiAgICAvLyBhc3NlcnQgYXJyWzBdID09IDQyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0MgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTk2CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKHgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfdWludDY0X2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NgogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEyCiAgICAvLyBhcnIgPSBwb3BfeChhcnIsIFVJbnQ2NCgzKSkKICAgIHB1c2hpbnQgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTk2CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKHgpOgogICAgPAogICAgYnogdGVzdF91aW50NjRfYXJyYXlfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NwogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZQogICAgYnVyeSAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NgogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X3VpbnQ2NF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfdWludDY0X2FycmF5X2FmdGVyX2ZvckA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEzCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExNAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTE2CiAgICAvLyBhcnIgPSBhZGRfeChhcnIsIFVJbnQ2NCgxMCkpCiAgICBwdXNoaW50IDEwCiAgICBjYWxsc3ViIGFkZF94CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMTcKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExOAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gOQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgOQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTIwCiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKFVJbnQ2NCg0NCkpCiAgICBwdXNoaW50IDQ0CiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjEKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEyMgogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gNDQKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0NAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTI0CiAgICAvLyBhcnIgPSBhcnIucmVwbGFjZSgyLCBVSW50NjQoMjMpKQogICAgcHVzaGludCAyMwogICAgaXRvYgogICAgcmVwbGFjZTIgMTggLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjUKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDE1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjYKICAgIC8vIGFzc2VydCBhcnJbMl0gPT0gMjMKICAgIGR1cAogICAgcHVzaGludCAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMjMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEyOAogICAgLy8gc2VsZi5hID0gYXJyCiAgICBwdXNoYnl0ZXMgImEiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6OTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2JpZ3VpbnRfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2JpZ3VpbnRfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzUKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludChUeG4ubnVtX2FwcF9hcmdzIC0gMSkpCiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGl0b2IKICAgIHB1c2hpbnQgNjQKICAgIGJ6ZXJvCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzIKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W0JpZ1VJbnRdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzUKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludChUeG4ubnVtX2FwcF9hcmdzIC0gMSkpCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHB1c2hieXRlcyAweDAwMDEKICAgIHJlcGxhY2UyIDAKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM2CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM3CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSAwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNjQKICAgICoKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWNfMCAvLyAweAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKHgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYmlndWludF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MDMKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM5CiAgICAvLyBhcnIgPSBhZGRfeGIoYXJyLCBVSW50NjQoNSkpCiAgICBwdXNoaW50IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKHgpOgogICAgPAogICAgYnogdGVzdF9iaWd1aW50X2FycmF5X2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MDQKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludChpKSkKICAgIGR1cG4gMgogICAgaXRvYgogICAgZGlnIDQKICAgIGJ8CiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfYmlndWludF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfYmlndWludF9hcnJheV9hZnRlcl9mb3JANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0MAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNgogICAgZGlnIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDEKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA2NAogICAgKgogICAgcHVzaGludCA2NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwNAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0MwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChCaWdVSW50KDIqKjUxMiAtIDEpIC0gVHhuLm51bV9hcHBfYXJncykKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpdG9iCiAgICBieXRlYyA1IC8vIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIHN3YXAKICAgIGItCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZGlnIDUKICAgIGJ8CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDQKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA3CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDUKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDIqKjUxMiAtIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA2NAogICAgKgogICAgcHVzaGludCA2NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0NgogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAwCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDY0CiAgICBieXRlY18wIC8vIDB4CiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTQ4CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKEJpZ1VJbnQoMioqNTEyIC0gMSkpCiAgICBzd2FwCiAgICBieXRlYyA1IC8vIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDkKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE1MAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMioqNTEyIC0gMQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA2NAogICAgKgogICAgcHVzaGludCA2NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA1IC8vIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTEKICAgIC8vIGFzc2VydCBhcnJbMF0gPT0gMAogICAgZHVwCiAgICBleHRyYWN0IDIgNjQKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTMKICAgIC8vIEJveChJbW11dGFibGVBcnJheVtCaWdVSW50XSwga2V5PWIiYmlndWludCIpLnZhbHVlID0gYXJyCiAgICBieXRlYyA3IC8vIDB4NjI2OTY3NzU2OTZlNzQKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgNyAvLyAweDYyNjk2Nzc1Njk2ZTc0CiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2Jvb2xfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2Jvb2xfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTcKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W2Jvb2xdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjEKICAgIC8vIGZvciBpIGluIHVyYW5nZShsZW5ndGgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYm9vbF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjEKICAgIC8vIGZvciBpIGluIHVyYW5nZShsZW5ndGgpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjIKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoaSA9PSBUeG4ubnVtX2FwcF9hcmdzKQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGRpZyAxCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGludGNfMyAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTYxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UobGVuZ3RoKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9ib29sX2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTY0CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGgKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBidXJ5IDUKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE2NgogICAgLy8gaWYgbGVuZ3RoID4gMDoKICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE2NwogICAgLy8gYXNzZXJ0IG5vdCBhcnJbMF0sICJleHBlY3RlZCBlbGVtZW50IDAgdG8gYmUgRmFsc2UiCiAgICBkaWcgMwogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZWxlbWVudCAwIHRvIGJlIEZhbHNlCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTY4CiAgICAvLyBpZiBsZW5ndGggPiAxOgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjkKICAgIC8vIGFzc2VydCBub3QgYXJyWzFdLCAiZXhwZWN0ZWQgZWxlbWVudCAxIHRvIGJlIEZhbHNlIgogICAgaW50Y18xIC8vIDEKICAgIGRpZyA0CiAgICA8CiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBwdXNoaW50IDE3CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBleHBlY3RlZCBlbGVtZW50IDEgdG8gYmUgRmFsc2UKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzAKICAgIC8vIGlmIGxlbmd0aCA+IDI6CiAgICBkaWcgMgogICAgaW50Y18yIC8vIDIKICAgID4KICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzEKICAgIC8vIGFzc2VydCBhcnJbMl0sICJleHBlY3RlZCBlbGVtZW50IDIgdG8gYmUgVHJ1ZSIKICAgIGludGNfMiAvLyAyCiAgICBkaWcgNAogICAgPAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcHVzaGludCAxOAogICAgZ2V0Yml0CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZWxlbWVudCAyIHRvIGJlIFRydWUKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTcyCiAgICAvLyBpZiBsZW5ndGggPiAzOgogICAgZGlnIDIKICAgIHB1c2hpbnQgMwogICAgPgogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE3MwogICAgLy8gYXNzZXJ0IG5vdCBhcnJbbGVuZ3RoIC0gMV0sICJleHBlY3RlZCBsYXN0IGVsZW1lbnQgdG8gYmUgRmFsc2UiCiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGludCAxNgogICAgKwogICAgZGlnIDIKICAgIHN3YXAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxhc3QgZWxlbWVudCB0byBiZSBGYWxzZQoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzUKICAgIC8vIHNlbGYuZyA9IGFycgogICAgcHVzaGJ5dGVzICJnIgogICAgZGlnIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzYKICAgIC8vIGlmIGxlbmd0aDoKICAgIGRpZyAyCiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICBkaWcgMwogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBzZXRiaXQKICAgIHN3YXAKICAgIHB1c2hpbnQgNwogICAgKwogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGludGNfMiAvLyAyCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTc4CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGggLSAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICA9PQogICAgYXNzZXJ0Cgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4MgogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXlbdHVwbGVbVUludDY0LCBVSW50NjRdXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg1CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4NQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgIDwKICAgIGJ6IHRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg2CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKChpICsgMSwgaSArIDIpKQogICAgZHVwbiAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAzCiAgICBidXJ5IDEKICAgIGIgdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg4CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA1CiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4OQogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAoVUludDY0KDEpLCBVSW50NjQoMikpCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMTYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxOTAKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IChVSW50NjQoNSksIFVJbnQ2NCg2KSkKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIHN3YXAKICAgIHB1c2hpbnQgNgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5MgogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBwdXNoaW50IDE2CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemUKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTkzCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTk0CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IChVSW50NjQoMSksIFVJbnQ2NCgyKSkKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAxNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5NQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg0KSwgVUludDY0KDUpKQogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgcHVzaGludCA0CiAgICA9PQogICAgc3dhcAogICAgcHVzaGludCA1CiAgICA9PQogICAgJiYKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTk2CiAgICAvLyBzZWxmLmMgPSBhcnIKICAgIHB1c2hieXRlcyAiYyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDAKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W015VHVwbGVdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDMKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNQogICAgPAogICAgYnogdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDQKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlUdXBsZShmb289aSwgYmFyPWkgJSAyID09IDAsIGJhej1pICogMyAlIDIgPT0gMCkpCiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAyCiAgICAlCiAgICAhCiAgICBkaWcgMQogICAgcHVzaGludCAzCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDIKICAgIGl0b2IKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDYKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwNwogICAgLy8gZm9vLCBiYXIsIGJheiA9IGFyclswXQogICAgZHVwCiAgICBleHRyYWN0IDIgOQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBwdXNoaW50IDY0CiAgICBnZXRiaXQKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA2NQogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDgKICAgIC8vIGFzc2VydCBmb28gPT0gMAogICAgdW5jb3ZlciAyCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwOQogICAgLy8gYXNzZXJ0IGJhcgogICAgc3dhcAogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTAKICAgIC8vIGFzc2VydCBiYXoKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjExCiAgICAvLyBzZWxmLmQgPSBhcnIKICAgIHB1c2hieXRlcyAiZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxOTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTUKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W3R1cGxlW1VJbnQ2NCwgQnl0ZXNdXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjE4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIxOAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgIDwKICAgIGJ6IHRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjE5CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKChpICsgMSwgb3AuYnplcm8oaSkpKQogICAgZHVwbiAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgc3dhcAogICAgYnplcm8KICAgIGRpZyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGJ5dGVjIDYgLy8gMHgwMDBhCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMwogICAgYnVyeSAxCiAgICBiIHRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyMQogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGJ1cnkgNAogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjIKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEKCnRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjIKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA8CiAgICBieiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyMwogICAgLy8gYXNzZXJ0IGFycltpXVswXSA9PSBpICsgMSwgImV4cGVjdGVkIDFzdCBlbGVtZW50IHRvIGJlIGNvcnJlY3QiCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZGlnIDYKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMXN0IGVsZW1lbnQgdG8gYmUgY29ycmVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjI0CiAgICAvLyBhc3NlcnQgYXJyW2ldWzFdLmxlbmd0aCA9PSBpLCAiZXhwZWN0ZWQgMm5kIGVsZW1lbnQgdG8gYmUgY29ycmVjdCIKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDJuZCBlbGVtZW50IHRvIGJlIGNvcnJlY3QKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2Cgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjYKICAgIC8vIGFyciA9IGFyci5wb3AoKQogICAgZGlnIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyNwogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyOAogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAoVUludDY0KDEpLCBvcC5iemVybygwKSksICJleHBlY3RlZCAxLCAwIgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgaW50Y18wIC8vIDAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDEsIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyOQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg0KSwgb3AuYnplcm8oMykpLCAiZXhwZWN0ZWQgNCwgMyIKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDQKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIHB1c2hpbnQgMwogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgNCwgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjMwCiAgICAvLyBzZWxmLmUgPSBhcnIKICAgIHB1c2hieXRlcyAiZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzQKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W015RHluYW1pY1NpemVkVHVwbGVdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzcKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjM3CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNQogICAgPAogICAgYnogdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzgKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlEeW5hbWljU2l6ZWRUdXBsZShmb289aSArIDEsIGJhcj10aW1lcyhpKSkpCiAgICBkdXBuIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBjYWxsc3ViIHRpbWVzCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyA2IC8vIDB4MDAwYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDMKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDAKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBidXJ5IDQKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNQogICAgPAogICAgYnogdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDIKICAgIC8vIGFzc2VydCBhcnJbaV1bMF0gPT0gaSArIDEsICJleHBlY3RlZCAxc3QgZWxlbWVudCB0byBiZSBjb3JyZWN0IgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGRpZyA2CiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDUKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDFzdCBlbGVtZW50IHRvIGJlIGNvcnJlY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI0MwogICAgLy8gYXNzZXJ0IGFycltpXVsxXSA9PSB0aW1lcyhpKSwgImV4cGVjdGVkIDJuZCBlbGVtZW50IHRvIGJlIGNvcnJlY3QiCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgdGltZXMKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMm5kIGVsZW1lbnQgdG8gYmUgY29ycmVjdAogICAgYnVyeSAxCiAgICBiIHRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDYKCnRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheV9hZnRlcl9mb3JAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI0NQogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBkaWcgMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ2CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ3CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IE15RHluYW1pY1NpemVkVHVwbGUoVUludDY0KDEpLCBTdHJpbmcoKSksICJleHBlY3RlZCAxLCAwIgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAiIgogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMSwgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ4CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSBNeUR5bmFtaWNTaXplZFR1cGxlKFVJbnQ2NCg0KSwgU3RyaW5nKCIgICAiKSksICJleHBlY3RlZCA0LCAzIgogICAgZGlnIDEKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgNAogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA0CiAgICA9PQogICAgc3dhcAogICAgcHVzaGJ5dGVzICIgICAiCiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBleHBlY3RlZCA0LCAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDkKICAgIC8vIHNlbGYuZiA9IGFycgogICAgcHVzaGJ5dGVzICJmIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9sb2dbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fbG9nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjUzCiAgICAvLyBsb2coYXJyKQogICAgbG9nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fZW1pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9lbWl0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU3CiAgICAvLyBhcmM0LmVtaXQoImVtaXRfdGVzdCIsIGFycikKICAgIHB1c2hieXRlcyAweGZhNDBjMDUzMDAwMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU3CiAgICAvLyBhcmM0LmVtaXQoImVtaXRfdGVzdCIsIGFycikKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X25lc3RlZF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfbmVzdGVkX2FycmF5OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMgogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjMtMjY0CiAgICAvLyAjIGFkZCBuIG5ldyBhcnJheXMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcnJfdG9fYWRkKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjMtMjY0CiAgICAvLyAjIGFkZCBuIG5ldyBhcnJheXMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcnJfdG9fYWRkKToKICAgIGR1cAogICAgZGlnIDMKICAgIDwKICAgIGJ6IHRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjUKICAgIC8vIGV4dHJhX2FyciA9IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGJ1cnkgMTIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2NgogICAgLy8gZm9yIGogaW4gdXJhbmdlKGkpOgogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjY2CiAgICAvLyBmb3IgaiBpbiB1cmFuZ2UoaSk6CiAgICBkaWcgNAogICAgZGlnIDEKICAgIDwKICAgIGJ6IHRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckA3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjcKICAgIC8vIGV4dHJhX2FyciA9IGV4dHJhX2Fyci5hcHBlbmQoaikKICAgIGRpZyA0CiAgICBkdXAKICAgIGl0b2IKICAgIGRpZyAxMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2NgogICAgLy8gZm9yIGogaW4gdXJhbmdlKGkpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiB0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDQKCnRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjY4CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKGV4dHJhX2FycikKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBkaWcgMTQKICAgIGNvbmNhdAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjYzLTI2NAogICAgLy8gIyBhZGQgbiBuZXcgYXJyYXlzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXJyX3RvX2FkZCk6CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3MC0yNzEKICAgIC8vICMgc3VtIGlubmVyIGFycmF5cyBhbmQgcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgc3VtcwogICAgLy8gdG90YWxzID0gSW1tdXRhYmxlQXJyYXlbVUludDY0XSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYnVyeSAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjcyCiAgICAvLyBmb3IgaW5uZXJfYXJyIGluIGFycjoKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgYnVyeSA5CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA3Cgp0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDEwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjcyCiAgICAvLyBmb3IgaW5uZXJfYXJyIGluIGFycjoKICAgIGRpZyA2CiAgICBkaWcgOQogICAgPAogICAgYnogdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDEzCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA3CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBidXJ5IDEyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MTAKICAgIC8vIHRvdGFsID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYxMQogICAgLy8gZm9yIGkgaW4gYXJyOgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGJ1cnkgOAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgoKdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAxNToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYxMQogICAgLy8gZm9yIGkgaW4gYXJyOgogICAgZGlnIDUKICAgIGRpZyA4CiAgICA8CiAgICBieiB0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAMTcKICAgIGRpZyAxMAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjEyCiAgICAvLyB0b3RhbCArPSBpCiAgICBkaWcgNQogICAgKwogICAgYnVyeSA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA2CiAgICBiIHRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJAMTUKCnRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckAxNzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3MwogICAgLy8gdG90YWxzID0gdG90YWxzLmFwcGVuZChzdW1fYXJyKGlubmVyX2FycikpCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDEwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAxMAogICAgZGlnIDYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDcKICAgIGIgdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAxMAoKdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2JpdF9wYWNrZWRfdHVwbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9iaXRfcGFja2VkX3R1cGxlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3OQogICAgLy8gYXJyMiA9IEltbXV0YWJsZUFycmF5W1R3b0Jvb2xUdXBsZV0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4MC0yODIKICAgIC8vIGFycjcgPSBJbW11dGFibGVBcnJheVtTZXZlbkJvb2xUdXBsZV0oKQogICAgLy8gYXJyOCA9IEltbXV0YWJsZUFycmF5W0VpZ2h0Qm9vbFR1cGxlXSgpCiAgICAvLyBhcnI5ID0gSW1tdXRhYmxlQXJyYXlbTmluZUJvb2xUdXBsZV0oKQogICAgZHVwbiAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyODgKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2JpdF9wYWNrZWRfdHVwbGVzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4OAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgIDwKICAgIGJ6IHRlc3RfYml0X3BhY2tlZF90dXBsZXNfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4OQogICAgLy8gYXJyMiA9IGFycjIuYXBwZW5kKFR3b0Jvb2xUdXBsZShhPWkgPT0gMCwgYj1pID09IDEpKQogICAgZHVwbiAyCiAgICAhCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI5MwogICAgLy8gYmFyPWkgKyAxLAogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTYKICAgIC8vIGM9aSA9PSAyLAogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjk3CiAgICAvLyBkPWkgPT0gMywKICAgIGRpZyAzCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTgKICAgIC8vIGU9aSA9PSA0LAogICAgZGlnIDQKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI5OQogICAgLy8gZj1pID09IDUsCiAgICBkaWcgNQogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzAwCiAgICAvLyBnPWkgPT0gNiwKICAgIGRpZyA2CiAgICBwdXNoaW50IDYKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTAtMzAyCiAgICAvLyBhcnI3ID0gYXJyNy5hcHBlbmQoCiAgICAvLyAgICAgU2V2ZW5Cb29sVHVwbGUoCiAgICAvLyAgICAgICAgIGZvbz1pLAogICAgLy8gICAgICAgICBiYXI9aSArIDEsCiAgICAvLyAgICAgICAgIGE9aSA9PSAwLAogICAgLy8gICAgICAgICBiPWkgPT0gMSwKICAgIC8vICAgICAgICAgYz1pID09IDIsCiAgICAvLyAgICAgICAgIGQ9aSA9PSAzLAogICAgLy8gICAgICAgICBlPWkgPT0gNCwKICAgIC8vICAgICAgICAgZj1pID09IDUsCiAgICAvLyAgICAgICAgIGc9aSA9PSA2LAogICAgLy8gICAgICkKICAgIC8vICkKICAgIGRpZyA3CiAgICBpdG9iCiAgICB1bmNvdmVyIDcKICAgIGludGNfMiAvLyAyCiAgICB1bmNvdmVyIDcKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCA1CiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCA2CiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgZHVwMgogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDkKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMxNAogICAgLy8gaD1pID09IDcsCiAgICBkaWcgNAogICAgcHVzaGludCA3CiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzAzLTMxNgogICAgLy8gYXJyOCA9IGFycjguYXBwZW5kKAogICAgLy8gICAgIEVpZ2h0Qm9vbFR1cGxlKAogICAgLy8gICAgICAgICBmb289aSwKICAgIC8vICAgICAgICAgYmFyPWkgKyAxLAogICAgLy8gICAgICAgICBhPWkgPT0gMCwKICAgIC8vICAgICAgICAgYj1pID09IDEsCiAgICAvLyAgICAgICAgIGM9aSA9PSAyLAogICAgLy8gICAgICAgICBkPWkgPT0gMywKICAgIC8vICAgICAgICAgZT1pID09IDQsCiAgICAvLyAgICAgICAgIGY9aSA9PSA1LAogICAgLy8gICAgICAgICBnPWkgPT0gNiwKICAgIC8vICAgICAgICAgaD1pID09IDcsCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDcKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkaWcgNwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgNwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzI5CiAgICAvLyBpPWkgPT0gOCwKICAgIHVuY292ZXIgMwogICAgaW50Y18zIC8vIDgKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMTctMzMxCiAgICAvLyBhcnI5ID0gYXJyOS5hcHBlbmQoCiAgICAvLyAgICAgTmluZUJvb2xUdXBsZSgKICAgIC8vICAgICAgICAgZm9vPWksCiAgICAvLyAgICAgICAgIGJhcj1pICsgMSwKICAgIC8vICAgICAgICAgYT1pID09IDAsCiAgICAvLyAgICAgICAgIGI9aSA9PSAxLAogICAgLy8gICAgICAgICBjPWkgPT0gMiwKICAgIC8vICAgICAgICAgZD1pID09IDMsCiAgICAvLyAgICAgICAgIGU9aSA9PSA0LAogICAgLy8gICAgICAgICBmPWkgPT0gNSwKICAgIC8vICAgICAgICAgZz1pID09IDYsCiAgICAvLyAgICAgICAgIGg9aSA9PSA3LAogICAgLy8gICAgICAgICBpPWkgPT0gOCwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAzCiAgICBidXJ5IDEKICAgIGIgdGVzdF9iaXRfcGFja2VkX3R1cGxlc19mb3JfaGVhZGVyQDIKCnRlc3RfYml0X3BhY2tlZF90dXBsZXNfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzMKICAgIC8vIGFzc2VydCBhcnIyLmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzQKICAgIC8vIGFzc2VydCBhcnI3Lmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzUKICAgIC8vIGFzc2VydCBhcnI4Lmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzYKICAgIC8vIGFzc2VydCBhcnI5Lmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzcKICAgIC8vIHNlbGYuYm9vbDIgPSBhcnIyCiAgICBwdXNoYnl0ZXMgImJvb2wyIgogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzM4CiAgICAvLyBzZWxmLmJvb2w3ID0gYXJyNwogICAgcHVzaGJ5dGVzICJib29sNyIKICAgIHVuY292ZXIgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMzOQogICAgLy8gc2VsZi5ib29sOCA9IGFycjgKICAgIHB1c2hieXRlcyAiYm9vbDgiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNDAKICAgIC8vIHNlbGYuYm9vbDkgPSBhcnI5CiAgICBwdXNoYnl0ZXMgImJvb2w5IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzOgogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTAKICAgIC8vIHN1bTEgPSBzdW0yID0gc3VtMyA9IHN1bTQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUxCiAgICAvLyBmb3IgaSBpbiBhcnIxOgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMCAvLyAwCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MQogICAgLy8gZm9yIGkgaW4gYXJyMToKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDUKICAgIGRpZyA5CiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTIKICAgIC8vIHN1bTEgKz0gaQogICAgZGlnIDQKICAgICsKICAgIGJ1cnkgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMgoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MwogICAgLy8gZm9yIGIgaW4gYXJyMjoKICAgIGRpZyA4CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgYnVyeSAxNwogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUzCiAgICAvLyBmb3IgYiBpbiBhcnIyOgogICAgZGlnIDEyCiAgICBkaWcgMTcKICAgIDwKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDExCiAgICBkaWcgMTIKICAgIHB1c2hpbnQgMTYKICAgICsKICAgIGRpZyA5CiAgICBzd2FwCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1NAogICAgLy8gaWYgYjoKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTUKICAgIC8vIHN1bTIgKz0gMQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDQKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUA5OgogICAgZGlnIDEyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxMwogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJANgoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTYKICAgIC8vIGZvciB0dXAgaW4gYXJyMzoKICAgIGRpZyA3CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgYnVyeSAxNgogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTIKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckAxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1NgogICAgLy8gZm9yIHR1cCBpbiBhcnIzOgogICAgZGlnIDExCiAgICBkaWcgMTYKICAgIDwKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDE5CiAgICBkaWcgNwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxMgogICAgcHVzaGludCA5CiAgICAqCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBwdXNoaW50IDY0CiAgICBnZXRiaXQKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA2NQogICAgZ2V0Yml0CiAgICBidXJ5IDEzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTcKICAgIC8vIHN1bTMgKz0gdHVwLmZvbwogICAgZGlnIDYKICAgIHVuY292ZXIgMgogICAgKwogICAgYnVyeSA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTgKICAgIC8vIGlmIHR1cC5iYXI6CiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1OQogICAgLy8gc3VtMyArPSAxCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYwCiAgICAvLyBpZiB0dXAuYmF6OgogICAgZGlnIDEwCiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM2MQogICAgLy8gc3VtMyArPSAxCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9pZl9lbHNlQDE3OgogICAgZGlnIDExCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxMgogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMTIKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDE5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYyCiAgICAvLyBmb3IgaWR4LCBkeW5fdHVwIGluIHVlbnVtZXJhdGUoYXJyNCk6CiAgICBkaWcgNgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGJ1cnkgMTUKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMjA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjIKICAgIC8vIGZvciBpZHgsIGR5bl90dXAgaW4gdWVudW1lcmF0ZShhcnI0KToKICAgIGRpZyAxMwogICAgZGlnIDE1CiAgICA8CiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAyMwogICAgZGlnIDYKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMTQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkaWcgMTgKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYzCiAgICAvLyBzdW00ICs9IGR5bl90dXAuZm9vCiAgICBkaWcgOQogICAgdW5jb3ZlciAyCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjQKICAgIC8vIHN1bTQgKz0gZHluX3R1cC5iYXIuYnl0ZXMubGVuZ3RoCiAgICBzd2FwCiAgICBsZW4KICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICBidXJ5IDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM2NQogICAgLy8gYXNzZXJ0IGR5bl90dXAuYmFyLmJ5dGVzLmxlbmd0aCA9PSBpZHgsICJleHBlY3RlZCBzdHJpbmcgbGVuZ3RoIHRvIG1hdGNoIGluZGV4IgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHN0cmluZyBsZW5ndGggdG8gbWF0Y2ggaW5kZXgKICAgIGJ1cnkgMTQKICAgIGIgc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19mb3JfaGVhZGVyQDIwCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAyMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAyCiAgICBpdG9iCiAgICBkaWcgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNgogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X3VpbnQ2NF9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3VpbnQ2NF9yZXR1cm46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzEKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIHB1c2hieXRlcyAweDAwMDMwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF91aW50NjRfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X3VpbnQ2NF9yZXR1cm5fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChpKQogICAgZHVwbiAyCiAgICBpdG9iCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzcyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF91aW50NjRfcmV0dXJuX2Zvcl9oZWFkZXJAMgoKdGVzdF91aW50NjRfcmV0dXJuX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfYm9vbF9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2Jvb2xfcmV0dXJuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc4CiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheSgoVHJ1ZSwgRmFsc2UsIFRydWUsIEZhbHNlLCBUcnVlKSkKICAgIHB1c2hieXRlcyAweDAwMDVhOAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2Jvb2xfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3OQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2Jvb2xfcmV0dXJuX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODAKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoaSAlIDIgPT0gMCkKICAgIGR1cG4gMgogICAgaW50Y18yIC8vIDIKICAgICUKICAgICEKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGludGNfMyAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9ib29sX3JldHVybl9mb3JfaGVhZGVyQDIKCnRlc3RfYm9vbF9yZXR1cm5fYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF90dXBsZV9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3R1cGxlX3JldHVybjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NQogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXkoKE15VHVwbGUoVUludDY0KCksIFRydWUsIEZhbHNlKSwpKQogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDAwMDAwMDAwMDAwMDA4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzg2CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X3R1cGxlX3JldHVybl9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODYKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF90dXBsZV9yZXR1cm5fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChNeVR1cGxlKGZvbz1pLCBiYXI9aSAlIDIgPT0gMCwgYmF6PWkgJSAzID09IDApKQogICAgZHVwbiAyCiAgICBpbnRjXzIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDEKICAgIHB1c2hpbnQgMwogICAgJQogICAgIQogICAgZGlnIDIKICAgIGl0b2IKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfdHVwbGVfcmV0dXJuX2Zvcl9oZWFkZXJAMgoKdGVzdF90dXBsZV9yZXR1cm5fYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9keW5hbWljX3R1cGxlX3JldHVybltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZHluYW1pY190dXBsZV9yZXR1cm46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTIKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5KChNeUR5bmFtaWNTaXplZFR1cGxlKFVJbnQ2NCgpLCBTdHJpbmcoIkhlbGxvIikpLCkpCiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDBhMDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9keW5hbWljX3R1cGxlX3JldHVybl9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF9keW5hbWljX3R1cGxlX3JldHVybl9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzk0CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKE15RHluYW1pY1NpemVkVHVwbGUoaSwgdGltZXMoaSkpKQogICAgZHVwbiAyCiAgICBjYWxsc3ViIHRpbWVzCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyA2IC8vIDB4MDAwYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfZHluYW1pY190dXBsZV9yZXR1cm5fZm9yX2hlYWRlckAyCgp0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFja1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFjazoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwMgogICAgLy8gbXV0YWJsZS5leHRlbmQoYXJyKQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwNAogICAgLy8gbXV0YWJsZS5hcHBlbmQoTXlUdXBsZShmb289aSwgYmFyPWkgJSAyID09IDAsIGJhej1pICUgMyA9PSAwKSkKICAgIGR1cG4gMgogICAgaW50Y18yIC8vIDIKICAgICUKICAgICEKICAgIGRpZyAxCiAgICBwdXNoaW50IDMKICAgICUKICAgICEKICAgIGRpZyA0CiAgICBjb3ZlciAzCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgYnVyeSAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MDMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfZm9yX2hlYWRlckAyCgp0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDA1CiAgICAvLyByZXR1cm4gbXV0YWJsZS5mcmVlemUoKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOQogICAgLwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDExCiAgICAvLyBwcmVmaXggPSBJbW11dGFibGVBcnJheSgoYXJjNC5VSW50NjQoMSksIGFyYzQuVUludDY0KDIpKSkKICAgIGJ5dGVjIDggLy8gMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxMgogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZXh0cmFjdCA4IDgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQyMAogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxOQogICAgLy8gcHJlZml4ID0gSW1tdXRhYmxlQXJyYXkoKGFyYzQuVUludDY0KDEpLCBhcmM0LlVJbnQ2NCgyKSkpCiAgICBieXRlYyA4IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjAKICAgIC8vIHJlc3VsdCA9IHByZWZpeCArIGFyZwogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBwdXNoYnl0ZXMgMHgwMDA0CiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfYXJjNF90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9hcmM0X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDI4CiAgICAvLyByZXN1bHQgPSBwcmVmaXggKyBhcmcKICAgIGV4dHJhY3QgNCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjcKICAgIC8vIHByZWZpeCA9IEltbXV0YWJsZUFycmF5KChhcmM0LlN0cmluZygiYSIpLCBhcmM0LlN0cmluZygiYiIpKSkKICAgIGJ5dGVjIDkgLy8gMHgwMDAyMDAwNDAwMDcwMDAxNjEwMDAxNjIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQyOAogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDM2CiAgICAvLyByZXN1bHQgPSBwcmVmaXggKyBhcmcKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDM1CiAgICAvLyBwcmVmaXggPSBJbW11dGFibGVBcnJheSgoYXJjNC5TdHJpbmcoImEiKSwgYXJjNC5TdHJpbmcoImIiKSkpCiAgICBieXRlYyA5IC8vIDB4MDAwMjAwMDQwMDA3MDAwMTYxMDAwMTYyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MzYKICAgIC8vIHJlc3VsdCA9IHByZWZpeCArIGFyZwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2NvbmNhdF9pbW11dGFibGVfZHluYW1pYzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ0MwogICAgLy8gcmV0dXJuIGltbTEgKyBpbW0yCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgZXh0cmFjdCAyIDAKICAgIHVuY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FyYzRbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcmM0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ3CiAgICAvLyBhc3NlcnQgaW1tLCAiZXhwZWN0ZWQgbm9uIGVtcHR5IGFycmF5IgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgbm9uIGVtcHR5IGFycmF5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NDgKICAgIC8vIGltbSA9IGltbS5yZXBsYWNlKGltbS5sZW5ndGggLSAxLCBpbW1bMF0pCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAxNgogICAgc3dhcAogICAgcHVzaGludCAxNgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIHN3YXAKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9pbW1fZml4ZWRfYXJyW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9pbW1fZml4ZWRfYXJyOgogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDUzCiAgICAvLyBhcnIxID0gemVyb19ieXRlcyhOYXRpdmVTdHJ1Y3QzKQogICAgcHVzaGludCA0OAogICAgYnplcm8KICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU0CiAgICAvLyBzdHJ1Y3QxMiA9IE5hdGl2ZVN0cnVjdChUeG4ubnVtX2FwcF9hcmdzICsgMSwgVHhuLm51bV9hcHBfYXJncyArIDIpCiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ1NQogICAgLy8gYXJyMiA9IE5hdGl2ZVN0cnVjdDMoKHN0cnVjdDEyLCBzdHJ1Y3QxMiwgc3RydWN0MTIpKQogICAgZHVwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU3CiAgICAvLyBhc3NlcnQgYXJyMSAhPSBhcnIyLCAiZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIGRpZmZlcmVudCIKICAgICE9CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIGRpZmZlcmVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDYwCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2MAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDMpOgogICAgZHVwCiAgICBwdXNoaW50IDMKICAgIDwKICAgIGJ6IHRlc3RfaW1tX2ZpeGVkX2Fycl9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDYxCiAgICAvLyBhcnIxID0gYXJyMS5yZXBsYWNlKGksIHN0cnVjdDEyKQogICAgZHVwbiAyCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZGlnIDUKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnVyeSA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NjAKICAgIC8vIGZvciBpIGluIHVyYW5nZSgzKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJAMgoKdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDYzCiAgICAvLyBhc3NlcnQgYXJyMSA9PSBhcnIyLCAiZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIHRoZSBzYW1lIgogICAgZGlnIDMKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFycmF5cyB0byBiZSB0aGUgc2FtZQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2NQogICAgLy8gZm9yIHN0cnVjdF9pdCBpbiBhcnIxOgogICAgZGlnIDQKICAgIHB1c2hpbnQgMwogICAgPAogICAgYnogdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA5CiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgcHVzaGludCAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NjYKICAgIC8vIGFzc2VydCBzdHJ1Y3RfaXQgPT0gc3RydWN0MTIsICJleHBlY3RlZCBpdGVtcyBvbiBpdGVyYXRpb24gdG8gYmUgdGhlIHNhbWUiCiAgICBkaWcgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBpdGVtcyBvbiBpdGVyYXRpb24gdG8gYmUgdGhlIHNhbWUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDUKICAgIGIgdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJANgoKdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDY4CiAgICAvLyBzZWxmLmltbV9maXhlZF9hcnIgPSBhcnIxCiAgICBieXRlYyAxMCAvLyAiaW1tX2ZpeGVkX2FyciIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzIKICAgIC8vIGFzc2VydCBzdW1faW1tX2ZpeGVkKG11dF9hcnIuZnJlZXplKCkpID09IDE1LCAiZXhwZWN0ZWQgc3VtIHRvIGJlIDE1IgogICAgZHVwCiAgICBjYWxsc3ViIHN1bV9pbW1fZml4ZWQKICAgIHB1c2hpbnQgMTUKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgc3VtIHRvIGJlIDE1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzQKICAgIC8vIG11dF9hcnJbMF0gPSBOYXRpdmVTdHJ1Y3QoVUludDY0KCksIFVJbnQ2NCgpKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDAgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzUKICAgIC8vIGFzc2VydCBzdW1faW1tX2ZpeGVkKG11dF9hcnIuZnJlZXplKCkpID09IDEwLCAiZXhwZWN0ZWQgc3VtIHRvIGJlIDEwIgogICAgY2FsbHN1YiBzdW1faW1tX2ZpeGVkCiAgICBwdXNoaW50IDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHN1bSB0byBiZSAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDc3CiAgICAvLyByZXR1cm4gc2VsZi5pbW1fZml4ZWRfYXJyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImltbV9maXhlZF9hcnIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1tX2ZpeGVkX2FyciBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAAECCCYLAAQVH3x1AgAAAQACAAJA/////////////////////////////////////////////////////////////////////////////////////wIACgdiaWd1aW50EgACAAAAAAAAAAEAAAAAAAAAAgwAAgAEAAcAAWEAAWINaW1tX2ZpeGVkX2FycjEbQQC3MRkURDEYRIIYBETUL5kEt+qmCwR0PXDtBBx+BJQEotWGCwTgX8VkBB4JK4MEATECYgTIZUqYBInRlvgEbLfJkQSYmL8CBPa2HugEYLhqewRzrSg/BFKd+ukEIG1RTwTgZGXiBOwDAKIE7N8UrwRRGspkBCmFLk8EbUqjWAS3y5a9NhoAjhgCaQNQBHoFNQXlBkoHfAixCLcIxgmjCsEL8gw+DHEMww0jDXINiw2nDboN4w4MDikAMRkUMRgUEEOKAgKL/iJZIwkWVwYAi/5MXABJFYv/CUqL/1hPAiJPA1KJigECi/8iWSMJSSQLSYv/VwIASU4CSU8CWUlPAkkVTE4CUigiiwaLAQxBABuLAosGSU4CWSQJFlcGAosFTFCMBSQIjAZC/92LABZXBgKLBVCLASQIiwJMiwNSUIsEjACMAYmKBAEoRwKL/CJZRwKL/ghJFlcGAIv8TFwATgJMgQcIJQpJTwKBBwglCklOAgxBAAyLBosFCa+LBExQjAQijACLA4EQCEmMAov+CIwBiwKLAQxBACCL/YsASU4CU4sEiwJJTgNPAlSMBCMIjAKL/wiMAEL/2IsEjACJigMBi/0iWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJIosEiwIMQQAjiwNJFlcGAosBiwRJTgRPAl1JjAFLAVkkCAiMAyQIjARC/9WLAIsBUIwAiYoEAShJi/4kC4v8JAsiiwSLAwxBAByL/YsESU4CWYsCCBZXBgKLAUxQjAEkCIwEQv/ci/0VjAAijASLBIsCDEEAHIv/iwRJTgJZiwAIFlcGAosBTFCMASQIjARC/9yL/Iv+CBZXBgKLAVCL/YsDiwBSUIv/FYv/iwJPAlJQjACJigEBIkmLAYEDDEEAH4sBSYEQC4v/TIEQWEkiW4sACEwlWwiMACMIjAFC/9mJigEBKCKLAYv/DEEAEYsAgAEgUIwAiwEjCIwBQv/niYoCASKLAIv/DEEAHYsASRaL/kxQi/4iWSMIFlcGAlwAjP4jCIwAQv/bi/5MiYAKAAEAAAAAAAAAKoEFiP/CSSJZSYEGEkRJIwlLAlcCAEwlC1uBBBJEgSsWTwJMUEwjCBZXBgJcAEcCIllJgQcSRCMJSwFXAgBMJQtbgSsSRCRbgSoSRCJJgQMMQQARSwEliP07RQNISSMIRQFC/+hLAUkiWUmBBBJEIwlLAVcCAEwlC1skEkSBCoj/RkkiWUmBDhJESSMJSwJXAgBMJQtbgQkSRIEsFk8CTFBMIwgWVwYCXABJIllJgQ8SRCMJSwFXAgBMJQtbgSwSRIEXFlwSSSJZgQ8SREmBEluBFxJEgAFhTGcjQzEbIwkWgUCvSU4CqypMUIACAAFcAEcCIllJIxJEIwlMVwIATIFAC4FAWCioRCJJgQUMQQAgRwIWSwSrSwNJTwJQTCJZIwgWVwYCXABFAyMIRQFC/9lLAUkiWUmBBhJESSMJSwJXAgBMgUALgUBYgAEEqEQxGxYnBUyhSRWBQA5ESwWrTwJMUEwjCBZXBgJcAEkiWUmBBxJESSMJSwJXAgBMgUALgUBYgED////////////////////////////////////////////////////////////////////////////////////+qERLAVcCQCioREwnBVBMIwgWVwYCXABJIllJJRJEIwlLAVcCAEyBQAuBQFgnBahESVcCQCioRCcHvEgnB0y/I0MoNhoBFyoiSUsDDEEAHjEbSwFJTwISKyJPAlRLA0wjJYj78EUDIwhFAUL/20sBIllJRQVLA0lOAhJEQQAKSwNESwGBEFMUREsCIw1BAAwjSwQMREsBgRFTFERLAiQNQQALJEsEDERLAYESU0RLAoEDDUEAEksCIwlJSwUMRIEQCEsCTFMURIABZ0sCZ0sCQQAoSwMjCUkWVwYASwNMXABLAYEQCCJUTIEHCCUKJAgiTFIiWUsDIwkSRCNDKiJJgQUMQQAlRwIjCEwkCEsBFkwWUEsDSU8CUEwiWSMIFlcGAlwARQNFAUL/1EsBSSJZSYEFEkRLAVcCAEsCVwIQSSJbTCVbTCMSTCQSEERMIwmBEAuBEFhJIltMJVtMgQUSTIEGEhBEgRCI+mZFAUkiWUmBBBJESwFXAgBLAlcCEEkiW0wlW0wjEkwkEhBETCMJgRALgRBYSSJbTCVbTIEEEkyBBRIQRIABY0xnI0MqIkmBBQxBADRHAiQYFEsBgQMLJBgUSwIWKyJPBFQjTwNUUEsDSU8CUEwiWSMIFlcGAlwARQMjCEUBQv/FSwFJIlmBBRJESVcCCUkiW0sBgUBTTwKBQVNPAhRETEREgAFkTGcjQygqIkmBBQxBADVHAiMITK9LA0kiWUxXAgBLAxZLAxUWVwYCTwRQTCcGUExQJwRMUE4CI08DiPruRQNFAUL/xEsBIllJRQSBBRJEIkUBSYEFDEEAT0sBVwIASwFJTgIkC0sBTFlLAiMISwZLAQlLAxVLAiQLSwVMWU8CTU8DTwNPAlJJIltLASVZSwIVTwNOAlJXAgBMSwISRBVPAhJERQFC/6pLAYj5OUUBSSJZSYEEEkRLAVcCAEkiWUsCIwlLAhVLAyRZSwFMSwNNSwRPBE8CUkkiW0sBJVlLAhVPA04CUlcCAEwjEiKvTwISEERLASQLSwNMWU8CIwhPBEsBCUwkC0sETFlPA0xPAk1SSSJbSwElWUsCFU8DTgJSVwIATIEEEoEDr08CEhBEgAFlTGcjQygqIkmBBQxBADdHAiMITIj6j0sDSSJZTFcCAEsDFksDFRZXBgJPBFBMJwZQTFAnBExQTgIjTwOI+bpFA0UBQv/CSwEiWUlFBIEFEkQiRQFJgQUMQQBRSwFXAgBLAUlOAiQLSwFMWUsCIwhLBksBCUsDFUsCJAtLBUxZTwJNTwNPA08CUkkiW0sBJVlLAhVPA04CUlcCAExLAhJETwKI+gESREUBQv+oSwGI+ANFAUkiWUmBBBJESwFXAgBJIllLAiMJSwIVSwMkWUsBTEsDTUsETwRPAlJJIltLASVZSwIVTwNOAlJXAgBMIxJMKBIQREsBJAtLA0xZTwIjCE8ESwEJTCQLSwRMWU8DTE8CTVJJIltLASVZSwIVTwNOAlJXAgBMgQQSTIADICAgEhBEgAFmTGcjQzYaAbAjQ4AG+kDAUwACNhoBULAjQyJHAihHBTYaARc2GgIiSUsDDEEATCpFDCJFBUsESwEMQQAeSwRJFksNSU8CUEwiWSMIFlcGAlwARQ0jCEUFQv/aSwFJIllMVwIAJwRLDlBOAiNPA4j4U0UCSSMIRQFC/60qRQpLASJZRQkiRQdLBksJDEEAYUsBVwIASwckC0sBTFlKWSULJAhYSUUMIkUFIllFCCJFBksFSwgMQQAZSwpXAgBLBklOAiULW0sFCEUFIwhFBkL/30sDFksKSU8CUEwiWSMIFlcGAlwARQpLBiMIRQdC/5cpSwpQsCNDKkcDIkmBBQxBAMZHAhRLASMSKyJPA1QjTwJUSwZJTgJLAVBPAiJZIwgWVwYCXABFB0sBIwhLAiQSSwOBAxJLBIEEEksFgQUSSwaBBhJLBxZPByRPB1SBA08GVIEETwVUgQVPBFSBBk8DVEpQSwMWTEsBUEsJSU8CUEwiWSMIFlcGAlwARQlLBIEHEk8CgQdPAlRPAkxQSUsCUEsHSU8CUEwiWSMIFlcGAlwARQdPAyUSKyJPAlRQTFBLA0lPAlBMIlkjCBZXBgJcAEUDRQFC/zNLBEkiWYEFEkRLBEkiWYEFEkRLBEkiWYEFEkRLBEkiWYEFEkSABWJvb2wyTwRngAVib29sN08DZ4AFYm9vbDhPAmeABWJvb2w5TGcjQyhHBjYaATYaAjYaAzYaBCJHAzYaASJZIklLAgxBABlLCVcCAEsBSU4CJQtbSwQIRQQjCEUBQv/gSwgiWUURIkUNSwxLEQxBABtLDIEQCEsJTFNBAAZLAyMIRQRLDCMIRQ1C/91LByJZRRAiRQxLC0sQDEEAQEsHVwIASwyBCQuBCVhJIltLAYFAU08CgUFTRQ1LBk8CCEUGQQAGSwQjCEUFSwpBAAZLBCMIRQVLCyMIRQxC/7hLBiJZRQ8iRQ5LDUsPDEEAVksGVwIASw5JTgIkC0sBTFlLAiMISxJLAQlLAxVLAiQLSwVMWU8CTU8DTwNPAlJJIltLASVZSwIVTwNOAlJXAgBLCU8CCEwVTEsBCEUJTwISREUOQv+iSwIWSwQWUEsFFlBLBhZQKUxQsCNDNhoBF4AaAAMAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAMiSUsDDEEAHUcCFksDSU8CUEwiWSMIFlcGAlwARQMjCEUBQv/cKUsCULAjQzYaAReAAwAFqCJJSwMMQQAbRwIkGBQrIk8CVEsDTCMliPQsRQMjCEUBQv/eKUsCULAjQzYaAReACwABAAAAAAAAAACAIklLAwxBADJHAiQYFEsBgQMYFEsCFisiTwRUI08DVFBLA0lPAlBMIlkjCBZXBgJcAEUDIwhFAUL/xylLAlCwI0M2GgEXgBUAAQACAAAAAAAAAAAACgAFSGVsbG8iSUsDDEEANkcCiPUySwNJIllMVwIASwMWSwMVFlcGAk8EUEwnBlBMUCcETFBOAiNPA4j0XUUDIwhFAUL/wylLAlCwI0M2GgE2GgIXTFcCACJJSwMMQQApRwIkGBRLAYEDGBRLBE4DSwIWKyJPBFQjTwNUUE8CTFBFAyMIRQFC/9BLAUkVgQkKFlcGAkxQKUxQsCNDJwg2GgFQSVcCABUlChZXBgJcAClMULAjQzYaAUlXAAhMVwgIUCcITFCAAgAEXAApTFCwI0M2GgFXBAAnCUwkiPNSKUxQsCNDNhoBSSJZSwEkWUsCTwJLAlJLAhVPA08DTwJSUCcJTCSI8ykpTFCwI0M2GgE2GgJLASJZTwJXAgBLAlcCAE8DIllPA08DTwJPA4jzailMULAjQzYaAUkiWUlEIwlLAVcCEEyBEAskCExdKUxQsCNDKIEwr0kxGyMIMRskCEwWTBZQSU4CSUsBUExQSU4CE0QiSYEDDEEAFEcCgRALSwVMSwVdRQUjCEUBQv/lSwNLAhJEIkUFSwSBAwxBABdLBEmBEAtLBUyBEFhLBBJEIwhFBUL/4ScKSwRJTgJnSYjzV4EPEkSAEAAAAAAAAAAAAAAAAAAAAABcAIjzPIEKEkQiJwplRClMULAjQw==","clear":"C4EBQw=="},"events":[{"name":"emit_test","args":[{"type":"uint64[]","name":"field1"}]}],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the ImmutableArrayContract contract + */ +export type ImmutableArrayContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'test_uint64_array()void': Record + 'test_biguint_array()void': Record + 'test_bool_array(uint64)void': { + length: bigint | number + } + 'test_fixed_size_tuple_array()void': Record + 'test_fixed_size_named_tuple_array()void': Record + 'test_dynamic_sized_tuple_array()void': Record + 'test_dynamic_sized_named_tuple_array()void': Record + 'test_implicit_conversion_log(uint64[])void': { + arr: bigint[] | number[] + } + 'test_implicit_conversion_emit(uint64[])void': { + arr: bigint[] | number[] + } + 'test_nested_array(uint64,uint64[][])uint64[]': { + arrToAdd: bigint | number + arr: bigint[] | number[][] + } + 'test_bit_packed_tuples()void': Record + 'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)': { + arr1: bigint[] | number[] + arr2: boolean[] + arr3: [bigint | number, boolean, boolean][] + arr4: [bigint | number, string][] + } + 'test_uint64_return(uint64)uint64[]': { + append: bigint | number + } + 'test_bool_return(uint64)bool[]': { + append: bigint | number + } + 'test_tuple_return(uint64)(uint64,bool,bool)[]': { + append: bigint | number + } + 'test_dynamic_tuple_return(uint64)(uint64,string)[]': { + append: bigint | number + } + 'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]': { + arr: [bigint | number, boolean, boolean][] + append: bigint | number + } + 'test_concat_with_arc4_tuple((uint64,uint64))uint64[]': { + arg: [bigint | number, bigint | number] + } + 'test_concat_with_native_tuple((uint64,uint64))uint64[]': { + arg: [bigint | number, bigint | number] + } + 'test_dynamic_concat_with_arc4_tuple((string,string))string[]': { + arg: [string, string] + } + 'test_dynamic_concat_with_native_tuple((string,string))string[]': { + arg: [string, string] + } + 'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]': { + imm1: [bigint | number, string][] + imm2: [bigint | number, string][] + } + 'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]': { + imm: [bigint | number, bigint | number][] + } + 'test_imm_fixed_arr()(uint64,uint64)[3]': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'test_uint64_array()void': [] + 'test_biguint_array()void': [] + 'test_bool_array(uint64)void': [length: bigint | number] + 'test_fixed_size_tuple_array()void': [] + 'test_fixed_size_named_tuple_array()void': [] + 'test_dynamic_sized_tuple_array()void': [] + 'test_dynamic_sized_named_tuple_array()void': [] + 'test_implicit_conversion_log(uint64[])void': [arr: bigint[] | number[]] + 'test_implicit_conversion_emit(uint64[])void': [arr: bigint[] | number[]] + 'test_nested_array(uint64,uint64[][])uint64[]': [arrToAdd: bigint | number, arr: bigint[] | number[][]] + 'test_bit_packed_tuples()void': [] + 'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)': [arr1: bigint[] | number[], arr2: boolean[], arr3: [bigint | number, boolean, boolean][], arr4: [bigint | number, string][]] + 'test_uint64_return(uint64)uint64[]': [append: bigint | number] + 'test_bool_return(uint64)bool[]': [append: bigint | number] + 'test_tuple_return(uint64)(uint64,bool,bool)[]': [append: bigint | number] + 'test_dynamic_tuple_return(uint64)(uint64,string)[]': [append: bigint | number] + 'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]': [arr: [bigint | number, boolean, boolean][], append: bigint | number] + 'test_concat_with_arc4_tuple((uint64,uint64))uint64[]': [arg: [bigint | number, bigint | number]] + 'test_concat_with_native_tuple((uint64,uint64))uint64[]': [arg: [bigint | number, bigint | number]] + 'test_dynamic_concat_with_arc4_tuple((string,string))string[]': [arg: [string, string]] + 'test_dynamic_concat_with_native_tuple((string,string))string[]': [arg: [string, string]] + 'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]': [imm1: [bigint | number, string][], imm2: [bigint | number, string][]] + 'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]': [imm: [bigint | number, bigint | number][]] + 'test_imm_fixed_arr()(uint64,uint64)[3]': [] + } +} + +/** + * The return type for each method + */ +export type ImmutableArrayContractReturns = { + 'test_uint64_array()void': void + 'test_biguint_array()void': void + 'test_bool_array(uint64)void': void + 'test_fixed_size_tuple_array()void': void + 'test_fixed_size_named_tuple_array()void': void + 'test_dynamic_sized_tuple_array()void': void + 'test_dynamic_sized_named_tuple_array()void': void + 'test_implicit_conversion_log(uint64[])void': void + 'test_implicit_conversion_emit(uint64[])void': void + 'test_nested_array(uint64,uint64[][])uint64[]': bigint[] + 'test_bit_packed_tuples()void': void + 'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)': [bigint, bigint, bigint, bigint] + 'test_uint64_return(uint64)uint64[]': bigint[] + 'test_bool_return(uint64)bool[]': boolean[] + 'test_tuple_return(uint64)(uint64,bool,bool)[]': [bigint, boolean, boolean][] + 'test_dynamic_tuple_return(uint64)(uint64,string)[]': [bigint, string][] + 'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]': [bigint, boolean, boolean][] + 'test_concat_with_arc4_tuple((uint64,uint64))uint64[]': bigint[] + 'test_concat_with_native_tuple((uint64,uint64))uint64[]': bigint[] + 'test_dynamic_concat_with_arc4_tuple((string,string))string[]': string[] + 'test_dynamic_concat_with_native_tuple((string,string))string[]': string[] + 'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]': [bigint, string][] + 'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]': [bigint, bigint][] + 'test_imm_fixed_arr()(uint64,uint64)[3]': [[bigint, bigint], [bigint, bigint], [bigint, bigint]] +} + +/** + * Defines the types of available calls and state of the ImmutableArrayContract smart contract. + */ +export type ImmutableArrayContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'test_uint64_array()void' | 'test_uint64_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_uint64_array()void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_uint64_array()void'] + returns: ImmutableArrayContractReturns['test_uint64_array()void'] + }> + & Record<'test_biguint_array()void' | 'test_biguint_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_biguint_array()void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_biguint_array()void'] + returns: ImmutableArrayContractReturns['test_biguint_array()void'] + }> + & Record<'test_bool_array(uint64)void' | 'test_bool_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_bool_array(uint64)void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_bool_array(uint64)void'] + returns: ImmutableArrayContractReturns['test_bool_array(uint64)void'] + }> + & Record<'test_fixed_size_tuple_array()void' | 'test_fixed_size_tuple_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_fixed_size_tuple_array()void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_fixed_size_tuple_array()void'] + returns: ImmutableArrayContractReturns['test_fixed_size_tuple_array()void'] + }> + & Record<'test_fixed_size_named_tuple_array()void' | 'test_fixed_size_named_tuple_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_fixed_size_named_tuple_array()void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_fixed_size_named_tuple_array()void'] + returns: ImmutableArrayContractReturns['test_fixed_size_named_tuple_array()void'] + }> + & Record<'test_dynamic_sized_tuple_array()void' | 'test_dynamic_sized_tuple_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_sized_tuple_array()void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_sized_tuple_array()void'] + returns: ImmutableArrayContractReturns['test_dynamic_sized_tuple_array()void'] + }> + & Record<'test_dynamic_sized_named_tuple_array()void' | 'test_dynamic_sized_named_tuple_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_sized_named_tuple_array()void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_sized_named_tuple_array()void'] + returns: ImmutableArrayContractReturns['test_dynamic_sized_named_tuple_array()void'] + }> + & Record<'test_implicit_conversion_log(uint64[])void' | 'test_implicit_conversion_log', { + argsObj: ImmutableArrayContractArgs['obj']['test_implicit_conversion_log(uint64[])void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_implicit_conversion_log(uint64[])void'] + returns: ImmutableArrayContractReturns['test_implicit_conversion_log(uint64[])void'] + }> + & Record<'test_implicit_conversion_emit(uint64[])void' | 'test_implicit_conversion_emit', { + argsObj: ImmutableArrayContractArgs['obj']['test_implicit_conversion_emit(uint64[])void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_implicit_conversion_emit(uint64[])void'] + returns: ImmutableArrayContractReturns['test_implicit_conversion_emit(uint64[])void'] + }> + & Record<'test_nested_array(uint64,uint64[][])uint64[]' | 'test_nested_array', { + argsObj: ImmutableArrayContractArgs['obj']['test_nested_array(uint64,uint64[][])uint64[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_nested_array(uint64,uint64[][])uint64[]'] + returns: ImmutableArrayContractReturns['test_nested_array(uint64,uint64[][])uint64[]'] + }> + & Record<'test_bit_packed_tuples()void' | 'test_bit_packed_tuples', { + argsObj: ImmutableArrayContractArgs['obj']['test_bit_packed_tuples()void'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_bit_packed_tuples()void'] + returns: ImmutableArrayContractReturns['test_bit_packed_tuples()void'] + }> + & Record<'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)' | 'sum_uints_and_lengths_and_trues', { + argsObj: ImmutableArrayContractArgs['obj']['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'] + argsTuple: ImmutableArrayContractArgs['tuple']['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'] + returns: ImmutableArrayContractReturns['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'] + }> + & Record<'test_uint64_return(uint64)uint64[]' | 'test_uint64_return', { + argsObj: ImmutableArrayContractArgs['obj']['test_uint64_return(uint64)uint64[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_uint64_return(uint64)uint64[]'] + returns: ImmutableArrayContractReturns['test_uint64_return(uint64)uint64[]'] + }> + & Record<'test_bool_return(uint64)bool[]' | 'test_bool_return', { + argsObj: ImmutableArrayContractArgs['obj']['test_bool_return(uint64)bool[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_bool_return(uint64)bool[]'] + returns: ImmutableArrayContractReturns['test_bool_return(uint64)bool[]'] + }> + & Record<'test_tuple_return(uint64)(uint64,bool,bool)[]' | 'test_tuple_return', { + argsObj: ImmutableArrayContractArgs['obj']['test_tuple_return(uint64)(uint64,bool,bool)[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_tuple_return(uint64)(uint64,bool,bool)[]'] + returns: ImmutableArrayContractReturns['test_tuple_return(uint64)(uint64,bool,bool)[]'] + }> + & Record<'test_dynamic_tuple_return(uint64)(uint64,string)[]' | 'test_dynamic_tuple_return', { + argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_tuple_return(uint64)(uint64,string)[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_tuple_return(uint64)(uint64,string)[]'] + returns: ImmutableArrayContractReturns['test_dynamic_tuple_return(uint64)(uint64,string)[]'] + }> + & Record<'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]' | 'test_convert_to_array_and_back', { + argsObj: ImmutableArrayContractArgs['obj']['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'] + returns: ImmutableArrayContractReturns['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'] + }> + & Record<'test_concat_with_arc4_tuple((uint64,uint64))uint64[]' | 'test_concat_with_arc4_tuple', { + argsObj: ImmutableArrayContractArgs['obj']['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'] + returns: ImmutableArrayContractReturns['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'] + }> + & Record<'test_concat_with_native_tuple((uint64,uint64))uint64[]' | 'test_concat_with_native_tuple', { + argsObj: ImmutableArrayContractArgs['obj']['test_concat_with_native_tuple((uint64,uint64))uint64[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_concat_with_native_tuple((uint64,uint64))uint64[]'] + returns: ImmutableArrayContractReturns['test_concat_with_native_tuple((uint64,uint64))uint64[]'] + }> + & Record<'test_dynamic_concat_with_arc4_tuple((string,string))string[]' | 'test_dynamic_concat_with_arc4_tuple', { + argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_concat_with_arc4_tuple((string,string))string[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_concat_with_arc4_tuple((string,string))string[]'] + returns: ImmutableArrayContractReturns['test_dynamic_concat_with_arc4_tuple((string,string))string[]'] + }> + & Record<'test_dynamic_concat_with_native_tuple((string,string))string[]' | 'test_dynamic_concat_with_native_tuple', { + argsObj: ImmutableArrayContractArgs['obj']['test_dynamic_concat_with_native_tuple((string,string))string[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_dynamic_concat_with_native_tuple((string,string))string[]'] + returns: ImmutableArrayContractReturns['test_dynamic_concat_with_native_tuple((string,string))string[]'] + }> + & Record<'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]' | 'test_concat_immutable_dynamic', { + argsObj: ImmutableArrayContractArgs['obj']['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'] + returns: ImmutableArrayContractReturns['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'] + }> + & Record<'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]' | 'test_immutable_arc4', { + argsObj: ImmutableArrayContractArgs['obj']['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'] + returns: ImmutableArrayContractReturns['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'] + }> + & Record<'test_imm_fixed_arr()(uint64,uint64)[3]' | 'test_imm_fixed_arr', { + argsObj: ImmutableArrayContractArgs['obj']['test_imm_fixed_arr()(uint64,uint64)[3]'] + argsTuple: ImmutableArrayContractArgs['tuple']['test_imm_fixed_arr()(uint64,uint64)[3]'] + returns: ImmutableArrayContractReturns['test_imm_fixed_arr()(uint64,uint64)[3]'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + global: { + keys: { + a: bigint[] + g: boolean[] + c: [bigint, bigint][] + d: [bigint, boolean, boolean][] + e: [bigint, Uint8Array][] + f: [bigint, string][] + bool2: [boolean, boolean][] + bool7: [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] + bool8: [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] + bool9: [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] + immFixedArr: [[bigint, bigint], [bigint, bigint], [bigint, bigint]] + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type ImmutableArrayContractSignatures = keyof ImmutableArrayContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type ImmutableArrayContractNonVoidMethodSignatures = keyof ImmutableArrayContractTypes['methods'] extends infer T ? T extends keyof ImmutableArrayContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the ImmutableArrayContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = ImmutableArrayContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the ImmutableArrayContract smart contract to the method's return type + */ +export type MethodReturn = ImmutableArrayContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed global state of the application. + */ +export type GlobalKeysState = ImmutableArrayContractTypes['state']['global']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type ImmutableArrayContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type ImmutableArrayContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: ImmutableArrayContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the ImmutableArrayContract smart contract + */ +export abstract class ImmutableArrayContractParamsFactory { + /** + * Constructs a no op call for the test_uint64_array()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testUint64Array(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_uint64_array()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_biguint_array()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testBiguintArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_biguint_array()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_bool_array(uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testBoolArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_bool_array(uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.length], + } + } + /** + * Constructs a no op call for the test_fixed_size_tuple_array()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testFixedSizeTupleArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_fixed_size_tuple_array()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_fixed_size_named_tuple_array()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testFixedSizeNamedTupleArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_fixed_size_named_tuple_array()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_dynamic_sized_tuple_array()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testDynamicSizedTupleArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_dynamic_sized_tuple_array()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_dynamic_sized_named_tuple_array()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testDynamicSizedNamedTupleArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_dynamic_sized_named_tuple_array()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_implicit_conversion_log(uint64[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImplicitConversionLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_implicit_conversion_log(uint64[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arr], + } + } + /** + * Constructs a no op call for the test_implicit_conversion_emit(uint64[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImplicitConversionEmit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_implicit_conversion_emit(uint64[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arr], + } + } + /** + * Constructs a no op call for the test_nested_array(uint64,uint64[][])uint64[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testNestedArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_nested_array(uint64,uint64[][])uint64[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arrToAdd, params.args.arr], + } + } + /** + * Constructs a no op call for the test_bit_packed_tuples()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testBitPackedTuples(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_bit_packed_tuples()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static sumUintsAndLengthsAndTrues(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arr1, params.args.arr2, params.args.arr3, params.args.arr4], + } + } + /** + * Constructs a no op call for the test_uint64_return(uint64)uint64[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testUint64Return(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_uint64_return(uint64)uint64[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.append], + } + } + /** + * Constructs a no op call for the test_bool_return(uint64)bool[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testBoolReturn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_bool_return(uint64)bool[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.append], + } + } + /** + * Constructs a no op call for the test_tuple_return(uint64)(uint64,bool,bool)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testTupleReturn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_tuple_return(uint64)(uint64,bool,bool)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.append], + } + } + /** + * Constructs a no op call for the test_dynamic_tuple_return(uint64)(uint64,string)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testDynamicTupleReturn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_dynamic_tuple_return(uint64)(uint64,string)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.append], + } + } + /** + * Constructs a no op call for the test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testConvertToArrayAndBack(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arr, params.args.append], + } + } + /** + * Constructs a no op call for the test_concat_with_arc4_tuple((uint64,uint64))uint64[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testConcatWithArc4Tuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_concat_with_arc4_tuple((uint64,uint64))uint64[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arg], + } + } + /** + * Constructs a no op call for the test_concat_with_native_tuple((uint64,uint64))uint64[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testConcatWithNativeTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_concat_with_native_tuple((uint64,uint64))uint64[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arg], + } + } + /** + * Constructs a no op call for the test_dynamic_concat_with_arc4_tuple((string,string))string[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testDynamicConcatWithArc4Tuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_dynamic_concat_with_arc4_tuple((string,string))string[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arg], + } + } + /** + * Constructs a no op call for the test_dynamic_concat_with_native_tuple((string,string))string[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testDynamicConcatWithNativeTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_dynamic_concat_with_native_tuple((string,string))string[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arg], + } + } + /** + * Constructs a no op call for the test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testConcatImmutableDynamic(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.imm1, params.args.imm2], + } + } + /** + * Constructs a no op call for the test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImmutableArc4(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.imm], + } + } + /** + * Constructs a no op call for the test_imm_fixed_arr()(uint64,uint64)[3] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImmFixedArr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_imm_fixed_arr()(uint64,uint64)[3]' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the ImmutableArrayContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class ImmutableArrayContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `ImmutableArrayContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new ImmutableArrayContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new ImmutableArrayContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the ImmutableArrayContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: ImmutableArrayContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new ImmutableArrayContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ImmutableArrayContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ImmutableArrayContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ImmutableArrayContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new ImmutableArrayContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the ImmutableArrayContract smart contract + */ +export class ImmutableArrayContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `ImmutableArrayContractClient` + * + * @param appClient An `AppClient` instance which has been created with the ImmutableArrayContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `ImmutableArrayContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `ImmutableArrayContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new ImmutableArrayContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `ImmutableArrayContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new ImmutableArrayContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testUint64Array: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testUint64Array(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_biguint_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testBiguintArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testBiguintArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_array(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testBoolArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testBoolArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testFixedSizeTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testFixedSizeTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_named_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testFixedSizeNamedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testFixedSizeNamedTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testDynamicSizedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicSizedTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_named_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testDynamicSizedNamedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicSizedNamedTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_log(uint64[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImplicitConversionLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testImplicitConversionLog(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_emit(uint64[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImplicitConversionEmit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testImplicitConversionEmit(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_nested_array(uint64,uint64[][])uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testNestedArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testNestedArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bit_packed_tuples()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testBitPackedTuples: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testBitPackedTuples(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + sumUintsAndLengthsAndTrues: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.sumUintsAndLengthsAndTrues(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_return(uint64)uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testUint64Return: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testUint64Return(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_return(uint64)bool[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testBoolReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testBoolReturn(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_tuple_return(uint64)(uint64,bool,bool)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testTupleReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testTupleReturn(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_tuple_return(uint64)(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testDynamicTupleReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicTupleReturn(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testConvertToArrayAndBack: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testConvertToArrayAndBack(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_arc4_tuple((uint64,uint64))uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testConcatWithArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testConcatWithArc4Tuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_native_tuple((uint64,uint64))uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testConcatWithNativeTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testConcatWithNativeTuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_arc4_tuple((string,string))string[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testDynamicConcatWithArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithArc4Tuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_native_tuple((string,string))string[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testDynamicConcatWithNativeTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithNativeTuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testConcatImmutableDynamic: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testConcatImmutableDynamic(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImmutableArc4: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testImmutableArc4(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_imm_fixed_arr()(uint64,uint64)[3]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImmFixedArr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayContractParamsFactory.testImmFixedArr(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testUint64Array: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testUint64Array(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_biguint_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testBiguintArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testBiguintArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_array(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testBoolArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testBoolArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testFixedSizeTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testFixedSizeTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_named_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testFixedSizeNamedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testFixedSizeNamedTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testDynamicSizedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicSizedTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_named_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testDynamicSizedNamedTupleArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicSizedNamedTupleArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_log(uint64[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImplicitConversionLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testImplicitConversionLog(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_emit(uint64[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImplicitConversionEmit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testImplicitConversionEmit(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_nested_array(uint64,uint64[][])uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testNestedArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testNestedArray(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bit_packed_tuples()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testBitPackedTuples: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testBitPackedTuples(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + sumUintsAndLengthsAndTrues: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.sumUintsAndLengthsAndTrues(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_return(uint64)uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testUint64Return: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testUint64Return(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_return(uint64)bool[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testBoolReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testBoolReturn(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_tuple_return(uint64)(uint64,bool,bool)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testTupleReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testTupleReturn(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_tuple_return(uint64)(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testDynamicTupleReturn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicTupleReturn(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testConvertToArrayAndBack: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testConvertToArrayAndBack(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_arc4_tuple((uint64,uint64))uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testConcatWithArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testConcatWithArc4Tuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_native_tuple((uint64,uint64))uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testConcatWithNativeTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testConcatWithNativeTuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_arc4_tuple((string,string))string[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testDynamicConcatWithArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithArc4Tuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_native_tuple((string,string))string[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testDynamicConcatWithNativeTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithNativeTuple(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testConcatImmutableDynamic: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testConcatImmutableDynamic(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImmutableArc4: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testImmutableArc4(params)) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_imm_fixed_arr()(uint64,uint64)[3]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImmFixedArr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayContractParamsFactory.testImmFixedArr(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testUint64Array: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testUint64Array(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_uint64_array()void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_biguint_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testBiguintArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testBiguintArray(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_biguint_array()void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_array(uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testBoolArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testBoolArray(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_bool_array(uint64)void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testFixedSizeTupleArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testFixedSizeTupleArray(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_fixed_size_tuple_array()void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_fixed_size_named_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testFixedSizeNamedTupleArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testFixedSizeNamedTupleArray(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_fixed_size_named_tuple_array()void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testDynamicSizedTupleArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicSizedTupleArray(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_sized_tuple_array()void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_sized_named_tuple_array()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testDynamicSizedNamedTupleArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicSizedNamedTupleArray(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_sized_named_tuple_array()void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_log(uint64[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImplicitConversionLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testImplicitConversionLog(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_implicit_conversion_log(uint64[])void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_implicit_conversion_emit(uint64[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImplicitConversionEmit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testImplicitConversionEmit(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_implicit_conversion_emit(uint64[])void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_nested_array(uint64,uint64[][])uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testNestedArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testNestedArray(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_nested_array(uint64,uint64[][])uint64[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bit_packed_tuples()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testBitPackedTuples: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testBitPackedTuples(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_bit_packed_tuples()void'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + sumUintsAndLengthsAndTrues: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.sumUintsAndLengthsAndTrues(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_uint64_return(uint64)uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testUint64Return: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testUint64Return(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_uint64_return(uint64)uint64[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_bool_return(uint64)bool[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testBoolReturn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testBoolReturn(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_bool_return(uint64)bool[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_tuple_return(uint64)(uint64,bool,bool)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testTupleReturn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testTupleReturn(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_tuple_return(uint64)(uint64,bool,bool)[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_tuple_return(uint64)(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testDynamicTupleReturn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicTupleReturn(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_tuple_return(uint64)(uint64,string)[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testConvertToArrayAndBack: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testConvertToArrayAndBack(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_arc4_tuple((uint64,uint64))uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testConcatWithArc4Tuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testConcatWithArc4Tuple(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_with_native_tuple((uint64,uint64))uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testConcatWithNativeTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testConcatWithNativeTuple(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_concat_with_native_tuple((uint64,uint64))uint64[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_arc4_tuple((string,string))string[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testDynamicConcatWithArc4Tuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithArc4Tuple(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_concat_with_arc4_tuple((string,string))string[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_dynamic_concat_with_native_tuple((string,string))string[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testDynamicConcatWithNativeTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testDynamicConcatWithNativeTuple(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_dynamic_concat_with_native_tuple((string,string))string[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testConcatImmutableDynamic: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testConcatImmutableDynamic(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImmutableArc4: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testImmutableArc4(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'])} + }, + + /** + * Makes a call to the ImmutableArrayContract smart contract using the `test_imm_fixed_arr()(uint64,uint64)[3]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImmFixedArr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayContractParamsFactory.testImmFixedArr(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayContractReturns['test_imm_fixed_arr()(uint64,uint64)[3]'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new ImmutableArrayContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current ImmutableArrayContract app + */ + state = { + /** + * Methods to access global state for the current ImmutableArrayContract app + */ + global: { + /** + * Get all current keyed values from global state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.global.getAll() + return { + a: result.a, + g: result.g, + c: result.c, + d: result.d, + e: result.e, + f: result.f, + bool2: result.bool2, + bool7: result.bool7, + bool8: result.bool8, + bool9: result.bool9, + immFixedArr: result.imm_fixed_arr, + } + }, + /** + * Get the current value of the a key in global state + */ + a: async (): Promise => { return (await this.appClient.state.global.getValue("a")) as bigint[] | undefined }, + /** + * Get the current value of the g key in global state + */ + g: async (): Promise => { return (await this.appClient.state.global.getValue("g")) as boolean[] | undefined }, + /** + * Get the current value of the c key in global state + */ + c: async (): Promise<[bigint, bigint][] | undefined> => { return (await this.appClient.state.global.getValue("c")) as [bigint, bigint][] | undefined }, + /** + * Get the current value of the d key in global state + */ + d: async (): Promise<[bigint, boolean, boolean][] | undefined> => { return (await this.appClient.state.global.getValue("d")) as [bigint, boolean, boolean][] | undefined }, + /** + * Get the current value of the e key in global state + */ + e: async (): Promise<[bigint, Uint8Array][] | undefined> => { return (await this.appClient.state.global.getValue("e")) as [bigint, Uint8Array][] | undefined }, + /** + * Get the current value of the f key in global state + */ + f: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.global.getValue("f")) as [bigint, string][] | undefined }, + /** + * Get the current value of the bool2 key in global state + */ + bool2: async (): Promise<[boolean, boolean][] | undefined> => { return (await this.appClient.state.global.getValue("bool2")) as [boolean, boolean][] | undefined }, + /** + * Get the current value of the bool7 key in global state + */ + bool7: async (): Promise<[bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined> => { return (await this.appClient.state.global.getValue("bool7")) as [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined }, + /** + * Get the current value of the bool8 key in global state + */ + bool8: async (): Promise<[bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined> => { return (await this.appClient.state.global.getValue("bool8")) as [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined }, + /** + * Get the current value of the bool9 key in global state + */ + bool9: async (): Promise<[bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined> => { return (await this.appClient.state.global.getValue("bool9")) as [bigint, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, bigint][] | undefined }, + /** + * Get the current value of the imm_fixed_arr key in global state + */ + immFixedArr: async (): Promise<[[bigint, bigint], [bigint, bigint], [bigint, bigint]] | undefined> => { return (await this.appClient.state.global.getValue("imm_fixed_arr")) as [[bigint, bigint], [bigint, bigint], [bigint, bigint]] | undefined }, + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): ImmutableArrayContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a test_uint64_array()void method call against the ImmutableArrayContract contract + */ + testUint64Array(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testUint64Array(params))) + return this + }, + /** + * Add a test_biguint_array()void method call against the ImmutableArrayContract contract + */ + testBiguintArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBiguintArray(params))) + return this + }, + /** + * Add a test_bool_array(uint64)void method call against the ImmutableArrayContract contract + */ + testBoolArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBoolArray(params))) + return this + }, + /** + * Add a test_fixed_size_tuple_array()void method call against the ImmutableArrayContract contract + */ + testFixedSizeTupleArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testFixedSizeTupleArray(params))) + return this + }, + /** + * Add a test_fixed_size_named_tuple_array()void method call against the ImmutableArrayContract contract + */ + testFixedSizeNamedTupleArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testFixedSizeNamedTupleArray(params))) + return this + }, + /** + * Add a test_dynamic_sized_tuple_array()void method call against the ImmutableArrayContract contract + */ + testDynamicSizedTupleArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicSizedTupleArray(params))) + return this + }, + /** + * Add a test_dynamic_sized_named_tuple_array()void method call against the ImmutableArrayContract contract + */ + testDynamicSizedNamedTupleArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicSizedNamedTupleArray(params))) + return this + }, + /** + * Add a test_implicit_conversion_log(uint64[])void method call against the ImmutableArrayContract contract + */ + testImplicitConversionLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImplicitConversionLog(params))) + return this + }, + /** + * Add a test_implicit_conversion_emit(uint64[])void method call against the ImmutableArrayContract contract + */ + testImplicitConversionEmit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImplicitConversionEmit(params))) + return this + }, + /** + * Add a test_nested_array(uint64,uint64[][])uint64[] method call against the ImmutableArrayContract contract + */ + testNestedArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testNestedArray(params))) + return this + }, + /** + * Add a test_bit_packed_tuples()void method call against the ImmutableArrayContract contract + */ + testBitPackedTuples(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBitPackedTuples(params))) + return this + }, + /** + * Add a sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64) method call against the ImmutableArrayContract contract + */ + sumUintsAndLengthsAndTrues(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sumUintsAndLengthsAndTrues(params))) + return this + }, + /** + * Add a test_uint64_return(uint64)uint64[] method call against the ImmutableArrayContract contract + */ + testUint64Return(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testUint64Return(params))) + return this + }, + /** + * Add a test_bool_return(uint64)bool[] method call against the ImmutableArrayContract contract + */ + testBoolReturn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBoolReturn(params))) + return this + }, + /** + * Add a test_tuple_return(uint64)(uint64,bool,bool)[] method call against the ImmutableArrayContract contract + */ + testTupleReturn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testTupleReturn(params))) + return this + }, + /** + * Add a test_dynamic_tuple_return(uint64)(uint64,string)[] method call against the ImmutableArrayContract contract + */ + testDynamicTupleReturn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicTupleReturn(params))) + return this + }, + /** + * Add a test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[] method call against the ImmutableArrayContract contract + */ + testConvertToArrayAndBack(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testConvertToArrayAndBack(params))) + return this + }, + /** + * Add a test_concat_with_arc4_tuple((uint64,uint64))uint64[] method call against the ImmutableArrayContract contract + */ + testConcatWithArc4Tuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testConcatWithArc4Tuple(params))) + return this + }, + /** + * Add a test_concat_with_native_tuple((uint64,uint64))uint64[] method call against the ImmutableArrayContract contract + */ + testConcatWithNativeTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testConcatWithNativeTuple(params))) + return this + }, + /** + * Add a test_dynamic_concat_with_arc4_tuple((string,string))string[] method call against the ImmutableArrayContract contract + */ + testDynamicConcatWithArc4Tuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicConcatWithArc4Tuple(params))) + return this + }, + /** + * Add a test_dynamic_concat_with_native_tuple((string,string))string[] method call against the ImmutableArrayContract contract + */ + testDynamicConcatWithNativeTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testDynamicConcatWithNativeTuple(params))) + return this + }, + /** + * Add a test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[] method call against the ImmutableArrayContract contract + */ + testConcatImmutableDynamic(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testConcatImmutableDynamic(params))) + return this + }, + /** + * Add a test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[] method call against the ImmutableArrayContract contract + */ + testImmutableArc4(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArc4(params))) + return this + }, + /** + * Add a test_imm_fixed_arr()(uint64,uint64)[3] method call against the ImmutableArrayContract contract + */ + testImmFixedArr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmFixedArr(params))) + return this + }, + /** + * Add a clear state call to the ImmutableArrayContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as ImmutableArrayContractComposer + } +} +export type ImmutableArrayContractComposer = { + /** + * Calls the test_uint64_array()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testUint64Array(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_uint64_array()void'] | undefined]> + + /** + * Calls the test_biguint_array()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testBiguintArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_biguint_array()void'] | undefined]> + + /** + * Calls the test_bool_array(uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testBoolArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_bool_array(uint64)void'] | undefined]> + + /** + * Calls the test_fixed_size_tuple_array()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testFixedSizeTupleArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_fixed_size_tuple_array()void'] | undefined]> + + /** + * Calls the test_fixed_size_named_tuple_array()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testFixedSizeNamedTupleArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_fixed_size_named_tuple_array()void'] | undefined]> + + /** + * Calls the test_dynamic_sized_tuple_array()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testDynamicSizedTupleArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_sized_tuple_array()void'] | undefined]> + + /** + * Calls the test_dynamic_sized_named_tuple_array()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testDynamicSizedNamedTupleArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_sized_named_tuple_array()void'] | undefined]> + + /** + * Calls the test_implicit_conversion_log(uint64[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImplicitConversionLog(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_implicit_conversion_log(uint64[])void'] | undefined]> + + /** + * Calls the test_implicit_conversion_emit(uint64[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImplicitConversionEmit(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_implicit_conversion_emit(uint64[])void'] | undefined]> + + /** + * Calls the test_nested_array(uint64,uint64[][])uint64[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testNestedArray(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_nested_array(uint64,uint64[][])uint64[]'] | undefined]> + + /** + * Calls the test_bit_packed_tuples()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testBitPackedTuples(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_bit_packed_tuples()void'] | undefined]> + + /** + * Calls the sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + sumUintsAndLengthsAndTrues(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)'] | undefined]> + + /** + * Calls the test_uint64_return(uint64)uint64[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testUint64Return(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_uint64_return(uint64)uint64[]'] | undefined]> + + /** + * Calls the test_bool_return(uint64)bool[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testBoolReturn(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_bool_return(uint64)bool[]'] | undefined]> + + /** + * Calls the test_tuple_return(uint64)(uint64,bool,bool)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testTupleReturn(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_tuple_return(uint64)(uint64,bool,bool)[]'] | undefined]> + + /** + * Calls the test_dynamic_tuple_return(uint64)(uint64,string)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testDynamicTupleReturn(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_tuple_return(uint64)(uint64,string)[]'] | undefined]> + + /** + * Calls the test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testConvertToArrayAndBack(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]'] | undefined]> + + /** + * Calls the test_concat_with_arc4_tuple((uint64,uint64))uint64[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testConcatWithArc4Tuple(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_concat_with_arc4_tuple((uint64,uint64))uint64[]'] | undefined]> + + /** + * Calls the test_concat_with_native_tuple((uint64,uint64))uint64[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testConcatWithNativeTuple(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_concat_with_native_tuple((uint64,uint64))uint64[]'] | undefined]> + + /** + * Calls the test_dynamic_concat_with_arc4_tuple((string,string))string[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testDynamicConcatWithArc4Tuple(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_concat_with_arc4_tuple((string,string))string[]'] | undefined]> + + /** + * Calls the test_dynamic_concat_with_native_tuple((string,string))string[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testDynamicConcatWithNativeTuple(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_dynamic_concat_with_native_tuple((string,string))string[]'] | undefined]> + + /** + * Calls the test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testConcatImmutableDynamic(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]'] | undefined]> + + /** + * Calls the test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImmutableArc4(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]'] | undefined]> + + /** + * Calls the test_imm_fixed_arr()(uint64,uint64)[3] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImmFixedArr(params?: CallParams): ImmutableArrayContractComposer<[...TReturns, ImmutableArrayContractReturns['test_imm_fixed_arr()(uint64,uint64)[3]'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): ImmutableArrayContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): ImmutableArrayContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type ImmutableArrayContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayInitContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayInitContract.ts new file mode 100644 index 0000000..358fea4 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/ImmutableArrayInitContract.ts @@ -0,0 +1,755 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"ImmutableArrayInitContract","structs":{},"methods":[{"name":"test_immutable_array_init","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_immutable_array_init_without_type_generic","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reference_array_init","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_reference_array_init_without_type_generic","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[42],"errorMessage":"OnCompletion must be NoOp"},{"pc":[89],"errorMessage":"OnCompletion must be NoOp && can only call when creating"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayA4IDMgMSAwCiAgICBieXRlY2Jsb2NrIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzkKICAgIC8vIGNsYXNzIEltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDExCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDg0MzRiYTJhIDB4NjNhYWJiYTAgMHhkYmFmMDM0ZSAweGE5ZDE0NTU0IC8vIG1ldGhvZCAidGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdCgpdm9pZCIsIG1ldGhvZCAidGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYygpdm9pZCIsIG1ldGhvZCAidGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdCgpdm9pZCIsIG1ldGhvZCAidGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYygpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXQgdGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYyB0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0IHRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWMKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDkwCiAgICAvLyBhMyA9IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0oUmVmZXJlbmNlQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTEyCiAgICAvLyBhMyA9IEltbXV0YWJsZUFycmF5KFJlZmVyZW5jZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUluaXRDb250cmFjdC50ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNgogICAgLy8gYTEgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyOAogICAgLy8gYTIgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKEZpeGVkQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKSkKICAgIGR1cAogICAgcG9wCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyOQogICAgLy8gYXNzZXJ0IGExLmxlbmd0aCA9PSBhMi5sZW5ndGgKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzAKICAgIC8vIGFzc2VydCBhMVswXSA9PSBhMlswXQogICAgZHVwCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzEKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhMlsxXQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzIKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhMlsyXQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzQKICAgIC8vIGEzID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XShJbW11dGFibGVBcnJheSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgcG9wCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzNgogICAgLy8gYXNzZXJ0IGExWzBdID09IGEzWzBdCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzcKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhM1sxXQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzgKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhM1syXQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MjYKICAgIC8vIGExID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQxCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGE0Lmxlbmd0aAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQyCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTRbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQzCiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTRbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ0CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTRbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0LnRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ4CiAgICAvLyBhMSA9IFJlZmVyZW5jZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1MAogICAgLy8gYTIgPSBSZWZlcmVuY2VBcnJheShGaXhlZEFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBkdXAKICAgIHBvcAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NTEKICAgIC8vIGFzc2VydCBhMS5sZW5ndGggPT0gYTIubGVuZ3RoCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUyCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTJbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUzCiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTJbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU0CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTJbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU2CiAgICAvLyBhMyA9IFJlZmVyZW5jZUFycmF5KEltbXV0YWJsZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU4CiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTNbMF0KICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1OQogICAgLy8gYXNzZXJ0IGExWzFdID09IGEzWzFdCiAgICBkdXAKICAgIGludGNfMCAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU2MAogICAgLy8gYXNzZXJ0IGExWzJdID09IGEzWzJdCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0OAogICAgLy8gYTEgPSBSZWZlcmVuY2VBcnJheSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTYzCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGE0Lmxlbmd0aAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY0CiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTRbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY1CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTRbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY2CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTRbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"byteCode":{"approval":"CiAECAMBACYBGAAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAzEbQQArMRkURDEYRIIEBIQ0uioEY6q7oATbrwNOBKnRRVQ2GgCOBAAJAA0AEQBjADEZFDEYFBBDKEgkQyhIJEMoSUhHAhUiCiMSREklWyQSREkiW4ECEkSBEFsjEkQoSEcCJVskEkRJIluBAhJEgRBbIxJEKEgoSEkVIgojEkRJJVskEkRJIluBAhJEgRBbIxJDKElIRwIVIgojEkRJJVskEkRJIluBAhJEgRBbIxJEKEhHAiVbJBJESSJbgQISRIEQWyMSRChIKEhJFSIKIxJESSVbJBJESSJbgQISRIEQWyMSQw==","clear":"CoEBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the ImmutableArrayInitContract contract + */ +export type ImmutableArrayInitContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'test_immutable_array_init()void': Record + 'test_immutable_array_init_without_type_generic()void': Record + 'test_reference_array_init()void': Record + 'test_reference_array_init_without_type_generic()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'test_immutable_array_init()void': [] + 'test_immutable_array_init_without_type_generic()void': [] + 'test_reference_array_init()void': [] + 'test_reference_array_init_without_type_generic()void': [] + } +} + +/** + * The return type for each method + */ +export type ImmutableArrayInitContractReturns = { + 'test_immutable_array_init()void': void + 'test_immutable_array_init_without_type_generic()void': void + 'test_reference_array_init()void': void + 'test_reference_array_init_without_type_generic()void': void +} + +/** + * Defines the types of available calls and state of the ImmutableArrayInitContract smart contract. + */ +export type ImmutableArrayInitContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'test_immutable_array_init()void' | 'test_immutable_array_init', { + argsObj: ImmutableArrayInitContractArgs['obj']['test_immutable_array_init()void'] + argsTuple: ImmutableArrayInitContractArgs['tuple']['test_immutable_array_init()void'] + returns: ImmutableArrayInitContractReturns['test_immutable_array_init()void'] + }> + & Record<'test_immutable_array_init_without_type_generic()void' | 'test_immutable_array_init_without_type_generic', { + argsObj: ImmutableArrayInitContractArgs['obj']['test_immutable_array_init_without_type_generic()void'] + argsTuple: ImmutableArrayInitContractArgs['tuple']['test_immutable_array_init_without_type_generic()void'] + returns: ImmutableArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'] + }> + & Record<'test_reference_array_init()void' | 'test_reference_array_init', { + argsObj: ImmutableArrayInitContractArgs['obj']['test_reference_array_init()void'] + argsTuple: ImmutableArrayInitContractArgs['tuple']['test_reference_array_init()void'] + returns: ImmutableArrayInitContractReturns['test_reference_array_init()void'] + }> + & Record<'test_reference_array_init_without_type_generic()void' | 'test_reference_array_init_without_type_generic', { + argsObj: ImmutableArrayInitContractArgs['obj']['test_reference_array_init_without_type_generic()void'] + argsTuple: ImmutableArrayInitContractArgs['tuple']['test_reference_array_init_without_type_generic()void'] + returns: ImmutableArrayInitContractReturns['test_reference_array_init_without_type_generic()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type ImmutableArrayInitContractSignatures = keyof ImmutableArrayInitContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the ImmutableArrayInitContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = ImmutableArrayInitContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the ImmutableArrayInitContract smart contract to the method's return type + */ +export type MethodReturn = ImmutableArrayInitContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type ImmutableArrayInitContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type ImmutableArrayInitContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: ImmutableArrayInitContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the ImmutableArrayInitContract smart contract + */ +export abstract class ImmutableArrayInitContractParamsFactory { + /** + * Constructs a no op call for the test_immutable_array_init()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImmutableArrayInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_immutable_array_init()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_immutable_array_init_without_type_generic()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testImmutableArrayInitWithoutTypeGeneric(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_immutable_array_init_without_type_generic()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_reference_array_init()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testReferenceArrayInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_reference_array_init()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the test_reference_array_init_without_type_generic()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testReferenceArrayInitWithoutTypeGeneric(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_reference_array_init_without_type_generic()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the ImmutableArrayInitContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class ImmutableArrayInitContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `ImmutableArrayInitContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new ImmutableArrayInitContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new ImmutableArrayInitContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the ImmutableArrayInitContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: ImmutableArrayInitContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new ImmutableArrayInitContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ImmutableArrayInitContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ImmutableArrayInitContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the ImmutableArrayInitContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new ImmutableArrayInitContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the ImmutableArrayInitContract smart contract + */ +export class ImmutableArrayInitContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `ImmutableArrayInitContractClient` + * + * @param appClient An `AppClient` instance which has been created with the ImmutableArrayInitContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `ImmutableArrayInitContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `ImmutableArrayInitContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new ImmutableArrayInitContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `ImmutableArrayInitContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new ImmutableArrayInitContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayInitContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImmutableArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInit(params)) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testImmutableArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testReferenceArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInit(params)) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testReferenceArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayInitContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImmutableArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInit(params)) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testImmutableArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testReferenceArrayInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInit(params)) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testReferenceArrayInitWithoutTypeGeneric: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayInitContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImmutableArrayInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInit(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayInitContractReturns['test_immutable_array_init()void'])} + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_immutable_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testImmutableArrayInitWithoutTypeGeneric: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayInitContractParamsFactory.testImmutableArrayInitWithoutTypeGeneric(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'])} + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testReferenceArrayInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInit(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayInitContractReturns['test_reference_array_init()void'])} + }, + + /** + * Makes a call to the ImmutableArrayInitContract smart contract using the `test_reference_array_init_without_type_generic()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testReferenceArrayInitWithoutTypeGeneric: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(ImmutableArrayInitContractParamsFactory.testReferenceArrayInitWithoutTypeGeneric(params)) + return {...result, return: result.return as unknown as (undefined | ImmutableArrayInitContractReturns['test_reference_array_init_without_type_generic()void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new ImmutableArrayInitContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current ImmutableArrayInitContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): ImmutableArrayInitContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a test_immutable_array_init()void method call against the ImmutableArrayInitContract contract + */ + testImmutableArrayInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArrayInit(params))) + return this + }, + /** + * Add a test_immutable_array_init_without_type_generic()void method call against the ImmutableArrayInitContract contract + */ + testImmutableArrayInitWithoutTypeGeneric(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testImmutableArrayInitWithoutTypeGeneric(params))) + return this + }, + /** + * Add a test_reference_array_init()void method call against the ImmutableArrayInitContract contract + */ + testReferenceArrayInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testReferenceArrayInit(params))) + return this + }, + /** + * Add a test_reference_array_init_without_type_generic()void method call against the ImmutableArrayInitContract contract + */ + testReferenceArrayInitWithoutTypeGeneric(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testReferenceArrayInitWithoutTypeGeneric(params))) + return this + }, + /** + * Add a clear state call to the ImmutableArrayInitContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as ImmutableArrayInitContractComposer + } +} +export type ImmutableArrayInitContractComposer = { + /** + * Calls the test_immutable_array_init()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImmutableArrayInit(params?: CallParams): ImmutableArrayInitContractComposer<[...TReturns, ImmutableArrayInitContractReturns['test_immutable_array_init()void'] | undefined]> + + /** + * Calls the test_immutable_array_init_without_type_generic()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testImmutableArrayInitWithoutTypeGeneric(params?: CallParams): ImmutableArrayInitContractComposer<[...TReturns, ImmutableArrayInitContractReturns['test_immutable_array_init_without_type_generic()void'] | undefined]> + + /** + * Calls the test_reference_array_init()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testReferenceArrayInit(params?: CallParams): ImmutableArrayInitContractComposer<[...TReturns, ImmutableArrayInitContractReturns['test_reference_array_init()void'] | undefined]> + + /** + * Calls the test_reference_array_init_without_type_generic()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testReferenceArrayInitWithoutTypeGeneric(params?: CallParams): ImmutableArrayInitContractComposer<[...TReturns, ImmutableArrayInitContractReturns['test_reference_array_init_without_type_generic()void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the ImmutableArrayInitContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): ImmutableArrayInitContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): ImmutableArrayInitContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type ImmutableArrayInitContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/LocalStateContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/LocalStateContract.ts new file mode 100644 index 0000000..767e777 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/LocalStateContract.ts @@ -0,0 +1,1746 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"LocalStateContract","structs":{},"methods":[{"name":"opt_in","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["OptIn"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_uint","args":[{"type":"address","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_string","args":[{"type":"address","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_byte","args":[{"type":"address","name":"a"}],"returns":{"type":"byte"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_bool","args":[{"type":"address","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_address","args":[{"type":"address","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_uint128","args":[{"type":"address","name":"a"}],"returns":{"type":"uint128"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_arc4_dynamic_bytes","args":[{"type":"address","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_implicit_key_tuple","args":[{"type":"address","name":"a"}],"returns":{"type":"(uint64,byte[],bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_uint","args":[{"type":"address","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_string","args":[{"type":"address","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_byte","args":[{"type":"address","name":"a"}],"returns":{"type":"byte"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_bool","args":[{"type":"address","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_address","args":[{"type":"address","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_uint128","args":[{"type":"address","name":"a"}],"returns":{"type":"uint128"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_arc4_dynamic_bytes","args":[{"type":"address","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":15}},"keys":{"global":{},"local":{"implicit_key_arc4_uint":{"keyType":"AVMString","valueType":"uint64","key":"aW1wbGljaXRfa2V5X2FyYzRfdWludA=="},"implicit_key_arc4_string":{"keyType":"AVMString","valueType":"string","key":"aW1wbGljaXRfa2V5X2FyYzRfc3RyaW5n"},"implicit_key_arc4_byte":{"keyType":"AVMString","valueType":"byte","key":"aW1wbGljaXRfa2V5X2FyYzRfYnl0ZQ=="},"implicit_key_arc4_bool":{"keyType":"AVMString","valueType":"bool","key":"aW1wbGljaXRfa2V5X2FyYzRfYm9vbA=="},"implicit_key_arc4_address":{"keyType":"AVMString","valueType":"address","key":"aW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcw=="},"implicit_key_arc4_uint128":{"keyType":"AVMString","valueType":"uint128","key":"aW1wbGljaXRfa2V5X2FyYzRfdWludDEyOA=="},"implicit_key_arc4_dynamic_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"aW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcw=="},"implicit_key_tuple":{"keyType":"AVMString","valueType":"(uint64,byte[],bool)","key":"aW1wbGljaXRfa2V5X3R1cGxl"},"arc4_uint":{"keyType":"AVMString","valueType":"uint64","key":"ZXhwbGljaXRfa2V5X2FyYzRfdWludA=="},"arc4_string":{"keyType":"AVMString","valueType":"string","key":"ZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5n"},"arc4_byte":{"keyType":"AVMString","valueType":"byte","key":"ZXhwbGljaXRfa2V5X2FyYzRfYnl0ZQ=="},"arc4_bool":{"keyType":"AVMString","valueType":"bool","key":"ZXhwbGljaXRfa2V5X2FyYzRfYm9vbA=="},"arc4_address":{"keyType":"AVMString","valueType":"address","key":"ZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcw=="},"arc4_uint128":{"keyType":"AVMString","valueType":"uint128","key":"ZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOA=="},"arc4_dynamic_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"ZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcw=="}},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[891],"errorMessage":"check self.arc4_address exists for account"},{"pc":[877],"errorMessage":"check self.arc4_bool exists for account"},{"pc":[863],"errorMessage":"check self.arc4_byte exists for account"},{"pc":[919],"errorMessage":"check self.arc4_dynamic_bytes exists for account"},{"pc":[849],"errorMessage":"check self.arc4_string exists for account"},{"pc":[835],"errorMessage":"check self.arc4_uint exists for account"},{"pc":[905],"errorMessage":"check self.arc4_uint128 exists for account"},{"pc":[779],"errorMessage":"check self.implicit_key_arc4_address exists for account"},{"pc":[765],"errorMessage":"check self.implicit_key_arc4_bool exists for account"},{"pc":[751],"errorMessage":"check self.implicit_key_arc4_byte exists for account"},{"pc":[807],"errorMessage":"check self.implicit_key_arc4_dynamic_bytes exists for account"},{"pc":[737],"errorMessage":"check self.implicit_key_arc4_string exists for account"},{"pc":[724],"errorMessage":"check self.implicit_key_arc4_uint exists for account"},{"pc":[793],"errorMessage":"check self.implicit_key_arc4_uint128 exists for account"},{"pc":[821],"errorMessage":"check self.implicit_key_tuple exists for account"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIgMHgwMDAwMDAwMDAwMDAwNTM5ICJpbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmciIDB4MDAwNTQ4NjU2YzZjNmYgImltcGxpY2l0X2tleV9hcmM0X2J5dGUiICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIiAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiIDB4MDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgImltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczICJpbXBsaWNpdF9rZXlfdHVwbGUiICJleHBsaWNpdF9rZXlfYXJjNF91aW50IiAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIiAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIgImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOCIgImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjYzCiAgICAvLyBjbGFzcyBMb2NhbFN0YXRlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDI2CiAgICBwdXNoYnl0ZXMgMHgzMGM2ZDU4YSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2luX3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY2MwogICAgLy8gY2xhc3MgTG9jYWxTdGF0ZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhiM2NmYTM4OSAweGRiODU4MTc2IDB4NzgyNjc3NjIgMHg0MjYzNTFjOCAweDA3NWNhZTkxIDB4NTljMGI4MGIgMHgwZDZmYTY5MCAweDk3ZTEwZDljIDB4MmU0YThjNDkgMHhiMjJjZDIxZSAweGIzZjQ0NzAxIDB4ZWRkOTcyOTcgMHg2NzFkMzUzYyAweGEzZmQ2ZmRjIDB4Y2QyZTVkNjYgLy8gbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludChhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyhhZGRyZXNzKXN0cmluZyIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGUoYWRkcmVzcylieXRlIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbChhZGRyZXNzKWJvb2wiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKGFkZHJlc3MpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgoYWRkcmVzcyl1aW50MTI4IiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyhhZGRyZXNzKWJ5dGVbXSIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV90dXBsZShhZGRyZXNzKSh1aW50NjQsYnl0ZVtdLGJvb2wpIiwgbWV0aG9kICJnZXRfYXJjNF91aW50KGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJnZXRfYXJjNF9zdHJpbmcoYWRkcmVzcylzdHJpbmciLCBtZXRob2QgImdldF9hcmM0X2J5dGUoYWRkcmVzcylieXRlIiwgbWV0aG9kICJnZXRfYXJjNF9ib29sKGFkZHJlc3MpYm9vbCIsIG1ldGhvZCAiZ2V0X2FyYzRfYWRkcmVzcyhhZGRyZXNzKWFkZHJlc3MiLCBtZXRob2QgImdldF9hcmM0X3VpbnQxMjgoYWRkcmVzcyl1aW50MTI4IiwgbWV0aG9kICJnZXRfYXJjNF9keW5hbWljX2J5dGVzKGFkZHJlc3MpYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBnZXRfaW1wbGljaXRfa2V5X3R1cGxlIGdldF9hcmM0X3VpbnQgZ2V0X2FyYzRfc3RyaW5nIGdldF9hcmM0X2J5dGUgZ2V0X2FyYzRfYm9vbCBnZXRfYXJjNF9hZGRyZXNzIGdldF9hcmM0X3VpbnQxMjggZ2V0X2FyYzRfZHluYW1pY19ieXRlcwogICAgZXJyCgptYWluX29wdF9pbl9yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE9wdEluCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgb3B0X2luCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDI2OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0Lm9wdF9pbltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdF9pbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2ODgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuVUludDY0KDEzMzcpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDUzOQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY4OQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlY18zIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICBieXRlYyA0IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTAKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZVtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQnl0ZSgwKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyA1IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTEKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQm9vbChUcnVlKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgcHVzaGJ5dGVzIDB4ODAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTIKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQWRkcmVzcygKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTMKICAgIC8vIEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5Mi02OTQKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQWRkcmVzcygKICAgIC8vICAgICBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzCiAgICAvLyApCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk1CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjhbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlVJbnQxMjgoMioqMTAwKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyA4IC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk2CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkR5bmFtaWNCeXRlcygKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTAgLy8gImltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk2LTY5OAogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoCiAgICAvLyAgICAgYiJkeW5hbWljIGJ5dGVzIgogICAgLy8gKQogICAgYnl0ZWMgMTEgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTkKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gKFVJbnQ2NCgxMCksIEJ5dGVzKGIidGVzdCIpLCBGYWxzZSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTIgLy8gImltcGxpY2l0X2tleV90dXBsZSIKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMGEwMDBiMDAwMDA0NzQ2NTczNzQKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDEKICAgIC8vIHNlbGYuYXJjNF91aW50W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5VSW50NjQoMTMzNykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTMgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDUzOQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwMgogICAgLy8gc2VsZi5hcmM0X3N0cmluZ1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuU3RyaW5nKCJIZWxsbyIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDE0IC8vICJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njg5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZ1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuU3RyaW5nKCJIZWxsbyIpCiAgICBieXRlYyA0IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDIKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmdbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwMwogICAgLy8gc2VsZi5hcmM0X2J5dGVbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJ5dGUoMCkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTUgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwNAogICAgLy8gc2VsZi5hcmM0X2Jvb2xbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJvb2woVHJ1ZSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTYgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjkxCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2xbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJvb2woVHJ1ZSkKICAgIHB1c2hieXRlcyAweDgwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA0CiAgICAvLyBzZWxmLmFyYzRfYm9vbFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQm9vbChUcnVlKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwNQogICAgLy8gc2VsZi5hcmM0X2FkZHJlc3NbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkFkZHJlc3MoR2xvYmFsLmNyZWF0b3JfYWRkcmVzcykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTcgLy8gImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDYKICAgIC8vIHNlbGYuYXJjNF91aW50MTI4W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5VSW50MTI4KDIqKjEwMCkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTggLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDcKICAgIC8vIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTkgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk2LTY5OAogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoCiAgICAvLyAgICAgYiJkeW5hbWljIGJ5dGVzIgogICAgLy8gKQogICAgYnl0ZWMgMTEgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDcKICAgIC8vIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA5LTcxMAogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgaW1wbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MTIKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnRbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDktNzEwCiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxNgogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyMAogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZVthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ieXRlIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyNAogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyOAogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDcgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczMgogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDggLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczNgogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQwCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGVbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMiAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0Mi03NDMKICAgIC8vICMgR2V0dGVyIG1ldGhvZHMgZm9yIGV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQ1CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3VpbnRbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfdWludCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDItNzQzCiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfc3RyaW5nW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDkKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfc3RyaW5nW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfc3RyaW5nIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTMKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYnl0ZVthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJleHBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ieXRlIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ib29sOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTcKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYm9vbFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ib29sIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2FkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjEKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYWRkcmVzc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9hZGRyZXNzIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjUKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfdWludDEyOFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF91aW50MTI4IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2R5bmFtaWNfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9keW5hbWljX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjkKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfZHluYW1pY19ieXRlc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmFAQVH3x1FmltcGxpY2l0X2tleV9hcmM0X3VpbnQIAAAAAAAABTkYaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nBwAFSGVsbG8WaW1wbGljaXRfa2V5X2FyYzRfYnl0ZRZpbXBsaWNpdF9rZXlfYXJjNF9ib29sGWltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MZaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOBAAAAAQAAAAAAAAAAAAAAAAH2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMPAA1keW5hbWljIGJ5dGVzEmltcGxpY2l0X2tleV90dXBsZRZleHBsaWNpdF9rZXlfYXJjNF91aW50GGV4cGxpY2l0X2tleV9hcmM0X3N0cmluZxZleHBsaWNpdF9rZXlfYXJjNF9ieXRlFmV4cGxpY2l0X2tleV9hcmM0X2Jvb2wZZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcxlleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4H2V4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMxG0EAkIAEMMbVijYaAI4BAHgxGRREMRhEgg8Es8+jiQTbhYF2BHgmd2IEQmNRyAQHXK6RBFnAuAsEDW+mkASX4Q2cBC5KjEkEsizSHgSz9EcBBO3ZcpcEZx01PASj/W/cBM0uXWY2GgCODwCQAJ0AqgC4AMYA1ADiAPAA/gEMARoBKAE2AUQBUgAxGSISMRgQREIACDEZFDEYFBBDMgkpKmYyCSsnBGYyCScFgAEAZjIJJwaAAYBmMgknBzIJZjIJJwgnCWYyCScKJwtmMgknDIARAAAAAAAAAAoACwAABHRlc3RmMgknDSpmMgknDicEZjIJJw+AAQBmMgknEIABgGYyCScRMglmMgknEicJZjIJJxMnC2YiQzYaASMpY0QoTFCwIkM2GgEjK2NEKExQsCJDNhoBIycFY0QoTFCwIkM2GgEjJwZjRChMULAiQzYaASMnB2NEKExQsCJDNhoBIycIY0QoTFCwIkM2GgEjJwpjRChMULAiQzYaASMnDGNEKExQsCJDNhoBIycNY0QoTFCwIkM2GgEjJw5jRChMULAiQzYaASMnD2NEKExQsCJDNhoBIycQY0QoTFCwIkM2GgEjJxFjRChMULAiQzYaASMnEmNEKExQsCJDNhoBIycTY0QoTFCwIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the LocalStateContract contract + */ +export type LocalStateContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'opt_in()void': Record + 'get_implicit_key_arc4_uint(address)uint64': { + a: string + } + 'get_implicit_key_arc4_string(address)string': { + a: string + } + 'get_implicit_key_arc4_byte(address)byte': { + a: string + } + 'get_implicit_key_arc4_bool(address)bool': { + a: string + } + 'get_implicit_key_arc4_address(address)address': { + a: string + } + 'get_implicit_key_arc4_uint128(address)uint128': { + a: string + } + 'get_implicit_key_arc4_dynamic_bytes(address)byte[]': { + a: string + } + 'get_implicit_key_tuple(address)(uint64,byte[],bool)': { + a: string + } + 'get_arc4_uint(address)uint64': { + a: string + } + 'get_arc4_string(address)string': { + a: string + } + 'get_arc4_byte(address)byte': { + a: string + } + 'get_arc4_bool(address)bool': { + a: string + } + 'get_arc4_address(address)address': { + a: string + } + 'get_arc4_uint128(address)uint128': { + a: string + } + 'get_arc4_dynamic_bytes(address)byte[]': { + a: string + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'opt_in()void': [] + 'get_implicit_key_arc4_uint(address)uint64': [a: string] + 'get_implicit_key_arc4_string(address)string': [a: string] + 'get_implicit_key_arc4_byte(address)byte': [a: string] + 'get_implicit_key_arc4_bool(address)bool': [a: string] + 'get_implicit_key_arc4_address(address)address': [a: string] + 'get_implicit_key_arc4_uint128(address)uint128': [a: string] + 'get_implicit_key_arc4_dynamic_bytes(address)byte[]': [a: string] + 'get_implicit_key_tuple(address)(uint64,byte[],bool)': [a: string] + 'get_arc4_uint(address)uint64': [a: string] + 'get_arc4_string(address)string': [a: string] + 'get_arc4_byte(address)byte': [a: string] + 'get_arc4_bool(address)bool': [a: string] + 'get_arc4_address(address)address': [a: string] + 'get_arc4_uint128(address)uint128': [a: string] + 'get_arc4_dynamic_bytes(address)byte[]': [a: string] + } +} + +/** + * The return type for each method + */ +export type LocalStateContractReturns = { + 'opt_in()void': void + 'get_implicit_key_arc4_uint(address)uint64': bigint + 'get_implicit_key_arc4_string(address)string': string + 'get_implicit_key_arc4_byte(address)byte': number + 'get_implicit_key_arc4_bool(address)bool': boolean + 'get_implicit_key_arc4_address(address)address': string + 'get_implicit_key_arc4_uint128(address)uint128': bigint + 'get_implicit_key_arc4_dynamic_bytes(address)byte[]': Uint8Array + 'get_implicit_key_tuple(address)(uint64,byte[],bool)': [bigint, Uint8Array, boolean] + 'get_arc4_uint(address)uint64': bigint + 'get_arc4_string(address)string': string + 'get_arc4_byte(address)byte': number + 'get_arc4_bool(address)bool': boolean + 'get_arc4_address(address)address': string + 'get_arc4_uint128(address)uint128': bigint + 'get_arc4_dynamic_bytes(address)byte[]': Uint8Array +} + +/** + * Defines the types of available calls and state of the LocalStateContract smart contract. + */ +export type LocalStateContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'opt_in()void' | 'opt_in', { + argsObj: LocalStateContractArgs['obj']['opt_in()void'] + argsTuple: LocalStateContractArgs['tuple']['opt_in()void'] + returns: LocalStateContractReturns['opt_in()void'] + }> + & Record<'get_implicit_key_arc4_uint(address)uint64' | 'get_implicit_key_arc4_uint', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_uint(address)uint64'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_uint(address)uint64'] + returns: LocalStateContractReturns['get_implicit_key_arc4_uint(address)uint64'] + }> + & Record<'get_implicit_key_arc4_string(address)string' | 'get_implicit_key_arc4_string', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_string(address)string'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_string(address)string'] + returns: LocalStateContractReturns['get_implicit_key_arc4_string(address)string'] + }> + & Record<'get_implicit_key_arc4_byte(address)byte' | 'get_implicit_key_arc4_byte', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_byte(address)byte'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_byte(address)byte'] + returns: LocalStateContractReturns['get_implicit_key_arc4_byte(address)byte'] + }> + & Record<'get_implicit_key_arc4_bool(address)bool' | 'get_implicit_key_arc4_bool', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_bool(address)bool'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_bool(address)bool'] + returns: LocalStateContractReturns['get_implicit_key_arc4_bool(address)bool'] + }> + & Record<'get_implicit_key_arc4_address(address)address' | 'get_implicit_key_arc4_address', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_address(address)address'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_address(address)address'] + returns: LocalStateContractReturns['get_implicit_key_arc4_address(address)address'] + }> + & Record<'get_implicit_key_arc4_uint128(address)uint128' | 'get_implicit_key_arc4_uint128', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_uint128(address)uint128'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_uint128(address)uint128'] + returns: LocalStateContractReturns['get_implicit_key_arc4_uint128(address)uint128'] + }> + & Record<'get_implicit_key_arc4_dynamic_bytes(address)byte[]' | 'get_implicit_key_arc4_dynamic_bytes', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_arc4_dynamic_bytes(address)byte[]'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_arc4_dynamic_bytes(address)byte[]'] + returns: LocalStateContractReturns['get_implicit_key_arc4_dynamic_bytes(address)byte[]'] + }> + & Record<'get_implicit_key_tuple(address)(uint64,byte[],bool)' | 'get_implicit_key_tuple', { + argsObj: LocalStateContractArgs['obj']['get_implicit_key_tuple(address)(uint64,byte[],bool)'] + argsTuple: LocalStateContractArgs['tuple']['get_implicit_key_tuple(address)(uint64,byte[],bool)'] + returns: LocalStateContractReturns['get_implicit_key_tuple(address)(uint64,byte[],bool)'] + }> + & Record<'get_arc4_uint(address)uint64' | 'get_arc4_uint', { + argsObj: LocalStateContractArgs['obj']['get_arc4_uint(address)uint64'] + argsTuple: LocalStateContractArgs['tuple']['get_arc4_uint(address)uint64'] + returns: LocalStateContractReturns['get_arc4_uint(address)uint64'] + }> + & Record<'get_arc4_string(address)string' | 'get_arc4_string', { + argsObj: LocalStateContractArgs['obj']['get_arc4_string(address)string'] + argsTuple: LocalStateContractArgs['tuple']['get_arc4_string(address)string'] + returns: LocalStateContractReturns['get_arc4_string(address)string'] + }> + & Record<'get_arc4_byte(address)byte' | 'get_arc4_byte', { + argsObj: LocalStateContractArgs['obj']['get_arc4_byte(address)byte'] + argsTuple: LocalStateContractArgs['tuple']['get_arc4_byte(address)byte'] + returns: LocalStateContractReturns['get_arc4_byte(address)byte'] + }> + & Record<'get_arc4_bool(address)bool' | 'get_arc4_bool', { + argsObj: LocalStateContractArgs['obj']['get_arc4_bool(address)bool'] + argsTuple: LocalStateContractArgs['tuple']['get_arc4_bool(address)bool'] + returns: LocalStateContractReturns['get_arc4_bool(address)bool'] + }> + & Record<'get_arc4_address(address)address' | 'get_arc4_address', { + argsObj: LocalStateContractArgs['obj']['get_arc4_address(address)address'] + argsTuple: LocalStateContractArgs['tuple']['get_arc4_address(address)address'] + returns: LocalStateContractReturns['get_arc4_address(address)address'] + }> + & Record<'get_arc4_uint128(address)uint128' | 'get_arc4_uint128', { + argsObj: LocalStateContractArgs['obj']['get_arc4_uint128(address)uint128'] + argsTuple: LocalStateContractArgs['tuple']['get_arc4_uint128(address)uint128'] + returns: LocalStateContractReturns['get_arc4_uint128(address)uint128'] + }> + & Record<'get_arc4_dynamic_bytes(address)byte[]' | 'get_arc4_dynamic_bytes', { + argsObj: LocalStateContractArgs['obj']['get_arc4_dynamic_bytes(address)byte[]'] + argsTuple: LocalStateContractArgs['tuple']['get_arc4_dynamic_bytes(address)byte[]'] + returns: LocalStateContractReturns['get_arc4_dynamic_bytes(address)byte[]'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + local: { + keys: { + implicitKeyArc4Uint: bigint + implicitKeyArc4String: string + implicitKeyArc4Byte: number + implicitKeyArc4Bool: boolean + implicitKeyArc4Address: string + implicitKeyArc4Uint128: bigint + implicitKeyArc4DynamicBytes: Uint8Array + implicitKeyTuple: [bigint, Uint8Array, boolean] + arc4Uint: bigint + arc4String: string + arc4Byte: number + arc4Bool: boolean + arc4Address: string + arc4Uint128: bigint + arc4DynamicBytes: Uint8Array + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type LocalStateContractSignatures = keyof LocalStateContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type LocalStateContractNonVoidMethodSignatures = keyof LocalStateContractTypes['methods'] extends infer T ? T extends keyof LocalStateContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the LocalStateContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = LocalStateContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the LocalStateContract smart contract to the method's return type + */ +export type MethodReturn = LocalStateContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed local state of the application. + */ +export type LocalKeysState = LocalStateContractTypes['state']['local']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type LocalStateContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type LocalStateContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: LocalStateContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the LocalStateContract smart contract + */ +export abstract class LocalStateContractParamsFactory { + /** + * Gets available optIn ABI call param factories + */ + static get optIn() { + return { + /** + * Constructs opt-in ABI call params for the LocalStateContract smart contract using the opt_in()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + optIn(params: CallParams): AppClientMethodCallParams { + return { + ...params, + method: 'opt_in()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + + /** + * Constructs a no op call for the get_implicit_key_arc4_uint(address)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_uint(address)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_string(address)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_string(address)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_byte(address)byte ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_byte(address)byte' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_bool(address)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_bool(address)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_address(address)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_address(address)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_uint128(address)uint128 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_uint128(address)uint128' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_implicit_key_arc4_dynamic_bytes(address)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_arc4_dynamic_bytes(address)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_implicit_key_tuple(address)(uint64,byte[],bool) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getImplicitKeyTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_implicit_key_tuple(address)(uint64,byte[],bool)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_arc4_uint(address)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Uint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_uint(address)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_arc4_string(address)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4String(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_string(address)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_arc4_byte(address)byte ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Byte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_byte(address)byte' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_arc4_bool(address)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_bool(address)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_arc4_address(address)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Address(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_address(address)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_arc4_uint128(address)uint128 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4Uint128(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_uint128(address)uint128' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the get_arc4_dynamic_bytes(address)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getArc4DynamicBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_arc4_dynamic_bytes(address)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } +} + +/** + * A factory to create and deploy one or more instance of the LocalStateContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class LocalStateContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `LocalStateContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new LocalStateContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new LocalStateContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the LocalStateContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: LocalStateContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new LocalStateContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the LocalStateContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the LocalStateContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the LocalStateContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new LocalStateContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the LocalStateContract smart contract + */ +export class LocalStateContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `LocalStateContractClient` + * + * @param appClient An `AppClient` instance which has been created with the LocalStateContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `LocalStateContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `LocalStateContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new LocalStateContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `LocalStateContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new LocalStateContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the LocalStateContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn params + */ + optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + return this.appClient.params.optIn(LocalStateContractParamsFactory.optIn.optIn(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the LocalStateContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint(address)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_string(address)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4String(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_byte(address)byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_bool(address)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_address(address)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Address(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint128(address)uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes(address)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_tuple(address)(uint64,byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getImplicitKeyTuple(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint(address)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Uint(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_string(address)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getArc4String(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_byte(address)byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Byte(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_bool(address)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Bool(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_address(address)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Address(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint128(address)uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getArc4Uint128(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_dynamic_bytes(address)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(LocalStateContractParamsFactory.getArc4DynamicBytes(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the LocalStateContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn transaction + */ + optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + return this.appClient.createTransaction.optIn(LocalStateContractParamsFactory.optIn.optIn(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the LocalStateContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint(address)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_string(address)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4String(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_byte(address)byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_bool(address)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_address(address)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Address(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint128(address)uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes(address)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_tuple(address)(uint64,byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getImplicitKeyTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getImplicitKeyTuple(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint(address)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Uint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Uint(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_string(address)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4String: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4String(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_byte(address)byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Byte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Byte(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_bool(address)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Bool(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_address(address)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Address: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Address(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint128(address)uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4Uint128: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4Uint128(params)) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_dynamic_bytes(address)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getArc4DynamicBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(LocalStateContractParamsFactory.getArc4DynamicBytes(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the LocalStateContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn result + */ + optIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + const result = await this.appClient.send.optIn(LocalStateContractParamsFactory.optIn.optIn(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['opt_in()void'])} + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the LocalStateContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint(address)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_uint(address)uint64'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_string(address)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4String(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_string(address)string'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_byte(address)byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Byte(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_byte(address)byte'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_bool(address)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Bool(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_bool(address)bool'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_address(address)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Address(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_address(address)address'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_uint128(address)uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4Uint128(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_uint128(address)uint128'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_arc4_dynamic_bytes(address)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyArc4DynamicBytes(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_arc4_dynamic_bytes(address)byte[]'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_implicit_key_tuple(address)(uint64,byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getImplicitKeyTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getImplicitKeyTuple(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_implicit_key_tuple(address)(uint64,byte[],bool)'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint(address)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Uint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Uint(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_uint(address)uint64'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_string(address)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4String: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4String(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_string(address)string'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_byte(address)byte` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Byte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Byte(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_byte(address)byte'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_bool(address)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Bool(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_bool(address)bool'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_address(address)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Address: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Address(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_address(address)address'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_uint128(address)uint128` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4Uint128: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4Uint128(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_uint128(address)uint128'])} + }, + + /** + * Makes a call to the LocalStateContract smart contract using the `get_arc4_dynamic_bytes(address)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getArc4DynamicBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(LocalStateContractParamsFactory.getArc4DynamicBytes(params)) + return {...result, return: result.return as unknown as (undefined | LocalStateContractReturns['get_arc4_dynamic_bytes(address)byte[]'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new LocalStateContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current LocalStateContract app + */ + state = { + /** + * Methods to access local state for the current LocalStateContract app + */ + local: (address: string | Address) => { + const encodedAddress = typeof address === 'string' ? address : encodeAddress(address.publicKey) + return { + /** + * Get all current keyed values from local state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.local(encodedAddress).getAll() + return { + implicitKeyArc4Uint: result.implicit_key_arc4_uint, + implicitKeyArc4String: result.implicit_key_arc4_string, + implicitKeyArc4Byte: result.implicit_key_arc4_byte, + implicitKeyArc4Bool: result.implicit_key_arc4_bool, + implicitKeyArc4Address: result.implicit_key_arc4_address, + implicitKeyArc4Uint128: result.implicit_key_arc4_uint128, + implicitKeyArc4DynamicBytes: result.implicit_key_arc4_dynamic_bytes, + implicitKeyTuple: result.implicit_key_tuple, + arc4Uint: result.arc4_uint, + arc4String: result.arc4_string, + arc4Byte: result.arc4_byte, + arc4Bool: result.arc4_bool, + arc4Address: result.arc4_address, + arc4Uint128: result.arc4_uint128, + arc4DynamicBytes: result.arc4_dynamic_bytes, + } + }, + /** + * Get the current value of the implicit_key_arc4_uint key in local state + */ + implicitKeyArc4Uint: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_uint")) as bigint | undefined }, + /** + * Get the current value of the implicit_key_arc4_string key in local state + */ + implicitKeyArc4String: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_string")) as string | undefined }, + /** + * Get the current value of the implicit_key_arc4_byte key in local state + */ + implicitKeyArc4Byte: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_byte")) as number | undefined }, + /** + * Get the current value of the implicit_key_arc4_bool key in local state + */ + implicitKeyArc4Bool: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_bool")) as boolean | undefined }, + /** + * Get the current value of the implicit_key_arc4_address key in local state + */ + implicitKeyArc4Address: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_address")) as string | undefined }, + /** + * Get the current value of the implicit_key_arc4_uint128 key in local state + */ + implicitKeyArc4Uint128: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_uint128")) as bigint | undefined }, + /** + * Get the current value of the implicit_key_arc4_dynamic_bytes key in local state + */ + implicitKeyArc4DynamicBytes: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_arc4_dynamic_bytes")) as Uint8Array | undefined }, + /** + * Get the current value of the implicit_key_tuple key in local state + */ + implicitKeyTuple: async (): Promise<[bigint, Uint8Array, boolean] | undefined> => { return (await this.appClient.state.local(encodedAddress).getValue("implicit_key_tuple")) as [bigint, Uint8Array, boolean] | undefined }, + /** + * Get the current value of the arc4_uint key in local state + */ + arc4Uint: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_uint")) as bigint | undefined }, + /** + * Get the current value of the arc4_string key in local state + */ + arc4String: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_string")) as string | undefined }, + /** + * Get the current value of the arc4_byte key in local state + */ + arc4Byte: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_byte")) as number | undefined }, + /** + * Get the current value of the arc4_bool key in local state + */ + arc4Bool: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_bool")) as boolean | undefined }, + /** + * Get the current value of the arc4_address key in local state + */ + arc4Address: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_address")) as string | undefined }, + /** + * Get the current value of the arc4_uint128 key in local state + */ + arc4Uint128: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_uint128")) as bigint | undefined }, + /** + * Get the current value of the arc4_dynamic_bytes key in local state + */ + arc4DynamicBytes: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("arc4_dynamic_bytes")) as Uint8Array | undefined }, + } + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): LocalStateContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a get_implicit_key_arc4_uint(address)uint64 method call against the LocalStateContract contract + */ + getImplicitKeyArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Uint(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_string(address)string method call against the LocalStateContract contract + */ + getImplicitKeyArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4String(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_byte(address)byte method call against the LocalStateContract contract + */ + getImplicitKeyArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Byte(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_bool(address)bool method call against the LocalStateContract contract + */ + getImplicitKeyArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Bool(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_address(address)address method call against the LocalStateContract contract + */ + getImplicitKeyArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Address(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_uint128(address)uint128 method call against the LocalStateContract contract + */ + getImplicitKeyArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4Uint128(params))) + return this + }, + /** + * Add a get_implicit_key_arc4_dynamic_bytes(address)byte[] method call against the LocalStateContract contract + */ + getImplicitKeyArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyArc4DynamicBytes(params))) + return this + }, + /** + * Add a get_implicit_key_tuple(address)(uint64,byte[],bool) method call against the LocalStateContract contract + */ + getImplicitKeyTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getImplicitKeyTuple(params))) + return this + }, + /** + * Add a get_arc4_uint(address)uint64 method call against the LocalStateContract contract + */ + getArc4Uint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Uint(params))) + return this + }, + /** + * Add a get_arc4_string(address)string method call against the LocalStateContract contract + */ + getArc4String(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4String(params))) + return this + }, + /** + * Add a get_arc4_byte(address)byte method call against the LocalStateContract contract + */ + getArc4Byte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Byte(params))) + return this + }, + /** + * Add a get_arc4_bool(address)bool method call against the LocalStateContract contract + */ + getArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Bool(params))) + return this + }, + /** + * Add a get_arc4_address(address)address method call against the LocalStateContract contract + */ + getArc4Address(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Address(params))) + return this + }, + /** + * Add a get_arc4_uint128(address)uint128 method call against the LocalStateContract contract + */ + getArc4Uint128(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4Uint128(params))) + return this + }, + /** + * Add a get_arc4_dynamic_bytes(address)byte[] method call against the LocalStateContract contract + */ + getArc4DynamicBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getArc4DynamicBytes(params))) + return this + }, + get optIn() { + return { + optIn: (params: CallParams) => { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn.optIn(params))) + return this + }, + } + }, + /** + * Add a clear state call to the LocalStateContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as LocalStateContractComposer + } +} +export type LocalStateContractComposer = { + /** + * Calls the get_implicit_key_arc4_uint(address)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Uint(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_uint(address)uint64'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_string(address)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4String(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_string(address)string'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_byte(address)byte ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Byte(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_byte(address)byte'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_bool(address)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Bool(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_bool(address)bool'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_address(address)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Address(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_address(address)address'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_uint128(address)uint128 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4Uint128(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_uint128(address)uint128'] | undefined]> + + /** + * Calls the get_implicit_key_arc4_dynamic_bytes(address)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyArc4DynamicBytes(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_arc4_dynamic_bytes(address)byte[]'] | undefined]> + + /** + * Calls the get_implicit_key_tuple(address)(uint64,byte[],bool) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getImplicitKeyTuple(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_implicit_key_tuple(address)(uint64,byte[],bool)'] | undefined]> + + /** + * Calls the get_arc4_uint(address)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Uint(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_uint(address)uint64'] | undefined]> + + /** + * Calls the get_arc4_string(address)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4String(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_string(address)string'] | undefined]> + + /** + * Calls the get_arc4_byte(address)byte ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Byte(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_byte(address)byte'] | undefined]> + + /** + * Calls the get_arc4_bool(address)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Bool(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_bool(address)bool'] | undefined]> + + /** + * Calls the get_arc4_address(address)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Address(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_address(address)address'] | undefined]> + + /** + * Calls the get_arc4_uint128(address)uint128 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4Uint128(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_uint128(address)uint128'] | undefined]> + + /** + * Calls the get_arc4_dynamic_bytes(address)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getArc4DynamicBytes(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['get_arc4_dynamic_bytes(address)byte[]'] | undefined]> + + /** + * Gets available optIn methods + */ + readonly optIn: { + /** + * Opts the user into an existing instance of the LocalStateContract smart contract using the opt_in()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + optIn(params?: CallParams): LocalStateContractComposer<[...TReturns, LocalStateContractReturns['opt_in()void'] | undefined]> + } + + /** + * Makes a clear_state call to an existing instance of the LocalStateContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): LocalStateContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): LocalStateContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type LocalStateContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/MiscellaneousOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/MiscellaneousOpsContract.ts new file mode 100644 index 0000000..afd9e82 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/MiscellaneousOpsContract.ts @@ -0,0 +1,3082 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"MiscellaneousOpsContract","structs":{},"methods":[{"name":"verify_addw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_base64_decode_standard","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_base64_decode_url","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_bitlen","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_a_size"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_bitlen","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bsqrt","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_btoi","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bzero","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_concat","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"uint64","name":"pad_a_size"},{"type":"uint64","name":"pad_b_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_divmodw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"},{"type":"uint64","name":"d"}],"returns":{"type":"(uint64,uint64,uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_divw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_err","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_exp","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_expw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract_from_2","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract_uint16","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract_uint32","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_extract_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_getbit_bytes","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_getbit_uint64","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_getbyte","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_itob","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_mulw","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"(uint64,uint64)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_replace","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_select_bytes","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_select_uint64","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_setbit_bytes","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"bool","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_setbit_uint64","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"},{"type":"bool","name":"c"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_setbyte","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_shl","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_shr","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_sqrt","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_substring","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_json_ref_string","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_json_ref_uint64","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_json_ref_object","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDE1MWY3Yzc1MDAyMCAweDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDQ0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg0NTg0N2VlYSAweGY1N2FjZWI1IDB4N2Q2MzE3MzAgMHhhMWIyNDQ0MSAweGNkN2JlMWFjIDB4N2NmZGE2NGIgMHg1NGE5MTBkOSAweGM0NjU2OGRlIDB4N2E0NmE2YWUgMHgwNDM3MjIwOSAweDdlNWY2ZDcyIDB4MjRlYmNmODQgMHg5YzBiMzM5NyAweDBhZDQwZGE0IDB4OTUxNzg4NzAgMHhkZWVkYzk5YiAweGFiMjE1MGJiIDB4MDJhNTQwMTcgMHgzZGI2NmI0MSAweDZlM2ZmMzhjIDB4OGYzYjlmMTggMHgxNjE2NmY5YSAweDJmNDcyMDY1IDB4ZDVhNzM5YzMgMHg2MWYzYjNlMSAweDU2Y2YzNjhiIDB4OTE5ZmZiZDIgMHhhYWU4YjY5NyAweDg0NzQyMmIxIDB4ZDUyNjAzMjcgMHgxMTRjOGM2ZCAweDM5ZTllNjJhIDB4ZDZhNGMwNWUgMHgxZWY4MTUxYSAweDY2ZGQ3Zjk2IDB4NGQ5ZWNlYjIgMHgxOWJhNzBlZSAvLyBtZXRob2QgInZlcmlmeV9hZGR3KHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfYmFzZTY0X2RlY29kZV9zdGFuZGFyZChieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmFzZTY0X2RlY29kZV91cmwoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2JpdGxlbihieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9iaXRsZW4odWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2JzcXJ0KGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9idG9pKGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9iemVybyh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfY29uY2F0KGJ5dGVbXSxieXRlW10sdWludDY0LHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9kaXZtb2R3KHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidmVyaWZ5X2RpdncodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZXJyKCl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfZXhwKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZXhwdyh1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidmVyaWZ5X2V4dHJhY3QoYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdF9mcm9tXzIoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2V4dHJhY3RfdWludDE2KGJ5dGVbXSx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdF91aW50MzIoYnl0ZVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9leHRyYWN0X3VpbnQ2NChieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2dldGJpdF9ieXRlcyhieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9nZXRiaXRfdWludDY0KHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2dldGJ5dGUoYnl0ZVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9pdG9iKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9tdWx3KHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfcmVwbGFjZShieXRlW10sdWludDY0LGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9zZWxlY3RfYnl0ZXMoYnl0ZVtdLGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc2VsZWN0X3VpbnQ2NCh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9zZXRiaXRfYnl0ZXMoYnl0ZVtdLHVpbnQ2NCxib29sKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X3NldGJpdF91aW50NjQodWludDY0LHVpbnQ2NCxib29sKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3NldGJ5dGUoYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc2hsKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc2hyKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc3FydCh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc3Vic3RyaW5nKGJ5dGVbXSx1aW50NjQsdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2pzb25fcmVmX3N0cmluZyhieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2pzb25fcmVmX3VpbnQ2NChieXRlW10sYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2pzb25fcmVmX29iamVjdChieXRlW10sYnl0ZVtdKWJ5dGVbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9hZGR3IHZlcmlmeV9iYXNlNjRfZGVjb2RlX3N0YW5kYXJkIHZlcmlmeV9iYXNlNjRfZGVjb2RlX3VybCB2ZXJpZnlfYnl0ZXNfYml0bGVuIHZlcmlmeV91aW50NjRfYml0bGVuIHZlcmlmeV9ic3FydCB2ZXJpZnlfYnRvaSB2ZXJpZnlfYnplcm8gdmVyaWZ5X2NvbmNhdCB2ZXJpZnlfZGl2bW9kdyB2ZXJpZnlfZGl2dyBtYWluX3ZlcmlmeV9lcnJfcm91dGVAMTUgdmVyaWZ5X2V4cCB2ZXJpZnlfZXhwdyB2ZXJpZnlfZXh0cmFjdCB2ZXJpZnlfZXh0cmFjdF9mcm9tXzIgdmVyaWZ5X2V4dHJhY3RfdWludDE2IHZlcmlmeV9leHRyYWN0X3VpbnQzMiB2ZXJpZnlfZXh0cmFjdF91aW50NjQgdmVyaWZ5X2dldGJpdF9ieXRlcyB2ZXJpZnlfZ2V0Yml0X3VpbnQ2NCB2ZXJpZnlfZ2V0Ynl0ZSB2ZXJpZnlfaXRvYiB2ZXJpZnlfbXVsdyB2ZXJpZnlfcmVwbGFjZSB2ZXJpZnlfc2VsZWN0X2J5dGVzIHZlcmlmeV9zZWxlY3RfdWludDY0IHZlcmlmeV9zZXRiaXRfYnl0ZXMgdmVyaWZ5X3NldGJpdF91aW50NjQgdmVyaWZ5X3NldGJ5dGUgdmVyaWZ5X3NobCB2ZXJpZnlfc2hyIHZlcmlmeV9zcXJ0IHZlcmlmeV9zdWJzdHJpbmcgdmVyaWZ5X2pzb25fcmVmX3N0cmluZyB2ZXJpZnlfanNvbl9yZWZfdWludDY0IHZlcmlmeV9qc29uX3JlZl9vYmplY3QKICAgIGVycgoKbWFpbl92ZXJpZnlfZXJyX3JvdXRlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANDQ6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYWRkd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hZGR3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjcKICAgIC8vIHJlc3VsdCA9IG9wLmFkZHcoYSwgYikKICAgIGFkZHcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Jhc2U2NF9kZWNvZGVfc3RhbmRhcmRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmFzZTY0X2RlY29kZV9zdGFuZGFyZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyCiAgICAvLyByZXN1bHQgPSBvcC5iYXNlNjRfZGVjb2RlKG9wLkJhc2U2NC5TdGRFbmNvZGluZywgYSkKICAgIGJhc2U2NF9kZWNvZGUgU3RkRW5jb2RpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIHJlc3VsdCA9IG9wLmJhc2U2NF9kZWNvZGUob3AuQmFzZTY0LlVSTEVuY29kaW5nLCBhKQogICAgYmFzZTY0X2RlY29kZSBVUkxFbmNvZGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfYml0bGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX2JpdGxlbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBhID0gb3AuYnplcm8ocGFkX2Ffc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToyMwogICAgLy8gcmVzdWx0ID0gb3AuYml0bGVuKGEpCiAgICBiaXRsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2JpdGxlbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfYml0bGVuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToyOAogICAgLy8gcmVzdWx0ID0gb3AuYml0bGVuKGEpCiAgICBiaXRsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYnNxcnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnNxcnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTozMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTozNAogICAgLy8gcmVzdWx0ID0gb3AuYnNxcnQoYV9iaWd1aW50KQogICAgYnNxcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2J0b2lbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnRvaToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjM5CiAgICAvLyByZXN1bHQgPSBvcC5idG9pKGEpCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTozNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2J6ZXJvW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J6ZXJvOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NAogICAgLy8gcmVzdWx0ID0gb3AuYnplcm8oYSkKICAgIGJ6ZXJvCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NQogICAgLy8gcmV0dXJuIG9wLnNoYTI1NihyZXN1bHQpCiAgICBzaGEyNTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2NvbmNhdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9jb25jYXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NDkKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfYV9zaXplKSArIGEKICAgIHN3YXAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NTAKICAgIC8vIGIgPSBvcC5iemVybyhwYWRfYl9zaXplKSArIGIKICAgIHN3YXAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NTEKICAgIC8vIHJlc3VsdCA9IGEgKyBiCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjUyCiAgICAvLyByZXN1bHQgPSBvcC5zaGEyNTYocmVzdWx0KQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9kaXZtb2R3W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Rpdm1vZHc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjU5CiAgICAvLyByZXN1bHQgPSBvcC5kaXZtb2R3KGEsIGIsIGMsIGQpCiAgICBkaXZtb2R3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Rpdndbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGl2dzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NjQKICAgIC8vIHJlc3VsdCA9IG9wLmRpdncoYSwgYiwgYykKICAgIGRpdncKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXhwW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4cDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIHJlc3VsdCA9IG9wLmV4cChhLCBiKQogICAgZXhwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4cHdbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZXhwdzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NzgKICAgIC8vIHJlc3VsdCA9IG9wLmV4cHcoYSwgYikKICAgIGV4cHcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4MwogICAgLy8gcmVzdWx0ID0gb3AuZXh0cmFjdChhLCBiLCBjKQogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3RfZnJvbV8yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3RfZnJvbV8yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4OAogICAgLy8gcmVzdWx0ID0gb3AuZXh0cmFjdChhLCAyLCAwKQogICAgZXh0cmFjdCA0IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3RfdWludDE2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3RfdWludDE2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTMKICAgIC8vIHJlc3VsdCA9IG9wLmV4dHJhY3RfdWludDE2KGEsIGIpCiAgICBleHRyYWN0X3VpbnQxNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0X3VpbnQzMltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9leHRyYWN0X3VpbnQzMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyByZXN1bHQgPSBvcC5leHRyYWN0X3VpbnQzMihhLCBiKQogICAgZXh0cmFjdF91aW50MzIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXh0cmFjdF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZXh0cmFjdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgcHVzaGludCA4CiAgICBleHRyYWN0MwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZ2V0Yml0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldGJpdF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMDgKICAgIC8vIHJlc3VsdCA9IG9wLmdldGJpdChhLCBiKQogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18yIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZ2V0Yml0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRiaXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTEzCiAgICAvLyByZXN1bHQgPSBvcC5nZXRiaXQoYSwgYikKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMiAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2dldGJ5dGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0Ynl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjExNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMTgKICAgIC8vIHJlc3VsdCA9IG9wLmdldGJ5dGUoYSwgYikKICAgIGdldGJ5dGUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjExNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2l0b2Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfaXRvYjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gcmVzdWx0ID0gb3AuaXRvYihhKQogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUwMDA4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfbXVsd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9tdWx3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTI4CiAgICAvLyByZXN1bHQgPSBvcC5tdWx3KGEsIGIpCiAgICBtdWx3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3JlcGxhY2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfcmVwbGFjZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTMzCiAgICAvLyByZXN1bHQgPSBvcC5yZXBsYWNlKGEsIGIsIGMpCiAgICByZXBsYWNlMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NlbGVjdF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zZWxlY3RfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gcmVzdWx0ID0gb3Auc2VsZWN0X2J5dGVzKGEsIGIsIGMpCiAgICBzZWxlY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zZWxlY3RfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NlbGVjdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDMKICAgIC8vIHJlc3VsdCA9IG9wLnNlbGVjdF91aW50NjQoYSwgYiwgYykKICAgIHNlbGVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2V0Yml0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NldGJpdF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDgKICAgIC8vIHJlc3VsdCA9IG9wLnNldGJpdF9ieXRlcyhhLCBiLCBjKQogICAgc2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2V0Yml0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zZXRiaXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUzCiAgICAvLyByZXN1bHQgPSBvcC5zZXRiaXRfdWludDY0KGEsIGIsIGMpCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NldGJ5dGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2V0Ynl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNTgKICAgIC8vIHJlc3VsdCA9IG9wLnNldGJ5dGUoYSwgYiwgYykKICAgIHNldGJ5dGUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zaGxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2hsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTYzCiAgICAvLyByZXN1bHQgPSBvcC5zaGwoYSwgYikKICAgIHNobAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2hyW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NocjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2OAogICAgLy8gcmVzdWx0ID0gb3Auc2hyKGEsIGIpCiAgICBzaHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NxcnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3FydDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3MwogICAgLy8gcmVzdWx0ID0gb3Auc3FydChhKQogICAgc3FydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc3Vic3RyaW5nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N1YnN0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNzgKICAgIC8vIHJlc3VsdCA9IG9wLnN1YnN0cmluZyhhLCBiLCBjKQogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2pzb25fcmVmX3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9qc29uX3JlZl9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gcmVzdWx0ID0gb3AuSnNvblJlZi5qc29uX3N0cmluZyhhLCBiKQogICAganNvbl9yZWYgSlNPTlN0cmluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2pzb25fcmVmX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9qc29uX3JlZl91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gcmVzdWx0ID0gb3AuSnNvblJlZi5qc29uX3VpbnQ2NChhLCBiKQogICAganNvbl9yZWYgSlNPTlVpbnQ2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfanNvbl9yZWZfb2JqZWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2pzb25fcmVmX29iamVjdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTkzCiAgICAvLyByZXN1bHQgPSBvcC5Kc29uUmVmLmpzb25fb2JqZWN0KGEsIGIpCiAgICBqc29uX3JlZiBKU09OT2JqZWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmAwQVH3x1BhUffHUAIAEAMRtBARMxGRREMRhEgiUERYR+6gT1es61BH1jFzAEobJEQQTNe+GsBHz9pksEVKkQ2QTEZWjeBHpGpq4EBDciCQR+X21yBCTrz4QEnAszlwQK1A2kBJUXiHAE3u3JmwSrIVC7BAKlQBcEPbZrQQRuP/OMBI87nxgEFhZvmgQvRyBlBNWnOcMEYfOz4QRWzzaLBJGf+9IEqui2lwSEdCKxBNUmAycEEUyMbQQ56eYqBNakwF4EHvgVGgRm3X+WBE2ezrIEGbpw7jYaAI4lAAoAHgA0AEoAXwBrAIAAjgCaAMAA5QABAPkBCQEdAToBTgFgAXIBhQGbAa8BwQHTAecCBgIlAjkCVwJsAokCmQKpArUC0gLuAwMAADEZFDEYFBBDNhoBFzYaAhceTBZMFlAoTFCwIkM2GgFXAgBeAUkVFlcGAkxQKExQsCJDNhoBVwIAXgBJFRZXBgJMUChMULAiQzYaAVcCADYaAhevTFCTFihMULAiQzYaAReTFihMULAiQzYaAVcCAJZJFRZXBgJMUChMULAiQzYaAVcCABcWKExQsCJDNhoBF68BKUxQsCJDNhoBVwIANhoCVwIANhoDFzYaBBdMr08DUEyvTwJQUAEpTFCwIkM2GgEXNhoCFzYaAxc2GgQXH08DFk8DFlBPAhZQTBZQKExQsCJDNhoBFzYaAhc2GgMXlxYoTFCwIkM2GgEXNhoCF5QWKExQsCJDNhoBFzYaAheVTBZMFlAoTFCwIkM2GgFXAgA2GgIXNhoDF1hJFRZXBgJMUChMULAiQzYaAVcEAEkVFlcGAkxQKExQsCJDNhoBVwIANhoCF1kWKExQsCJDNhoBVwIANhoCF1oWKExQsCJDNhoBVwIANhoCF4EIWChMULAiQzYaAVcCADYaAhdTKiNPAlQoTFCwIkM2GgEXNhoCF1MqI08CVChMULAiQzYaAVcCADYaAhdVFihMULAiQzYaARcWgAYVH3x1AAhMULAiQzYaARc2GgIXHUwWTBZQKExQsCJDNhoBVwIANhoCFzYaA1cCAF1JFRZXBgJMUChMULAiQzYaAVcCADYaAlcCADYaAxdNSRUWVwYCTFAoTFCwIkM2GgEXNhoCFzYaAxdNFihMULAiQzYaAVcCADYaAhc2GgMjU1RJFRZXBgJMUChMULAiQzYaARc2GgIXNhoDI1NUFihMULAiQzYaAVcCADYaAhc2GgMXVkkVFlcGAkxQKExQsCJDNhoBFzYaAheQFihMULAiQzYaARc2GgIXkRYoTFCwIkM2GgEXkhYoTFCwIkM2GgFXAgA2GgIXNhoDF1JJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAF8ASRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgBfARYoTFCwIkM2GgFXAgA2GgJXAgBfAkkVFlcGAkxQKExQsCJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the MiscellaneousOpsContract contract + */ +export type MiscellaneousOpsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_addw(uint64,uint64)(uint64,uint64)': { + a: bigint | number + b: bigint | number + } + 'verify_base64_decode_standard(byte[])byte[]': { + a: Uint8Array + } + 'verify_base64_decode_url(byte[])byte[]': { + a: Uint8Array + } + 'verify_bytes_bitlen(byte[],uint64)uint64': { + a: Uint8Array + padASize: bigint | number + } + 'verify_uint64_bitlen(uint64)uint64': { + a: bigint | number + } + 'verify_bsqrt(byte[])byte[]': { + a: Uint8Array + } + 'verify_btoi(byte[])uint64': { + a: Uint8Array + } + 'verify_bzero(uint64)byte[]': { + a: bigint | number + } + 'verify_concat(byte[],byte[],uint64,uint64)byte[]': { + a: Uint8Array + b: Uint8Array + padASize: bigint | number + padBSize: bigint | number + } + 'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)': { + a: bigint | number + b: bigint | number + c: bigint | number + d: bigint | number + } + 'verify_divw(uint64,uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + c: bigint | number + } + 'verify_err()void': Record + 'verify_exp(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_expw(uint64,uint64)(uint64,uint64)': { + a: bigint | number + b: bigint | number + } + 'verify_extract(byte[],uint64,uint64)byte[]': { + a: Uint8Array + b: bigint | number + c: bigint | number + } + 'verify_extract_from_2(byte[])byte[]': { + a: Uint8Array + } + 'verify_extract_uint16(byte[],uint64)uint64': { + a: Uint8Array + b: bigint | number + } + 'verify_extract_uint32(byte[],uint64)uint64': { + a: Uint8Array + b: bigint | number + } + 'verify_extract_uint64(byte[],uint64)uint64': { + a: Uint8Array + b: bigint | number + } + 'verify_getbit_bytes(byte[],uint64)bool': { + a: Uint8Array + b: bigint | number + } + 'verify_getbit_uint64(uint64,uint64)bool': { + a: bigint | number + b: bigint | number + } + 'verify_getbyte(byte[],uint64)uint64': { + a: Uint8Array + b: bigint | number + } + 'verify_itob(uint64)byte[]': { + a: bigint | number + } + 'verify_mulw(uint64,uint64)(uint64,uint64)': { + a: bigint | number + b: bigint | number + } + 'verify_replace(byte[],uint64,byte[])byte[]': { + a: Uint8Array + b: bigint | number + c: Uint8Array + } + 'verify_select_bytes(byte[],byte[],uint64)byte[]': { + a: Uint8Array + b: Uint8Array + c: bigint | number + } + 'verify_select_uint64(uint64,uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + c: bigint | number + } + 'verify_setbit_bytes(byte[],uint64,bool)byte[]': { + a: Uint8Array + b: bigint | number + c: boolean + } + 'verify_setbit_uint64(uint64,uint64,bool)uint64': { + a: bigint | number + b: bigint | number + c: boolean + } + 'verify_setbyte(byte[],uint64,uint64)byte[]': { + a: Uint8Array + b: bigint | number + c: bigint | number + } + 'verify_shl(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_shr(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_sqrt(uint64)uint64': { + a: bigint | number + } + 'verify_substring(byte[],uint64,uint64)byte[]': { + a: Uint8Array + b: bigint | number + c: bigint | number + } + 'verify_json_ref_string(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_json_ref_uint64(byte[],byte[])uint64': { + a: Uint8Array + b: Uint8Array + } + 'verify_json_ref_object(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_addw(uint64,uint64)(uint64,uint64)': [a: bigint | number, b: bigint | number] + 'verify_base64_decode_standard(byte[])byte[]': [a: Uint8Array] + 'verify_base64_decode_url(byte[])byte[]': [a: Uint8Array] + 'verify_bytes_bitlen(byte[],uint64)uint64': [a: Uint8Array, padASize: bigint | number] + 'verify_uint64_bitlen(uint64)uint64': [a: bigint | number] + 'verify_bsqrt(byte[])byte[]': [a: Uint8Array] + 'verify_btoi(byte[])uint64': [a: Uint8Array] + 'verify_bzero(uint64)byte[]': [a: bigint | number] + 'verify_concat(byte[],byte[],uint64,uint64)byte[]': [a: Uint8Array, b: Uint8Array, padASize: bigint | number, padBSize: bigint | number] + 'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)': [a: bigint | number, b: bigint | number, c: bigint | number, d: bigint | number] + 'verify_divw(uint64,uint64,uint64)uint64': [a: bigint | number, b: bigint | number, c: bigint | number] + 'verify_err()void': [] + 'verify_exp(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_expw(uint64,uint64)(uint64,uint64)': [a: bigint | number, b: bigint | number] + 'verify_extract(byte[],uint64,uint64)byte[]': [a: Uint8Array, b: bigint | number, c: bigint | number] + 'verify_extract_from_2(byte[])byte[]': [a: Uint8Array] + 'verify_extract_uint16(byte[],uint64)uint64': [a: Uint8Array, b: bigint | number] + 'verify_extract_uint32(byte[],uint64)uint64': [a: Uint8Array, b: bigint | number] + 'verify_extract_uint64(byte[],uint64)uint64': [a: Uint8Array, b: bigint | number] + 'verify_getbit_bytes(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] + 'verify_getbit_uint64(uint64,uint64)bool': [a: bigint | number, b: bigint | number] + 'verify_getbyte(byte[],uint64)uint64': [a: Uint8Array, b: bigint | number] + 'verify_itob(uint64)byte[]': [a: bigint | number] + 'verify_mulw(uint64,uint64)(uint64,uint64)': [a: bigint | number, b: bigint | number] + 'verify_replace(byte[],uint64,byte[])byte[]': [a: Uint8Array, b: bigint | number, c: Uint8Array] + 'verify_select_bytes(byte[],byte[],uint64)byte[]': [a: Uint8Array, b: Uint8Array, c: bigint | number] + 'verify_select_uint64(uint64,uint64,uint64)uint64': [a: bigint | number, b: bigint | number, c: bigint | number] + 'verify_setbit_bytes(byte[],uint64,bool)byte[]': [a: Uint8Array, b: bigint | number, c: boolean] + 'verify_setbit_uint64(uint64,uint64,bool)uint64': [a: bigint | number, b: bigint | number, c: boolean] + 'verify_setbyte(byte[],uint64,uint64)byte[]': [a: Uint8Array, b: bigint | number, c: bigint | number] + 'verify_shl(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_shr(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_sqrt(uint64)uint64': [a: bigint | number] + 'verify_substring(byte[],uint64,uint64)byte[]': [a: Uint8Array, b: bigint | number, c: bigint | number] + 'verify_json_ref_string(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_json_ref_uint64(byte[],byte[])uint64': [a: Uint8Array, b: Uint8Array] + 'verify_json_ref_object(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + } +} + +/** + * The return type for each method + */ +export type MiscellaneousOpsContractReturns = { + 'verify_addw(uint64,uint64)(uint64,uint64)': [bigint, bigint] + 'verify_base64_decode_standard(byte[])byte[]': Uint8Array + 'verify_base64_decode_url(byte[])byte[]': Uint8Array + 'verify_bytes_bitlen(byte[],uint64)uint64': bigint + 'verify_uint64_bitlen(uint64)uint64': bigint + 'verify_bsqrt(byte[])byte[]': Uint8Array + 'verify_btoi(byte[])uint64': bigint + 'verify_bzero(uint64)byte[]': Uint8Array + 'verify_concat(byte[],byte[],uint64,uint64)byte[]': Uint8Array + 'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)': [bigint, bigint, bigint, bigint] + 'verify_divw(uint64,uint64,uint64)uint64': bigint + 'verify_err()void': void + 'verify_exp(uint64,uint64)uint64': bigint + 'verify_expw(uint64,uint64)(uint64,uint64)': [bigint, bigint] + 'verify_extract(byte[],uint64,uint64)byte[]': Uint8Array + 'verify_extract_from_2(byte[])byte[]': Uint8Array + 'verify_extract_uint16(byte[],uint64)uint64': bigint + 'verify_extract_uint32(byte[],uint64)uint64': bigint + 'verify_extract_uint64(byte[],uint64)uint64': bigint + 'verify_getbit_bytes(byte[],uint64)bool': boolean + 'verify_getbit_uint64(uint64,uint64)bool': boolean + 'verify_getbyte(byte[],uint64)uint64': bigint + 'verify_itob(uint64)byte[]': Uint8Array + 'verify_mulw(uint64,uint64)(uint64,uint64)': [bigint, bigint] + 'verify_replace(byte[],uint64,byte[])byte[]': Uint8Array + 'verify_select_bytes(byte[],byte[],uint64)byte[]': Uint8Array + 'verify_select_uint64(uint64,uint64,uint64)uint64': bigint + 'verify_setbit_bytes(byte[],uint64,bool)byte[]': Uint8Array + 'verify_setbit_uint64(uint64,uint64,bool)uint64': bigint + 'verify_setbyte(byte[],uint64,uint64)byte[]': Uint8Array + 'verify_shl(uint64,uint64)uint64': bigint + 'verify_shr(uint64,uint64)uint64': bigint + 'verify_sqrt(uint64)uint64': bigint + 'verify_substring(byte[],uint64,uint64)byte[]': Uint8Array + 'verify_json_ref_string(byte[],byte[])byte[]': Uint8Array + 'verify_json_ref_uint64(byte[],byte[])uint64': bigint + 'verify_json_ref_object(byte[],byte[])byte[]': Uint8Array +} + +/** + * Defines the types of available calls and state of the MiscellaneousOpsContract smart contract. + */ +export type MiscellaneousOpsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_addw(uint64,uint64)(uint64,uint64)' | 'verify_addw', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_addw(uint64,uint64)(uint64,uint64)'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_addw(uint64,uint64)(uint64,uint64)'] + returns: MiscellaneousOpsContractReturns['verify_addw(uint64,uint64)(uint64,uint64)'] + }> + & Record<'verify_base64_decode_standard(byte[])byte[]' | 'verify_base64_decode_standard', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_base64_decode_standard(byte[])byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_base64_decode_standard(byte[])byte[]'] + returns: MiscellaneousOpsContractReturns['verify_base64_decode_standard(byte[])byte[]'] + }> + & Record<'verify_base64_decode_url(byte[])byte[]' | 'verify_base64_decode_url', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_base64_decode_url(byte[])byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_base64_decode_url(byte[])byte[]'] + returns: MiscellaneousOpsContractReturns['verify_base64_decode_url(byte[])byte[]'] + }> + & Record<'verify_bytes_bitlen(byte[],uint64)uint64' | 'verify_bytes_bitlen', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_bytes_bitlen(byte[],uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_bytes_bitlen(byte[],uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_bytes_bitlen(byte[],uint64)uint64'] + }> + & Record<'verify_uint64_bitlen(uint64)uint64' | 'verify_uint64_bitlen', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_uint64_bitlen(uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_uint64_bitlen(uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_uint64_bitlen(uint64)uint64'] + }> + & Record<'verify_bsqrt(byte[])byte[]' | 'verify_bsqrt', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_bsqrt(byte[])byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_bsqrt(byte[])byte[]'] + returns: MiscellaneousOpsContractReturns['verify_bsqrt(byte[])byte[]'] + }> + & Record<'verify_btoi(byte[])uint64' | 'verify_btoi', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_btoi(byte[])uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_btoi(byte[])uint64'] + returns: MiscellaneousOpsContractReturns['verify_btoi(byte[])uint64'] + }> + & Record<'verify_bzero(uint64)byte[]' | 'verify_bzero', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_bzero(uint64)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_bzero(uint64)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_bzero(uint64)byte[]'] + }> + & Record<'verify_concat(byte[],byte[],uint64,uint64)byte[]' | 'verify_concat', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_concat(byte[],byte[],uint64,uint64)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_concat(byte[],byte[],uint64,uint64)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_concat(byte[],byte[],uint64,uint64)byte[]'] + }> + & Record<'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)' | 'verify_divmodw', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'] + returns: MiscellaneousOpsContractReturns['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'] + }> + & Record<'verify_divw(uint64,uint64,uint64)uint64' | 'verify_divw', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_divw(uint64,uint64,uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_divw(uint64,uint64,uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_divw(uint64,uint64,uint64)uint64'] + }> + & Record<'verify_err()void' | 'verify_err', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_err()void'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_err()void'] + returns: MiscellaneousOpsContractReturns['verify_err()void'] + }> + & Record<'verify_exp(uint64,uint64)uint64' | 'verify_exp', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_exp(uint64,uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_exp(uint64,uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_exp(uint64,uint64)uint64'] + }> + & Record<'verify_expw(uint64,uint64)(uint64,uint64)' | 'verify_expw', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_expw(uint64,uint64)(uint64,uint64)'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_expw(uint64,uint64)(uint64,uint64)'] + returns: MiscellaneousOpsContractReturns['verify_expw(uint64,uint64)(uint64,uint64)'] + }> + & Record<'verify_extract(byte[],uint64,uint64)byte[]' | 'verify_extract', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract(byte[],uint64,uint64)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract(byte[],uint64,uint64)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_extract(byte[],uint64,uint64)byte[]'] + }> + & Record<'verify_extract_from_2(byte[])byte[]' | 'verify_extract_from_2', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract_from_2(byte[])byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract_from_2(byte[])byte[]'] + returns: MiscellaneousOpsContractReturns['verify_extract_from_2(byte[])byte[]'] + }> + & Record<'verify_extract_uint16(byte[],uint64)uint64' | 'verify_extract_uint16', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract_uint16(byte[],uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract_uint16(byte[],uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_extract_uint16(byte[],uint64)uint64'] + }> + & Record<'verify_extract_uint32(byte[],uint64)uint64' | 'verify_extract_uint32', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract_uint32(byte[],uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract_uint32(byte[],uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_extract_uint32(byte[],uint64)uint64'] + }> + & Record<'verify_extract_uint64(byte[],uint64)uint64' | 'verify_extract_uint64', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_extract_uint64(byte[],uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_extract_uint64(byte[],uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_extract_uint64(byte[],uint64)uint64'] + }> + & Record<'verify_getbit_bytes(byte[],uint64)bool' | 'verify_getbit_bytes', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_getbit_bytes(byte[],uint64)bool'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_getbit_bytes(byte[],uint64)bool'] + returns: MiscellaneousOpsContractReturns['verify_getbit_bytes(byte[],uint64)bool'] + }> + & Record<'verify_getbit_uint64(uint64,uint64)bool' | 'verify_getbit_uint64', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_getbit_uint64(uint64,uint64)bool'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_getbit_uint64(uint64,uint64)bool'] + returns: MiscellaneousOpsContractReturns['verify_getbit_uint64(uint64,uint64)bool'] + }> + & Record<'verify_getbyte(byte[],uint64)uint64' | 'verify_getbyte', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_getbyte(byte[],uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_getbyte(byte[],uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_getbyte(byte[],uint64)uint64'] + }> + & Record<'verify_itob(uint64)byte[]' | 'verify_itob', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_itob(uint64)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_itob(uint64)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_itob(uint64)byte[]'] + }> + & Record<'verify_mulw(uint64,uint64)(uint64,uint64)' | 'verify_mulw', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_mulw(uint64,uint64)(uint64,uint64)'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_mulw(uint64,uint64)(uint64,uint64)'] + returns: MiscellaneousOpsContractReturns['verify_mulw(uint64,uint64)(uint64,uint64)'] + }> + & Record<'verify_replace(byte[],uint64,byte[])byte[]' | 'verify_replace', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_replace(byte[],uint64,byte[])byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_replace(byte[],uint64,byte[])byte[]'] + returns: MiscellaneousOpsContractReturns['verify_replace(byte[],uint64,byte[])byte[]'] + }> + & Record<'verify_select_bytes(byte[],byte[],uint64)byte[]' | 'verify_select_bytes', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_select_bytes(byte[],byte[],uint64)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_select_bytes(byte[],byte[],uint64)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_select_bytes(byte[],byte[],uint64)byte[]'] + }> + & Record<'verify_select_uint64(uint64,uint64,uint64)uint64' | 'verify_select_uint64', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_select_uint64(uint64,uint64,uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_select_uint64(uint64,uint64,uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_select_uint64(uint64,uint64,uint64)uint64'] + }> + & Record<'verify_setbit_bytes(byte[],uint64,bool)byte[]' | 'verify_setbit_bytes', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_setbit_bytes(byte[],uint64,bool)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_setbit_bytes(byte[],uint64,bool)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_setbit_bytes(byte[],uint64,bool)byte[]'] + }> + & Record<'verify_setbit_uint64(uint64,uint64,bool)uint64' | 'verify_setbit_uint64', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_setbit_uint64(uint64,uint64,bool)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_setbit_uint64(uint64,uint64,bool)uint64'] + returns: MiscellaneousOpsContractReturns['verify_setbit_uint64(uint64,uint64,bool)uint64'] + }> + & Record<'verify_setbyte(byte[],uint64,uint64)byte[]' | 'verify_setbyte', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_setbyte(byte[],uint64,uint64)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_setbyte(byte[],uint64,uint64)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_setbyte(byte[],uint64,uint64)byte[]'] + }> + & Record<'verify_shl(uint64,uint64)uint64' | 'verify_shl', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_shl(uint64,uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_shl(uint64,uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_shl(uint64,uint64)uint64'] + }> + & Record<'verify_shr(uint64,uint64)uint64' | 'verify_shr', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_shr(uint64,uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_shr(uint64,uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_shr(uint64,uint64)uint64'] + }> + & Record<'verify_sqrt(uint64)uint64' | 'verify_sqrt', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_sqrt(uint64)uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_sqrt(uint64)uint64'] + returns: MiscellaneousOpsContractReturns['verify_sqrt(uint64)uint64'] + }> + & Record<'verify_substring(byte[],uint64,uint64)byte[]' | 'verify_substring', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_substring(byte[],uint64,uint64)byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_substring(byte[],uint64,uint64)byte[]'] + returns: MiscellaneousOpsContractReturns['verify_substring(byte[],uint64,uint64)byte[]'] + }> + & Record<'verify_json_ref_string(byte[],byte[])byte[]' | 'verify_json_ref_string', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_json_ref_string(byte[],byte[])byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_json_ref_string(byte[],byte[])byte[]'] + returns: MiscellaneousOpsContractReturns['verify_json_ref_string(byte[],byte[])byte[]'] + }> + & Record<'verify_json_ref_uint64(byte[],byte[])uint64' | 'verify_json_ref_uint64', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_json_ref_uint64(byte[],byte[])uint64'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_json_ref_uint64(byte[],byte[])uint64'] + returns: MiscellaneousOpsContractReturns['verify_json_ref_uint64(byte[],byte[])uint64'] + }> + & Record<'verify_json_ref_object(byte[],byte[])byte[]' | 'verify_json_ref_object', { + argsObj: MiscellaneousOpsContractArgs['obj']['verify_json_ref_object(byte[],byte[])byte[]'] + argsTuple: MiscellaneousOpsContractArgs['tuple']['verify_json_ref_object(byte[],byte[])byte[]'] + returns: MiscellaneousOpsContractReturns['verify_json_ref_object(byte[],byte[])byte[]'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type MiscellaneousOpsContractSignatures = keyof MiscellaneousOpsContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type MiscellaneousOpsContractNonVoidMethodSignatures = keyof MiscellaneousOpsContractTypes['methods'] extends infer T ? T extends keyof MiscellaneousOpsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the MiscellaneousOpsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = MiscellaneousOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the MiscellaneousOpsContract smart contract to the method's return type + */ +export type MethodReturn = MiscellaneousOpsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type MiscellaneousOpsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type MiscellaneousOpsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: MiscellaneousOpsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the MiscellaneousOpsContract smart contract + */ +export abstract class MiscellaneousOpsContractParamsFactory { + /** + * Constructs a no op call for the verify_addw(uint64,uint64)(uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAddw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_addw(uint64,uint64)(uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_base64_decode_standard(byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBase64DecodeStandard(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_base64_decode_standard(byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_base64_decode_url(byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBase64DecodeUrl(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_base64_decode_url(byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bytes_bitlen(byte[],uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesBitlen(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_bitlen(byte[],uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padASize], + } + } + /** + * Constructs a no op call for the verify_uint64_bitlen(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Bitlen(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_bitlen(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bsqrt(byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBsqrt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bsqrt(byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_btoi(byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBtoi(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_btoi(byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_bzero(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBzero(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bzero(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_concat(byte[],byte[],uint64,uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyConcat(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_concat(byte[],byte[],uint64,uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.padASize, params.args.padBSize], + } + } + /** + * Constructs a no op call for the verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyDivmodw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d], + } + } + /** + * Constructs a no op call for the verify_divw(uint64,uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyDivw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_divw(uint64,uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_err()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyErr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_err()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the verify_exp(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExp(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_exp(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_expw(uint64,uint64)(uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExpw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_expw(uint64,uint64)(uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_extract(byte[],uint64,uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExtract(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_extract(byte[],uint64,uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_extract_from_2(byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExtractFrom_2(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_extract_from_2(byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_extract_uint16(byte[],uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExtractUint16(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_extract_uint16(byte[],uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_extract_uint32(byte[],uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExtractUint32(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_extract_uint32(byte[],uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_extract_uint64(byte[],uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExtractUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_extract_uint64(byte[],uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_getbit_bytes(byte[],uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetbitBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_getbit_bytes(byte[],uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_getbit_uint64(uint64,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetbitUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_getbit_uint64(uint64,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_getbyte(byte[],uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetbyte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_getbyte(byte[],uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_itob(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyItob(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_itob(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_mulw(uint64,uint64)(uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyMulw(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_mulw(uint64,uint64)(uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_replace(byte[],uint64,byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyReplace(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_replace(byte[],uint64,byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_select_bytes(byte[],byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySelectBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_select_bytes(byte[],byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_select_uint64(uint64,uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySelectUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_select_uint64(uint64,uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_setbit_bytes(byte[],uint64,bool)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySetbitBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_setbit_bytes(byte[],uint64,bool)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_setbit_uint64(uint64,uint64,bool)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySetbitUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_setbit_uint64(uint64,uint64,bool)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_setbyte(byte[],uint64,uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySetbyte(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_setbyte(byte[],uint64,uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_shl(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyShl(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_shl(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_shr(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyShr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_shr(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_sqrt(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySqrt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_sqrt(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_substring(byte[],uint64,uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifySubstring(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_substring(byte[],uint64,uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_json_ref_string(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyJsonRefString(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_json_ref_string(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_json_ref_uint64(byte[],byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyJsonRefUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_json_ref_uint64(byte[],byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_json_ref_object(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyJsonRefObject(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_json_ref_object(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } +} + +/** + * A factory to create and deploy one or more instance of the MiscellaneousOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class MiscellaneousOpsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `MiscellaneousOpsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new MiscellaneousOpsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new MiscellaneousOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the MiscellaneousOpsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: MiscellaneousOpsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new MiscellaneousOpsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the MiscellaneousOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the MiscellaneousOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the MiscellaneousOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new MiscellaneousOpsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the MiscellaneousOpsContract smart contract + */ +export class MiscellaneousOpsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `MiscellaneousOpsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the MiscellaneousOpsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `MiscellaneousOpsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `MiscellaneousOpsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new MiscellaneousOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `MiscellaneousOpsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new MiscellaneousOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the MiscellaneousOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_addw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAddw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyAddw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_standard(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBase64DecodeStandard: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeStandard(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_url(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBase64DecodeUrl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeUrl(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bytes_bitlen(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesBitlen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBytesBitlen(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_uint64_bitlen(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Bitlen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyUint64Bitlen(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bsqrt(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBsqrt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBsqrt(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_btoi(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBtoi: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBtoi(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bzero(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBzero: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyBzero(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_concat(byte[],byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyConcat: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyConcat(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyDivmodw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyDivmodw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divw(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyDivw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyDivw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_err()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyErr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyErr(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_exp(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExp: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExp(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_expw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExpw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExpw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExtract: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtract(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_from_2(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExtractFrom_2: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtractFrom_2(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint16(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExtractUint16: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint16(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint32(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExtractUint32: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint32(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint64(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExtractUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_bytes(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetbitBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyGetbitBytes(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_uint64(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetbitUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyGetbitUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbyte(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetbyte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyGetbyte(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_itob(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyItob: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyItob(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_mulw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyMulw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyMulw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_replace(byte[],uint64,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyReplace: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyReplace(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_bytes(byte[],byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySelectBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySelectBytes(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_uint64(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySelectUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySelectUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_bytes(byte[],uint64,bool)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySetbitBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySetbitBytes(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_uint64(uint64,uint64,bool)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySetbitUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySetbitUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbyte(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySetbyte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySetbyte(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shl(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyShl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyShl(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shr(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyShr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyShr(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_sqrt(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySqrt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySqrt(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_substring(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifySubstring: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifySubstring(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_string(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyJsonRefString: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefString(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_uint64(byte[],byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyJsonRefUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_object(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyJsonRefObject: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefObject(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the MiscellaneousOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_addw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAddw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyAddw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_standard(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBase64DecodeStandard: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeStandard(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_url(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBase64DecodeUrl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeUrl(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bytes_bitlen(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesBitlen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBytesBitlen(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_uint64_bitlen(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Bitlen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyUint64Bitlen(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bsqrt(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBsqrt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBsqrt(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_btoi(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBtoi: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBtoi(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bzero(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBzero: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyBzero(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_concat(byte[],byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyConcat: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyConcat(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyDivmodw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyDivmodw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divw(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyDivw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyDivw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_err()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyErr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyErr(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_exp(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExp: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExp(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_expw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExpw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExpw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExtract: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtract(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_from_2(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExtractFrom_2: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtractFrom_2(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint16(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExtractUint16: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint16(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint32(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExtractUint32: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint32(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint64(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExtractUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_bytes(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetbitBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyGetbitBytes(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_uint64(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetbitUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyGetbitUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbyte(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetbyte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyGetbyte(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_itob(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyItob: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyItob(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_mulw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyMulw: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyMulw(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_replace(byte[],uint64,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyReplace: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyReplace(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_bytes(byte[],byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySelectBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySelectBytes(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_uint64(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySelectUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySelectUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_bytes(byte[],uint64,bool)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySetbitBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySetbitBytes(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_uint64(uint64,uint64,bool)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySetbitUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySetbitUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbyte(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySetbyte: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySetbyte(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shl(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyShl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyShl(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shr(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyShr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyShr(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_sqrt(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySqrt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySqrt(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_substring(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifySubstring: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifySubstring(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_string(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyJsonRefString: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefString(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_uint64(byte[],byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyJsonRefUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefUint64(params)) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_object(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyJsonRefObject: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefObject(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the MiscellaneousOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_addw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAddw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyAddw(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_addw(uint64,uint64)(uint64,uint64)'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_standard(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBase64DecodeStandard: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeStandard(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_base64_decode_standard(byte[])byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_base64_decode_url(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBase64DecodeUrl: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBase64DecodeUrl(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_base64_decode_url(byte[])byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bytes_bitlen(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesBitlen: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBytesBitlen(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_bytes_bitlen(byte[],uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_uint64_bitlen(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Bitlen: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyUint64Bitlen(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_uint64_bitlen(uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bsqrt(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBsqrt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBsqrt(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_bsqrt(byte[])byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_btoi(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBtoi: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBtoi(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_btoi(byte[])uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_bzero(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBzero: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyBzero(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_bzero(uint64)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_concat(byte[],byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyConcat: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyConcat(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_concat(byte[],byte[],uint64,uint64)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyDivmodw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyDivmodw(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_divw(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyDivw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyDivw(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_divw(uint64,uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_err()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyErr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyErr(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_err()void'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_exp(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExp: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExp(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_exp(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_expw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExpw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExpw(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_expw(uint64,uint64)(uint64,uint64)'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExtract: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtract(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract(byte[],uint64,uint64)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_from_2(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExtractFrom_2: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtractFrom_2(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract_from_2(byte[])byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint16(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExtractUint16: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint16(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract_uint16(byte[],uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint32(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExtractUint32: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint32(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract_uint32(byte[],uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_extract_uint64(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExtractUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyExtractUint64(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_extract_uint64(byte[],uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_bytes(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetbitBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyGetbitBytes(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_getbit_bytes(byte[],uint64)bool'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbit_uint64(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetbitUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyGetbitUint64(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_getbit_uint64(uint64,uint64)bool'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_getbyte(byte[],uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetbyte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyGetbyte(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_getbyte(byte[],uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_itob(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyItob: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyItob(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_itob(uint64)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_mulw(uint64,uint64)(uint64,uint64)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyMulw: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyMulw(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_mulw(uint64,uint64)(uint64,uint64)'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_replace(byte[],uint64,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyReplace: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyReplace(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_replace(byte[],uint64,byte[])byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_bytes(byte[],byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySelectBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySelectBytes(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_select_bytes(byte[],byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_select_uint64(uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySelectUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySelectUint64(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_select_uint64(uint64,uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_bytes(byte[],uint64,bool)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySetbitBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySetbitBytes(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_setbit_bytes(byte[],uint64,bool)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbit_uint64(uint64,uint64,bool)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySetbitUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySetbitUint64(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_setbit_uint64(uint64,uint64,bool)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_setbyte(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySetbyte: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySetbyte(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_setbyte(byte[],uint64,uint64)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shl(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyShl: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyShl(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_shl(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_shr(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyShr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyShr(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_shr(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_sqrt(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySqrt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySqrt(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_sqrt(uint64)uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_substring(byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifySubstring: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifySubstring(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_substring(byte[],uint64,uint64)byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_string(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyJsonRefString: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefString(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_json_ref_string(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_uint64(byte[],byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyJsonRefUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefUint64(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_json_ref_uint64(byte[],byte[])uint64'])} + }, + + /** + * Makes a call to the MiscellaneousOpsContract smart contract using the `verify_json_ref_object(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyJsonRefObject: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(MiscellaneousOpsContractParamsFactory.verifyJsonRefObject(params)) + return {...result, return: result.return as unknown as (undefined | MiscellaneousOpsContractReturns['verify_json_ref_object(byte[],byte[])byte[]'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new MiscellaneousOpsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current MiscellaneousOpsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): MiscellaneousOpsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_addw(uint64,uint64)(uint64,uint64) method call against the MiscellaneousOpsContract contract + */ + verifyAddw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAddw(params))) + return this + }, + /** + * Add a verify_base64_decode_standard(byte[])byte[] method call against the MiscellaneousOpsContract contract + */ + verifyBase64DecodeStandard(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBase64DecodeStandard(params))) + return this + }, + /** + * Add a verify_base64_decode_url(byte[])byte[] method call against the MiscellaneousOpsContract contract + */ + verifyBase64DecodeUrl(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBase64DecodeUrl(params))) + return this + }, + /** + * Add a verify_bytes_bitlen(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyBytesBitlen(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesBitlen(params))) + return this + }, + /** + * Add a verify_uint64_bitlen(uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyUint64Bitlen(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Bitlen(params))) + return this + }, + /** + * Add a verify_bsqrt(byte[])byte[] method call against the MiscellaneousOpsContract contract + */ + verifyBsqrt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBsqrt(params))) + return this + }, + /** + * Add a verify_btoi(byte[])uint64 method call against the MiscellaneousOpsContract contract + */ + verifyBtoi(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBtoi(params))) + return this + }, + /** + * Add a verify_bzero(uint64)byte[] method call against the MiscellaneousOpsContract contract + */ + verifyBzero(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBzero(params))) + return this + }, + /** + * Add a verify_concat(byte[],byte[],uint64,uint64)byte[] method call against the MiscellaneousOpsContract contract + */ + verifyConcat(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyConcat(params))) + return this + }, + /** + * Add a verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64) method call against the MiscellaneousOpsContract contract + */ + verifyDivmodw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyDivmodw(params))) + return this + }, + /** + * Add a verify_divw(uint64,uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyDivw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyDivw(params))) + return this + }, + /** + * Add a verify_err()void method call against the MiscellaneousOpsContract contract + */ + verifyErr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyErr(params))) + return this + }, + /** + * Add a verify_exp(uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyExp(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExp(params))) + return this + }, + /** + * Add a verify_expw(uint64,uint64)(uint64,uint64) method call against the MiscellaneousOpsContract contract + */ + verifyExpw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExpw(params))) + return this + }, + /** + * Add a verify_extract(byte[],uint64,uint64)byte[] method call against the MiscellaneousOpsContract contract + */ + verifyExtract(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtract(params))) + return this + }, + /** + * Add a verify_extract_from_2(byte[])byte[] method call against the MiscellaneousOpsContract contract + */ + verifyExtractFrom_2(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtractFrom_2(params))) + return this + }, + /** + * Add a verify_extract_uint16(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyExtractUint16(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtractUint16(params))) + return this + }, + /** + * Add a verify_extract_uint32(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyExtractUint32(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtractUint32(params))) + return this + }, + /** + * Add a verify_extract_uint64(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyExtractUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExtractUint64(params))) + return this + }, + /** + * Add a verify_getbit_bytes(byte[],uint64)bool method call against the MiscellaneousOpsContract contract + */ + verifyGetbitBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetbitBytes(params))) + return this + }, + /** + * Add a verify_getbit_uint64(uint64,uint64)bool method call against the MiscellaneousOpsContract contract + */ + verifyGetbitUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetbitUint64(params))) + return this + }, + /** + * Add a verify_getbyte(byte[],uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyGetbyte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetbyte(params))) + return this + }, + /** + * Add a verify_itob(uint64)byte[] method call against the MiscellaneousOpsContract contract + */ + verifyItob(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyItob(params))) + return this + }, + /** + * Add a verify_mulw(uint64,uint64)(uint64,uint64) method call against the MiscellaneousOpsContract contract + */ + verifyMulw(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyMulw(params))) + return this + }, + /** + * Add a verify_replace(byte[],uint64,byte[])byte[] method call against the MiscellaneousOpsContract contract + */ + verifyReplace(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyReplace(params))) + return this + }, + /** + * Add a verify_select_bytes(byte[],byte[],uint64)byte[] method call against the MiscellaneousOpsContract contract + */ + verifySelectBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySelectBytes(params))) + return this + }, + /** + * Add a verify_select_uint64(uint64,uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifySelectUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySelectUint64(params))) + return this + }, + /** + * Add a verify_setbit_bytes(byte[],uint64,bool)byte[] method call against the MiscellaneousOpsContract contract + */ + verifySetbitBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySetbitBytes(params))) + return this + }, + /** + * Add a verify_setbit_uint64(uint64,uint64,bool)uint64 method call against the MiscellaneousOpsContract contract + */ + verifySetbitUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySetbitUint64(params))) + return this + }, + /** + * Add a verify_setbyte(byte[],uint64,uint64)byte[] method call against the MiscellaneousOpsContract contract + */ + verifySetbyte(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySetbyte(params))) + return this + }, + /** + * Add a verify_shl(uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyShl(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyShl(params))) + return this + }, + /** + * Add a verify_shr(uint64,uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifyShr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyShr(params))) + return this + }, + /** + * Add a verify_sqrt(uint64)uint64 method call against the MiscellaneousOpsContract contract + */ + verifySqrt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySqrt(params))) + return this + }, + /** + * Add a verify_substring(byte[],uint64,uint64)byte[] method call against the MiscellaneousOpsContract contract + */ + verifySubstring(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifySubstring(params))) + return this + }, + /** + * Add a verify_json_ref_string(byte[],byte[])byte[] method call against the MiscellaneousOpsContract contract + */ + verifyJsonRefString(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyJsonRefString(params))) + return this + }, + /** + * Add a verify_json_ref_uint64(byte[],byte[])uint64 method call against the MiscellaneousOpsContract contract + */ + verifyJsonRefUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyJsonRefUint64(params))) + return this + }, + /** + * Add a verify_json_ref_object(byte[],byte[])byte[] method call against the MiscellaneousOpsContract contract + */ + verifyJsonRefObject(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyJsonRefObject(params))) + return this + }, + /** + * Add a clear state call to the MiscellaneousOpsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as MiscellaneousOpsContractComposer + } +} +export type MiscellaneousOpsContractComposer = { + /** + * Calls the verify_addw(uint64,uint64)(uint64,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAddw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_addw(uint64,uint64)(uint64,uint64)'] | undefined]> + + /** + * Calls the verify_base64_decode_standard(byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBase64DecodeStandard(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_base64_decode_standard(byte[])byte[]'] | undefined]> + + /** + * Calls the verify_base64_decode_url(byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBase64DecodeUrl(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_base64_decode_url(byte[])byte[]'] | undefined]> + + /** + * Calls the verify_bytes_bitlen(byte[],uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesBitlen(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_bytes_bitlen(byte[],uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_bitlen(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Bitlen(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_uint64_bitlen(uint64)uint64'] | undefined]> + + /** + * Calls the verify_bsqrt(byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBsqrt(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_bsqrt(byte[])byte[]'] | undefined]> + + /** + * Calls the verify_btoi(byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBtoi(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_btoi(byte[])uint64'] | undefined]> + + /** + * Calls the verify_bzero(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBzero(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_bzero(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_concat(byte[],byte[],uint64,uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyConcat(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_concat(byte[],byte[],uint64,uint64)byte[]'] | undefined]> + + /** + * Calls the verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyDivmodw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)'] | undefined]> + + /** + * Calls the verify_divw(uint64,uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyDivw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_divw(uint64,uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_err()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyErr(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_err()void'] | undefined]> + + /** + * Calls the verify_exp(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExp(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_exp(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_expw(uint64,uint64)(uint64,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExpw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_expw(uint64,uint64)(uint64,uint64)'] | undefined]> + + /** + * Calls the verify_extract(byte[],uint64,uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExtract(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract(byte[],uint64,uint64)byte[]'] | undefined]> + + /** + * Calls the verify_extract_from_2(byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExtractFrom_2(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract_from_2(byte[])byte[]'] | undefined]> + + /** + * Calls the verify_extract_uint16(byte[],uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExtractUint16(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract_uint16(byte[],uint64)uint64'] | undefined]> + + /** + * Calls the verify_extract_uint32(byte[],uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExtractUint32(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract_uint32(byte[],uint64)uint64'] | undefined]> + + /** + * Calls the verify_extract_uint64(byte[],uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExtractUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_extract_uint64(byte[],uint64)uint64'] | undefined]> + + /** + * Calls the verify_getbit_bytes(byte[],uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetbitBytes(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_getbit_bytes(byte[],uint64)bool'] | undefined]> + + /** + * Calls the verify_getbit_uint64(uint64,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetbitUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_getbit_uint64(uint64,uint64)bool'] | undefined]> + + /** + * Calls the verify_getbyte(byte[],uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetbyte(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_getbyte(byte[],uint64)uint64'] | undefined]> + + /** + * Calls the verify_itob(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyItob(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_itob(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_mulw(uint64,uint64)(uint64,uint64) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyMulw(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_mulw(uint64,uint64)(uint64,uint64)'] | undefined]> + + /** + * Calls the verify_replace(byte[],uint64,byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyReplace(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_replace(byte[],uint64,byte[])byte[]'] | undefined]> + + /** + * Calls the verify_select_bytes(byte[],byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySelectBytes(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_select_bytes(byte[],byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_select_uint64(uint64,uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySelectUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_select_uint64(uint64,uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_setbit_bytes(byte[],uint64,bool)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySetbitBytes(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_setbit_bytes(byte[],uint64,bool)byte[]'] | undefined]> + + /** + * Calls the verify_setbit_uint64(uint64,uint64,bool)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySetbitUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_setbit_uint64(uint64,uint64,bool)uint64'] | undefined]> + + /** + * Calls the verify_setbyte(byte[],uint64,uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySetbyte(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_setbyte(byte[],uint64,uint64)byte[]'] | undefined]> + + /** + * Calls the verify_shl(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyShl(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_shl(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_shr(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyShr(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_shr(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_sqrt(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySqrt(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_sqrt(uint64)uint64'] | undefined]> + + /** + * Calls the verify_substring(byte[],uint64,uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifySubstring(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_substring(byte[],uint64,uint64)byte[]'] | undefined]> + + /** + * Calls the verify_json_ref_string(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyJsonRefString(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_json_ref_string(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_json_ref_uint64(byte[],byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyJsonRefUint64(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_json_ref_uint64(byte[],byte[])uint64'] | undefined]> + + /** + * Calls the verify_json_ref_object(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyJsonRefObject(params?: CallParams): MiscellaneousOpsContractComposer<[...TReturns, MiscellaneousOpsContractReturns['verify_json_ref_object(byte[],byte[])byte[]'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the MiscellaneousOpsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): MiscellaneousOpsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): MiscellaneousOpsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type MiscellaneousOpsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/PrimitiveOpsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/PrimitiveOpsContract.ts new file mode 100644 index 0000000..5ff671b --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/PrimitiveOpsContract.ts @@ -0,0 +1,4701 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"PrimitiveOpsContract","structs":{},"methods":[{"name":"verify_uint64_init","args":[{"type":"byte[]","name":"raw_value"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_add","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_sub","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_mul","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_div","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_mod","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_and","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_or","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_xor","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_not","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_lshift","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_rshift","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_pow","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_eq","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_ne","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_lt","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_le","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_gt","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_uint64_ge","args":[{"type":"uint64","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_init","args":[{"type":"uint64","name":"raw_value"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_add","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"},{"type":"uint64","name":"pad_a_size"},{"type":"uint64","name":"pad_b_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_and","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_or","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_xor","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_bytes_not","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"pad_size"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_add","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_add_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_sub","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_sub_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_mul","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_mul_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_div","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_div_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_mod","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_mod_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_and","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_and_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_or","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_or_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_xor","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_xor_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_eq","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_eq_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_ne","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_ne_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_lt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_lt_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_le","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_le_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_gt","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_gt_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_ge","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_biguint_ge_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_init","args":[{"type":"string","name":"a"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_startswith","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_endswith","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_string_join","args":[{"type":"string","name":"a"},{"type":"string","name":"b"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_log","args":[{"type":"string","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"},{"type":"byte[]","name":"d"},{"type":"bool","name":"e"},{"type":"string","name":"f"},{"type":"uint64","name":"g"},{"type":"uint256","name":"h"},{"type":"ufixed32x8","name":"i"},{"type":"ufixed256x16","name":"j"},{"type":"byte[]","name":"k"},{"type":"byte[]","name":"m"},{"type":"byte[]","name":"n"},{"type":"byte[5]","name":"o"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDAwICItIiAweDE1MWY3Yzc1MDAyMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANjcKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDcyNWM2OTJiIDB4MTczMTQ1NTkgMHg1M2YzNDg5MyAweDg4YzhiMjY5IDB4YTQ2NGI3YWIgMHg5YzhiMTFiOCAweDZmNDA2NTRlIDB4ZWM5YTI5NzQgMHhjNzkzNzA4ZiAweDdkZGI3NDk5IDB4YTIxYzQ0M2QgMHg2ZTdmYjIxMiAweGIwMDdmY2IwIDB4MmViYzIwZDQgMHhiMDk1NGI2NiAweGRkMTQwYWVmIDB4YWNlNDc0ZGEgMHhiYTY5NDk5MCAweDZkYjU4MWMwIDB4OTFjOGRiODkgMHhkYmU3NzE1OCAweDlhMGYyMmUxIDB4NjQwMzNkMzcgMHgyYTcyMzdjNSAweGUzYTk0NDU4IDB4NDJmODdmN2QgMHgyYjU1NDJhNCAweDliZTJmYmU5IDB4MWNkOTI1MTUgMHg2NGUxNzA1YyAweGYxMjcxYzUwIDB4MmFiNjNiNzAgMHg4MzRiYjdkMiAweDUzMTYyMGQ3IDB4M2ZiOWU3NjkgMHhmYThkYjBiYyAweGE3MmVhNDg1IDB4YjdiMGJhMTkgMHg3NDQ2MGM0MiAweGFiMzIwNzM4IDB4NTJhZDQ2NTQgMHgxMDE1NjM5OSAweDBmMDc1OTU3IDB4YmQ4NDNkZmYgMHhiMzc3ZDM4MSAweDg5NzY3MjY1IDB4NDU2YjRiMjMgMHgzM2QxYjg4YyAweDZiZjk3M2VhIDB4NjdjZDZiYjIgMHgzZjU4ODA1YSAweDFlMTMwMDM5IDB4NTA5ZGM5MWQgMHhhNTY0YTIwMiAweDIzNjUwNzYzIDB4ZjhjOGY4ZDUgMHgyM2ZhZjdhNCAweDdkMGFmZTE1IDB4NDg1ODFhZGYgMHgzZGFlZjljZCAvLyBtZXRob2QgInZlcmlmeV91aW50NjRfaW5pdChieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2FkZCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9zdWIodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbXVsKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2Rpdih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9tb2QodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfYW5kKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X29yKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X3hvcih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9ub3QodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9sc2hpZnQodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfcnNoaWZ0KHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X3Bvdyh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9lcSh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbmUodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2x0KHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9sZSh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfZ3QodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2dlKHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2luaXQodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2FkZChieXRlW10sYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfYW5kKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfb3IoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc194b3IoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc19ub3QoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2FkZChieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfYWRkX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfc3ViKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9zdWJfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9tdWwoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X211bF91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2RpdihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZGl2X3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbW9kKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9tb2RfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9hbmQoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X29yKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9vcl91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X3hvcihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfeG9yX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9lcV91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9uZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2x0KGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9sZV91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9ndChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2dlKGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19pbml0KHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aChzdHJpbmcsc3RyaW5nKWJvb2wiLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfZW5kc3dpdGgoc3RyaW5nLHN0cmluZylib29sIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2pvaW4oc3RyaW5nLHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9sb2coc3RyaW5nLHVpbnQ2NCxieXRlW10sYnl0ZVtdLGJvb2wsc3RyaW5nLHVpbnQ2NCx1aW50MjU2LHVmaXhlZDMyeDgsdWZpeGVkMjU2eDE2LGJ5dGVbXSxieXRlW10sYnl0ZVtdLGJ5dGVbNV0pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV91aW50NjRfaW5pdCB2ZXJpZnlfdWludDY0X2FkZCB2ZXJpZnlfdWludDY0X3N1YiB2ZXJpZnlfdWludDY0X211bCB2ZXJpZnlfdWludDY0X2RpdiB2ZXJpZnlfdWludDY0X21vZCB2ZXJpZnlfdWludDY0X2FuZCB2ZXJpZnlfdWludDY0X29yIHZlcmlmeV91aW50NjRfeG9yIHZlcmlmeV91aW50NjRfbm90IHZlcmlmeV91aW50NjRfbHNoaWZ0IHZlcmlmeV91aW50NjRfcnNoaWZ0IHZlcmlmeV91aW50NjRfcG93IHZlcmlmeV91aW50NjRfZXEgdmVyaWZ5X3VpbnQ2NF9uZSB2ZXJpZnlfdWludDY0X2x0IHZlcmlmeV91aW50NjRfbGUgdmVyaWZ5X3VpbnQ2NF9ndCB2ZXJpZnlfdWludDY0X2dlIHZlcmlmeV9ieXRlc19pbml0IHZlcmlmeV9ieXRlc19hZGQgdmVyaWZ5X2J5dGVzX2VxIHZlcmlmeV9ieXRlc19uZSB2ZXJpZnlfYnl0ZXNfYW5kIHZlcmlmeV9ieXRlc19vciB2ZXJpZnlfYnl0ZXNfeG9yIHZlcmlmeV9ieXRlc19ub3QgdmVyaWZ5X2JpZ3VpbnRfYWRkIHZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfc3ViIHZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbXVsIHZlcmlmeV9iaWd1aW50X211bF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfZGl2IHZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbW9kIHZlcmlmeV9iaWd1aW50X21vZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfYW5kIHZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfb3IgdmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0IHZlcmlmeV9iaWd1aW50X3hvciB2ZXJpZnlfYmlndWludF94b3JfdWludDY0IHZlcmlmeV9iaWd1aW50X2VxIHZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NCB2ZXJpZnlfYmlndWludF9uZSB2ZXJpZnlfYmlndWludF9uZV91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbHQgdmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0IHZlcmlmeV9iaWd1aW50X2xlIHZlcmlmeV9iaWd1aW50X2xlX3VpbnQ2NCB2ZXJpZnlfYmlndWludF9ndCB2ZXJpZnlfYmlndWludF9ndF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfZ2UgdmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0IHZlcmlmeV9zdHJpbmdfaW5pdCB2ZXJpZnlfc3RyaW5nX3N0YXJ0c3dpdGggdmVyaWZ5X3N0cmluZ19lbmRzd2l0aCB2ZXJpZnlfc3RyaW5nX2pvaW4gdmVyaWZ5X2xvZwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDY3OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjkKICAgIC8vIHJlc3VsdCA9IG9wLmJ0b2kocmF3X3ZhbHVlKQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9hZGRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0CiAgICAvLyByZXN1bHQgPSBhICsgYgogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfc3ViW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9zdWI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOQogICAgLy8gcmVzdWx0ID0gYSAtIGIKICAgIC0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X211bFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbXVsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQKICAgIC8vIHJlc3VsdCA9IGEgKiBiCiAgICAqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9kaXZbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2RpdjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI5CiAgICAvLyByZXN1bHQgPSBhIC8vIGIKICAgIC8KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X21vZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbW9kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzQKICAgIC8vIHJlc3VsdCA9IGEgJSBiCiAgICAlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9hbmRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2FuZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM5CiAgICAvLyByZXN1bHQgPSBhICYgYgogICAgJgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfb3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X29yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDQKICAgIC8vIHJlc3VsdCA9IGEgfCBiCiAgICB8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF94b3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X3hvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyByZXN1bHQgPSBhIF4gYgogICAgXgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbm90W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9ub3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NAogICAgLy8gcmVzdWx0ID0gfmEKICAgIH4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2xzaGlmdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbHNoaWZ0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIHJlc3VsdCA9IGEgPDwgYgogICAgc2hsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9yc2hpZnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X3JzaGlmdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY0CiAgICAvLyByZXN1bHQgPSBhID4+IGIKICAgIHNocgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfcG93W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9wb3c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2OQogICAgLy8gcmVzdWx0ID0gYSoqYgogICAgZXhwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfZXE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3NAogICAgLy8gcmVzdWx0ID0gYSA9PSBiCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9uZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyByZXN1bHQgPSBhICE9IGIKICAgICE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODQKICAgIC8vIHJlc3VsdCA9IGEgPCBiCiAgICA8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2xlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODkKICAgIC8vIHJlc3VsdCA9IGEgPD0gYgogICAgPD0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9ndFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NAogICAgLy8gcmVzdWx0ID0gYSA+IGIKICAgID4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9nZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5OQogICAgLy8gcmVzdWx0ID0gYSA+PSBiCiAgICA+PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ieXRlc19pbml0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmVzdWx0ID0gb3AuaXRvYihyYXdfdmFsdWUpCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1MDAwOAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19hZGRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfYWRkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTExCiAgICAvLyBhID0gb3AuYnplcm8ocGFkX2Ffc2l6ZSkgKyBhCiAgICBzd2FwCiAgICBiemVybwogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTEyCiAgICAvLyBiID0gb3AuYnplcm8ocGFkX2Jfc2l6ZSkgKyBiCiAgICBzd2FwCiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTEzCiAgICAvLyByZXN1bHQgPSBhICsgYgogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExNAogICAgLy8gcmVzdWx0ID0gb3Auc2hhMjU2KHJlc3VsdCkKICAgIHNoYTI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUwMDIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX2VxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTE5CiAgICAvLyByZXN1bHQgPSBhID09IGIKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfbmVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfbmU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjQKICAgIC8vIHJlc3VsdCA9IGEgIT0gYgogICAgIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19hbmRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfYW5kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTI5CiAgICAvLyByZXN1bHQgPSBhICYgYgogICAgYiYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19vcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ieXRlc19vcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gcmVzdWx0ID0gYSB8IGIKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfeG9yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX3hvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gcmVzdWx0ID0gYSBeIGIKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfbm90W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX25vdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQ0CiAgICAvLyBhID0gb3AuYnplcm8ocGFkX3NpemUpICsgYQogICAgYnplcm8KICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDUKICAgIC8vIHJlc3VsdCA9IH5hCiAgICBifgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDYKICAgIC8vIHJlc3VsdCA9IG9wLnNoYTI1NihyZXN1bHQpCiAgICBzaGEyNTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FkZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICsgYl9iaWd1aW50CiAgICBiKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfYWRkX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1OQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICsgYgogICAgaXRvYgogICAgYisKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3N1Yltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X3N1YjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IC0gYl9iaWd1aW50CiAgICBiLQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfc3ViX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3MgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IC0gYgogICAgaXRvYgogICAgYi0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X211bFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X211bDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3OQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICogYl9iaWd1aW50CiAgICBiKgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbXVsX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X211bF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICogYgogICAgaXRvYgogICAgYioKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2Rpdltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2RpdjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE5MgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IC8vIGJfYmlndWludAogICAgYi8KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9kaXZfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTgKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCAvLyBiCiAgICBpdG9iCiAgICBiLwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbW9kW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbW9kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjA1CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJSBiX2JpZ3VpbnQKICAgIGIlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9tb2RfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbW9kX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjExCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJSBiCiAgICBpdG9iCiAgICBiJQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfYW5kW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfYW5kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjE4CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJiBiX2JpZ3VpbnQKICAgIGImCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9hbmRfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfYW5kX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI0CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJiBiCiAgICBpdG9iCiAgICBiJgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfb3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9vcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzMQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IHwgYl9iaWd1aW50CiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzcKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCB8IGIKICAgIGl0b2IKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF94b3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF94b3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDQKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCBeIGJfYmlndWludAogICAgYl4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3hvcl91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF94b3JfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTAKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCBeIGIKICAgIGl0b2IKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjU3CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPT0gYl9iaWd1aW50CiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjYzCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPT0gYgogICAgaXRvYgogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9uZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcwCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgIT0gYl9iaWd1aW50CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjc2CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgIT0gYgogICAgaXRvYgogICAgYiE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9sdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjgzCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPCBiX2JpZ3VpbnQKICAgIGI8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9sdF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9sdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI4OQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IDwgYgogICAgaXRvYgogICAgYjwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTYKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA8PSBiX2JpZ3VpbnQKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMDIKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA8PSBiCiAgICBpdG9iCiAgICBiPD0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2d0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMDkKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA+IGJfYmlndWludAogICAgYj4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzE1CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPiBiCiAgICBpdG9iCiAgICBiPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9nZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyMgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ID49IGJfYmlndWludAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9nZV91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9nZV91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ID49IGIKICAgIGl0b2IKICAgIGI+PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N0cmluZ19pbml0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzMzCiAgICAvLyByZXN1bHQgPSBTdHJpbmcoIkhlbGxvLCAiKSArIGEKICAgIHB1c2hieXRlcyAiSGVsbG8sICIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzM4CiAgICAvLyByZXN1bHQgPSBhLnN0YXJ0c3dpdGgoYikKICAgIGxlbgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGxlbgogICAgPgogICAgYnogdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoX3Rlcm5hcnlfZmFsc2VAMwogICAgaW50Y18xIC8vIDAKCnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aF90ZXJuYXJ5X21lcmdlQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoX3Rlcm5hcnlfZmFsc2VAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzM4CiAgICAvLyByZXN1bHQgPSBhLnN0YXJ0c3dpdGgoYikKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMAogICAgZGlnIDIKICAgIGV4dHJhY3QzCiAgICBkaWcgMgogICAgPT0KICAgIGIgdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoX3Rlcm5hcnlfbWVyZ2VANAoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19lbmRzd2l0aFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfZW5kc3dpdGg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gcmVzdWx0ID0gYS5lbmRzd2l0aChiKQogICAgbGVuCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID4KICAgIGJ6IHZlcmlmeV9zdHJpbmdfZW5kc3dpdGhfdGVybmFyeV9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMAoKdmVyaWZ5X3N0cmluZ19lbmRzd2l0aF90ZXJuYXJ5X21lcmdlQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKdmVyaWZ5X3N0cmluZ19lbmRzd2l0aF90ZXJuYXJ5X2ZhbHNlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gcmVzdWx0ID0gYS5lbmRzd2l0aChiKQogICAgZHVwCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICAtCiAgICBkaWcgNQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0MwogICAgZGlnIDMKICAgID09CiAgICBiIHZlcmlmeV9zdHJpbmdfZW5kc3dpdGhfdGVybmFyeV9tZXJnZUA0CgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2pvaW5bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2pvaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzQ4CiAgICAvLyByZXN1bHQgPSBTdHJpbmcoIiwgIikuam9pbigoYSwgYikpCiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgIiwgIgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNzMKICAgIC8vIGxvZyhhLCBiLCBjLCBkX2JpZ3VpbnQsIGUsIGYsIGcsIGgsIGksIGosIGFyYzRfaywgYXJjNF9tLCBhcmM0X24sIG8sIHNlcD0iLSIpCiAgICB1bmNvdmVyIDEzCiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmBAQVH3x1AQABLQYVH3x1ACAxG0EBszEZFEQxGESCPARyXGkrBBcxRVkEU/NIkwSIyLJpBKRkt6sEnIsRuARvQGVOBOyaKXQEx5NwjwR923SZBKIcRD0Ebn+yEgSwB/ywBC68INQEsJVLZgTdFArvBKzkdNoEumlJkARttYHABJHI24kE2+dxWASaDyLhBGQDPTcEKnI3xQTjqURYBEL4f30EK1VCpASb4vvpBBzZJRUEZOFwXATxJxxQBCq2O3AEg0u30gRTFiDXBD+552kE+o2wvASnLqSFBLewuhkEdEYMQgSrMgc4BFKtRlQEEBVjmQQPB1lXBL2EPf8Es3fTgQSJdnJlBEVrSyMEM9G4jARr+XPqBGfNa7IEP1iAWgQeEwA5BFCdyR0EpWSiAgQjZQdjBPjI+NUEI/r3pAR9Cv4VBEhYGt8EPa75zTYaAI48AAkAFwAnADcARwBXAGcAdwCHAJcAowCzAMMA0wDnAPsBDwEjATcBSwFdAYMBmwGzAc4B6QIEAhkCNAJOAmkCgwKeArgC0wLtAwgDIgM9A1cDcgOMA6cDwQPZA/AECAQfBDcETgRmBH0ElQSsBMQE2wT6BSsFZgWIADEZFDEYFBBDNhoBVwIAFxYoTFCwIkM2GgEXNhoCFwgWKExQsCJDNhoBFzYaAhcJFihMULAiQzYaARc2GgIXCxYoTFCwIkM2GgEXNhoCFwoWKExQsCJDNhoBFzYaAhcYFihMULAiQzYaARc2GgIXGhYoTFCwIkM2GgEXNhoCFxkWKExQsCJDNhoBFzYaAhcbFihMULAiQzYaARccFihMULAiQzYaARc2GgIXkBYoTFCwIkM2GgEXNhoCF5EWKExQsCJDNhoBFzYaAheUFihMULAiQzYaARc2GgIXEikjTwJUKExQsCJDNhoBFzYaAhcTKSNPAlQoTFCwIkM2GgEXNhoCFwwpI08CVChMULAiQzYaARc2GgIXDikjTwJUKExQsCJDNhoBFzYaAhcNKSNPAlQoTFCwIkM2GgEXNhoCFw8pI08CVChMULAiQzYaARcWgAYVH3x1AAhMULAiQzYaAVcCADYaAlcCADYaAxc2GgQXTK9PA1BMr08CUFABK0xQsCJDNhoBVwIANhoCVwIAEikjTwJUKExQsCJDNhoBVwIANhoCVwIAEykjTwJUKExQsCJDNhoBVwIANhoCVwIArEkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAq0kVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIArUkVFlcGAkxQKExQsCJDNhoBVwIANhoCF69MUK4BK0xQsCJDNhoBVwIANhoCVwIAoEkVFlcGAkxQKExQsCJDNhoBVwIANhoCFxagSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgChSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFqFJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKNJFRZXBgJMUChMULAiQzYaAVcCADYaAhcWo0kVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAokkVFlcGAkxQKExQsCJDNhoBVwIANhoCFxaiSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCqSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFqpJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKxJFRZXBgJMUChMULAiQzYaAVcCADYaAhcWrEkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAq0kVFlcGAkxQKExQsCJDNhoBVwIANhoCFxarSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCtSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFq1JFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKgpI08CVChMULAiQzYaAVcCADYaAhcWqCkjTwJUKExQsCJDNhoBVwIANhoCVwIAqSkjTwJUKExQsCJDNhoBVwIANhoCFxapKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgCkKSNPAlQoTFCwIkM2GgFXAgA2GgIXFqQpI08CVChMULAiQzYaAVcCADYaAlcCAKYpI08CVChMULAiQzYaAVcCADYaAhcWpikjTwJUKExQsCJDNhoBVwIANhoCVwIApSkjTwJUKExQsCJDNhoBVwIANhoCFxalKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgCnKSNPAlQoTFCwIkM2GgFXAgA2GgIXFqcpI08CVChMULAiQzYaAVcCAIAHSGVsbG8sIExQSRUWVwYCTFAoTFCwIkM2GgFXAgBJNhoCVwIASU4CFUlPAhUNQQAMIykjTwJUKExQsCJDSwIjSwJYSwISQv/pNhoBVwIASTYaAlcCAElOAhVJTwIVSU4CDUEADCMpI08CVChMULAiQ0lLAklOAglLBUxPAlhLAxJC/+I2GgFXAgA2GgJXAgBMgAIsIFBMUEkVFlcGAkxQKExQsCJDNhoBVwIANhoCFzYaA1cCADYaBFcCADYaBTYaBjYaBzYaCDYaCTYaCjYaC1cCADYaDFcCADYaDVcCADYaDk8NKlBPDRZQKlBPDFAqUE8LUCpQTwpQKlBPCVAqUE8IUCpQTwdQKlBPBlAqUE8FUCpQTwRQKlBPA1AqUE8CUCpQTFCwIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the PrimitiveOpsContract contract + */ +export type PrimitiveOpsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_uint64_init(byte[])uint64': { + rawValue: Uint8Array + } + 'verify_uint64_add(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_sub(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_mul(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_div(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_mod(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_and(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_or(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_xor(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_not(uint64)uint64': { + a: bigint | number + } + 'verify_uint64_lshift(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_rshift(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_pow(uint64,uint64)uint64': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_eq(uint64,uint64)bool': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_ne(uint64,uint64)bool': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_lt(uint64,uint64)bool': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_le(uint64,uint64)bool': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_gt(uint64,uint64)bool': { + a: bigint | number + b: bigint | number + } + 'verify_uint64_ge(uint64,uint64)bool': { + a: bigint | number + b: bigint | number + } + 'verify_bytes_init(uint64)byte[]': { + rawValue: bigint | number + } + 'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]': { + a: Uint8Array + b: Uint8Array + padASize: bigint | number + padBSize: bigint | number + } + 'verify_bytes_eq(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_bytes_ne(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_bytes_and(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_bytes_or(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_bytes_xor(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_bytes_not(byte[],uint64)byte[]': { + a: Uint8Array + padSize: bigint | number + } + 'verify_biguint_add(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_add_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_sub(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_sub_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_mul(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_mul_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_div(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_div_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_mod(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_mod_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_and(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_and_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_or(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_or_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_xor(byte[],byte[])byte[]': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_xor_uint64(byte[],uint64)byte[]': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_eq(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_eq_uint64(byte[],uint64)bool': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_ne(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_ne_uint64(byte[],uint64)bool': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_lt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_lt_uint64(byte[],uint64)bool': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_le(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_le_uint64(byte[],uint64)bool': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_gt(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_gt_uint64(byte[],uint64)bool': { + a: Uint8Array + b: bigint | number + } + 'verify_biguint_ge(byte[],byte[])bool': { + a: Uint8Array + b: Uint8Array + } + 'verify_biguint_ge_uint64(byte[],uint64)bool': { + a: Uint8Array + b: bigint | number + } + 'verify_string_init(string)string': { + a: string + } + 'verify_string_startswith(string,string)bool': { + a: string + b: string + } + 'verify_string_endswith(string,string)bool': { + a: string + b: string + } + 'verify_string_join(string,string)string': { + a: string + b: string + } + 'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void': { + a: string + b: bigint | number + c: Uint8Array + d: Uint8Array + e: boolean + f: string + g: bigint | number + h: bigint | number + i: number + j: number + k: Uint8Array + m: Uint8Array + n: Uint8Array + o: Uint8Array + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_uint64_init(byte[])uint64': [rawValue: Uint8Array] + 'verify_uint64_add(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_sub(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_mul(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_div(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_mod(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_and(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_or(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_xor(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_not(uint64)uint64': [a: bigint | number] + 'verify_uint64_lshift(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_rshift(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_pow(uint64,uint64)uint64': [a: bigint | number, b: bigint | number] + 'verify_uint64_eq(uint64,uint64)bool': [a: bigint | number, b: bigint | number] + 'verify_uint64_ne(uint64,uint64)bool': [a: bigint | number, b: bigint | number] + 'verify_uint64_lt(uint64,uint64)bool': [a: bigint | number, b: bigint | number] + 'verify_uint64_le(uint64,uint64)bool': [a: bigint | number, b: bigint | number] + 'verify_uint64_gt(uint64,uint64)bool': [a: bigint | number, b: bigint | number] + 'verify_uint64_ge(uint64,uint64)bool': [a: bigint | number, b: bigint | number] + 'verify_bytes_init(uint64)byte[]': [rawValue: bigint | number] + 'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]': [a: Uint8Array, b: Uint8Array, padASize: bigint | number, padBSize: bigint | number] + 'verify_bytes_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_bytes_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_bytes_and(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_bytes_or(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_bytes_xor(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_bytes_not(byte[],uint64)byte[]': [a: Uint8Array, padSize: bigint | number] + 'verify_biguint_add(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_add_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_sub(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_sub_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_mul(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_mul_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_div(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_div_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_mod(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_mod_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_and(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_and_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_or(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_or_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_xor(byte[],byte[])byte[]': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_xor_uint64(byte[],uint64)byte[]': [a: Uint8Array, b: bigint | number] + 'verify_biguint_eq(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_eq_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] + 'verify_biguint_ne(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_ne_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] + 'verify_biguint_lt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_lt_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] + 'verify_biguint_le(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_le_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] + 'verify_biguint_gt(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_gt_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] + 'verify_biguint_ge(byte[],byte[])bool': [a: Uint8Array, b: Uint8Array] + 'verify_biguint_ge_uint64(byte[],uint64)bool': [a: Uint8Array, b: bigint | number] + 'verify_string_init(string)string': [a: string] + 'verify_string_startswith(string,string)bool': [a: string, b: string] + 'verify_string_endswith(string,string)bool': [a: string, b: string] + 'verify_string_join(string,string)string': [a: string, b: string] + 'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void': [a: string, b: bigint | number, c: Uint8Array, d: Uint8Array, e: boolean, f: string, g: bigint | number, h: bigint | number, i: number, j: number, k: Uint8Array, m: Uint8Array, n: Uint8Array, o: Uint8Array] + } +} + +/** + * The return type for each method + */ +export type PrimitiveOpsContractReturns = { + 'verify_uint64_init(byte[])uint64': bigint + 'verify_uint64_add(uint64,uint64)uint64': bigint + 'verify_uint64_sub(uint64,uint64)uint64': bigint + 'verify_uint64_mul(uint64,uint64)uint64': bigint + 'verify_uint64_div(uint64,uint64)uint64': bigint + 'verify_uint64_mod(uint64,uint64)uint64': bigint + 'verify_uint64_and(uint64,uint64)uint64': bigint + 'verify_uint64_or(uint64,uint64)uint64': bigint + 'verify_uint64_xor(uint64,uint64)uint64': bigint + 'verify_uint64_not(uint64)uint64': bigint + 'verify_uint64_lshift(uint64,uint64)uint64': bigint + 'verify_uint64_rshift(uint64,uint64)uint64': bigint + 'verify_uint64_pow(uint64,uint64)uint64': bigint + 'verify_uint64_eq(uint64,uint64)bool': boolean + 'verify_uint64_ne(uint64,uint64)bool': boolean + 'verify_uint64_lt(uint64,uint64)bool': boolean + 'verify_uint64_le(uint64,uint64)bool': boolean + 'verify_uint64_gt(uint64,uint64)bool': boolean + 'verify_uint64_ge(uint64,uint64)bool': boolean + 'verify_bytes_init(uint64)byte[]': Uint8Array + 'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]': Uint8Array + 'verify_bytes_eq(byte[],byte[])bool': boolean + 'verify_bytes_ne(byte[],byte[])bool': boolean + 'verify_bytes_and(byte[],byte[])byte[]': Uint8Array + 'verify_bytes_or(byte[],byte[])byte[]': Uint8Array + 'verify_bytes_xor(byte[],byte[])byte[]': Uint8Array + 'verify_bytes_not(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_add(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_add_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_sub(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_sub_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_mul(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_mul_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_div(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_div_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_mod(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_mod_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_and(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_and_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_or(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_or_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_xor(byte[],byte[])byte[]': Uint8Array + 'verify_biguint_xor_uint64(byte[],uint64)byte[]': Uint8Array + 'verify_biguint_eq(byte[],byte[])bool': boolean + 'verify_biguint_eq_uint64(byte[],uint64)bool': boolean + 'verify_biguint_ne(byte[],byte[])bool': boolean + 'verify_biguint_ne_uint64(byte[],uint64)bool': boolean + 'verify_biguint_lt(byte[],byte[])bool': boolean + 'verify_biguint_lt_uint64(byte[],uint64)bool': boolean + 'verify_biguint_le(byte[],byte[])bool': boolean + 'verify_biguint_le_uint64(byte[],uint64)bool': boolean + 'verify_biguint_gt(byte[],byte[])bool': boolean + 'verify_biguint_gt_uint64(byte[],uint64)bool': boolean + 'verify_biguint_ge(byte[],byte[])bool': boolean + 'verify_biguint_ge_uint64(byte[],uint64)bool': boolean + 'verify_string_init(string)string': string + 'verify_string_startswith(string,string)bool': boolean + 'verify_string_endswith(string,string)bool': boolean + 'verify_string_join(string,string)string': string + 'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void': void +} + +/** + * Defines the types of available calls and state of the PrimitiveOpsContract smart contract. + */ +export type PrimitiveOpsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_uint64_init(byte[])uint64' | 'verify_uint64_init', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_init(byte[])uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_init(byte[])uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_init(byte[])uint64'] + }> + & Record<'verify_uint64_add(uint64,uint64)uint64' | 'verify_uint64_add', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_add(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_add(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_add(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_sub(uint64,uint64)uint64' | 'verify_uint64_sub', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_sub(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_sub(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_sub(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_mul(uint64,uint64)uint64' | 'verify_uint64_mul', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_mul(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_mul(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_mul(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_div(uint64,uint64)uint64' | 'verify_uint64_div', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_div(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_div(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_div(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_mod(uint64,uint64)uint64' | 'verify_uint64_mod', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_mod(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_mod(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_mod(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_and(uint64,uint64)uint64' | 'verify_uint64_and', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_and(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_and(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_and(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_or(uint64,uint64)uint64' | 'verify_uint64_or', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_or(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_or(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_or(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_xor(uint64,uint64)uint64' | 'verify_uint64_xor', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_xor(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_xor(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_xor(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_not(uint64)uint64' | 'verify_uint64_not', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_not(uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_not(uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_not(uint64)uint64'] + }> + & Record<'verify_uint64_lshift(uint64,uint64)uint64' | 'verify_uint64_lshift', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_lshift(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_lshift(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_lshift(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_rshift(uint64,uint64)uint64' | 'verify_uint64_rshift', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_rshift(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_rshift(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_rshift(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_pow(uint64,uint64)uint64' | 'verify_uint64_pow', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_pow(uint64,uint64)uint64'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_pow(uint64,uint64)uint64'] + returns: PrimitiveOpsContractReturns['verify_uint64_pow(uint64,uint64)uint64'] + }> + & Record<'verify_uint64_eq(uint64,uint64)bool' | 'verify_uint64_eq', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_eq(uint64,uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_eq(uint64,uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_uint64_eq(uint64,uint64)bool'] + }> + & Record<'verify_uint64_ne(uint64,uint64)bool' | 'verify_uint64_ne', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_ne(uint64,uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_ne(uint64,uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_uint64_ne(uint64,uint64)bool'] + }> + & Record<'verify_uint64_lt(uint64,uint64)bool' | 'verify_uint64_lt', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_lt(uint64,uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_lt(uint64,uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_uint64_lt(uint64,uint64)bool'] + }> + & Record<'verify_uint64_le(uint64,uint64)bool' | 'verify_uint64_le', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_le(uint64,uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_le(uint64,uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_uint64_le(uint64,uint64)bool'] + }> + & Record<'verify_uint64_gt(uint64,uint64)bool' | 'verify_uint64_gt', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_gt(uint64,uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_gt(uint64,uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_uint64_gt(uint64,uint64)bool'] + }> + & Record<'verify_uint64_ge(uint64,uint64)bool' | 'verify_uint64_ge', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_uint64_ge(uint64,uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_uint64_ge(uint64,uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_uint64_ge(uint64,uint64)bool'] + }> + & Record<'verify_bytes_init(uint64)byte[]' | 'verify_bytes_init', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_init(uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_init(uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_bytes_init(uint64)byte[]'] + }> + & Record<'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]' | 'verify_bytes_add', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'] + }> + & Record<'verify_bytes_eq(byte[],byte[])bool' | 'verify_bytes_eq', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_eq(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_eq(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_bytes_eq(byte[],byte[])bool'] + }> + & Record<'verify_bytes_ne(byte[],byte[])bool' | 'verify_bytes_ne', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_ne(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_ne(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_bytes_ne(byte[],byte[])bool'] + }> + & Record<'verify_bytes_and(byte[],byte[])byte[]' | 'verify_bytes_and', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_and(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_and(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_bytes_and(byte[],byte[])byte[]'] + }> + & Record<'verify_bytes_or(byte[],byte[])byte[]' | 'verify_bytes_or', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_or(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_or(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_bytes_or(byte[],byte[])byte[]'] + }> + & Record<'verify_bytes_xor(byte[],byte[])byte[]' | 'verify_bytes_xor', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_xor(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_xor(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_bytes_xor(byte[],byte[])byte[]'] + }> + & Record<'verify_bytes_not(byte[],uint64)byte[]' | 'verify_bytes_not', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_bytes_not(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_bytes_not(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_bytes_not(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_add(byte[],byte[])byte[]' | 'verify_biguint_add', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_add(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_add(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_add(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_add_uint64(byte[],uint64)byte[]' | 'verify_biguint_add_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_add_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_add_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_add_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_sub(byte[],byte[])byte[]' | 'verify_biguint_sub', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_sub(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_sub(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_sub(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_sub_uint64(byte[],uint64)byte[]' | 'verify_biguint_sub_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_sub_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_sub_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_sub_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_mul(byte[],byte[])byte[]' | 'verify_biguint_mul', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_mul(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_mul(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_mul(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_mul_uint64(byte[],uint64)byte[]' | 'verify_biguint_mul_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_mul_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_mul_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_mul_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_div(byte[],byte[])byte[]' | 'verify_biguint_div', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_div(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_div(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_div(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_div_uint64(byte[],uint64)byte[]' | 'verify_biguint_div_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_div_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_div_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_div_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_mod(byte[],byte[])byte[]' | 'verify_biguint_mod', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_mod(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_mod(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_mod(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_mod_uint64(byte[],uint64)byte[]' | 'verify_biguint_mod_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_mod_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_mod_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_mod_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_and(byte[],byte[])byte[]' | 'verify_biguint_and', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_and(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_and(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_and(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_and_uint64(byte[],uint64)byte[]' | 'verify_biguint_and_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_and_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_and_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_and_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_or(byte[],byte[])byte[]' | 'verify_biguint_or', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_or(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_or(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_or(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_or_uint64(byte[],uint64)byte[]' | 'verify_biguint_or_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_or_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_or_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_or_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_xor(byte[],byte[])byte[]' | 'verify_biguint_xor', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_xor(byte[],byte[])byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_xor(byte[],byte[])byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_xor(byte[],byte[])byte[]'] + }> + & Record<'verify_biguint_xor_uint64(byte[],uint64)byte[]' | 'verify_biguint_xor_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_xor_uint64(byte[],uint64)byte[]'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_xor_uint64(byte[],uint64)byte[]'] + returns: PrimitiveOpsContractReturns['verify_biguint_xor_uint64(byte[],uint64)byte[]'] + }> + & Record<'verify_biguint_eq(byte[],byte[])bool' | 'verify_biguint_eq', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_eq(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_eq(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_eq(byte[],byte[])bool'] + }> + & Record<'verify_biguint_eq_uint64(byte[],uint64)bool' | 'verify_biguint_eq_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_eq_uint64(byte[],uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_eq_uint64(byte[],uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_eq_uint64(byte[],uint64)bool'] + }> + & Record<'verify_biguint_ne(byte[],byte[])bool' | 'verify_biguint_ne', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_ne(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_ne(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_ne(byte[],byte[])bool'] + }> + & Record<'verify_biguint_ne_uint64(byte[],uint64)bool' | 'verify_biguint_ne_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_ne_uint64(byte[],uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_ne_uint64(byte[],uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_ne_uint64(byte[],uint64)bool'] + }> + & Record<'verify_biguint_lt(byte[],byte[])bool' | 'verify_biguint_lt', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_lt(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_lt(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_lt(byte[],byte[])bool'] + }> + & Record<'verify_biguint_lt_uint64(byte[],uint64)bool' | 'verify_biguint_lt_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_lt_uint64(byte[],uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_lt_uint64(byte[],uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_lt_uint64(byte[],uint64)bool'] + }> + & Record<'verify_biguint_le(byte[],byte[])bool' | 'verify_biguint_le', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_le(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_le(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_le(byte[],byte[])bool'] + }> + & Record<'verify_biguint_le_uint64(byte[],uint64)bool' | 'verify_biguint_le_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_le_uint64(byte[],uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_le_uint64(byte[],uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_le_uint64(byte[],uint64)bool'] + }> + & Record<'verify_biguint_gt(byte[],byte[])bool' | 'verify_biguint_gt', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_gt(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_gt(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_gt(byte[],byte[])bool'] + }> + & Record<'verify_biguint_gt_uint64(byte[],uint64)bool' | 'verify_biguint_gt_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_gt_uint64(byte[],uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_gt_uint64(byte[],uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_gt_uint64(byte[],uint64)bool'] + }> + & Record<'verify_biguint_ge(byte[],byte[])bool' | 'verify_biguint_ge', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_ge(byte[],byte[])bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_ge(byte[],byte[])bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_ge(byte[],byte[])bool'] + }> + & Record<'verify_biguint_ge_uint64(byte[],uint64)bool' | 'verify_biguint_ge_uint64', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_biguint_ge_uint64(byte[],uint64)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_biguint_ge_uint64(byte[],uint64)bool'] + returns: PrimitiveOpsContractReturns['verify_biguint_ge_uint64(byte[],uint64)bool'] + }> + & Record<'verify_string_init(string)string' | 'verify_string_init', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_string_init(string)string'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_string_init(string)string'] + returns: PrimitiveOpsContractReturns['verify_string_init(string)string'] + }> + & Record<'verify_string_startswith(string,string)bool' | 'verify_string_startswith', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_string_startswith(string,string)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_string_startswith(string,string)bool'] + returns: PrimitiveOpsContractReturns['verify_string_startswith(string,string)bool'] + }> + & Record<'verify_string_endswith(string,string)bool' | 'verify_string_endswith', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_string_endswith(string,string)bool'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_string_endswith(string,string)bool'] + returns: PrimitiveOpsContractReturns['verify_string_endswith(string,string)bool'] + }> + & Record<'verify_string_join(string,string)string' | 'verify_string_join', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_string_join(string,string)string'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_string_join(string,string)string'] + returns: PrimitiveOpsContractReturns['verify_string_join(string,string)string'] + }> + & Record<'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void' | 'verify_log', { + argsObj: PrimitiveOpsContractArgs['obj']['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'] + argsTuple: PrimitiveOpsContractArgs['tuple']['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'] + returns: PrimitiveOpsContractReturns['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type PrimitiveOpsContractSignatures = keyof PrimitiveOpsContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type PrimitiveOpsContractNonVoidMethodSignatures = keyof PrimitiveOpsContractTypes['methods'] extends infer T ? T extends keyof PrimitiveOpsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the PrimitiveOpsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = PrimitiveOpsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the PrimitiveOpsContract smart contract to the method's return type + */ +export type MethodReturn = PrimitiveOpsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type PrimitiveOpsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type PrimitiveOpsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: PrimitiveOpsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the PrimitiveOpsContract smart contract + */ +export abstract class PrimitiveOpsContractParamsFactory { + /** + * Constructs a no op call for the verify_uint64_init(byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Init(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_init(byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.rawValue], + } + } + /** + * Constructs a no op call for the verify_uint64_add(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Add(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_add(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_sub(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Sub(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_sub(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_mul(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Mul(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_mul(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_div(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Div(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_div(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_mod(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Mod(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_mod(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_and(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64And(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_and(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_or(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Or(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_or(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_xor(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Xor(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_xor(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_not(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Not(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_not(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_uint64_lshift(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Lshift(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_lshift(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_rshift(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Rshift(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_rshift(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_pow(uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Pow(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_pow(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_eq(uint64,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Eq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_eq(uint64,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_ne(uint64,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Ne(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_ne(uint64,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_lt(uint64,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Lt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_lt(uint64,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_le(uint64,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Le(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_le(uint64,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_gt(uint64,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Gt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_gt(uint64,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_uint64_ge(uint64,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyUint64Ge(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_uint64_ge(uint64,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_bytes_init(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_init(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.rawValue], + } + } + /** + * Constructs a no op call for the verify_bytes_add(byte[],byte[],uint64,uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesAdd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_add(byte[],byte[],uint64,uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.padASize, params.args.padBSize], + } + } + /** + * Constructs a no op call for the verify_bytes_eq(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_eq(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_bytes_ne(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_ne(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_bytes_and(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesAnd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_and(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_bytes_or(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesOr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_or(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_bytes_xor(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesXor(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_xor(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_bytes_not(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBytesNot(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_bytes_not(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.padSize], + } + } + /** + * Constructs a no op call for the verify_biguint_add(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintAdd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_add(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_add_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintAddUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_add_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_sub(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintSub(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_sub(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_sub_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintSubUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_sub_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_mul(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintMul(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_mul(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_mul_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintMulUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_mul_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_div(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintDiv(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_div(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_div_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintDivUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_div_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_mod(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintMod(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_mod(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_mod_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintModUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_mod_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_and(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintAnd(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_and(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_and_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintAndUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_and_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_or(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintOr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_or(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_or_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintOrUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_or_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_xor(byte[],byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintXor(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_xor(byte[],byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_xor_uint64(byte[],uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintXorUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_xor_uint64(byte[],uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_eq(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintEq(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_eq(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_eq_uint64(byte[],uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintEqUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_eq_uint64(byte[],uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_ne(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintNe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_ne(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_ne_uint64(byte[],uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintNeUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_ne_uint64(byte[],uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_lt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintLt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_lt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_lt_uint64(byte[],uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintLtUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_lt_uint64(byte[],uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_le(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintLe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_le(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_le_uint64(byte[],uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintLeUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_le_uint64(byte[],uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_gt(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintGt(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_gt(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_gt_uint64(byte[],uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintGtUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_gt_uint64(byte[],uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_ge(byte[],byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintGe(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_ge(byte[],byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_biguint_ge_uint64(byte[],uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyBiguintGeUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_biguint_ge_uint64(byte[],uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_string_init(string)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringInit(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_init(string)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_string_startswith(string,string)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringStartswith(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_startswith(string,string)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_string_endswith(string,string)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringEndswith(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_endswith(string,string)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_string_join(string,string)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyStringJoin(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_string_join(string,string)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyLog(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c, params.args.d, params.args.e, params.args.f, params.args.g, params.args.h, params.args.i, params.args.j, params.args.k, params.args.m, params.args.n, params.args.o], + } + } +} + +/** + * A factory to create and deploy one or more instance of the PrimitiveOpsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class PrimitiveOpsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `PrimitiveOpsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new PrimitiveOpsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new PrimitiveOpsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the PrimitiveOpsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: PrimitiveOpsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new PrimitiveOpsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the PrimitiveOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the PrimitiveOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the PrimitiveOpsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new PrimitiveOpsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the PrimitiveOpsContract smart contract + */ +export class PrimitiveOpsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `PrimitiveOpsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the PrimitiveOpsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `PrimitiveOpsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `PrimitiveOpsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new PrimitiveOpsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `PrimitiveOpsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new PrimitiveOpsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the PrimitiveOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_init(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Init: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Init(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_add(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Add: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Add(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_sub(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Sub: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Sub(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mul(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Mul: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Mul(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_div(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Div: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Div(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mod(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Mod: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Mod(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_and(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64And: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64And(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_or(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Or: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Or(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_xor(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Xor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Xor(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_not(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Not: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Not(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lshift(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Lshift: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Lshift(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_rshift(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Rshift: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Rshift(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_pow(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Pow: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Pow(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_eq(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Eq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Eq(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ne(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Ne: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Ne(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lt(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Lt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Lt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_le(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Le: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Le(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_gt(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Gt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Gt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ge(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyUint64Ge: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyUint64Ge(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_init(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesInit(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_add(byte[],byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesAdd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesEq(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesNe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_and(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesAnd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesAnd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_or(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesOr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesOr(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_xor(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesXor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesXor(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_not(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBytesNot: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBytesNot(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintAdd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintAddUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintAddUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintSub: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintSub(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintSubUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintSubUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintMul: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintMul(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintMulUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintMulUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintDiv: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintDiv(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintDivUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintDivUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintMod: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintMod(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintModUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintModUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintAnd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintAnd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintAndUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintAndUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintOr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintOr(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintOrUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintOrUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintXor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintXor(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintXorUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintXorUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintEq(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintEqUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintEqUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintNe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintNeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintNeUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintLt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintLtUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintLtUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintLe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintLeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintLeUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintGt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintGtUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintGtUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintGe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyBiguintGeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyBiguintGeUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyStringInit(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_startswith(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringStartswith: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyStringStartswith(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_endswith(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringEndswith: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyStringEndswith(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_join(string,string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyStringJoin: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyStringJoin(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(PrimitiveOpsContractParamsFactory.verifyLog(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the PrimitiveOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_init(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Init: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Init(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_add(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Add: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Add(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_sub(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Sub: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Sub(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mul(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Mul: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Mul(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_div(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Div: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Div(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mod(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Mod: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Mod(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_and(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64And: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64And(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_or(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Or: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Or(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_xor(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Xor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Xor(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_not(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Not: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Not(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lshift(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Lshift: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Lshift(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_rshift(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Rshift: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Rshift(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_pow(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Pow: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Pow(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_eq(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Eq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Eq(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ne(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Ne: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Ne(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lt(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Lt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Lt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_le(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Le: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Le(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_gt(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Gt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Gt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ge(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyUint64Ge: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyUint64Ge(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_init(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesInit(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_add(byte[],byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesAdd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesEq(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesNe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_and(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesAnd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesAnd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_or(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesOr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesOr(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_xor(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesXor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesXor(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_not(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBytesNot: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBytesNot(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintAdd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintAdd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintAddUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintAddUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintSub: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintSub(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintSubUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintSubUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintMul: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintMul(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintMulUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintMulUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintDiv: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintDiv(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintDivUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintDivUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintMod: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintMod(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintModUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintModUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintAnd: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintAnd(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintAndUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintAndUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintOr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintOr(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintOrUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintOrUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintXor: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintXor(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintXorUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintXorUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintEq: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintEq(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintEqUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintEqUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintNe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintNe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintNeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintNeUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintLt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintLt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintLtUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintLtUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintLe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintLe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintLeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintLeUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintGt: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintGt(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintGtUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintGtUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintGe: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintGe(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyBiguintGeUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyBiguintGeUint64(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringInit: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyStringInit(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_startswith(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringStartswith: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyStringStartswith(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_endswith(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringEndswith: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyStringEndswith(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_join(string,string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyStringJoin: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyStringJoin(params)) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyLog: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(PrimitiveOpsContractParamsFactory.verifyLog(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the PrimitiveOpsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_init(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Init: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Init(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_init(byte[])uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_add(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Add: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Add(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_add(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_sub(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Sub: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Sub(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_sub(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mul(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Mul: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Mul(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_mul(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_div(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Div: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Div(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_div(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_mod(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Mod: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Mod(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_mod(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_and(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64And: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64And(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_and(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_or(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Or: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Or(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_or(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_xor(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Xor: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Xor(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_xor(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_not(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Not: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Not(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_not(uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lshift(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Lshift: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Lshift(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_lshift(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_rshift(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Rshift: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Rshift(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_rshift(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_pow(uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Pow: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Pow(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_pow(uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_eq(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Eq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Eq(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_eq(uint64,uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ne(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Ne: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Ne(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_ne(uint64,uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_lt(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Lt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Lt(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_lt(uint64,uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_le(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Le: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Le(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_le(uint64,uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_gt(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Gt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Gt(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_gt(uint64,uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_uint64_ge(uint64,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyUint64Ge: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyUint64Ge(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_uint64_ge(uint64,uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_init(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesInit(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_init(uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_add(byte[],byte[],uint64,uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesAdd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesAdd(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesEq(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_eq(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesNe(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_ne(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_and(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesAnd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesAnd(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_and(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_or(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesOr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesOr(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_or(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_xor(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesXor: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesXor(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_xor(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_bytes_not(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBytesNot: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBytesNot(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_bytes_not(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintAdd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintAdd(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_add(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_add_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintAddUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintAddUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_add_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintSub: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintSub(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_sub(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_sub_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintSubUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintSubUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_sub_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintMul: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintMul(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_mul(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mul_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintMulUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintMulUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_mul_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintDiv: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintDiv(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_div(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_div_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintDivUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintDivUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_div_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintMod: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintMod(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_mod(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_mod_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintModUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintModUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_mod_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintAnd: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintAnd(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_and(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_and_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintAndUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintAndUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_and_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintOr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintOr(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_or(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_or_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintOrUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintOrUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_or_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor(byte[],byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintXor: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintXor(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_xor(byte[],byte[])byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_xor_uint64(byte[],uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintXorUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintXorUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_xor_uint64(byte[],uint64)byte[]'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintEq: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintEq(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_eq(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_eq_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintEqUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintEqUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_eq_uint64(byte[],uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintNe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintNe(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_ne(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ne_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintNeUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintNeUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_ne_uint64(byte[],uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintLt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintLt(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_lt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_lt_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintLtUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintLtUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_lt_uint64(byte[],uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintLe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintLe(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_le(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_le_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintLeUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintLeUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_le_uint64(byte[],uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintGt: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintGt(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_gt(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_gt_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintGtUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintGtUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_gt_uint64(byte[],uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge(byte[],byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintGe: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintGe(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_ge(byte[],byte[])bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_biguint_ge_uint64(byte[],uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyBiguintGeUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyBiguintGeUint64(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_biguint_ge_uint64(byte[],uint64)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_init(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringInit: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyStringInit(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_string_init(string)string'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_startswith(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringStartswith: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyStringStartswith(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_string_startswith(string,string)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_endswith(string,string)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringEndswith: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyStringEndswith(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_string_endswith(string,string)bool'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_string_join(string,string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyStringJoin: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyStringJoin(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_string_join(string,string)string'])} + }, + + /** + * Makes a call to the PrimitiveOpsContract smart contract using the `verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyLog: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(PrimitiveOpsContractParamsFactory.verifyLog(params)) + return {...result, return: result.return as unknown as (undefined | PrimitiveOpsContractReturns['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new PrimitiveOpsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current PrimitiveOpsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): PrimitiveOpsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_uint64_init(byte[])uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Init(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Init(params))) + return this + }, + /** + * Add a verify_uint64_add(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Add(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Add(params))) + return this + }, + /** + * Add a verify_uint64_sub(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Sub(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Sub(params))) + return this + }, + /** + * Add a verify_uint64_mul(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Mul(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Mul(params))) + return this + }, + /** + * Add a verify_uint64_div(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Div(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Div(params))) + return this + }, + /** + * Add a verify_uint64_mod(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Mod(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Mod(params))) + return this + }, + /** + * Add a verify_uint64_and(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64And(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64And(params))) + return this + }, + /** + * Add a verify_uint64_or(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Or(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Or(params))) + return this + }, + /** + * Add a verify_uint64_xor(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Xor(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Xor(params))) + return this + }, + /** + * Add a verify_uint64_not(uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Not(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Not(params))) + return this + }, + /** + * Add a verify_uint64_lshift(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Lshift(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Lshift(params))) + return this + }, + /** + * Add a verify_uint64_rshift(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Rshift(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Rshift(params))) + return this + }, + /** + * Add a verify_uint64_pow(uint64,uint64)uint64 method call against the PrimitiveOpsContract contract + */ + verifyUint64Pow(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Pow(params))) + return this + }, + /** + * Add a verify_uint64_eq(uint64,uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyUint64Eq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Eq(params))) + return this + }, + /** + * Add a verify_uint64_ne(uint64,uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyUint64Ne(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Ne(params))) + return this + }, + /** + * Add a verify_uint64_lt(uint64,uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyUint64Lt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Lt(params))) + return this + }, + /** + * Add a verify_uint64_le(uint64,uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyUint64Le(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Le(params))) + return this + }, + /** + * Add a verify_uint64_gt(uint64,uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyUint64Gt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Gt(params))) + return this + }, + /** + * Add a verify_uint64_ge(uint64,uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyUint64Ge(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyUint64Ge(params))) + return this + }, + /** + * Add a verify_bytes_init(uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBytesInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesInit(params))) + return this + }, + /** + * Add a verify_bytes_add(byte[],byte[],uint64,uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBytesAdd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesAdd(params))) + return this + }, + /** + * Add a verify_bytes_eq(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBytesEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesEq(params))) + return this + }, + /** + * Add a verify_bytes_ne(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBytesNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesNe(params))) + return this + }, + /** + * Add a verify_bytes_and(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBytesAnd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesAnd(params))) + return this + }, + /** + * Add a verify_bytes_or(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBytesOr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesOr(params))) + return this + }, + /** + * Add a verify_bytes_xor(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBytesXor(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesXor(params))) + return this + }, + /** + * Add a verify_bytes_not(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBytesNot(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBytesNot(params))) + return this + }, + /** + * Add a verify_biguint_add(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintAdd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintAdd(params))) + return this + }, + /** + * Add a verify_biguint_add_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintAddUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintAddUint64(params))) + return this + }, + /** + * Add a verify_biguint_sub(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintSub(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintSub(params))) + return this + }, + /** + * Add a verify_biguint_sub_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintSubUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintSubUint64(params))) + return this + }, + /** + * Add a verify_biguint_mul(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintMul(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintMul(params))) + return this + }, + /** + * Add a verify_biguint_mul_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintMulUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintMulUint64(params))) + return this + }, + /** + * Add a verify_biguint_div(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintDiv(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintDiv(params))) + return this + }, + /** + * Add a verify_biguint_div_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintDivUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintDivUint64(params))) + return this + }, + /** + * Add a verify_biguint_mod(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintMod(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintMod(params))) + return this + }, + /** + * Add a verify_biguint_mod_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintModUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintModUint64(params))) + return this + }, + /** + * Add a verify_biguint_and(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintAnd(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintAnd(params))) + return this + }, + /** + * Add a verify_biguint_and_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintAndUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintAndUint64(params))) + return this + }, + /** + * Add a verify_biguint_or(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintOr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintOr(params))) + return this + }, + /** + * Add a verify_biguint_or_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintOrUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintOrUint64(params))) + return this + }, + /** + * Add a verify_biguint_xor(byte[],byte[])byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintXor(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintXor(params))) + return this + }, + /** + * Add a verify_biguint_xor_uint64(byte[],uint64)byte[] method call against the PrimitiveOpsContract contract + */ + verifyBiguintXorUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintXorUint64(params))) + return this + }, + /** + * Add a verify_biguint_eq(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintEq(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintEq(params))) + return this + }, + /** + * Add a verify_biguint_eq_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintEqUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintEqUint64(params))) + return this + }, + /** + * Add a verify_biguint_ne(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintNe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintNe(params))) + return this + }, + /** + * Add a verify_biguint_ne_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintNeUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintNeUint64(params))) + return this + }, + /** + * Add a verify_biguint_lt(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintLt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintLt(params))) + return this + }, + /** + * Add a verify_biguint_lt_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintLtUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintLtUint64(params))) + return this + }, + /** + * Add a verify_biguint_le(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintLe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintLe(params))) + return this + }, + /** + * Add a verify_biguint_le_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintLeUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintLeUint64(params))) + return this + }, + /** + * Add a verify_biguint_gt(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintGt(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintGt(params))) + return this + }, + /** + * Add a verify_biguint_gt_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintGtUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintGtUint64(params))) + return this + }, + /** + * Add a verify_biguint_ge(byte[],byte[])bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintGe(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintGe(params))) + return this + }, + /** + * Add a verify_biguint_ge_uint64(byte[],uint64)bool method call against the PrimitiveOpsContract contract + */ + verifyBiguintGeUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyBiguintGeUint64(params))) + return this + }, + /** + * Add a verify_string_init(string)string method call against the PrimitiveOpsContract contract + */ + verifyStringInit(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringInit(params))) + return this + }, + /** + * Add a verify_string_startswith(string,string)bool method call against the PrimitiveOpsContract contract + */ + verifyStringStartswith(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringStartswith(params))) + return this + }, + /** + * Add a verify_string_endswith(string,string)bool method call against the PrimitiveOpsContract contract + */ + verifyStringEndswith(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringEndswith(params))) + return this + }, + /** + * Add a verify_string_join(string,string)string method call against the PrimitiveOpsContract contract + */ + verifyStringJoin(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyStringJoin(params))) + return this + }, + /** + * Add a verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void method call against the PrimitiveOpsContract contract + */ + verifyLog(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyLog(params))) + return this + }, + /** + * Add a clear state call to the PrimitiveOpsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as PrimitiveOpsContractComposer + } +} +export type PrimitiveOpsContractComposer = { + /** + * Calls the verify_uint64_init(byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Init(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_init(byte[])uint64'] | undefined]> + + /** + * Calls the verify_uint64_add(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Add(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_add(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_sub(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Sub(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_sub(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_mul(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Mul(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_mul(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_div(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Div(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_div(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_mod(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Mod(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_mod(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_and(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64And(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_and(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_or(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Or(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_or(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_xor(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Xor(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_xor(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_not(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Not(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_not(uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_lshift(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Lshift(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_lshift(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_rshift(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Rshift(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_rshift(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_pow(uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Pow(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_pow(uint64,uint64)uint64'] | undefined]> + + /** + * Calls the verify_uint64_eq(uint64,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Eq(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_eq(uint64,uint64)bool'] | undefined]> + + /** + * Calls the verify_uint64_ne(uint64,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Ne(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_ne(uint64,uint64)bool'] | undefined]> + + /** + * Calls the verify_uint64_lt(uint64,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Lt(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_lt(uint64,uint64)bool'] | undefined]> + + /** + * Calls the verify_uint64_le(uint64,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Le(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_le(uint64,uint64)bool'] | undefined]> + + /** + * Calls the verify_uint64_gt(uint64,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Gt(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_gt(uint64,uint64)bool'] | undefined]> + + /** + * Calls the verify_uint64_ge(uint64,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyUint64Ge(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_uint64_ge(uint64,uint64)bool'] | undefined]> + + /** + * Calls the verify_bytes_init(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesInit(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_init(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_bytes_add(byte[],byte[],uint64,uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesAdd(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_add(byte[],byte[],uint64,uint64)byte[]'] | undefined]> + + /** + * Calls the verify_bytes_eq(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesEq(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_eq(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_bytes_ne(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesNe(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_ne(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_bytes_and(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesAnd(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_and(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_bytes_or(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesOr(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_or(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_bytes_xor(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesXor(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_xor(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_bytes_not(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBytesNot(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_bytes_not(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_add(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintAdd(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_add(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_add_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintAddUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_add_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_sub(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintSub(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_sub(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_sub_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintSubUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_sub_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_mul(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintMul(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_mul(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_mul_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintMulUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_mul_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_div(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintDiv(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_div(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_div_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintDivUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_div_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_mod(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintMod(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_mod(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_mod_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintModUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_mod_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_and(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintAnd(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_and(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_and_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintAndUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_and_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_or(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintOr(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_or(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_or_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintOrUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_or_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_xor(byte[],byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintXor(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_xor(byte[],byte[])byte[]'] | undefined]> + + /** + * Calls the verify_biguint_xor_uint64(byte[],uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintXorUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_xor_uint64(byte[],uint64)byte[]'] | undefined]> + + /** + * Calls the verify_biguint_eq(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintEq(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_eq(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguint_eq_uint64(byte[],uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintEqUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_eq_uint64(byte[],uint64)bool'] | undefined]> + + /** + * Calls the verify_biguint_ne(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintNe(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_ne(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguint_ne_uint64(byte[],uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintNeUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_ne_uint64(byte[],uint64)bool'] | undefined]> + + /** + * Calls the verify_biguint_lt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintLt(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_lt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguint_lt_uint64(byte[],uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintLtUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_lt_uint64(byte[],uint64)bool'] | undefined]> + + /** + * Calls the verify_biguint_le(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintLe(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_le(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguint_le_uint64(byte[],uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintLeUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_le_uint64(byte[],uint64)bool'] | undefined]> + + /** + * Calls the verify_biguint_gt(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintGt(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_gt(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguint_gt_uint64(byte[],uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintGtUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_gt_uint64(byte[],uint64)bool'] | undefined]> + + /** + * Calls the verify_biguint_ge(byte[],byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintGe(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_ge(byte[],byte[])bool'] | undefined]> + + /** + * Calls the verify_biguint_ge_uint64(byte[],uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyBiguintGeUint64(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_biguint_ge_uint64(byte[],uint64)bool'] | undefined]> + + /** + * Calls the verify_string_init(string)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringInit(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_string_init(string)string'] | undefined]> + + /** + * Calls the verify_string_startswith(string,string)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringStartswith(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_string_startswith(string,string)bool'] | undefined]> + + /** + * Calls the verify_string_endswith(string,string)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringEndswith(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_string_endswith(string,string)bool'] | undefined]> + + /** + * Calls the verify_string_join(string,string)string ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyStringJoin(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_string_join(string,string)string'] | undefined]> + + /** + * Calls the verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyLog(params?: CallParams): PrimitiveOpsContractComposer<[...TReturns, PrimitiveOpsContractReturns['verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the PrimitiveOpsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): PrimitiveOpsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): PrimitiveOpsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type PrimitiveOpsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/README.md b/examples/p-py/projects/p-py-frontend/src/contracts/README.md new file mode 100644 index 0000000..04629b1 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/README.md @@ -0,0 +1,14 @@ +## How to connect my web app with Algorand smart contracts? + +The following folder is reserved for the Algorand Application Clients. The clients are used to interact with instances of Algorand Smart Contracts (ASC1s) deployed on-chain. + +To integrate this react frontend template with your smart contracts codebase, perform the following steps: + +1. Generate the typed client using `algokit generate client -l typescript -o {path/to/this/folder}` or using the dedicated `link` command `algokit project link` (ensure to invoke it from the root of this react project). Using the `link` command is especially useful within workspaces that have multiple contract projects. +2. The generated typescript client should be ready to be imported and used in this react frontend template, making it a full fledged dApp. + +> Please note, by default this template defines `"generate:app-clients": "algokit project link --all"` which is a shortcut to automatically link TEAL code from all `contract` projects in the workspace as typed clients into the `frontend` project that is invoking the `link` command. Refer to [documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/link.md) to read more about `link` command. + +## **How to interact with the smart contract?** + +The generated client provides a set of functions that can be used to interact with the ABI (Application Binary Interface) compliant Algorand smart contract. For example, if the smart contract has a function called `hello`, the generated client will have a function called `hello` that can be used to interact with the smart contract. Refer to a [full-stack end-to-end starter template](https://github.com/algorandfoundation/algokit-fullstack-template) for a reference example on invoking and interacting with typescript typed clients generated. diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/SignaturesContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/SignaturesContract.ts new file mode 100644 index 0000000..e810782 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/SignaturesContract.ts @@ -0,0 +1,1203 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"SignaturesContract","structs":{"AnotherStruct":[{"name":"one","type":"uint64"},{"name":"two","type":"string"}],"MyStruct":[{"name":"anotherStruct","type":"AnotherStruct"},{"name":"anotherStructAlias","type":"AnotherStruct"},{"name":"three","type":"uint128"},{"name":"four","type":"uint128"}]},"methods":[{"name":"create","args":[],"returns":{"type":"void"},"actions":{"create":["NoOp"],"call":[]},"readonly":false,"events":[],"recommendations":{}},{"name":"sink","args":[{"type":"string","name":"value"},{"type":"uint8[]","name":"arr"},{"type":"byte[4]","name":"fixed_bytes"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"alias","args":[{"type":"string","name":"value"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"with_txn","args":[{"type":"string","name":"value"},{"type":"pay","name":"pay"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"with_asset","args":[{"type":"string","name":"value"},{"type":"asset","name":"asset"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"with_app","args":[{"type":"string","name":"value"},{"type":"application","name":"app"},{"type":"uint64","name":"app_id"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"with_acc","args":[{"type":"string","name":"value"},{"type":"account","name":"acc"},{"type":"uint8[]","name":"arr"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"complex_sig","args":[{"type":"((uint64,string),(uint64,string),uint128,uint128)","struct":"MyStruct","name":"struct1"},{"type":"txn","name":"txn"},{"type":"account","name":"acc"},{"type":"uint8[]","name":"five"}],"returns":{"type":"((uint64,string),((uint64,string),(uint64,string),uint128,uint128))"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"echo_resource_by_index","args":[{"type":"asset","name":"asset"},{"type":"application","name":"app"},{"type":"account","name":"acc"}],"returns":{"type":"(uint64,uint64,address)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"echo_resource_by_value","args":[{"type":"uint64","name":"asset"},{"type":"uint64","name":"app"},{"type":"address","name":"acc"}],"returns":{"type":"(uint64,uint64,address)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":[],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[348,353,547,552],"errorMessage":"account funded"},{"pc":[284],"errorMessage":"application exists"},{"pc":[242],"errorMessage":"asset exists"},{"pc":[639],"errorMessage":"expected account to be passed by index"},{"pc":[693],"errorMessage":"expected account to be passed by value"},{"pc":[280],"errorMessage":"expected app id to match provided app id"},{"pc":[629],"errorMessage":"expected application to be passed by index"},{"pc":[687],"errorMessage":"expected application to be passed by value"},{"pc":[619],"errorMessage":"expected asset to be passed by index"},{"pc":[679],"errorMessage":"expected asset to be passed by value"},{"pc":[138],"errorMessage":"expected global to have app address"},{"pc":[132],"errorMessage":"expected global to have app id"},{"pc":[288],"errorMessage":"expected other app to have same creator"},{"pc":[143,147],"errorMessage":"expected txn to have 0"},{"pc":[392],"errorMessage":"invalid array length header"},{"pc":[400],"errorMessage":"invalid number of bytes for arc4.dynamic_array"},{"pc":[671],"errorMessage":"invalid number of bytes for arc4.static_array"},{"pc":[129,294],"errorMessage":"transaction type is appl"},{"pc":[190],"errorMessage":"transaction type is pay"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgNiAxMjMKICAgIGJ5dGVjYmxvY2sgMHgwMDAwIDB4MTUxZjdjNzUgMHgwMDAwMDAwMDAwMDAwMDAxIDB4MDAwMTMyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyNQogICAgLy8gY2xhc3MgU2lnbmF0dXJlc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDEzCiAgICBwdXNoYnl0ZXNzIDB4MmUwMTc4MWUgMHgzYjA1Y2YxNyAweDA2NThkY2MzIDB4NWI2NDQ3ZGUgMHgwNjFmNGU3NyAweGVhYTg5MTM5IDB4NTEwZTcyYTQgMHhkNmMyYWM3ZiAweDQ4MTQyZDVlIC8vIG1ldGhvZCAic2luayhzdHJpbmcsdWludDhbXSxieXRlWzRdKXZvaWQiLCBtZXRob2QgImFsaWFzKHN0cmluZyx1aW50OFtdKXZvaWQiLCBtZXRob2QgIndpdGhfdHhuKHN0cmluZyxwYXksdWludDhbXSl2b2lkIiwgbWV0aG9kICJ3aXRoX2Fzc2V0KHN0cmluZyxhc3NldCx1aW50OFtdKXZvaWQiLCBtZXRob2QgIndpdGhfYXBwKHN0cmluZyxhcHBsaWNhdGlvbix1aW50NjQsdWludDhbXSl2b2lkIiwgbWV0aG9kICJ3aXRoX2FjYyhzdHJpbmcsYWNjb3VudCx1aW50OFtdKXZvaWQiLCBtZXRob2QgImNvbXBsZXhfc2lnKCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpLHVpbnQxMjgsdWludDEyOCksdHhuLGFjY291bnQsdWludDhbXSkoKHVpbnQ2NCxzdHJpbmcpLCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpLHVpbnQxMjgsdWludDEyOCkpIiwgbWV0aG9kICJlY2hvX3Jlc291cmNlX2J5X2luZGV4KGFzc2V0LGFwcGxpY2F0aW9uLGFjY291bnQpKHVpbnQ2NCx1aW50NjQsYWRkcmVzcykiLCBtZXRob2QgImVjaG9fcmVzb3VyY2VfYnlfdmFsdWUodWludDY0LHVpbnQ2NCxhZGRyZXNzKSh1aW50NjQsdWludDY0LGFkZHJlc3MpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggc2luayBzaW5rMiB3aXRoX3R4biB3aXRoX2Fzc2V0IHdpdGhfYXBwIHdpdGhfYWNjIGNvbXBsZXhfc2lnIGVjaG9fcmVzb3VyY2VfYnlfaW5kZXggZWNob19yZXNvdXJjZV9ieV92YWx1ZQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjUKICAgIC8vIGNsYXNzIFNpZ25hdHVyZXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgcHVzaGJ5dGVzIDB4NGM1YzYxYmEgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGUKICAgIGVycgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyOAogICAgLy8gYXBwX3R4biA9IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24oMCkKICAgIGludGNfMSAvLyAwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyOQogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkICE9IDAsICJleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgaWQiCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzICE9IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozMC0zMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzICE9IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIC8vICksICJleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgYWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjgKICAgIC8vIGFwcF90eG4gPSBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKDApCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzMKICAgIC8vIGFzc2VydCBhcHBfdHhuLmFwcF9pZCA9PSAwLCAiZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMCIKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBleHBlY3RlZCB0eG4gdG8gaGF2ZSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozNAogICAgLy8gYXNzZXJ0IFR4bi5hcHBsaWNhdGlvbl9pZCA9PSAwLCAiZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMCIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5zaW5rW3JvdXRpbmddKCkgLT4gdm9pZDoKc2luazoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QodmFsaWRhdGVfZW5jb2Rpbmc9InVuc2FmZV9kaXNhYmxlZCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0MAogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDEKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHZhbGlkYXRlX2VuY29kaW5nPSJ1bnNhZmVfZGlzYWJsZWQiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5zaW5rMltyb3V0aW5nXSgpIC0+IHZvaWQ6CnNpbmsyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPSJhbGlhcyIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0NgogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDcKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9ImFsaWFzIikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF90eG5bcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX3R4bjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTEKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgdW5jb3ZlciAyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTIKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1MwogICAgLy8gYXNzZXJ0IHBheS5ncm91cF9pbmRleCA9PSAwCiAgICBkdXAKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTQKICAgIC8vIGFzc2VydCBUeG4uZ3JvdXBfaW5kZXggPT0gMQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1NQogICAgLy8gYXNzZXJ0IHBheS5hbW91bnQgPT0gMTIzCiAgICBndHhucyBBbW91bnQKICAgIGludGNfMyAvLyAxMjMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hc3NldFtyb3V0aW5nXSgpIC0+IHZvaWQ6CndpdGhfYXNzZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBhc3NlcnQgdmFsdWUKICAgIHVuY292ZXIgMgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBhc3NlcnQgYXJyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjEKICAgIC8vIGFzc2VydCBhc3NldC50b3RhbCA9PSAxMjMKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpbnRjXzMgLy8gMTIzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo2MgogICAgLy8gYXNzZXJ0IFR4bi5hc3NldHMoMCkgPT0gYXNzZXQKICAgIHR4bmEgQXNzZXRzIDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hcHBbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX2FwcDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjgKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgdW5jb3ZlciAzCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjkKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3MAogICAgLy8gYXNzZXJ0IGFwcC5pZCA9PSBhcHBfaWQsICJleHBlY3RlZCBhcHAgaWQgdG8gbWF0Y2ggcHJvdmlkZWQgYXBwIGlkIgogICAgZGlnIDEKICAgIGl0b2IKICAgIGI9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcCBpZCB0byBtYXRjaCBwcm92aWRlZCBhcHAgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBhc3NlcnQgYXBwLmNyZWF0b3IgPT0gb3AuR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgImV4cGVjdGVkIG90aGVyIGFwcCB0byBoYXZlIHNhbWUgY3JlYXRvciIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG90aGVyIGFwcCB0byBoYXZlIHNhbWUgY3JlYXRvcgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NzIKICAgIC8vIGFwcF90eG4gPSBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKDApCiAgICBpbnRjXzEgLy8gMAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjczCiAgICAvLyBhc3NlcnQgYXBwX3R4bi5hcHBzKDApID09IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkCiAgICBkdXAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25zCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9ucygwKSA9PSBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZAogICAgdHhuYSBBcHBsaWNhdGlvbnMgMAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3MgogICAgLy8gYXBwX3R4biA9IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24oMCkKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3NQogICAgLy8gYXNzZXJ0IGFwcF90eG4uYXBwcygxKSA9PSBhcHAKICAgIGludGNfMCAvLyAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9ucwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9ucygxKSA9PSBhcHAKICAgIHR4bmEgQXBwbGljYXRpb25zIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hY2Nbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX2FjYzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4MAogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4MQogICAgLy8gYXNzZXJ0IGFycgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBhc3NlcnQgYWNjLmJhbGFuY2UgPT0gYWNjLm1pbl9iYWxhbmNlICsgMTIzNAogICAgZHVwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBwdXNoaW50IDEyMzQKICAgICsKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBhc3NlcnQgVHhuLmFjY291bnRzKDApID09IFR4bi5zZW5kZXIKICAgIHR4bmEgQWNjb3VudHMgMAogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6ODQKICAgIC8vIGFzc2VydCBUeG4uYWNjb3VudHMoMSkgPT0gYWNjCiAgICB0eG5hIEFjY291bnRzIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3QuY29tcGxleF9zaWdbcm91dGluZ10oKSAtPiB2b2lkOgpjb21wbGV4X3NpZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBmaXZlLnZhbGlkYXRlKCkKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5MQogICAgLy8gYXNzZXJ0IFR4bi5udW1fYXBwX2FyZ3MgPT0gNAogICAgdHhuIE51bUFwcEFyZ3MKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTItOTMKICAgIC8vICMgc3RydWN0CiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdC5vbmUgPT0gMQogICAgZGlnIDMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDQKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyA1CiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4CiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjkyLTk0CiAgICAvLyAjIHN0cnVjdAogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3Qub25lID09IDEKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0LnR3byA9PSAiMiIKICAgIGR1cAogICAgcHVzaGludCA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdC50d28gPT0gIjIiCiAgICBieXRlY18zIC8vIDB4MDAwMTMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5NQogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3RfYWxpYXMub25lID09IDEKICAgIGRpZyA2CiAgICBsZW4KICAgIGRpZyA3CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5NS05NgogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3RfYWxpYXMub25lID09IDEKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0X2FsaWFzLnR3byA9PSAiMiIKICAgIGR1cAogICAgcHVzaGludCA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTQKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0LnR3byA9PSAiMiIKICAgIGJ5dGVjXzMgLy8gMHgwMDAxMzIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdF9hbGlhcy50d28gPT0gIjIiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5NwogICAgLy8gYXNzZXJ0IHN0cnVjdDEudGhyZWUgPT0gMwogICAgZGlnIDUKICAgIGV4dHJhY3QgNCAxNgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5OAogICAgLy8gYXNzZXJ0IHN0cnVjdDEuZm91ciA9PSA0CiAgICBkaWcgNQogICAgZXh0cmFjdCAyMCAxNgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMDAtMTAxCiAgICAvLyAjIHR4bgogICAgLy8gYXNzZXJ0IHR4bi5ncm91cF9pbmRleCA9PSBUeG4uZ3JvdXBfaW5kZXggLSAxCiAgICB1bmNvdmVyIDQKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTAzLTEwNAogICAgLy8gIyBhY2MKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygyKSA9PSBhcmM0LlVJbnQ4KDEpLmJ5dGVzICAjIGFjYyBhcnJheSByZWYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHB1c2hieXRlcyAweDAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMDUKICAgIC8vIGFzc2VydCBhY2MuYmFsYW5jZSA9PSBhY2MubWluX2JhbGFuY2UgKyAxMjM0CiAgICBkaWcgMwogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIHVuY292ZXIgNAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIHB1c2hpbnQgMTIzNAogICAgKwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTA2CiAgICAvLyBhc3NlcnQgZml2ZVswXSA9PSA1CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAxCiAgICBwdXNoYnl0ZXMgMHgwNQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHB1c2hpbnQgNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3QuZWNob19yZXNvdXJjZV9ieV9pbmRleFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmVjaG9fcmVzb3VyY2VfYnlfaW5kZXg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTAtMTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IiwKICAgIC8vICkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NldF9pZHggPSBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTE3CiAgICAvLyBhc3NlcnQgYXNzZXQgPT0gVHhuLmFzc2V0cyhhc3NldF9pZHgpLCAiZXhwZWN0ZWQgYXNzZXQgdG8gYmUgcGFzc2VkIGJ5IGluZGV4IgogICAgdHhuYXMgQXNzZXRzCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCB0byBiZSBwYXNzZWQgYnkgaW5kZXgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjExOAogICAgLy8gYXBwX2lkeCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMikpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTkKICAgIC8vIGFzc2VydCBhcHAgPT0gVHhuLmFwcGxpY2F0aW9ucyhhcHBfaWR4KSwgImV4cGVjdGVkIGFwcGxpY2F0aW9uIHRvIGJlIHBhc3NlZCBieSBpbmRleCIKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXBwbGljYXRpb24gdG8gYmUgcGFzc2VkIGJ5IGluZGV4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMjAKICAgIC8vIGFjY19pZHggPSBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDMpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTIxCiAgICAvLyBhc3NlcnQgYWNjID09IFR4bi5hY2NvdW50cyhhY2NfaWR4KSwgImV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IGluZGV4IgogICAgdHhuYXMgQWNjb3VudHMKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IGluZGV4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTAtMTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IiwKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5lY2hvX3Jlc291cmNlX2J5X3ZhbHVlW3JvdXRpbmddKCkgLT4gdm9pZDoKZWNob19yZXNvdXJjZV9ieV92YWx1ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEyNC0xMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICByZXNvdXJjZV9lbmNvZGluZz0idmFsdWUiLAogICAgLy8gKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMwCiAgICAvLyBhY2MudmFsaWRhdGUoKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMxCiAgICAvLyBhc3NldF9pZCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMzIKICAgIC8vIGFzc2VydCBhc3NldC5pZCA9PSBhc3NldF9pZCwgImV4cGVjdGVkIGFzc2V0IHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFzc2V0IHRvIGJlIHBhc3NlZCBieSB2YWx1ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMzCiAgICAvLyBhcHBfaWQgPSBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDIpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTM0CiAgICAvLyBhc3NlcnQgYXBwLmlkID09IGFwcF9pZCwgImV4cGVjdGVkIGFwcGxpY2F0aW9uIHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcGxpY2F0aW9uIHRvIGJlIHBhc3NlZCBieSB2YWx1ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTM2CiAgICAvLyBhc3NlcnQgYWNjLmJ5dGVzID09IGFkZHJlc3MsICJleHBlY3RlZCBhY2NvdW50IHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTM1CiAgICAvLyBhZGRyZXNzID0gVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMykKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gYXNzZXJ0IGFjYy5ieXRlcyA9PSBhZGRyZXNzLCAiZXhwZWN0ZWQgYWNjb3VudCB0byBiZSBwYXNzZWQgYnkgdmFsdWUiCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IHZhbHVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMjQtMTI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9InZhbHVlIiwKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAQAGeyYEAgAABBUffHUIAAAAAAAAAAEDAAEyMRkURDEYQQBHggkELgF4HgQ7Bc8XBAZY3MMEW2RH3gQGH053BOqokTkEUQ5ypATWwqx/BEgULV42GgCOCQApADcARQBuAJAA2AEJAeMCIgCABExcYbo2GgCOAQABACM4ECQSRDIIRDIKMgMTRCM4GBREMRgURCJDNhoCNhoBKBNEKBNEIkM2GgI2GgEoE0QoE0QiQzYaATEWIglJOBAiEkQ2GgJPAigTRCgTREk4FhREMRYiEkQ4CCUSRCJDNhoBNhoCF8AwNhoDTwIoE0QoE0RJcQBEJRJENjAAEkQiQzYaATYaAhfAMjYaAzYaBE8DKBNEKBNESwEWqERJcgdEMgkSRCM4ECQSRCNJwjIyCBJENjIAMggSRCMiwjJLARJENjIBEkQiQzYaATYaAhfAHDYaA08CKBNEKBNESXMAREsBcwFEgdIJCBJENhwAMQASRDYcARJEIkM2GgExFiIJNhoCF8AcNhoDSSNZgQIISwEVEkQxG4EEEkRLAyNZSwSBAllLBU8CSwJSSVcACCqoREmBCFlLARVLAk8CSwJSKxJESwYVSwdPBE8CUklXAAgqqERJgQhZSwEVUisSREsFVwQQgBAAAAAAAAAAAAAAAAAAAAADqERLBVcUEIAQAAAAAAAAAAAAAAAAAAAABKhETwQ4FjEWIgkSRDYaAoABARJESwNzAERPBHMBRIHSCQgSRE8CVwIBgAEFqESBBAgWVwYCgAIABExQTFBMUClMULAiQzYaARfAMDYaAhfAMjYaAxfAHDYaARfAMEsDEkQ2GgIXwDJLAhJENhoDF8AcSwESRE8CFk8CFlBMUClMULAiQzYaARc2GgIXNhoDSRWBIBJENhoBF0sDEkQ2GgIXSwISREk2GgMSRE8CFk8CFlBMUClMULAiQw==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +// Type definitions for ARC-56 structs + +export type AnotherStruct = { + one: bigint, + two: string +} + + +/** + * Converts the ABI tuple representation of a AnotherStruct to the struct representation + */ +export function AnotherStructFromTuple(abiTuple: [bigint, string]) { + const abiStructType = ABIStructType.fromStruct('AnotherStruct', APP_SPEC.structs) + return getStructValueFromTupleValue(abiStructType, abiTuple) as AnotherStruct +} + +export type MyStruct = { + anotherStruct: AnotherStruct, + anotherStructAlias: AnotherStruct, + three: bigint, + four: bigint +} + + +/** + * Converts the ABI tuple representation of a MyStruct to the struct representation + */ +export function MyStructFromTuple(abiTuple: [AnotherStruct, AnotherStruct, bigint, bigint]) { + const abiStructType = ABIStructType.fromStruct('MyStruct', APP_SPEC.structs) + return getStructValueFromTupleValue(abiStructType, abiTuple) as MyStruct +} + +/** + * The argument types for the SignaturesContract contract + */ +export type SignaturesContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'create()void': Record + 'sink(string,uint8[],byte[4])void': { + value: string + arr: bigint[] | number[] + fixedBytes: Uint8Array + } + 'alias(string,uint8[])void': { + value: string + arr: bigint[] | number[] + } + 'with_txn(string,pay,uint8[])void': { + value: string + pay: AppMethodCallTransactionArgument + arr: bigint[] | number[] + } + 'with_asset(string,asset,uint8[])void': { + value: string + asset: bigint + arr: bigint[] | number[] + } + 'with_app(string,application,uint64,uint8[])void': { + value: string + app: bigint + appId: bigint | number + arr: bigint[] | number[] + } + 'with_acc(string,account,uint8[])void': { + value: string + acc: Uint8Array | string + arr: bigint[] | number[] + } + 'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))': { + struct1: MyStruct + txn: AppMethodCallTransactionArgument + acc: Uint8Array | string + five: bigint[] | number[] + } + 'echo_resource_by_index(asset,application,account)(uint64,uint64,address)': { + asset: bigint + app: bigint + acc: Uint8Array | string + } + 'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)': { + asset: bigint | number + app: bigint | number + acc: string + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'create()void': [] + 'sink(string,uint8[],byte[4])void': [value: string, arr: bigint[] | number[], fixedBytes: Uint8Array] + 'alias(string,uint8[])void': [value: string, arr: bigint[] | number[]] + 'with_txn(string,pay,uint8[])void': [value: string, pay: AppMethodCallTransactionArgument, arr: bigint[] | number[]] + 'with_asset(string,asset,uint8[])void': [value: string, asset: bigint, arr: bigint[] | number[]] + 'with_app(string,application,uint64,uint8[])void': [value: string, app: bigint, appId: bigint | number, arr: bigint[] | number[]] + 'with_acc(string,account,uint8[])void': [value: string, acc: Uint8Array | string, arr: bigint[] | number[]] + 'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))': [struct1: MyStruct, txn: AppMethodCallTransactionArgument, acc: Uint8Array | string, five: bigint[] | number[]] + 'echo_resource_by_index(asset,application,account)(uint64,uint64,address)': [asset: bigint, app: bigint, acc: Uint8Array | string] + 'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)': [asset: bigint | number, app: bigint | number, acc: string] + } +} + +/** + * The return type for each method + */ +export type SignaturesContractReturns = { + 'create()void': void + 'sink(string,uint8[],byte[4])void': void + 'alias(string,uint8[])void': void + 'with_txn(string,pay,uint8[])void': void + 'with_asset(string,asset,uint8[])void': void + 'with_app(string,application,uint64,uint8[])void': void + 'with_acc(string,account,uint8[])void': void + 'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))': [[bigint, string], [[bigint, string], [bigint, string], bigint, bigint]] + 'echo_resource_by_index(asset,application,account)(uint64,uint64,address)': [bigint, bigint, string] + 'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)': [bigint, bigint, string] +} + +/** + * Defines the types of available calls and state of the SignaturesContract smart contract. + */ +export type SignaturesContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'create()void' | 'create', { + argsObj: SignaturesContractArgs['obj']['create()void'] + argsTuple: SignaturesContractArgs['tuple']['create()void'] + returns: SignaturesContractReturns['create()void'] + }> + & Record<'sink(string,uint8[],byte[4])void' | 'sink', { + argsObj: SignaturesContractArgs['obj']['sink(string,uint8[],byte[4])void'] + argsTuple: SignaturesContractArgs['tuple']['sink(string,uint8[],byte[4])void'] + returns: SignaturesContractReturns['sink(string,uint8[],byte[4])void'] + }> + & Record<'alias(string,uint8[])void' | 'alias', { + argsObj: SignaturesContractArgs['obj']['alias(string,uint8[])void'] + argsTuple: SignaturesContractArgs['tuple']['alias(string,uint8[])void'] + returns: SignaturesContractReturns['alias(string,uint8[])void'] + }> + & Record<'with_txn(string,pay,uint8[])void' | 'with_txn', { + argsObj: SignaturesContractArgs['obj']['with_txn(string,pay,uint8[])void'] + argsTuple: SignaturesContractArgs['tuple']['with_txn(string,pay,uint8[])void'] + returns: SignaturesContractReturns['with_txn(string,pay,uint8[])void'] + }> + & Record<'with_asset(string,asset,uint8[])void' | 'with_asset', { + argsObj: SignaturesContractArgs['obj']['with_asset(string,asset,uint8[])void'] + argsTuple: SignaturesContractArgs['tuple']['with_asset(string,asset,uint8[])void'] + returns: SignaturesContractReturns['with_asset(string,asset,uint8[])void'] + }> + & Record<'with_app(string,application,uint64,uint8[])void' | 'with_app', { + argsObj: SignaturesContractArgs['obj']['with_app(string,application,uint64,uint8[])void'] + argsTuple: SignaturesContractArgs['tuple']['with_app(string,application,uint64,uint8[])void'] + returns: SignaturesContractReturns['with_app(string,application,uint64,uint8[])void'] + }> + & Record<'with_acc(string,account,uint8[])void' | 'with_acc', { + argsObj: SignaturesContractArgs['obj']['with_acc(string,account,uint8[])void'] + argsTuple: SignaturesContractArgs['tuple']['with_acc(string,account,uint8[])void'] + returns: SignaturesContractReturns['with_acc(string,account,uint8[])void'] + }> + & Record<'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))' | 'complex_sig', { + argsObj: SignaturesContractArgs['obj']['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'] + argsTuple: SignaturesContractArgs['tuple']['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'] + returns: SignaturesContractReturns['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'] + }> + & Record<'echo_resource_by_index(asset,application,account)(uint64,uint64,address)' | 'echo_resource_by_index', { + argsObj: SignaturesContractArgs['obj']['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'] + argsTuple: SignaturesContractArgs['tuple']['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'] + returns: SignaturesContractReturns['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'] + }> + & Record<'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)' | 'echo_resource_by_value', { + argsObj: SignaturesContractArgs['obj']['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'] + argsTuple: SignaturesContractArgs['tuple']['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'] + returns: SignaturesContractReturns['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type SignaturesContractSignatures = keyof SignaturesContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type SignaturesContractNonVoidMethodSignatures = keyof SignaturesContractTypes['methods'] extends infer T ? T extends keyof SignaturesContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the SignaturesContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = SignaturesContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the SignaturesContract smart contract to the method's return type + */ +export type MethodReturn = SignaturesContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type SignaturesContractCreateCallParams = + | Expand & {method: 'create'} & { onComplete?: OnApplicationComplete.NoOp } & CreateSchema> + | Expand & {method: 'create()void'} & { onComplete?: OnApplicationComplete.NoOp } & CreateSchema> +/** + * Defines arguments required for the deploy method. + */ +export type SignaturesContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: SignaturesContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the SignaturesContract smart contract + */ +export abstract class SignaturesContractParamsFactory { + /** + * Gets available create ABI call param factories + */ + static get create() { + return { + _resolveByMethod(params: TParams) { + switch(params.method) { + case 'create': + case 'create()void': + return SignaturesContractParamsFactory.create.create(params) + } + throw new Error(`Unknown ' + verb + ' method`) + }, + + /** + * Constructs create ABI call params for the SignaturesContract smart contract using the create()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + create(params: CallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.NoOp }): AppClientMethodCallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.NoOp } { + return { + ...params, + method: 'create()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + + /** + * Constructs a no op call for the sink(string,uint8[],byte[4])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static sink(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'sink(string,uint8[],byte[4])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.arr, params.args.fixedBytes], + } + } + /** + * Constructs a no op call for the alias(string,uint8[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static alias(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'alias(string,uint8[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.arr], + } + } + /** + * Constructs a no op call for the with_txn(string,pay,uint8[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static withTxn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'with_txn(string,pay,uint8[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.pay, params.args.arr], + } + } + /** + * Constructs a no op call for the with_asset(string,asset,uint8[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static withAsset(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'with_asset(string,asset,uint8[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.asset, params.args.arr], + } + } + /** + * Constructs a no op call for the with_app(string,application,uint64,uint8[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static withApp(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'with_app(string,application,uint64,uint8[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.app, params.args.appId, params.args.arr], + } + } + /** + * Constructs a no op call for the with_acc(string,account,uint8[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static withAcc(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'with_acc(string,account,uint8[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.value, params.args.acc, params.args.arr], + } + } + /** + * Constructs a no op call for the complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128)) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static complexSig(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))' as const, + args: Array.isArray(params.args) ? params.args : [params.args.struct1, params.args.txn, params.args.acc, params.args.five], + } + } + /** + * Constructs a no op call for the echo_resource_by_index(asset,application,account)(uint64,uint64,address) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static echoResourceByIndex(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'echo_resource_by_index(asset,application,account)(uint64,uint64,address)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset, params.args.app, params.args.acc], + } + } + /** + * Constructs a no op call for the echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static echoResourceByValue(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset, params.args.app, params.args.acc], + } + } +} + +/** + * A factory to create and deploy one or more instance of the SignaturesContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class SignaturesContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `SignaturesContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new SignaturesContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new SignaturesContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the SignaturesContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: SignaturesContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + createParams: params.createParams?.method ? SignaturesContractParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (SignaturesContractCreateCallParams & { args: Uint8Array[] }) : undefined, + }) + return { result: result.result, appClient: new SignaturesContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the SignaturesContract smart contract using the create()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create params + */ + create: (params: CallParams & AppClientCompilationParams & CreateSchema & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appFactory.params.create(SignaturesContractParamsFactory.create.create(params)) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the SignaturesContract smart contract using the create()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create transaction + */ + create: (params: CallParams & AppClientCompilationParams & CreateSchema & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appFactory.createTransaction.create(SignaturesContractParamsFactory.create.create(params)) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the SignaturesContract smart contract using an ABI method call using the create()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create result + */ + create: async (params: CallParams & AppClientCompilationParams & CreateSchema & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appFactory.send.create(SignaturesContractParamsFactory.create.create(params)) + return { result: { ...result.result, return: result.result.return as unknown as (undefined | SignaturesContractReturns['create()void']) }, appClient: new SignaturesContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the SignaturesContract smart contract + */ +export class SignaturesContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `SignaturesContractClient` + * + * @param appClient An `AppClient` instance which has been created with the SignaturesContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `SignaturesContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `SignaturesContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new SignaturesContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `SignaturesContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new SignaturesContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the SignaturesContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `sink(string,uint8[],byte[4])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + sink: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.sink(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `alias(string,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + alias: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.alias(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_txn(string,pay,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + withTxn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.withTxn(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_asset(string,asset,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + withAsset: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.withAsset(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_app(string,application,uint64,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + withApp: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.withApp(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_acc(string,account,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + withAcc: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.withAcc(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + complexSig: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.complexSig(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_index(asset,application,account)(uint64,uint64,address)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + echoResourceByIndex: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.echoResourceByIndex(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + echoResourceByValue: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(SignaturesContractParamsFactory.echoResourceByValue(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the SignaturesContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `sink(string,uint8[],byte[4])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + sink: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.sink(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `alias(string,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + alias: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.alias(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_txn(string,pay,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + withTxn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.withTxn(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_asset(string,asset,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + withAsset: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.withAsset(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_app(string,application,uint64,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + withApp: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.withApp(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_acc(string,account,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + withAcc: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.withAcc(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + complexSig: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.complexSig(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_index(asset,application,account)(uint64,uint64,address)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + echoResourceByIndex: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.echoResourceByIndex(params)) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + echoResourceByValue: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(SignaturesContractParamsFactory.echoResourceByValue(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the SignaturesContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `sink(string,uint8[],byte[4])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + sink: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.sink(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['sink(string,uint8[],byte[4])void'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `alias(string,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + alias: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.alias(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['alias(string,uint8[])void'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_txn(string,pay,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + withTxn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.withTxn(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['with_txn(string,pay,uint8[])void'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_asset(string,asset,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + withAsset: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.withAsset(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['with_asset(string,asset,uint8[])void'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_app(string,application,uint64,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + withApp: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.withApp(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['with_app(string,application,uint64,uint8[])void'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `with_acc(string,account,uint8[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + withAcc: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.withAcc(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['with_acc(string,account,uint8[])void'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + complexSig: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.complexSig(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_index(asset,application,account)(uint64,uint64,address)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + echoResourceByIndex: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.echoResourceByIndex(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'])} + }, + + /** + * Makes a call to the SignaturesContract smart contract using the `echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + echoResourceByValue: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(SignaturesContractParamsFactory.echoResourceByValue(params)) + return {...result, return: result.return as unknown as (undefined | SignaturesContractReturns['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new SignaturesContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current SignaturesContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): SignaturesContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a sink(string,uint8[],byte[4])void method call against the SignaturesContract contract + */ + sink(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sink(params))) + return this + }, + /** + * Add a alias(string,uint8[])void method call against the SignaturesContract contract + */ + alias(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.alias(params))) + return this + }, + /** + * Add a with_txn(string,pay,uint8[])void method call against the SignaturesContract contract + */ + withTxn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withTxn(params))) + return this + }, + /** + * Add a with_asset(string,asset,uint8[])void method call against the SignaturesContract contract + */ + withAsset(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withAsset(params))) + return this + }, + /** + * Add a with_app(string,application,uint64,uint8[])void method call against the SignaturesContract contract + */ + withApp(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withApp(params))) + return this + }, + /** + * Add a with_acc(string,account,uint8[])void method call against the SignaturesContract contract + */ + withAcc(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withAcc(params))) + return this + }, + /** + * Add a complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128)) method call against the SignaturesContract contract + */ + complexSig(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.complexSig(params))) + return this + }, + /** + * Add a echo_resource_by_index(asset,application,account)(uint64,uint64,address) method call against the SignaturesContract contract + */ + echoResourceByIndex(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.echoResourceByIndex(params))) + return this + }, + /** + * Add a echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address) method call against the SignaturesContract contract + */ + echoResourceByValue(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.echoResourceByValue(params))) + return this + }, + /** + * Add a clear state call to the SignaturesContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as SignaturesContractComposer + } +} +export type SignaturesContractComposer = { + /** + * Calls the sink(string,uint8[],byte[4])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + sink(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['sink(string,uint8[],byte[4])void'] | undefined]> + + /** + * Calls the alias(string,uint8[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + alias(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['alias(string,uint8[])void'] | undefined]> + + /** + * Calls the with_txn(string,pay,uint8[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + withTxn(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['with_txn(string,pay,uint8[])void'] | undefined]> + + /** + * Calls the with_asset(string,asset,uint8[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + withAsset(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['with_asset(string,asset,uint8[])void'] | undefined]> + + /** + * Calls the with_app(string,application,uint64,uint8[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + withApp(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['with_app(string,application,uint64,uint8[])void'] | undefined]> + + /** + * Calls the with_acc(string,account,uint8[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + withAcc(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['with_acc(string,account,uint8[])void'] | undefined]> + + /** + * Calls the complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128)) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + complexSig(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))'] | undefined]> + + /** + * Calls the echo_resource_by_index(asset,application,account)(uint64,uint64,address) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + echoResourceByIndex(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['echo_resource_by_index(asset,application,account)(uint64,uint64,address)'] | undefined]> + + /** + * Calls the echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + echoResourceByValue(params?: CallParams): SignaturesContractComposer<[...TReturns, SignaturesContractReturns['echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the SignaturesContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): SignaturesContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): SignaturesContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type SignaturesContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGet.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGet.ts new file mode 100644 index 0000000..62c4b5b --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGet.ts @@ -0,0 +1,1319 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"arcs":[],"name":"StateAcctParamsGet","structs":{},"methods":[{"name":"verify_acct_balance","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_min_balance","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_auth_addr","args":[{"name":"a","type":"account"}],"returns":{"type":"byte[]"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_num_uint","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_num_byte_slice","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_extra_app_pages","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_apps_created","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_apps_opted_in","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_assets_created","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_assets","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_boxes","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"verify_acct_total_box_bytes","args":[{"name":"a","type":"account"}],"returns":{"type":"uint64"},"events":[],"actions":{"create":[],"call":["NoOp"]}}],"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LmFwcHJvdmFsX3Byb2dyYW06CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDE2CiAgICBtZXRob2QgInZlcmlmeV9hY2N0X2JhbGFuY2UoYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X21pbl9iYWxhbmNlKGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF9hdXRoX2FkZHIoYWNjb3VudClieXRlW10iCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50KGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhY2NvdW50KXVpbnQ2NCIKICAgIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzKGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQoYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4oYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMoYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2JveGVzKGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMoYWNjb3VudCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3ZlcmlmeV9hY2N0X2JhbGFuY2Vfcm91dGVAMiBtYWluX3ZlcmlmeV9hY2N0X21pbl9iYWxhbmNlX3JvdXRlQDMgbWFpbl92ZXJpZnlfYWNjdF9hdXRoX2FkZHJfcm91dGVANCBtYWluX3ZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50X3JvdXRlQDUgbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZV9yb3V0ZUA2IG1haW5fdmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzX3JvdXRlQDcgbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWRfcm91dGVAOCBtYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW5fcm91dGVAOSBtYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkX3JvdXRlQDEwIG1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX3JvdXRlQDExIG1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXNfcm91dGVAMTIgbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXNfcm91dGVAMTMKICAgIGVyciAvLyByZWplY3QgdHJhbnNhY3Rpb24KCm1haW5fdmVyaWZ5X2FjY3RfYmFsYW5jZV9yb3V0ZUAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXQoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X2JhbGFuY2UKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfbWluX2JhbGFuY2Vfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF9taW5fYmFsYW5jZQogICAgaXRvYgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl92ZXJpZnlfYWNjdF9hdXRoX2FkZHJfcm91dGVANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF9hdXRoX2FkZHIKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50X3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2Vfcm91dGVANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZQogICAgaXRvYgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXNfcm91dGVANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkX3JvdXRlQDg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW5fcm91dGVAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX29wdGVkX2luCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkX3JvdXRlQDEwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXQoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19yb3V0ZUAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXNfcm91dGVAMTI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXMKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYm94X2J5dGVzX3JvdXRlQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXQoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlcwogICAgaXRvYgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIHJlamVjdCB0cmFuc2FjdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50IDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXQudmVyaWZ5X2FjY3RfYmFsYW5jZShhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4LTE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9hY2N0X2JhbGFuY2Uoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMAogICAgLy8gYmFsYW5jZSwgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9iYWxhbmNlKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBiYWxhbmNlCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LnZlcmlmeV9hY2N0X21pbl9iYWxhbmNlKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X21pbl9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzLTI0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9hY2N0X21pbl9iYWxhbmNlKHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhbGdvcHkuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUKICAgIC8vIG1pbl9iYWxhbmNlLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X21pbl9iYWxhbmNlKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjYKICAgIC8vIHJldHVybiBtaW5fYmFsYW5jZQogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF9hdXRoX2FkZHIoYTogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYWNjdF9hdXRoX2FkZHI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgtMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfYXV0aF9hZGRyKHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhbGdvcHkuQnl0ZXM6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMAogICAgLy8gYXV0aF9hZGRyLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2F1dGhfYWRkcihhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEF1dGhBZGRyCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMQogICAgLy8gcmV0dXJuIGF1dGhfYWRkci5ieXRlcwogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludChhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMy0zNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludChzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM1CiAgICAvLyB0b3RhbF9udW1fdWludCwgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9udW1fdWludChhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtVWludAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzYKICAgIC8vIHJldHVybiB0b3RhbF9udW1fdWludAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOC0zOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwCiAgICAvLyB0b3RhbF9udW1fYnl0ZV9zbGljZSwgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MQogICAgLy8gcmV0dXJuIHRvdGFsX251bV9ieXRlX3NsaWNlCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LnZlcmlmeV9hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlcyhhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDMtNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzKHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhbGdvcHkuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDUKICAgIC8vIHRvdGFsX2V4dHJhX2FwcF9wYWdlcywgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEV4dHJhQXBwUGFnZXMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2CiAgICAvLyByZXR1cm4gdG90YWxfZXh0cmFfYXBwX3BhZ2VzCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgtNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkKHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhbGdvcHkuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTAKICAgIC8vIHRvdGFsX2FwcHNfY3JlYXRlZCwgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNDcmVhdGVkCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MQogICAgLy8gcmV0dXJuIHRvdGFsX2FwcHNfY3JlYXRlZAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF90b3RhbF9hcHBzX29wdGVkX2luKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTMtNTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbihzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1CiAgICAvLyB0b3RhbF9hcHBzX29wdGVkX2luLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4oYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNPcHRlZEluCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NgogICAgLy8gcmV0dXJuIHRvdGFsX2FwcHNfb3B0ZWRfaW4KICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXQudmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTgtNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MAogICAgLy8gdG90YWxfYXNzZXRzX2NyZWF0ZWQsIF92YWwgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFzc2V0c0NyZWF0ZWQKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxCiAgICAvLyByZXR1cm4gdG90YWxfYXNzZXRzX2NyZWF0ZWQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXQudmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0czoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2My02NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NQogICAgLy8gdG90YWxfYXNzZXRzLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0cyhhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXNzZXRzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NgogICAgLy8gcmV0dXJuIHRvdGFsX2Fzc2V0cwogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldC52ZXJpZnlfYWNjdF90b3RhbF9ib3hlcyhhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9ib3hlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OC02OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9ib3hlcyhzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwCiAgICAvLyB0b3RhbF9ib3hlcywgX3ZhbCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9ib3hlcyhhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94ZXMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxCiAgICAvLyByZXR1cm4gdG90YWxfYm94ZXMKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXQudmVyaWZ5X2FjY3RfdG90YWxfYm94X2J5dGVzKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3My03NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NQogICAgLy8gdG90YWxfYm94X2J5dGVzLCBfdmFsID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveF9ieXRlcyhhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94Qnl0ZXMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyByZXR1cm4gdG90YWxfYm94X2J5dGVzCiAgICByZXRzdWIK","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldChBUkM0Q29udHJhY3QpOgogICAgaW50IDEKICAgIHJldHVybgo="},"bareActions":{"create":["NoOp"],"call":[]}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAcctParamsGet contract + */ +export type StateAcctParamsGetArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_acct_balance(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_min_balance(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_auth_addr(account)byte[]': { + a: Uint8Array | string + } + 'verify_acct_total_num_uint(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_num_byte_slice(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_extra_app_pages(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_apps_created(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_apps_opted_in(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_assets_created(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_assets(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_boxes(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_box_bytes(account)uint64': { + a: Uint8Array | string + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_acct_balance(account)uint64': [a: Uint8Array | string] + 'verify_acct_min_balance(account)uint64': [a: Uint8Array | string] + 'verify_acct_auth_addr(account)byte[]': [a: Uint8Array | string] + 'verify_acct_total_num_uint(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_num_byte_slice(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_extra_app_pages(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_apps_created(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_apps_opted_in(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_assets_created(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_assets(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_boxes(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_box_bytes(account)uint64': [a: Uint8Array | string] + } +} + +/** + * The return type for each method + */ +export type StateAcctParamsGetReturns = { + 'verify_acct_balance(account)uint64': bigint + 'verify_acct_min_balance(account)uint64': bigint + 'verify_acct_auth_addr(account)byte[]': Uint8Array + 'verify_acct_total_num_uint(account)uint64': bigint + 'verify_acct_total_num_byte_slice(account)uint64': bigint + 'verify_acct_total_extra_app_pages(account)uint64': bigint + 'verify_acct_total_apps_created(account)uint64': bigint + 'verify_acct_total_apps_opted_in(account)uint64': bigint + 'verify_acct_total_assets_created(account)uint64': bigint + 'verify_acct_total_assets(account)uint64': bigint + 'verify_acct_total_boxes(account)uint64': bigint + 'verify_acct_total_box_bytes(account)uint64': bigint +} + +/** + * Defines the types of available calls and state of the StateAcctParamsGet smart contract. + */ +export type StateAcctParamsGetTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_acct_balance(account)uint64' | 'verify_acct_balance', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_balance(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_balance(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_balance(account)uint64'] + }> + & Record<'verify_acct_min_balance(account)uint64' | 'verify_acct_min_balance', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_min_balance(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_min_balance(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_min_balance(account)uint64'] + }> + & Record<'verify_acct_auth_addr(account)byte[]' | 'verify_acct_auth_addr', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_auth_addr(account)byte[]'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_auth_addr(account)byte[]'] + returns: StateAcctParamsGetReturns['verify_acct_auth_addr(account)byte[]'] + }> + & Record<'verify_acct_total_num_uint(account)uint64' | 'verify_acct_total_num_uint', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_num_uint(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_num_uint(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_num_uint(account)uint64'] + }> + & Record<'verify_acct_total_num_byte_slice(account)uint64' | 'verify_acct_total_num_byte_slice', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_num_byte_slice(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_num_byte_slice(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_num_byte_slice(account)uint64'] + }> + & Record<'verify_acct_total_extra_app_pages(account)uint64' | 'verify_acct_total_extra_app_pages', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_extra_app_pages(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_extra_app_pages(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_extra_app_pages(account)uint64'] + }> + & Record<'verify_acct_total_apps_created(account)uint64' | 'verify_acct_total_apps_created', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_apps_created(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_apps_created(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_apps_created(account)uint64'] + }> + & Record<'verify_acct_total_apps_opted_in(account)uint64' | 'verify_acct_total_apps_opted_in', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_apps_opted_in(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_apps_opted_in(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_apps_opted_in(account)uint64'] + }> + & Record<'verify_acct_total_assets_created(account)uint64' | 'verify_acct_total_assets_created', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_assets_created(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_assets_created(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_assets_created(account)uint64'] + }> + & Record<'verify_acct_total_assets(account)uint64' | 'verify_acct_total_assets', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_assets(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_assets(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_assets(account)uint64'] + }> + & Record<'verify_acct_total_boxes(account)uint64' | 'verify_acct_total_boxes', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_boxes(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_boxes(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_boxes(account)uint64'] + }> + & Record<'verify_acct_total_box_bytes(account)uint64' | 'verify_acct_total_box_bytes', { + argsObj: StateAcctParamsGetArgs['obj']['verify_acct_total_box_bytes(account)uint64'] + argsTuple: StateAcctParamsGetArgs['tuple']['verify_acct_total_box_bytes(account)uint64'] + returns: StateAcctParamsGetReturns['verify_acct_total_box_bytes(account)uint64'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAcctParamsGetSignatures = keyof StateAcctParamsGetTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateAcctParamsGetNonVoidMethodSignatures = keyof StateAcctParamsGetTypes['methods'] extends infer T ? T extends keyof StateAcctParamsGetTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAcctParamsGet smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAcctParamsGetTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAcctParamsGet smart contract to the method's return type + */ +export type MethodReturn = StateAcctParamsGetTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAcctParamsGetCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAcctParamsGetDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAcctParamsGetCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAcctParamsGet smart contract + */ +export abstract class StateAcctParamsGetParamsFactory { + /** + * Constructs a no op call for the verify_acct_balance(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctBalance(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_balance(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_min_balance(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctMinBalance(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_min_balance(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_auth_addr(account)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctAuthAddr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_auth_addr(account)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_num_uint(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalNumUint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_num_uint(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_num_byte_slice(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalNumByteSlice(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_num_byte_slice(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_extra_app_pages(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalExtraAppPages(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_extra_app_pages(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_apps_created(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAppsCreated(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_apps_created(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_apps_opted_in(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAppsOptedIn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_apps_opted_in(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_assets_created(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAssetsCreated(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_assets_created(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_assets(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAssets(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_assets(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_boxes(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_boxes(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_box_bytes(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalBoxBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_box_bytes(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateAcctParamsGet smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAcctParamsGetFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAcctParamsGetFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAcctParamsGetClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAcctParamsGetClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAcctParamsGet smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAcctParamsGetDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAcctParamsGetClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAcctParamsGet smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAcctParamsGet smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAcctParamsGet smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAcctParamsGetClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAcctParamsGet smart contract + */ +export class StateAcctParamsGetClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAcctParamsGetClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAcctParamsGet app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAcctParamsGetClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAcctParamsGetClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAcctParamsGetClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAcctParamsGetClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAcctParamsGetClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGet smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_min_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctMinBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctMinBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_auth_addr(account)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctAuthAddr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctAuthAddr(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumUint(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalExtraAppPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalExtraAppPages(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAppsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAppsOptedIn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsOptedIn(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAssetsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssetsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAssets: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssets(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxes(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalBoxBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxBytes(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGet smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_min_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctMinBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctMinBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_auth_addr(account)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctAuthAddr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctAuthAddr(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumUint(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalExtraAppPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalExtraAppPages(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAppsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAppsOptedIn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsOptedIn(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAssetsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssetsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAssets: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssets(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxes(params)) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalBoxBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxBytes(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGet smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctBalance: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctBalance(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_balance(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_min_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctMinBalance: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctMinBalance(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_min_balance(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_auth_addr(account)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctAuthAddr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctAuthAddr(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_auth_addr(account)byte[]'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalNumUint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumUint(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_num_uint(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalNumByteSlice: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalNumByteSlice(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_num_byte_slice(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalExtraAppPages: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalExtraAppPages(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_extra_app_pages(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAppsCreated: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsCreated(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_apps_created(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAppsOptedIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAppsOptedIn(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_apps_opted_in(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAssetsCreated: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssetsCreated(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_assets_created(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_assets(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAssets: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalAssets(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_assets(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxes(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_boxes(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGet smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalBoxBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetParamsFactory.verifyAcctTotalBoxBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetReturns['verify_acct_total_box_bytes(account)uint64'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAcctParamsGetClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAcctParamsGet app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAcctParamsGetComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_acct_balance(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctBalance(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctBalance(params))) + return this + }, + /** + * Add a verify_acct_min_balance(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctMinBalance(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctMinBalance(params))) + return this + }, + /** + * Add a verify_acct_auth_addr(account)byte[] method call against the StateAcctParamsGet contract + */ + verifyAcctAuthAddr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctAuthAddr(params))) + return this + }, + /** + * Add a verify_acct_total_num_uint(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalNumUint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalNumUint(params))) + return this + }, + /** + * Add a verify_acct_total_num_byte_slice(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalNumByteSlice(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalNumByteSlice(params))) + return this + }, + /** + * Add a verify_acct_total_extra_app_pages(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalExtraAppPages(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalExtraAppPages(params))) + return this + }, + /** + * Add a verify_acct_total_apps_created(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalAppsCreated(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAppsCreated(params))) + return this + }, + /** + * Add a verify_acct_total_apps_opted_in(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalAppsOptedIn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAppsOptedIn(params))) + return this + }, + /** + * Add a verify_acct_total_assets_created(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalAssetsCreated(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAssetsCreated(params))) + return this + }, + /** + * Add a verify_acct_total_assets(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalAssets(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAssets(params))) + return this + }, + /** + * Add a verify_acct_total_boxes(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalBoxes(params))) + return this + }, + /** + * Add a verify_acct_total_box_bytes(account)uint64 method call against the StateAcctParamsGet contract + */ + verifyAcctTotalBoxBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalBoxBytes(params))) + return this + }, + /** + * Add a clear state call to the StateAcctParamsGet contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAcctParamsGetComposer + } +} +export type StateAcctParamsGetComposer = { + /** + * Calls the verify_acct_balance(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctBalance(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_balance(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_min_balance(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctMinBalance(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_min_balance(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_auth_addr(account)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctAuthAddr(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_auth_addr(account)byte[]'] | undefined]> + + /** + * Calls the verify_acct_total_num_uint(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalNumUint(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_num_uint(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_num_byte_slice(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalNumByteSlice(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_num_byte_slice(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_extra_app_pages(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalExtraAppPages(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_extra_app_pages(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_apps_created(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAppsCreated(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_apps_created(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_apps_opted_in(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAppsOptedIn(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_apps_opted_in(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_assets_created(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAssetsCreated(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_assets_created(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_assets(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAssets(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_assets(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_boxes(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalBoxes(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_boxes(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_box_bytes(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalBoxBytes(params?: CallParams): StateAcctParamsGetComposer<[...TReturns, StateAcctParamsGetReturns['verify_acct_total_box_bytes(account)uint64'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGet smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAcctParamsGetComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAcctParamsGetComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAcctParamsGetComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGetContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGetContract.ts new file mode 100644 index 0000000..01c1c8f --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAcctParamsGetContract.ts @@ -0,0 +1,1526 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAcctParamsGetContract","structs":{},"methods":[{"name":"verify_acct_balance","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_min_balance","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_auth_addr","args":[{"type":"account","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_num_uint","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_num_byte_slice","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_extra_app_pages","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_apps_created","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_apps_opted_in","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_assets_created","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_assets","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_boxes","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_total_box_bytes","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_incentive_eligible","args":[{"type":"account","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_last_heartbeat","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_acct_last_proposed","args":[{"type":"account","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[171,225],"errorMessage":"account funded"},{"pc":[175],"errorMessage":"expected Account balance to match"},{"pc":[229],"errorMessage":"expected Account min_balance to match"},{"pc":[166,220,273,301,330,359,388,417,446,475,504,533,562,598,627],"errorMessage":"expected funded by index to match"},{"pc":[190],"errorMessage":"expected op.balance by index to match"},{"pc":[181],"errorMessage":"expected op.balance to match"},{"pc":[244],"errorMessage":"expected op.min_balance by index to match"},{"pc":[235],"errorMessage":"expected op.min_balance to match"},{"pc":[164,218,271,299,328,357,386,415,444,473,502,531,560,596,625],"errorMessage":"expected value by index to match"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNAogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NWY1YjQzZTQgMHg3M2RjOTNjNyAweDU2MjZkZmViIDB4ZGM4YTI1YmYgMHgxOThlYmQ4YyAweDIzMDFhYjI2IDB4OWY2OGZjYTYgMHhhOTc1YzJkMSAweGQxZTA0ODAxIDB4YjY5NjZiZTUgMHgxOTVkNTQxOCAweDZhZGFlM2YxIDB4ZGY4Y2ZlZTUgMHg2YWQ3MGQyMSAweDE3MzVmZDIyIC8vIG1ldGhvZCAidmVyaWZ5X2FjY3RfYmFsYW5jZShhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfbWluX2JhbGFuY2UoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X2F1dGhfYWRkcihhY2NvdW50KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50KGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4oYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2JveGVzKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X2luY2VudGl2ZV9lbGlnaWJsZShhY2NvdW50KWJvb2wiLCBtZXRob2QgInZlcmlmeV9hY2N0X2xhc3RfaGVhcnRiZWF0KGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF9sYXN0X3Byb3Bvc2VkKGFjY291bnQpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X2FjY3RfYmFsYW5jZSB2ZXJpZnlfYWNjdF9taW5fYmFsYW5jZSB2ZXJpZnlfYWNjdF9hdXRoX2FkZHIgdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQgdmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2UgdmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzIHZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZCB2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX29wdGVkX2luIHZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkIHZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0cyB2ZXJpZnlfYWNjdF90b3RhbF9ib3hlcyB2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMgdmVyaWZ5X2FjY3RfaW5jZW50aXZlX2VsaWdpYmxlIHZlcmlmeV9hY2N0X2xhc3RfaGVhcnRiZWF0IHZlcmlmeV9hY2N0X2xhc3RfcHJvcG9zZWQKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyMjoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2JhbGFuY2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjcKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYmFsYW5jZShhKQogICAgZHVwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYmFsYW5jZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYS5iYWxhbmNlLCAiZXhwZWN0ZWQgQWNjb3VudCBiYWxhbmNlIHRvIG1hdGNoIgogICAgZGlnIDEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBBY2NvdW50IGJhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMgogICAgLy8gYXNzZXJ0IHZhbHVlID09IGFsZ29weS5vcC5iYWxhbmNlKGEpLCAiZXhwZWN0ZWQgb3AuYmFsYW5jZSB0byBtYXRjaCIKICAgIHN3YXAKICAgIGJhbGFuY2UKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG9wLmJhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzMtMzUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhbGdvcHkub3AuYmFsYW5jZSgKICAgIC8vICAgICBfZ2V0XzFzdF9yZWZfaW5kZXgoKQogICAgLy8gKSwgImV4cGVjdGVkIG9wLmJhbGFuY2UgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBiYWxhbmNlCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvcC5iYWxhbmNlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF9taW5fYmFsYW5jZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X21pbl9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDAKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbWluX2JhbGFuY2UoYSkKICAgIGR1cAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQxCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X21pbl9iYWxhbmNlKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDIKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhLm1pbl9iYWxhbmNlLCAiZXhwZWN0ZWQgQWNjb3VudCBtaW5fYmFsYW5jZSB0byBtYXRjaCIKICAgIGRpZyAxCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgQWNjb3VudCBtaW5fYmFsYW5jZSB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYWxnb3B5Lm9wLm1pbl9iYWxhbmNlKGEpLCAiZXhwZWN0ZWQgb3AubWluX2JhbGFuY2UgdG8gbWF0Y2giCiAgICBzd2FwCiAgICBtaW5fYmFsYW5jZQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgb3AubWluX2JhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDYtNDgKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhbGdvcHkub3AubWluX2JhbGFuY2UoCiAgICAvLyAgICAgX2dldF8xc3RfcmVmX2luZGV4KCkKICAgIC8vICksICJleHBlY3RlZCBvcC5taW5fYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaCIKICAgIG1pbl9iYWxhbmNlCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvcC5taW5fYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfYXV0aF9hZGRyW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfYXV0aF9hZGRyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTMKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYXV0aF9hZGRyKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEF1dGhBZGRyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2F1dGhfYWRkcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QXV0aEFkZHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTYKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9udW1fdWludChhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbE51bVVpbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfbnVtX3VpbnQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtVWludAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwLTcyCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlKAogICAgLy8gICAgIF9nZXRfMXN0X3JlZl9pbmRleCgpCiAgICAvLyApCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3OQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxFeHRyYUFwcFBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjgwLTgyCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlcygKICAgIC8vICAgICBfZ2V0XzFzdF9yZWZfaW5kZXgoKQogICAgLy8gKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEV4dHJhQXBwUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo4MwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6ODQKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNDcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjkwCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBcHBzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5MgogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hcHBzX29wdGVkX2luKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXBwc09wdGVkSW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXBwc19vcHRlZF9pbihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBcHBzT3B0ZWRJbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMDAKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTA1CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXNzZXRzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMDYtMTA4CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKAogICAgLy8gICAgIF9nZXRfMXN0X3JlZl9pbmRleCgpCiAgICAvLyApCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXNzZXRzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTEwCiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExNQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hc3NldHMoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTE2CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0cyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMTcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExOAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTIzCiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveGVzKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI0CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveGVzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEJveGVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjYKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTMxCiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveF9ieXRlcyhhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEJveEJ5dGVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9ib3hfYnl0ZXMoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94Qnl0ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2luY2VudGl2ZV9lbGlnaWJsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X2luY2VudGl2ZV9lbGlnaWJsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfaW5jZW50aXZlX2VsaWdpYmxlKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEluY2VudGl2ZUVsaWdpYmxlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE0MAogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9pbmNlbnRpdmVfZWxpZ2libGUoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEluY2VudGl2ZUVsaWdpYmxlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTQxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDIKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIHB1c2hpbnQgMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfbGFzdF9oZWFydGJlYXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF9sYXN0X2hlYXJ0YmVhdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDcKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbGFzdF9oZWFydGJlYXQoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TGFzdEhlYXJ0YmVhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbGFzdF9oZWFydGJlYXQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdExhc3RIZWFydGJlYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDkKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1MAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2xhc3RfcHJvcG9zZWRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF9sYXN0X3Byb3Bvc2VkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1NQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9sYXN0X3Byb3Bvc2VkKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdExhc3RQcm9wb3NlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTYKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbGFzdF9wcm9wb3NlZChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TGFzdFByb3Bvc2VkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTU3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTgKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyABASYBBBUffHUxG0EAeDEZFEQxGESCDwRfW0PkBHPck8cEVibf6wTciiW/BBmOvYwEIwGrJgSfaPymBKl1wtEE0eBIAQS2lmvlBBldVBgEatrj8QTfjP7lBGrXDSEEFzX9IjYaAI4PAAkAPwB1AJEArgDLAOgBBQEiAT8BXAF5AZYBugHXADEZFDEYFBBDNhoBF8AcSXMANhoBF3MASwNPAhJEEkRLAXMAREsBEkRMYEsBEkQ2GgEXYEsBEkQWKExQsCJDNhoBF8AcSXMBNhoBF3MBSwNPAhJEEkRLAXMBREsBEkRMeEsBEkQ2GgEXeEsBEkQWKExQsCJDNhoBF8AccwI2GgEXcwJLA08CEkQSRChMULAiQzYaARfAHHMDNhoBF3MDSwNPAhJEEkQWKExQsCJDNhoBF8AccwQ2GgEXcwRLA08CEkQSRBYoTFCwIkM2GgEXwBxzBTYaARdzBUsDTwISRBJEFihMULAiQzYaARfAHHMGNhoBF3MGSwNPAhJEEkQWKExQsCJDNhoBF8Accwc2GgEXcwdLA08CEkQSRBYoTFCwIkM2GgEXwBxzCDYaARdzCEsDTwISRBJEFihMULAiQzYaARfAHHMJNhoBF3MJSwNPAhJEEkQWKExQsCJDNhoBF8Accwo2GgEXcwpLA08CEkQSRBYoTFCwIkM2GgEXwBxzCzYaARdzC0sDTwISRBJEFihMULAiQzYaARfAHHMMNhoBF3MMSwNPAhJEEkSAAQCBAE8CVChMULAiQzYaARfAHHMONhoBF3MOSwNPAhJEEkQWKExQsCJDNhoBF8Accw02GgEXcw1LA08CEkQSRBYoTFCwIkM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAcctParamsGetContract contract + */ +export type StateAcctParamsGetContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_acct_balance(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_min_balance(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_auth_addr(account)address': { + a: Uint8Array | string + } + 'verify_acct_total_num_uint(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_num_byte_slice(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_extra_app_pages(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_apps_created(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_apps_opted_in(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_assets_created(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_assets(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_boxes(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_total_box_bytes(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_incentive_eligible(account)bool': { + a: Uint8Array | string + } + 'verify_acct_last_heartbeat(account)uint64': { + a: Uint8Array | string + } + 'verify_acct_last_proposed(account)uint64': { + a: Uint8Array | string + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_acct_balance(account)uint64': [a: Uint8Array | string] + 'verify_acct_min_balance(account)uint64': [a: Uint8Array | string] + 'verify_acct_auth_addr(account)address': [a: Uint8Array | string] + 'verify_acct_total_num_uint(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_num_byte_slice(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_extra_app_pages(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_apps_created(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_apps_opted_in(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_assets_created(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_assets(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_boxes(account)uint64': [a: Uint8Array | string] + 'verify_acct_total_box_bytes(account)uint64': [a: Uint8Array | string] + 'verify_acct_incentive_eligible(account)bool': [a: Uint8Array | string] + 'verify_acct_last_heartbeat(account)uint64': [a: Uint8Array | string] + 'verify_acct_last_proposed(account)uint64': [a: Uint8Array | string] + } +} + +/** + * The return type for each method + */ +export type StateAcctParamsGetContractReturns = { + 'verify_acct_balance(account)uint64': bigint + 'verify_acct_min_balance(account)uint64': bigint + 'verify_acct_auth_addr(account)address': string + 'verify_acct_total_num_uint(account)uint64': bigint + 'verify_acct_total_num_byte_slice(account)uint64': bigint + 'verify_acct_total_extra_app_pages(account)uint64': bigint + 'verify_acct_total_apps_created(account)uint64': bigint + 'verify_acct_total_apps_opted_in(account)uint64': bigint + 'verify_acct_total_assets_created(account)uint64': bigint + 'verify_acct_total_assets(account)uint64': bigint + 'verify_acct_total_boxes(account)uint64': bigint + 'verify_acct_total_box_bytes(account)uint64': bigint + 'verify_acct_incentive_eligible(account)bool': boolean + 'verify_acct_last_heartbeat(account)uint64': bigint + 'verify_acct_last_proposed(account)uint64': bigint +} + +/** + * Defines the types of available calls and state of the StateAcctParamsGetContract smart contract. + */ +export type StateAcctParamsGetContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_acct_balance(account)uint64' | 'verify_acct_balance', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_balance(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_balance(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_balance(account)uint64'] + }> + & Record<'verify_acct_min_balance(account)uint64' | 'verify_acct_min_balance', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_min_balance(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_min_balance(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_min_balance(account)uint64'] + }> + & Record<'verify_acct_auth_addr(account)address' | 'verify_acct_auth_addr', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_auth_addr(account)address'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_auth_addr(account)address'] + returns: StateAcctParamsGetContractReturns['verify_acct_auth_addr(account)address'] + }> + & Record<'verify_acct_total_num_uint(account)uint64' | 'verify_acct_total_num_uint', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_num_uint(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_num_uint(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_num_uint(account)uint64'] + }> + & Record<'verify_acct_total_num_byte_slice(account)uint64' | 'verify_acct_total_num_byte_slice', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_num_byte_slice(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_num_byte_slice(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_num_byte_slice(account)uint64'] + }> + & Record<'verify_acct_total_extra_app_pages(account)uint64' | 'verify_acct_total_extra_app_pages', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_extra_app_pages(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_extra_app_pages(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_extra_app_pages(account)uint64'] + }> + & Record<'verify_acct_total_apps_created(account)uint64' | 'verify_acct_total_apps_created', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_apps_created(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_apps_created(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_apps_created(account)uint64'] + }> + & Record<'verify_acct_total_apps_opted_in(account)uint64' | 'verify_acct_total_apps_opted_in', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_apps_opted_in(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_apps_opted_in(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_apps_opted_in(account)uint64'] + }> + & Record<'verify_acct_total_assets_created(account)uint64' | 'verify_acct_total_assets_created', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_assets_created(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_assets_created(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_assets_created(account)uint64'] + }> + & Record<'verify_acct_total_assets(account)uint64' | 'verify_acct_total_assets', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_assets(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_assets(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_assets(account)uint64'] + }> + & Record<'verify_acct_total_boxes(account)uint64' | 'verify_acct_total_boxes', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_boxes(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_boxes(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_boxes(account)uint64'] + }> + & Record<'verify_acct_total_box_bytes(account)uint64' | 'verify_acct_total_box_bytes', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_total_box_bytes(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_total_box_bytes(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_total_box_bytes(account)uint64'] + }> + & Record<'verify_acct_incentive_eligible(account)bool' | 'verify_acct_incentive_eligible', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_incentive_eligible(account)bool'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_incentive_eligible(account)bool'] + returns: StateAcctParamsGetContractReturns['verify_acct_incentive_eligible(account)bool'] + }> + & Record<'verify_acct_last_heartbeat(account)uint64' | 'verify_acct_last_heartbeat', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_last_heartbeat(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_last_heartbeat(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_last_heartbeat(account)uint64'] + }> + & Record<'verify_acct_last_proposed(account)uint64' | 'verify_acct_last_proposed', { + argsObj: StateAcctParamsGetContractArgs['obj']['verify_acct_last_proposed(account)uint64'] + argsTuple: StateAcctParamsGetContractArgs['tuple']['verify_acct_last_proposed(account)uint64'] + returns: StateAcctParamsGetContractReturns['verify_acct_last_proposed(account)uint64'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAcctParamsGetContractSignatures = keyof StateAcctParamsGetContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateAcctParamsGetContractNonVoidMethodSignatures = keyof StateAcctParamsGetContractTypes['methods'] extends infer T ? T extends keyof StateAcctParamsGetContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAcctParamsGetContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAcctParamsGetContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAcctParamsGetContract smart contract to the method's return type + */ +export type MethodReturn = StateAcctParamsGetContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAcctParamsGetContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAcctParamsGetContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAcctParamsGetContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAcctParamsGetContract smart contract + */ +export abstract class StateAcctParamsGetContractParamsFactory { + /** + * Constructs a no op call for the verify_acct_balance(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctBalance(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_balance(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_min_balance(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctMinBalance(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_min_balance(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_auth_addr(account)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctAuthAddr(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_auth_addr(account)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_num_uint(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalNumUint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_num_uint(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_num_byte_slice(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalNumByteSlice(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_num_byte_slice(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_extra_app_pages(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalExtraAppPages(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_extra_app_pages(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_apps_created(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAppsCreated(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_apps_created(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_apps_opted_in(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAppsOptedIn(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_apps_opted_in(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_assets_created(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAssetsCreated(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_assets_created(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_assets(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalAssets(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_assets(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_boxes(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalBoxes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_boxes(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_total_box_bytes(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctTotalBoxBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_total_box_bytes(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_incentive_eligible(account)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctIncentiveEligible(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_incentive_eligible(account)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_last_heartbeat(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctLastHeartbeat(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_last_heartbeat(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_acct_last_proposed(account)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAcctLastProposed(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_acct_last_proposed(account)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateAcctParamsGetContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAcctParamsGetContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAcctParamsGetContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAcctParamsGetContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAcctParamsGetContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAcctParamsGetContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAcctParamsGetContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAcctParamsGetContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAcctParamsGetContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAcctParamsGetContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAcctParamsGetContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAcctParamsGetContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAcctParamsGetContract smart contract + */ +export class StateAcctParamsGetContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAcctParamsGetContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAcctParamsGetContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAcctParamsGetContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAcctParamsGetContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAcctParamsGetContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAcctParamsGetContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAcctParamsGetContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGetContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_min_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctMinBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctMinBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_auth_addr(account)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctAuthAddr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctAuthAddr(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumUint(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalExtraAppPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalExtraAppPages(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAppsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAppsOptedIn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsOptedIn(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAssetsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssetsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalAssets: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssets(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxes(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctTotalBoxBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxBytes(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_incentive_eligible(account)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctIncentiveEligible: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctIncentiveEligible(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_heartbeat(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctLastHeartbeat: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastHeartbeat(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_proposed(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAcctLastProposed: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastProposed(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGetContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_min_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctMinBalance: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctMinBalance(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_auth_addr(account)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctAuthAddr: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctAuthAddr(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumUint(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalExtraAppPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalExtraAppPages(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAppsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAppsOptedIn: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsOptedIn(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAssetsCreated: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssetsCreated(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalAssets: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssets(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalBoxes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxes(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctTotalBoxBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxBytes(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_incentive_eligible(account)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctIncentiveEligible: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctIncentiveEligible(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_heartbeat(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctLastHeartbeat: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastHeartbeat(params)) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_proposed(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAcctLastProposed: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastProposed(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGetContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctBalance: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctBalance(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_balance(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_min_balance(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctMinBalance: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctMinBalance(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_min_balance(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_auth_addr(account)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctAuthAddr: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctAuthAddr(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_auth_addr(account)address'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_uint(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalNumUint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumUint(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_num_uint(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_num_byte_slice(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalNumByteSlice: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalNumByteSlice(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_num_byte_slice(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_extra_app_pages(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalExtraAppPages: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalExtraAppPages(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_extra_app_pages(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAppsCreated: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsCreated(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_apps_created(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_apps_opted_in(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAppsOptedIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAppsOptedIn(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_apps_opted_in(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets_created(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAssetsCreated: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssetsCreated(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_assets_created(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_assets(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalAssets: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalAssets(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_assets(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_boxes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalBoxes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxes(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_boxes(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_total_box_bytes(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctTotalBoxBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctTotalBoxBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_total_box_bytes(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_incentive_eligible(account)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctIncentiveEligible: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctIncentiveEligible(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_incentive_eligible(account)bool'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_heartbeat(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctLastHeartbeat: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastHeartbeat(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_last_heartbeat(account)uint64'])} + }, + + /** + * Makes a call to the StateAcctParamsGetContract smart contract using the `verify_acct_last_proposed(account)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAcctLastProposed: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAcctParamsGetContractParamsFactory.verifyAcctLastProposed(params)) + return {...result, return: result.return as unknown as (undefined | StateAcctParamsGetContractReturns['verify_acct_last_proposed(account)uint64'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAcctParamsGetContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAcctParamsGetContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAcctParamsGetContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_acct_balance(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctBalance(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctBalance(params))) + return this + }, + /** + * Add a verify_acct_min_balance(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctMinBalance(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctMinBalance(params))) + return this + }, + /** + * Add a verify_acct_auth_addr(account)address method call against the StateAcctParamsGetContract contract + */ + verifyAcctAuthAddr(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctAuthAddr(params))) + return this + }, + /** + * Add a verify_acct_total_num_uint(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalNumUint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalNumUint(params))) + return this + }, + /** + * Add a verify_acct_total_num_byte_slice(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalNumByteSlice(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalNumByteSlice(params))) + return this + }, + /** + * Add a verify_acct_total_extra_app_pages(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalExtraAppPages(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalExtraAppPages(params))) + return this + }, + /** + * Add a verify_acct_total_apps_created(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalAppsCreated(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAppsCreated(params))) + return this + }, + /** + * Add a verify_acct_total_apps_opted_in(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalAppsOptedIn(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAppsOptedIn(params))) + return this + }, + /** + * Add a verify_acct_total_assets_created(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalAssetsCreated(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAssetsCreated(params))) + return this + }, + /** + * Add a verify_acct_total_assets(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalAssets(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalAssets(params))) + return this + }, + /** + * Add a verify_acct_total_boxes(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalBoxes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalBoxes(params))) + return this + }, + /** + * Add a verify_acct_total_box_bytes(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctTotalBoxBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctTotalBoxBytes(params))) + return this + }, + /** + * Add a verify_acct_incentive_eligible(account)bool method call against the StateAcctParamsGetContract contract + */ + verifyAcctIncentiveEligible(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctIncentiveEligible(params))) + return this + }, + /** + * Add a verify_acct_last_heartbeat(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctLastHeartbeat(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctLastHeartbeat(params))) + return this + }, + /** + * Add a verify_acct_last_proposed(account)uint64 method call against the StateAcctParamsGetContract contract + */ + verifyAcctLastProposed(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAcctLastProposed(params))) + return this + }, + /** + * Add a clear state call to the StateAcctParamsGetContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAcctParamsGetContractComposer + } +} +export type StateAcctParamsGetContractComposer = { + /** + * Calls the verify_acct_balance(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctBalance(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_balance(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_min_balance(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctMinBalance(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_min_balance(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_auth_addr(account)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctAuthAddr(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_auth_addr(account)address'] | undefined]> + + /** + * Calls the verify_acct_total_num_uint(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalNumUint(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_num_uint(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_num_byte_slice(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalNumByteSlice(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_num_byte_slice(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_extra_app_pages(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalExtraAppPages(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_extra_app_pages(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_apps_created(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAppsCreated(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_apps_created(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_apps_opted_in(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAppsOptedIn(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_apps_opted_in(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_assets_created(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAssetsCreated(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_assets_created(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_assets(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalAssets(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_assets(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_boxes(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalBoxes(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_boxes(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_total_box_bytes(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctTotalBoxBytes(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_total_box_bytes(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_incentive_eligible(account)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctIncentiveEligible(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_incentive_eligible(account)bool'] | undefined]> + + /** + * Calls the verify_acct_last_heartbeat(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctLastHeartbeat(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_last_heartbeat(account)uint64'] | undefined]> + + /** + * Calls the verify_acct_last_proposed(account)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAcctLastProposed(params?: CallParams): StateAcctParamsGetContractComposer<[...TReturns, StateAcctParamsGetContractReturns['verify_acct_last_proposed(account)uint64'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the StateAcctParamsGetContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAcctParamsGetContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAcctParamsGetContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAcctParamsGetContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalContract.ts new file mode 100644 index 0000000..fc6b74f --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalContract.ts @@ -0,0 +1,1018 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAppGlobalContract","structs":{},"methods":[{"name":"verify_get_bytes","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_uint64","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_ex_bytes","args":[{"type":"uint64","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"(byte[],bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_ex_uint64","args":[{"type":"uint64","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"(uint64,bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_delete","args":[{"type":"byte[]","name":"a"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_put_uint64","args":[{"type":"byte[]","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_put_bytes","args":[{"type":"byte[]","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":1,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"global_uint64":{"keyType":"AVMString","valueType":"AVMUint64","key":"Z2xvYmFsX3VpbnQ2NA=="},"global_bytes":{"keyType":"AVMString","valueType":"AVMBytes","key":"Z2xvYmFsX2J5dGVz"}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQ1CiAgICAvLyBjbGFzcyBTdGF0ZUFwcEdsb2JhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxNgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4YTk5N2ExODcgMHg0ZGI4YWE0MSAweDBjMWY1NmE3IDB4YWZkZGIwODggMHg5M2E4NTJlMSAweDM2OTk2NDUxIDB4MzkyMGE1N2IgLy8gbWV0aG9kICJ2ZXJpZnlfZ2V0X2J5dGVzKGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9nZXRfdWludDY0KGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfYnl0ZXModWludDY0LGJ5dGVbXSkoYnl0ZVtdLGJvb2wpIiwgbWV0aG9kICJ2ZXJpZnlfZ2V0X2V4X3VpbnQ2NCh1aW50NjQsYnl0ZVtdKSh1aW50NjQsYm9vbCkiLCBtZXRob2QgInZlcmlmeV9kZWxldGUoYnl0ZVtdKXZvaWQiLCBtZXRob2QgInZlcmlmeV9wdXRfdWludDY0KGJ5dGVbXSx1aW50NjQpdm9pZCIsIG1ldGhvZCAidmVyaWZ5X3B1dF9ieXRlcyhieXRlW10sYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfZ2V0X2J5dGVzIHZlcmlmeV9nZXRfdWludDY0IHZlcmlmeV9nZXRfZXhfYnl0ZXMgdmVyaWZ5X2dldF9leF91aW50NjQgdmVyaWZ5X2RlbGV0ZSB2ZXJpZnlfcHV0X3VpbnQ2NCB2ZXJpZnlfcHV0X2J5dGVzCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTY6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9nZXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDU5CiAgICAvLyB2YWx1ZSA9IG9wLkFwcEdsb2JhbC5nZXRfYnl0ZXMoYSkKICAgIGFwcF9nbG9iYWxfZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDY0CiAgICAvLyB2YWx1ZSA9IG9wLkFwcEdsb2JhbC5nZXRfdWludDY0KGEpCiAgICBhcHBfZ2xvYmFsX2dldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF9leF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2OQogICAgLy8gcmV0dXJuIG9wLkFwcEdsb2JhbC5nZXRfZXhfYnl0ZXMoYSwgYikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfZXhfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDczCiAgICAvLyByZXR1cm4gb3AuQXBwR2xvYmFsLmdldF9leF91aW50NjQoYSwgYikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgc3dhcAogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9kZWxldGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGVsZXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDc3CiAgICAvLyBvcC5BcHBHbG9iYWwuZGVsZXRlKGEpCiAgICBhcHBfZ2xvYmFsX2RlbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfcHV0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgxCiAgICAvLyBvcC5BcHBHbG9iYWwucHV0KGEsIGIpCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfcHV0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3B1dF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODUKICAgIC8vIG9wLkFwcEdsb2JhbC5wdXQoYSwgYikKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmAgQVH3x1AQAxG0EAQDEZFEQxGESCBwSpl6GHBE24qkEEDB9WpwSv3bCIBJOoUuEENplkUQQ5IKV7NhoAjgcACQAeACwAVABtAHYAgwAxGRQxGBQQQzYaAVcCAGRJFRZXBgJMUChMULAiQzYaAVcCAGQWKExQsCJDNhoBFzYaAlcCAGVLARUWVwYCTwJQKSNPA1SAAgADTFBMUChMULAiQzYaARc2GgJXAgBlTBYpI08DVFAoTFCwIkM2GgFXAgBpIkM2GgFXAgA2GgIXZyJDNhoBVwIANhoCVwIAZyJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAppGlobalContract contract + */ +export type StateAppGlobalContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_get_bytes(byte[])byte[]': { + a: Uint8Array + } + 'verify_get_uint64(byte[])uint64': { + a: Uint8Array + } + 'verify_get_ex_bytes(uint64,byte[])(byte[],bool)': { + a: bigint | number + b: Uint8Array + } + 'verify_get_ex_uint64(uint64,byte[])(uint64,bool)': { + a: bigint | number + b: Uint8Array + } + 'verify_delete(byte[])void': { + a: Uint8Array + } + 'verify_put_uint64(byte[],uint64)void': { + a: Uint8Array + b: bigint | number + } + 'verify_put_bytes(byte[],byte[])void': { + a: Uint8Array + b: Uint8Array + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_get_bytes(byte[])byte[]': [a: Uint8Array] + 'verify_get_uint64(byte[])uint64': [a: Uint8Array] + 'verify_get_ex_bytes(uint64,byte[])(byte[],bool)': [a: bigint | number, b: Uint8Array] + 'verify_get_ex_uint64(uint64,byte[])(uint64,bool)': [a: bigint | number, b: Uint8Array] + 'verify_delete(byte[])void': [a: Uint8Array] + 'verify_put_uint64(byte[],uint64)void': [a: Uint8Array, b: bigint | number] + 'verify_put_bytes(byte[],byte[])void': [a: Uint8Array, b: Uint8Array] + } +} + +/** + * The return type for each method + */ +export type StateAppGlobalContractReturns = { + 'verify_get_bytes(byte[])byte[]': Uint8Array + 'verify_get_uint64(byte[])uint64': bigint + 'verify_get_ex_bytes(uint64,byte[])(byte[],bool)': [Uint8Array, boolean] + 'verify_get_ex_uint64(uint64,byte[])(uint64,bool)': [bigint, boolean] + 'verify_delete(byte[])void': void + 'verify_put_uint64(byte[],uint64)void': void + 'verify_put_bytes(byte[],byte[])void': void +} + +/** + * Defines the types of available calls and state of the StateAppGlobalContract smart contract. + */ +export type StateAppGlobalContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_get_bytes(byte[])byte[]' | 'verify_get_bytes', { + argsObj: StateAppGlobalContractArgs['obj']['verify_get_bytes(byte[])byte[]'] + argsTuple: StateAppGlobalContractArgs['tuple']['verify_get_bytes(byte[])byte[]'] + returns: StateAppGlobalContractReturns['verify_get_bytes(byte[])byte[]'] + }> + & Record<'verify_get_uint64(byte[])uint64' | 'verify_get_uint64', { + argsObj: StateAppGlobalContractArgs['obj']['verify_get_uint64(byte[])uint64'] + argsTuple: StateAppGlobalContractArgs['tuple']['verify_get_uint64(byte[])uint64'] + returns: StateAppGlobalContractReturns['verify_get_uint64(byte[])uint64'] + }> + & Record<'verify_get_ex_bytes(uint64,byte[])(byte[],bool)' | 'verify_get_ex_bytes', { + argsObj: StateAppGlobalContractArgs['obj']['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'] + argsTuple: StateAppGlobalContractArgs['tuple']['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'] + returns: StateAppGlobalContractReturns['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'] + }> + & Record<'verify_get_ex_uint64(uint64,byte[])(uint64,bool)' | 'verify_get_ex_uint64', { + argsObj: StateAppGlobalContractArgs['obj']['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'] + argsTuple: StateAppGlobalContractArgs['tuple']['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'] + returns: StateAppGlobalContractReturns['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'] + }> + & Record<'verify_delete(byte[])void' | 'verify_delete', { + argsObj: StateAppGlobalContractArgs['obj']['verify_delete(byte[])void'] + argsTuple: StateAppGlobalContractArgs['tuple']['verify_delete(byte[])void'] + returns: StateAppGlobalContractReturns['verify_delete(byte[])void'] + }> + & Record<'verify_put_uint64(byte[],uint64)void' | 'verify_put_uint64', { + argsObj: StateAppGlobalContractArgs['obj']['verify_put_uint64(byte[],uint64)void'] + argsTuple: StateAppGlobalContractArgs['tuple']['verify_put_uint64(byte[],uint64)void'] + returns: StateAppGlobalContractReturns['verify_put_uint64(byte[],uint64)void'] + }> + & Record<'verify_put_bytes(byte[],byte[])void' | 'verify_put_bytes', { + argsObj: StateAppGlobalContractArgs['obj']['verify_put_bytes(byte[],byte[])void'] + argsTuple: StateAppGlobalContractArgs['tuple']['verify_put_bytes(byte[],byte[])void'] + returns: StateAppGlobalContractReturns['verify_put_bytes(byte[],byte[])void'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + global: { + keys: { + globalUint64: bigint + globalBytes: BinaryState + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAppGlobalContractSignatures = keyof StateAppGlobalContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateAppGlobalContractNonVoidMethodSignatures = keyof StateAppGlobalContractTypes['methods'] extends infer T ? T extends keyof StateAppGlobalContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAppGlobalContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAppGlobalContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAppGlobalContract smart contract to the method's return type + */ +export type MethodReturn = StateAppGlobalContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed global state of the application. + */ +export type GlobalKeysState = StateAppGlobalContractTypes['state']['global']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAppGlobalContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAppGlobalContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAppGlobalContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppGlobalContract smart contract + */ +export abstract class StateAppGlobalContractParamsFactory { + /** + * Constructs a no op call for the verify_get_bytes(byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_bytes(byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_get_uint64(byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_uint64(byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_get_ex_bytes(uint64,byte[])(byte[],bool) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetExBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_ex_bytes(uint64,byte[])(byte[],bool)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_get_ex_uint64(uint64,byte[])(uint64,bool) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetExUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_ex_uint64(uint64,byte[])(uint64,bool)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_delete(byte[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyDelete(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_delete(byte[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_put_uint64(byte[],uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyPutUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_put_uint64(byte[],uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_put_bytes(byte[],byte[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyPutBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_put_bytes(byte[],byte[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateAppGlobalContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAppGlobalContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAppGlobalContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAppGlobalContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAppGlobalContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAppGlobalContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAppGlobalContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAppGlobalContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppGlobalContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppGlobalContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppGlobalContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAppGlobalContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAppGlobalContract smart contract + */ +export class StateAppGlobalContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAppGlobalContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAppGlobalContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAppGlobalContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAppGlobalContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAppGlobalContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAppGlobalContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAppGlobalContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_bytes(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyGetBytes(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyGetUint64(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_bytes(uint64,byte[])(byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetExBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyGetExBytes(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_uint64(uint64,byte[])(uint64,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetExUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyGetExUint64(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_delete(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyDelete: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyDelete(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_uint64(byte[],uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyPutUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyPutUint64(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_bytes(byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyPutBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppGlobalContractParamsFactory.verifyPutBytes(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_bytes(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyGetBytes(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyGetUint64(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_bytes(uint64,byte[])(byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetExBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyGetExBytes(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_uint64(uint64,byte[])(uint64,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetExUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyGetExUint64(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_delete(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyDelete: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyDelete(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_uint64(byte[],uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyPutUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyPutUint64(params)) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_bytes(byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyPutBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppGlobalContractParamsFactory.verifyPutBytes(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_bytes(byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyGetBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_get_bytes(byte[])byte[]'])} + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_uint64(byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyGetUint64(params)) + return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_get_uint64(byte[])uint64'])} + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_bytes(uint64,byte[])(byte[],bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetExBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyGetExBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'])} + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_get_ex_uint64(uint64,byte[])(uint64,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetExUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyGetExUint64(params)) + return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'])} + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_delete(byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyDelete: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyDelete(params)) + return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_delete(byte[])void'])} + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_uint64(byte[],uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyPutUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyPutUint64(params)) + return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_put_uint64(byte[],uint64)void'])} + }, + + /** + * Makes a call to the StateAppGlobalContract smart contract using the `verify_put_bytes(byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyPutBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppGlobalContractParamsFactory.verifyPutBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAppGlobalContractReturns['verify_put_bytes(byte[],byte[])void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAppGlobalContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAppGlobalContract app + */ + state = { + /** + * Methods to access global state for the current StateAppGlobalContract app + */ + global: { + /** + * Get all current keyed values from global state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.global.getAll() + return { + globalUint64: result.global_uint64, + globalBytes: new BinaryStateValue(result.global_bytes), + } + }, + /** + * Get the current value of the global_uint64 key in global state + */ + globalUint64: async (): Promise => { return (await this.appClient.state.global.getValue("global_uint64")) as bigint | undefined }, + /** + * Get the current value of the global_bytes key in global state + */ + globalBytes: async (): Promise => { return new BinaryStateValue((await this.appClient.state.global.getValue("global_bytes")) as Uint8Array | undefined) }, + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAppGlobalContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_get_bytes(byte[])byte[] method call against the StateAppGlobalContract contract + */ + verifyGetBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetBytes(params))) + return this + }, + /** + * Add a verify_get_uint64(byte[])uint64 method call against the StateAppGlobalContract contract + */ + verifyGetUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetUint64(params))) + return this + }, + /** + * Add a verify_get_ex_bytes(uint64,byte[])(byte[],bool) method call against the StateAppGlobalContract contract + */ + verifyGetExBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetExBytes(params))) + return this + }, + /** + * Add a verify_get_ex_uint64(uint64,byte[])(uint64,bool) method call against the StateAppGlobalContract contract + */ + verifyGetExUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetExUint64(params))) + return this + }, + /** + * Add a verify_delete(byte[])void method call against the StateAppGlobalContract contract + */ + verifyDelete(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyDelete(params))) + return this + }, + /** + * Add a verify_put_uint64(byte[],uint64)void method call against the StateAppGlobalContract contract + */ + verifyPutUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyPutUint64(params))) + return this + }, + /** + * Add a verify_put_bytes(byte[],byte[])void method call against the StateAppGlobalContract contract + */ + verifyPutBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyPutBytes(params))) + return this + }, + /** + * Add a clear state call to the StateAppGlobalContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAppGlobalContractComposer + } +} +export type StateAppGlobalContractComposer = { + /** + * Calls the verify_get_bytes(byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetBytes(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_get_bytes(byte[])byte[]'] | undefined]> + + /** + * Calls the verify_get_uint64(byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetUint64(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_get_uint64(byte[])uint64'] | undefined]> + + /** + * Calls the verify_get_ex_bytes(uint64,byte[])(byte[],bool) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetExBytes(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_get_ex_bytes(uint64,byte[])(byte[],bool)'] | undefined]> + + /** + * Calls the verify_get_ex_uint64(uint64,byte[])(uint64,bool) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetExUint64(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_get_ex_uint64(uint64,byte[])(uint64,bool)'] | undefined]> + + /** + * Calls the verify_delete(byte[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyDelete(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_delete(byte[])void'] | undefined]> + + /** + * Calls the verify_put_uint64(byte[],uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyPutUint64(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_put_uint64(byte[],uint64)void'] | undefined]> + + /** + * Calls the verify_put_bytes(byte[],byte[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyPutBytes(params?: CallParams): StateAppGlobalContractComposer<[...TReturns, StateAppGlobalContractReturns['verify_put_bytes(byte[],byte[])void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAppGlobalContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppGlobalContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAppGlobalContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalExContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalExContract.ts new file mode 100644 index 0000000..cf78371 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppGlobalExContract.ts @@ -0,0 +1,551 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAppGlobalExContract","structs":{},"methods":[],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":2,"bytes":4},"local":{"ints":0,"bytes":0}},"keys":{"global":{"global_uint64":{"keyType":"AVMString","valueType":"AVMUint64","key":"Z2xvYmFsX3VpbnQ2NA=="},"global_bytes":{"keyType":"AVMString","valueType":"AVMBytes","key":"Z2xvYmFsX2J5dGVz"},"global_uint64_explicit":{"keyType":"AVMString","valueType":"AVMUint64","key":"Z2xvYmFsX3VpbnQ2NF9leHBsaWNpdA=="},"global_bytes_explicit":{"keyType":"AVMString","valueType":"AVMBytes","key":"Z2xvYmFsX2J5dGVzX2V4cGxpY2l0"},"global_arc4_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"Z2xvYmFsX2FyYzRfYnl0ZXM="},"global_arc4_bytes_explicit":{"keyType":"AVMString","valueType":"byte[]","key":"Z2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQ="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDMxCiAgICAvLyBrZXk9Imdsb2JhbF91aW50NjQiLAogICAgcHVzaGJ5dGVzICJnbG9iYWxfdWludDY0IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzMAogICAgLy8gVUludDY0KDIpLAogICAgcHVzaGludCAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDI5LTQzMgogICAgLy8gc2VsZi5nbG9iYWxfdWludDY0ID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgVUludDY0KDIpLAogICAgLy8gICAgIGtleT0iZ2xvYmFsX3VpbnQ2NCIsCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzNQogICAgLy8ga2V5PSJnbG9iYWxfYnl0ZXMiLAogICAgcHVzaGJ5dGVzICJnbG9iYWxfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM0CiAgICAvLyBCeXRlcyhiImR1bW15X2J5dGVzIiksCiAgICBieXRlY18wIC8vIDB4NjQ3NTZkNmQ3OTVmNjI3OTc0NjU3MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzMy00MzYKICAgIC8vIHNlbGYuZ2xvYmFsX2J5dGVzID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgQnl0ZXMoYiJkdW1teV9ieXRlcyIpLAogICAgLy8gICAgIGtleT0iZ2xvYmFsX2J5dGVzIiwKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM3CiAgICAvLyBzZWxmLmdsb2JhbF91aW50NjRfZXhwbGljaXQgPSBhbGdvcHkuVUludDY0KDIpCiAgICBwdXNoYnl0ZXMgImdsb2JhbF91aW50NjRfZXhwbGljaXQiCiAgICBwdXNoaW50IDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM4CiAgICAvLyBzZWxmLmdsb2JhbF9ieXRlc19leHBsaWNpdCA9IGFsZ29weS5CeXRlcyhiImR1bW15X2J5dGVzIikKICAgIHB1c2hieXRlcyAiZ2xvYmFsX2J5dGVzX2V4cGxpY2l0IgogICAgYnl0ZWNfMCAvLyAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQwCiAgICAvLyBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIiksIGtleT0iZ2xvYmFsX2FyYzRfYnl0ZXMiCiAgICBwdXNoYnl0ZXMgImdsb2JhbF9hcmM0X2J5dGVzIgogICAgYnl0ZWNfMSAvLyAweDAwMTA2NDc1NmQ2ZDc5NWY2MTcyNjMzNDVmNjI3OTc0NjU3MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzOS00NDEKICAgIC8vIHNlbGYuZ2xvYmFsX2FyYzRfYnl0ZXMgPSBHbG9iYWxTdGF0ZSgKICAgIC8vICAgICBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIiksIGtleT0iZ2xvYmFsX2FyYzRfYnl0ZXMiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ0MgogICAgLy8gc2VsZi5nbG9iYWxfYXJjNF9ieXRlc19leHBsaWNpdCA9IGFsZ29weS5hcmM0LkR5bmFtaWNCeXRlcyhiImR1bW15X2FyYzRfYnl0ZXMiKQogICAgcHVzaGJ5dGVzICJnbG9iYWxfYXJjNF9ieXRlc19leHBsaWNpdCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDAKICAgIC8vIGFsZ29weS5hcmM0LkR5bmFtaWNCeXRlcyhiImR1bW15X2FyYzRfYnl0ZXMiKSwga2V5PSJnbG9iYWxfYXJjNF9ieXRlcyIKICAgIGJ5dGVjXzEgLy8gMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDIKICAgIC8vIHNlbGYuZ2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQgPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIikKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjcKICAgIC8vIGNsYXNzIFN0YXRlQXBwR2xvYmFsRXhDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgICEKICAgIGFzc2VydAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyYCC2R1bW15X2J5dGVzEgAQZHVtbXlfYXJjNF9ieXRlczEYQACJgA1nbG9iYWxfdWludDY0gQJngAxnbG9iYWxfYnl0ZXMoZ4AWZ2xvYmFsX3VpbnQ2NF9leHBsaWNpdIECZ4AVZ2xvYmFsX2J5dGVzX2V4cGxpY2l0KGeAEWdsb2JhbF9hcmM0X2J5dGVzKWeAGmdsb2JhbF9hcmM0X2J5dGVzX2V4cGxpY2l0KWcxGxREMRkUMRgUEEM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAppGlobalExContract contract + */ +export type StateAppGlobalExContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + } +} + +/** + * The return type for each method + */ +export type StateAppGlobalExContractReturns = { +} + +/** + * Defines the types of available calls and state of the StateAppGlobalExContract smart contract. + */ +export type StateAppGlobalExContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: {} + /** + * Defines the shape of the state of the application. + */ + state: { + global: { + keys: { + globalUint64: bigint + globalBytes: BinaryState + globalUint64Explicit: bigint + globalBytesExplicit: BinaryState + globalArc4Bytes: Uint8Array + globalArc4BytesExplicit: Uint8Array + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAppGlobalExContractSignatures = keyof StateAppGlobalExContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAppGlobalExContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAppGlobalExContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAppGlobalExContract smart contract to the method's return type + */ +export type MethodReturn = StateAppGlobalExContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed global state of the application. + */ +export type GlobalKeysState = StateAppGlobalExContractTypes['state']['global']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAppGlobalExContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAppGlobalExContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAppGlobalExContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppGlobalExContract smart contract + */ +export abstract class StateAppGlobalExContractParamsFactory { +} + +/** + * A factory to create and deploy one or more instance of the StateAppGlobalExContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAppGlobalExContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAppGlobalExContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAppGlobalExContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAppGlobalExContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAppGlobalExContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAppGlobalExContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAppGlobalExContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppGlobalExContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppGlobalExContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppGlobalExContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAppGlobalExContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAppGlobalExContract smart contract + */ +export class StateAppGlobalExContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAppGlobalExContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAppGlobalExContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAppGlobalExContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAppGlobalExContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAppGlobalExContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAppGlobalExContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAppGlobalExContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalExContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalExContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalExContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAppGlobalExContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAppGlobalExContract app + */ + state = { + /** + * Methods to access global state for the current StateAppGlobalExContract app + */ + global: { + /** + * Get all current keyed values from global state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.global.getAll() + return { + globalUint64: result.global_uint64, + globalBytes: new BinaryStateValue(result.global_bytes), + globalUint64Explicit: result.global_uint64_explicit, + globalBytesExplicit: new BinaryStateValue(result.global_bytes_explicit), + globalArc4Bytes: result.global_arc4_bytes, + globalArc4BytesExplicit: result.global_arc4_bytes_explicit, + } + }, + /** + * Get the current value of the global_uint64 key in global state + */ + globalUint64: async (): Promise => { return (await this.appClient.state.global.getValue("global_uint64")) as bigint | undefined }, + /** + * Get the current value of the global_bytes key in global state + */ + globalBytes: async (): Promise => { return new BinaryStateValue((await this.appClient.state.global.getValue("global_bytes")) as Uint8Array | undefined) }, + /** + * Get the current value of the global_uint64_explicit key in global state + */ + globalUint64Explicit: async (): Promise => { return (await this.appClient.state.global.getValue("global_uint64_explicit")) as bigint | undefined }, + /** + * Get the current value of the global_bytes_explicit key in global state + */ + globalBytesExplicit: async (): Promise => { return new BinaryStateValue((await this.appClient.state.global.getValue("global_bytes_explicit")) as Uint8Array | undefined) }, + /** + * Get the current value of the global_arc4_bytes key in global state + */ + globalArc4Bytes: async (): Promise => { return (await this.appClient.state.global.getValue("global_arc4_bytes")) as Uint8Array | undefined }, + /** + * Get the current value of the global_arc4_bytes_explicit key in global state + */ + globalArc4BytesExplicit: async (): Promise => { return (await this.appClient.state.global.getValue("global_arc4_bytes_explicit")) as Uint8Array | undefined }, + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAppGlobalExContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a clear state call to the StateAppGlobalExContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAppGlobalExContractComposer + } +} +export type StateAppGlobalExContractComposer = { + /** + * Makes a clear_state call to an existing instance of the StateAppGlobalExContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAppGlobalExContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppGlobalExContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAppGlobalExContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalContract.ts new file mode 100644 index 0000000..be9dae8 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalContract.ts @@ -0,0 +1,1197 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAppLocalContract","structs":{},"methods":[{"name":"opt_in","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["OptIn"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_bytes","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_uint64","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_ex_bytes","args":[{"type":"address","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_get_ex_uint64","args":[{"type":"address","name":"a"},{"type":"uint64","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_delete","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_exists","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_put_uint64","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"},{"type":"uint64","name":"c"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_put_bytes","args":[{"type":"address","name":"a"},{"type":"byte[]","name":"b"},{"type":"byte[]","name":"c"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":1,"bytes":1}},"keys":{"global":{},"local":{"local_uint64":{"keyType":"AVMString","valueType":"AVMUint64","key":"bG9jYWxfdWludDY0"},"local_bytes":{"keyType":"AVMString","valueType":"AVMBytes","key":"bG9jYWxfYnl0ZXM="}},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM3MgogICAgLy8gY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxOQogICAgcHVzaGJ5dGVzIDB4MzBjNmQ1OGEgLy8gbWV0aG9kICJvcHRfaW4oKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX29wdF9pbl9yb3V0ZUA1CgptYWluX3N3aXRjaF9jYXNlX25leHRANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNzIKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4YTg4MzAyZmUgMHg0OWI3ZGRmOSAweGMwNzhiZWFkIDB4YTUyZjk5MmIgMHg4YzU2YWQ5MCAweDRjN2FkODIzIDB4Y2FhN2I4NjQgMHgyNGY5ZjA4NSAvLyBtZXRob2QgInZlcmlmeV9nZXRfYnl0ZXMoYWRkcmVzcyxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZ2V0X3VpbnQ2NChhZGRyZXNzLGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfYnl0ZXMoYWRkcmVzcyx1aW50NjQsYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2dldF9leF91aW50NjQoYWRkcmVzcyx1aW50NjQsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2RlbGV0ZShhZGRyZXNzLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfZXhpc3RzKGFkZHJlc3MsYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9wdXRfdWludDY0KGFkZHJlc3MsYnl0ZVtdLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfcHV0X2J5dGVzKGFkZHJlc3MsYnl0ZVtdLGJ5dGVbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X2dldF9ieXRlcyB2ZXJpZnlfZ2V0X3VpbnQ2NCB2ZXJpZnlfZ2V0X2V4X2J5dGVzIHZlcmlmeV9nZXRfZXhfdWludDY0IHZlcmlmeV9kZWxldGUgdmVyaWZ5X2V4aXN0cyB2ZXJpZnlfcHV0X3VpbnQ2NCB2ZXJpZnlfcHV0X2J5dGVzCiAgICBlcnIKCm1haW5fb3B0X2luX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gT3B0SW4KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBvcHRfaW4KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3Qub3B0X2luW3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4NgogICAgLy8gc2VsZi5sb2NhbF9ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IEJ5dGVzKGIiZHVtbXlfYnl0ZXMiKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBwdXNoYnl0ZXNzICJsb2NhbF9ieXRlcyIgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzg3CiAgICAvLyBzZWxmLmxvY2FsX3VpbnQ2NFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IFVJbnQ2NCg5OTkpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIHB1c2hieXRlcyAibG9jYWxfdWludDY0IgogICAgcHVzaGludCA5OTkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9nZXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzkxCiAgICAvLyB2YWx1ZSA9IG9wLkFwcExvY2FsLmdldF9ieXRlcyhhLCBiKQogICAgYXBwX2xvY2FsX2dldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzk2CiAgICAvLyB2YWx1ZSA9IG9wLkFwcExvY2FsLmdldF91aW50NjQoYSwgYikKICAgIGFwcF9sb2NhbF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF9leF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gdmFsdWUsIF92YWwgPSBvcC5BcHBMb2NhbC5nZXRfZXhfYnl0ZXMoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfZXhfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDA2CiAgICAvLyB2YWx1ZSwgX3ZhbCA9IG9wLkFwcExvY2FsLmdldF9leF91aW50NjQoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9kZWxldGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGVsZXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDExCiAgICAvLyBvcC5BcHBMb2NhbC5kZWxldGUoYSwgYikKICAgIGFwcF9sb2NhbF9kZWwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZXhpc3RzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4aXN0czoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQxNQogICAgLy8gX3ZhbHVlLCBleGlzdHMgPSBvcC5BcHBMb2NhbC5nZXRfZXhfdWludDY0KGEsIDAsIGIpCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAogICAgYXBwX2xvY2FsX2dldF9leAogICAgYnVyeSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X3B1dF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfcHV0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQyMAogICAgLy8gb3AuQXBwTG9jYWwucHV0KGEsIGIsIGMpCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X3B1dF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDI0CiAgICAvLyBvcC5BcHBMb2NhbC5wdXQoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyACAQAmAQQVH3x1MRtBAF+ABDDG1Yo2GgCOAQBHMRkURDEYRIIIBKiDAv4ESbfd+QTAeL6tBKUvmSsEjFatkARMetgjBMqnuGQEJPnwhTYaAI4IAEcAXwBwAI0AowCvAMoA2gAxGSISMRgQREIACDEZFDEYFBBDMgmCAgtsb2NhbF9ieXRlcwtkdW1teV9ieXRlc2YyCYAMbG9jYWxfdWludDY0gecHZiJDNhoBNhoCVwIAYkkVFlcGAkxQKExQsCJDNhoBNhoCVwIAYhYoTFCwIkM2GgE2GgIXNhoDVwIAY0hJFRZXBgJMUChMULAiQzYaATYaAhc2GgNXAgBjSBYoTFCwIkM2GgE2GgJXAgBoIkM2GgE2GgJXAgAjTGNFAYABACNPAlQoTFCwIkM2GgE2GgJXAgA2GgMXZiJDNhoBNhoCVwIANhoDVwIAZiJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAppLocalContract contract + */ +export type StateAppLocalContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'opt_in()void': Record + 'verify_get_bytes(address,byte[])byte[]': { + a: string + b: Uint8Array + } + 'verify_get_uint64(address,byte[])uint64': { + a: string + b: Uint8Array + } + 'verify_get_ex_bytes(address,uint64,byte[])byte[]': { + a: string + b: bigint | number + c: Uint8Array + } + 'verify_get_ex_uint64(address,uint64,byte[])uint64': { + a: string + b: bigint | number + c: Uint8Array + } + 'verify_delete(address,byte[])void': { + a: string + b: Uint8Array + } + 'verify_exists(address,byte[])bool': { + a: string + b: Uint8Array + } + 'verify_put_uint64(address,byte[],uint64)void': { + a: string + b: Uint8Array + c: bigint | number + } + 'verify_put_bytes(address,byte[],byte[])void': { + a: string + b: Uint8Array + c: Uint8Array + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'opt_in()void': [] + 'verify_get_bytes(address,byte[])byte[]': [a: string, b: Uint8Array] + 'verify_get_uint64(address,byte[])uint64': [a: string, b: Uint8Array] + 'verify_get_ex_bytes(address,uint64,byte[])byte[]': [a: string, b: bigint | number, c: Uint8Array] + 'verify_get_ex_uint64(address,uint64,byte[])uint64': [a: string, b: bigint | number, c: Uint8Array] + 'verify_delete(address,byte[])void': [a: string, b: Uint8Array] + 'verify_exists(address,byte[])bool': [a: string, b: Uint8Array] + 'verify_put_uint64(address,byte[],uint64)void': [a: string, b: Uint8Array, c: bigint | number] + 'verify_put_bytes(address,byte[],byte[])void': [a: string, b: Uint8Array, c: Uint8Array] + } +} + +/** + * The return type for each method + */ +export type StateAppLocalContractReturns = { + 'opt_in()void': void + 'verify_get_bytes(address,byte[])byte[]': Uint8Array + 'verify_get_uint64(address,byte[])uint64': bigint + 'verify_get_ex_bytes(address,uint64,byte[])byte[]': Uint8Array + 'verify_get_ex_uint64(address,uint64,byte[])uint64': bigint + 'verify_delete(address,byte[])void': void + 'verify_exists(address,byte[])bool': boolean + 'verify_put_uint64(address,byte[],uint64)void': void + 'verify_put_bytes(address,byte[],byte[])void': void +} + +/** + * Defines the types of available calls and state of the StateAppLocalContract smart contract. + */ +export type StateAppLocalContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'opt_in()void' | 'opt_in', { + argsObj: StateAppLocalContractArgs['obj']['opt_in()void'] + argsTuple: StateAppLocalContractArgs['tuple']['opt_in()void'] + returns: StateAppLocalContractReturns['opt_in()void'] + }> + & Record<'verify_get_bytes(address,byte[])byte[]' | 'verify_get_bytes', { + argsObj: StateAppLocalContractArgs['obj']['verify_get_bytes(address,byte[])byte[]'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_get_bytes(address,byte[])byte[]'] + returns: StateAppLocalContractReturns['verify_get_bytes(address,byte[])byte[]'] + }> + & Record<'verify_get_uint64(address,byte[])uint64' | 'verify_get_uint64', { + argsObj: StateAppLocalContractArgs['obj']['verify_get_uint64(address,byte[])uint64'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_get_uint64(address,byte[])uint64'] + returns: StateAppLocalContractReturns['verify_get_uint64(address,byte[])uint64'] + }> + & Record<'verify_get_ex_bytes(address,uint64,byte[])byte[]' | 'verify_get_ex_bytes', { + argsObj: StateAppLocalContractArgs['obj']['verify_get_ex_bytes(address,uint64,byte[])byte[]'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_get_ex_bytes(address,uint64,byte[])byte[]'] + returns: StateAppLocalContractReturns['verify_get_ex_bytes(address,uint64,byte[])byte[]'] + }> + & Record<'verify_get_ex_uint64(address,uint64,byte[])uint64' | 'verify_get_ex_uint64', { + argsObj: StateAppLocalContractArgs['obj']['verify_get_ex_uint64(address,uint64,byte[])uint64'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_get_ex_uint64(address,uint64,byte[])uint64'] + returns: StateAppLocalContractReturns['verify_get_ex_uint64(address,uint64,byte[])uint64'] + }> + & Record<'verify_delete(address,byte[])void' | 'verify_delete', { + argsObj: StateAppLocalContractArgs['obj']['verify_delete(address,byte[])void'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_delete(address,byte[])void'] + returns: StateAppLocalContractReturns['verify_delete(address,byte[])void'] + }> + & Record<'verify_exists(address,byte[])bool' | 'verify_exists', { + argsObj: StateAppLocalContractArgs['obj']['verify_exists(address,byte[])bool'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_exists(address,byte[])bool'] + returns: StateAppLocalContractReturns['verify_exists(address,byte[])bool'] + }> + & Record<'verify_put_uint64(address,byte[],uint64)void' | 'verify_put_uint64', { + argsObj: StateAppLocalContractArgs['obj']['verify_put_uint64(address,byte[],uint64)void'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_put_uint64(address,byte[],uint64)void'] + returns: StateAppLocalContractReturns['verify_put_uint64(address,byte[],uint64)void'] + }> + & Record<'verify_put_bytes(address,byte[],byte[])void' | 'verify_put_bytes', { + argsObj: StateAppLocalContractArgs['obj']['verify_put_bytes(address,byte[],byte[])void'] + argsTuple: StateAppLocalContractArgs['tuple']['verify_put_bytes(address,byte[],byte[])void'] + returns: StateAppLocalContractReturns['verify_put_bytes(address,byte[],byte[])void'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + local: { + keys: { + localUint64: bigint + localBytes: BinaryState + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAppLocalContractSignatures = keyof StateAppLocalContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateAppLocalContractNonVoidMethodSignatures = keyof StateAppLocalContractTypes['methods'] extends infer T ? T extends keyof StateAppLocalContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAppLocalContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAppLocalContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAppLocalContract smart contract to the method's return type + */ +export type MethodReturn = StateAppLocalContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed local state of the application. + */ +export type LocalKeysState = StateAppLocalContractTypes['state']['local']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAppLocalContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAppLocalContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAppLocalContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppLocalContract smart contract + */ +export abstract class StateAppLocalContractParamsFactory { + /** + * Gets available optIn ABI call param factories + */ + static get optIn() { + return { + /** + * Constructs opt-in ABI call params for the StateAppLocalContract smart contract using the opt_in()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + optIn(params: CallParams): AppClientMethodCallParams { + return { + ...params, + method: 'opt_in()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + + /** + * Constructs a no op call for the verify_get_bytes(address,byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_bytes(address,byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_get_uint64(address,byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_uint64(address,byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_get_ex_bytes(address,uint64,byte[])byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetExBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_ex_bytes(address,uint64,byte[])byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_get_ex_uint64(address,uint64,byte[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyGetExUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_get_ex_uint64(address,uint64,byte[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_delete(address,byte[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyDelete(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_delete(address,byte[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_exists(address,byte[])bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyExists(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_exists(address,byte[])bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_put_uint64(address,byte[],uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyPutUint64(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_put_uint64(address,byte[],uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } + /** + * Constructs a no op call for the verify_put_bytes(address,byte[],byte[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyPutBytes(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_put_bytes(address,byte[],byte[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.c], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateAppLocalContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAppLocalContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAppLocalContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAppLocalContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAppLocalContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAppLocalContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAppLocalContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAppLocalContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppLocalContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppLocalContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppLocalContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAppLocalContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAppLocalContract smart contract + */ +export class StateAppLocalContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAppLocalContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAppLocalContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAppLocalContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAppLocalContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAppLocalContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAppLocalContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAppLocalContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn params + */ + optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + return this.appClient.params.optIn(StateAppLocalContractParamsFactory.optIn.optIn(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_bytes(address,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyGetBytes(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_uint64(address,byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyGetUint64(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_bytes(address,uint64,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetExBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyGetExBytes(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_uint64(address,uint64,byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyGetExUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyGetExUint64(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_delete(address,byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyDelete: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyDelete(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_exists(address,byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyExists: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyExists(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_put_uint64(address,byte[],uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyPutUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyPutUint64(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_put_bytes(address,byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyPutBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppLocalContractParamsFactory.verifyPutBytes(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn transaction + */ + optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + return this.appClient.createTransaction.optIn(StateAppLocalContractParamsFactory.optIn.optIn(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_bytes(address,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyGetBytes(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_uint64(address,byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyGetUint64(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_bytes(address,uint64,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetExBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyGetExBytes(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_uint64(address,uint64,byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyGetExUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyGetExUint64(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_delete(address,byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyDelete: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyDelete(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_exists(address,byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyExists: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyExists(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_put_uint64(address,byte[],uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyPutUint64: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyPutUint64(params)) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_put_bytes(address,byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyPutBytes: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppLocalContractParamsFactory.verifyPutBytes(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn result + */ + optIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + const result = await this.appClient.send.optIn(StateAppLocalContractParamsFactory.optIn.optIn(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['opt_in()void'])} + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_bytes(address,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyGetBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_get_bytes(address,byte[])byte[]'])} + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_uint64(address,byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyGetUint64(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_get_uint64(address,byte[])uint64'])} + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_bytes(address,uint64,byte[])byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetExBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyGetExBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_get_ex_bytes(address,uint64,byte[])byte[]'])} + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_get_ex_uint64(address,uint64,byte[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyGetExUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyGetExUint64(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_get_ex_uint64(address,uint64,byte[])uint64'])} + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_delete(address,byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyDelete: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyDelete(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_delete(address,byte[])void'])} + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_exists(address,byte[])bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyExists: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyExists(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_exists(address,byte[])bool'])} + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_put_uint64(address,byte[],uint64)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyPutUint64: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyPutUint64(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_put_uint64(address,byte[],uint64)void'])} + }, + + /** + * Makes a call to the StateAppLocalContract smart contract using the `verify_put_bytes(address,byte[],byte[])void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyPutBytes: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppLocalContractParamsFactory.verifyPutBytes(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalContractReturns['verify_put_bytes(address,byte[],byte[])void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAppLocalContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAppLocalContract app + */ + state = { + /** + * Methods to access local state for the current StateAppLocalContract app + */ + local: (address: string | Address) => { + const encodedAddress = typeof address === 'string' ? address : encodeAddress(address.publicKey) + return { + /** + * Get all current keyed values from local state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.local(encodedAddress).getAll() + return { + localUint64: result.local_uint64, + localBytes: new BinaryStateValue(result.local_bytes), + } + }, + /** + * Get the current value of the local_uint64 key in local state + */ + localUint64: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("local_uint64")) as bigint | undefined }, + /** + * Get the current value of the local_bytes key in local state + */ + localBytes: async (): Promise => { return new BinaryStateValue((await this.appClient.state.local(encodedAddress).getValue("local_bytes")) as Uint8Array | undefined) }, + } + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAppLocalContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_get_bytes(address,byte[])byte[] method call against the StateAppLocalContract contract + */ + verifyGetBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetBytes(params))) + return this + }, + /** + * Add a verify_get_uint64(address,byte[])uint64 method call against the StateAppLocalContract contract + */ + verifyGetUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetUint64(params))) + return this + }, + /** + * Add a verify_get_ex_bytes(address,uint64,byte[])byte[] method call against the StateAppLocalContract contract + */ + verifyGetExBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetExBytes(params))) + return this + }, + /** + * Add a verify_get_ex_uint64(address,uint64,byte[])uint64 method call against the StateAppLocalContract contract + */ + verifyGetExUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyGetExUint64(params))) + return this + }, + /** + * Add a verify_delete(address,byte[])void method call against the StateAppLocalContract contract + */ + verifyDelete(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyDelete(params))) + return this + }, + /** + * Add a verify_exists(address,byte[])bool method call against the StateAppLocalContract contract + */ + verifyExists(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyExists(params))) + return this + }, + /** + * Add a verify_put_uint64(address,byte[],uint64)void method call against the StateAppLocalContract contract + */ + verifyPutUint64(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyPutUint64(params))) + return this + }, + /** + * Add a verify_put_bytes(address,byte[],byte[])void method call against the StateAppLocalContract contract + */ + verifyPutBytes(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyPutBytes(params))) + return this + }, + get optIn() { + return { + optIn: (params: CallParams) => { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn.optIn(params))) + return this + }, + } + }, + /** + * Add a clear state call to the StateAppLocalContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAppLocalContractComposer + } +} +export type StateAppLocalContractComposer = { + /** + * Calls the verify_get_bytes(address,byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetBytes(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_get_bytes(address,byte[])byte[]'] | undefined]> + + /** + * Calls the verify_get_uint64(address,byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetUint64(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_get_uint64(address,byte[])uint64'] | undefined]> + + /** + * Calls the verify_get_ex_bytes(address,uint64,byte[])byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetExBytes(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_get_ex_bytes(address,uint64,byte[])byte[]'] | undefined]> + + /** + * Calls the verify_get_ex_uint64(address,uint64,byte[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyGetExUint64(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_get_ex_uint64(address,uint64,byte[])uint64'] | undefined]> + + /** + * Calls the verify_delete(address,byte[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyDelete(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_delete(address,byte[])void'] | undefined]> + + /** + * Calls the verify_exists(address,byte[])bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyExists(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_exists(address,byte[])bool'] | undefined]> + + /** + * Calls the verify_put_uint64(address,byte[],uint64)void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyPutUint64(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_put_uint64(address,byte[],uint64)void'] | undefined]> + + /** + * Calls the verify_put_bytes(address,byte[],byte[])void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyPutBytes(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['verify_put_bytes(address,byte[],byte[])void'] | undefined]> + + /** + * Gets available optIn methods + */ + readonly optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalContract smart contract using the opt_in()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + optIn(params?: CallParams): StateAppLocalContractComposer<[...TReturns, StateAppLocalContractReturns['opt_in()void'] | undefined]> + } + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAppLocalContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppLocalContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAppLocalContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalExContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalExContract.ts new file mode 100644 index 0000000..53a53bd --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppLocalExContract.ts @@ -0,0 +1,635 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAppLocalExContract","structs":{},"methods":[{"name":"opt_in","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["OptIn"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":1,"bytes":2}},"keys":{"global":{},"local":{"local_uint64":{"keyType":"AVMString","valueType":"AVMUint64","key":"bG9jYWxfdWludDY0"},"local_bytes":{"keyType":"AVMString","valueType":"AVMBytes","key":"bG9jYWxfYnl0ZXM="},"local_arc4_bytes":{"keyType":"AVMString","valueType":"byte[]","key":"bG9jYWxfYXJjNF9ieXRlcw=="}},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNDYKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxFeENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA3CiAgICBwdXNoYnl0ZXMgMHgzMGM2ZDU4YSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2luX3JvdXRlQDUKICAgIGVycgoKbWFpbl9vcHRfaW5fcm91dGVANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgMSAvLyBPcHRJbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIG9wdF9pbgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA3OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbEV4Q29udHJhY3Qub3B0X2luW3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM2NQogICAgLy8gc2VsZi5sb2NhbF9ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IEJ5dGVzKGIiZHVtbXlfYnl0ZXNfZnJvbV9leHRlcm5hbF9jb250cmFjdCIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIHB1c2hieXRlc3MgImxvY2FsX2J5dGVzIiAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzM1ZjY2NzI2ZjZkNWY2NTc4NzQ2NTcyNmU2MTZjNWY2MzZmNmU3NDcyNjE2Mzc0CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzY2CiAgICAvLyBzZWxmLmxvY2FsX3VpbnQ2NFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IFVJbnQ2NCg5OSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgcHVzaGJ5dGVzICJsb2NhbF91aW50NjQiCiAgICBwdXNoaW50IDk5CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzY3CiAgICAvLyBzZWxmLmxvY2FsX2FyYzRfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjctMzY5CiAgICAvLyBzZWxmLmxvY2FsX2FyYzRfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoCiAgICAvLyAgICAgYiJkdW1teV9hcmM0X2J5dGVzIgogICAgLy8gKQogICAgcHVzaGJ5dGVzcyAibG9jYWxfYXJjNF9ieXRlcyIgMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAagAQwxtWKNhoAjgEAAQAxGYEBEjEYEERCAAgxGRQxGBQQQzIJggILbG9jYWxfYnl0ZXMiZHVtbXlfYnl0ZXNfZnJvbV9leHRlcm5hbF9jb250cmFjdGYyCYAMbG9jYWxfdWludDY0gWNmMgmCAhBsb2NhbF9hcmM0X2J5dGVzEgAQZHVtbXlfYXJjNF9ieXRlc2aBAUM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAppLocalExContract contract + */ +export type StateAppLocalExContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'opt_in()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'opt_in()void': [] + } +} + +/** + * The return type for each method + */ +export type StateAppLocalExContractReturns = { + 'opt_in()void': void +} + +/** + * Defines the types of available calls and state of the StateAppLocalExContract smart contract. + */ +export type StateAppLocalExContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'opt_in()void' | 'opt_in', { + argsObj: StateAppLocalExContractArgs['obj']['opt_in()void'] + argsTuple: StateAppLocalExContractArgs['tuple']['opt_in()void'] + returns: StateAppLocalExContractReturns['opt_in()void'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + local: { + keys: { + localUint64: bigint + localBytes: BinaryState + localArc4Bytes: Uint8Array + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAppLocalExContractSignatures = keyof StateAppLocalExContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAppLocalExContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAppLocalExContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAppLocalExContract smart contract to the method's return type + */ +export type MethodReturn = StateAppLocalExContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed local state of the application. + */ +export type LocalKeysState = StateAppLocalExContractTypes['state']['local']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAppLocalExContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAppLocalExContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAppLocalExContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppLocalExContract smart contract + */ +export abstract class StateAppLocalExContractParamsFactory { + /** + * Gets available optIn ABI call param factories + */ + static get optIn() { + return { + /** + * Constructs opt-in ABI call params for the StateAppLocalExContract smart contract using the opt_in()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + optIn(params: CallParams): AppClientMethodCallParams { + return { + ...params, + method: 'opt_in()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + +} + +/** + * A factory to create and deploy one or more instance of the StateAppLocalExContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAppLocalExContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAppLocalExContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAppLocalExContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAppLocalExContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAppLocalExContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAppLocalExContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAppLocalExContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppLocalExContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppLocalExContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppLocalExContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAppLocalExContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAppLocalExContract smart contract + */ +export class StateAppLocalExContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAppLocalExContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAppLocalExContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAppLocalExContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAppLocalExContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAppLocalExContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAppLocalExContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAppLocalExContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalExContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn params + */ + optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + return this.appClient.params.optIn(StateAppLocalExContractParamsFactory.optIn.optIn(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalExContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalExContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn transaction + */ + optIn: (params: CallParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + return this.appClient.createTransaction.optIn(StateAppLocalExContractParamsFactory.optIn.optIn(params)) + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalExContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalExContract smart contract using the `opt_in()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The optIn result + */ + optIn: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.OptIn } = {args: []}) => { + const result = await this.appClient.send.optIn(StateAppLocalExContractParamsFactory.optIn.optIn(params)) + return {...result, return: result.return as unknown as (undefined | StateAppLocalExContractReturns['opt_in()void'])} + }, + + }, + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalExContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAppLocalExContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAppLocalExContract app + */ + state = { + /** + * Methods to access local state for the current StateAppLocalExContract app + */ + local: (address: string | Address) => { + const encodedAddress = typeof address === 'string' ? address : encodeAddress(address.publicKey) + return { + /** + * Get all current keyed values from local state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.local(encodedAddress).getAll() + return { + localUint64: result.local_uint64, + localBytes: new BinaryStateValue(result.local_bytes), + localArc4Bytes: result.local_arc4_bytes, + } + }, + /** + * Get the current value of the local_uint64 key in local state + */ + localUint64: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("local_uint64")) as bigint | undefined }, + /** + * Get the current value of the local_bytes key in local state + */ + localBytes: async (): Promise => { return new BinaryStateValue((await this.appClient.state.local(encodedAddress).getValue("local_bytes")) as Uint8Array | undefined) }, + /** + * Get the current value of the local_arc4_bytes key in local state + */ + localArc4Bytes: async (): Promise => { return (await this.appClient.state.local(encodedAddress).getValue("local_arc4_bytes")) as Uint8Array | undefined }, + } + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAppLocalExContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + get optIn() { + return { + optIn: (params: CallParams) => { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn.optIn(params))) + return this + }, + } + }, + /** + * Add a clear state call to the StateAppLocalExContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAppLocalExContractComposer + } +} +export type StateAppLocalExContractComposer = { + /** + * Gets available optIn methods + */ + readonly optIn: { + /** + * Opts the user into an existing instance of the StateAppLocalExContract smart contract using the opt_in()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + optIn(params?: CallParams): StateAppLocalExContractComposer<[...TReturns, StateAppLocalExContractReturns['opt_in()void'] | undefined]> + } + + /** + * Makes a clear_state call to an existing instance of the StateAppLocalExContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAppLocalExContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppLocalExContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAppLocalExContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAppParamsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppParamsContract.ts new file mode 100644 index 0000000..182a6a4 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAppParamsContract.ts @@ -0,0 +1,1112 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAppParamsContract","structs":{},"methods":[{"name":"verify_app_params_get_approval_program","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_clear_state_program","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_global_num_uint","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_global_num_byte_slice","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_local_num_uint","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_local_num_byte_slice","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_extra_program_pages","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_creator","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_app_params_get_address","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[121,155,189,216,243,270,297,324,350],"errorMessage":"expected exists by index to match"},{"pc":[119,153,187,214,241,268,295,322,348],"errorMessage":"expected value by index to match"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzIKICAgIC8vIGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhiOWQxM2MxYiAweGU1YzNjODg5IDB4ZWU0ZTdiMmEgMHg3ZmEyMzRjYiAweDE5Zjc3NDM5IDB4OTJjNTcyYWEgMHhhZTljNmVmYiAweGUzNmVkNzA1IDB4OGM2NmE4NDIgLy8gbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYXBwcm92YWxfcHJvZ3JhbSh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbSh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV91aW50KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZSh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlcyh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvcih1aW50NjQpYWRkcmVzcyIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FkZHJlc3ModWludDY0KWFkZHJlc3MiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYXBwcm92YWxfcHJvZ3JhbSB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbSB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50IHZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV91aW50IHZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZSB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlcyB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvciB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzcwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfYXBwcm92YWxfcHJvZ3JhbVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzUKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FwcHJvdmFsX3Byb2dyYW0oYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFwcHJvdmFsUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FwcHJvdmFsX3Byb2dyYW0oX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBcHByb3ZhbFByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3OAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NsZWFyX3N0YXRlX3Byb2dyYW1bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgzCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9jbGVhcl9zdGF0ZV9wcm9ncmFtKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDbGVhclN0YXRlUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODQKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2NsZWFyX3N0YXRlX3Byb2dyYW0oX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDbGVhclN0YXRlUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjg2CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkxCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX3VpbnQoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEdsb2JhbE51bVVpbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkyCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX3VpbnQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1VaW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOTQKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5OQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfZ2xvYmFsX251bV9ieXRlX3NsaWNlKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzAwCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDEKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwMgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwNwogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfbG9jYWxfbnVtX3VpbnQoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcExvY2FsTnVtVWludAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDgKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2xvY2FsX251bV91aW50KF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1VaW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzA5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTUKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2xvY2FsX251bV9ieXRlX3NsaWNlKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2xvY2FsX251bV9ieXRlX3NsaWNlKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxOAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjMKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2V4dHJhX3Byb2dyYW1fcGFnZXMoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyNAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFwcFBhcmFtc0dldC5hcHBfZXh0cmFfcHJvZ3JhbV9wYWdlcyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzI1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjYKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NyZWF0b3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzMxCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9jcmVhdG9yKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDcmVhdG9yCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzMgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFwcFBhcmFtc0dldC5hcHBfY3JlYXRvcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzNAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMzkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FkZHJlc3MoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQwCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9hZGRyZXNzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQyCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyABASYBBBUffHUxG0EATjEZFEQxGESCCQS50TwbBOXDyIkE7k57KgR/ojTLBBn3dDkEksVyqgSunG77BONu1wUEjGaoQjYaAI4JAAkAKwBNAGgAgwCeALkA1ADuADEZFDEYFBBDNhoBF3IANhoBF3IASwNPAhJEEkRJFRZXBgJMUChMULAiQzYaARdyATYaARdyAUsDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcgI2GgEXcgJLA08CEkQSRBYoTFCwIkM2GgEXcgM2GgEXcgNLA08CEkQSRBYoTFCwIkM2GgEXcgQ2GgEXcgRLA08CEkQSRBYoTFCwIkM2GgEXcgU2GgEXcgVLA08CEkQSRBYoTFCwIkM2GgEXcgY2GgEXcgZLA08CEkQSRBYoTFCwIkM2GgEXcgc2GgEXcgdLA08CEkQSRChMULAiQzYaARdyCDYaARdyCEsDTwISRBJEKExQsCJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAppParamsContract contract + */ +export type StateAppParamsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_app_params_get_approval_program(uint64)byte[]': { + a: bigint | number + } + 'verify_app_params_get_clear_state_program(uint64)byte[]': { + a: bigint | number + } + 'verify_app_params_get_global_num_uint(uint64)uint64': { + a: bigint | number + } + 'verify_app_params_get_global_num_byte_slice(uint64)uint64': { + a: bigint | number + } + 'verify_app_params_get_local_num_uint(uint64)uint64': { + a: bigint | number + } + 'verify_app_params_get_local_num_byte_slice(uint64)uint64': { + a: bigint | number + } + 'verify_app_params_get_extra_program_pages(uint64)uint64': { + a: bigint | number + } + 'verify_app_params_get_creator(uint64)address': { + a: bigint | number + } + 'verify_app_params_get_address(uint64)address': { + a: bigint | number + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_app_params_get_approval_program(uint64)byte[]': [a: bigint | number] + 'verify_app_params_get_clear_state_program(uint64)byte[]': [a: bigint | number] + 'verify_app_params_get_global_num_uint(uint64)uint64': [a: bigint | number] + 'verify_app_params_get_global_num_byte_slice(uint64)uint64': [a: bigint | number] + 'verify_app_params_get_local_num_uint(uint64)uint64': [a: bigint | number] + 'verify_app_params_get_local_num_byte_slice(uint64)uint64': [a: bigint | number] + 'verify_app_params_get_extra_program_pages(uint64)uint64': [a: bigint | number] + 'verify_app_params_get_creator(uint64)address': [a: bigint | number] + 'verify_app_params_get_address(uint64)address': [a: bigint | number] + } +} + +/** + * The return type for each method + */ +export type StateAppParamsContractReturns = { + 'verify_app_params_get_approval_program(uint64)byte[]': Uint8Array + 'verify_app_params_get_clear_state_program(uint64)byte[]': Uint8Array + 'verify_app_params_get_global_num_uint(uint64)uint64': bigint + 'verify_app_params_get_global_num_byte_slice(uint64)uint64': bigint + 'verify_app_params_get_local_num_uint(uint64)uint64': bigint + 'verify_app_params_get_local_num_byte_slice(uint64)uint64': bigint + 'verify_app_params_get_extra_program_pages(uint64)uint64': bigint + 'verify_app_params_get_creator(uint64)address': string + 'verify_app_params_get_address(uint64)address': string +} + +/** + * Defines the types of available calls and state of the StateAppParamsContract smart contract. + */ +export type StateAppParamsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_app_params_get_approval_program(uint64)byte[]' | 'verify_app_params_get_approval_program', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_approval_program(uint64)byte[]'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_approval_program(uint64)byte[]'] + returns: StateAppParamsContractReturns['verify_app_params_get_approval_program(uint64)byte[]'] + }> + & Record<'verify_app_params_get_clear_state_program(uint64)byte[]' | 'verify_app_params_get_clear_state_program', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_clear_state_program(uint64)byte[]'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_clear_state_program(uint64)byte[]'] + returns: StateAppParamsContractReturns['verify_app_params_get_clear_state_program(uint64)byte[]'] + }> + & Record<'verify_app_params_get_global_num_uint(uint64)uint64' | 'verify_app_params_get_global_num_uint', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_global_num_uint(uint64)uint64'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_global_num_uint(uint64)uint64'] + returns: StateAppParamsContractReturns['verify_app_params_get_global_num_uint(uint64)uint64'] + }> + & Record<'verify_app_params_get_global_num_byte_slice(uint64)uint64' | 'verify_app_params_get_global_num_byte_slice', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_global_num_byte_slice(uint64)uint64'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_global_num_byte_slice(uint64)uint64'] + returns: StateAppParamsContractReturns['verify_app_params_get_global_num_byte_slice(uint64)uint64'] + }> + & Record<'verify_app_params_get_local_num_uint(uint64)uint64' | 'verify_app_params_get_local_num_uint', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_local_num_uint(uint64)uint64'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_local_num_uint(uint64)uint64'] + returns: StateAppParamsContractReturns['verify_app_params_get_local_num_uint(uint64)uint64'] + }> + & Record<'verify_app_params_get_local_num_byte_slice(uint64)uint64' | 'verify_app_params_get_local_num_byte_slice', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_local_num_byte_slice(uint64)uint64'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_local_num_byte_slice(uint64)uint64'] + returns: StateAppParamsContractReturns['verify_app_params_get_local_num_byte_slice(uint64)uint64'] + }> + & Record<'verify_app_params_get_extra_program_pages(uint64)uint64' | 'verify_app_params_get_extra_program_pages', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_extra_program_pages(uint64)uint64'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_extra_program_pages(uint64)uint64'] + returns: StateAppParamsContractReturns['verify_app_params_get_extra_program_pages(uint64)uint64'] + }> + & Record<'verify_app_params_get_creator(uint64)address' | 'verify_app_params_get_creator', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_creator(uint64)address'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_creator(uint64)address'] + returns: StateAppParamsContractReturns['verify_app_params_get_creator(uint64)address'] + }> + & Record<'verify_app_params_get_address(uint64)address' | 'verify_app_params_get_address', { + argsObj: StateAppParamsContractArgs['obj']['verify_app_params_get_address(uint64)address'] + argsTuple: StateAppParamsContractArgs['tuple']['verify_app_params_get_address(uint64)address'] + returns: StateAppParamsContractReturns['verify_app_params_get_address(uint64)address'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAppParamsContractSignatures = keyof StateAppParamsContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateAppParamsContractNonVoidMethodSignatures = keyof StateAppParamsContractTypes['methods'] extends infer T ? T extends keyof StateAppParamsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAppParamsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAppParamsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAppParamsContract smart contract to the method's return type + */ +export type MethodReturn = StateAppParamsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAppParamsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAppParamsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAppParamsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAppParamsContract smart contract + */ +export abstract class StateAppParamsContractParamsFactory { + /** + * Constructs a no op call for the verify_app_params_get_approval_program(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetApprovalProgram(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_approval_program(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_clear_state_program(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetClearStateProgram(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_clear_state_program(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_global_num_uint(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetGlobalNumUint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_global_num_uint(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_global_num_byte_slice(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetGlobalNumByteSlice(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_global_num_byte_slice(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_local_num_uint(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetLocalNumUint(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_local_num_uint(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_local_num_byte_slice(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetLocalNumByteSlice(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_local_num_byte_slice(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_extra_program_pages(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetExtraProgramPages(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_extra_program_pages(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_creator(uint64)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetCreator(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_creator(uint64)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_app_params_get_address(uint64)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAppParamsGetAddress(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_app_params_get_address(uint64)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateAppParamsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAppParamsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAppParamsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAppParamsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAppParamsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAppParamsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAppParamsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAppParamsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppParamsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppParamsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAppParamsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAppParamsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAppParamsContract smart contract + */ +export class StateAppParamsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAppParamsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAppParamsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAppParamsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAppParamsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAppParamsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAppParamsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAppParamsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StateAppParamsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_approval_program(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetApprovalProgram: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetApprovalProgram(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_clear_state_program(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetClearStateProgram: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetClearStateProgram(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_uint(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetGlobalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumUint(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_byte_slice(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetGlobalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_uint(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetLocalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumUint(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_byte_slice(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetLocalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_extra_program_pages(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetExtraProgramPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetExtraProgramPages(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_creator(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetCreator: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetCreator(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_address(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAppParamsGetAddress: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAppParamsContractParamsFactory.verifyAppParamsGetAddress(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StateAppParamsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_approval_program(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetApprovalProgram: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetApprovalProgram(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_clear_state_program(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetClearStateProgram: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetClearStateProgram(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_uint(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetGlobalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumUint(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_byte_slice(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetGlobalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_uint(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetLocalNumUint: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumUint(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_byte_slice(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetLocalNumByteSlice: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumByteSlice(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_extra_program_pages(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetExtraProgramPages: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetExtraProgramPages(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_creator(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetCreator: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetCreator(params)) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_address(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAppParamsGetAddress: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAppParamsContractParamsFactory.verifyAppParamsGetAddress(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StateAppParamsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_approval_program(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetApprovalProgram: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetApprovalProgram(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_approval_program(uint64)byte[]'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_clear_state_program(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetClearStateProgram: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetClearStateProgram(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_clear_state_program(uint64)byte[]'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_uint(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetGlobalNumUint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumUint(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_global_num_uint(uint64)uint64'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_global_num_byte_slice(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetGlobalNumByteSlice: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetGlobalNumByteSlice(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_global_num_byte_slice(uint64)uint64'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_uint(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetLocalNumUint: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumUint(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_local_num_uint(uint64)uint64'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_local_num_byte_slice(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetLocalNumByteSlice: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetLocalNumByteSlice(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_local_num_byte_slice(uint64)uint64'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_extra_program_pages(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetExtraProgramPages: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetExtraProgramPages(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_extra_program_pages(uint64)uint64'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_creator(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetCreator: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetCreator(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_creator(uint64)address'])} + }, + + /** + * Makes a call to the StateAppParamsContract smart contract using the `verify_app_params_get_address(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAppParamsGetAddress: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAppParamsContractParamsFactory.verifyAppParamsGetAddress(params)) + return {...result, return: result.return as unknown as (undefined | StateAppParamsContractReturns['verify_app_params_get_address(uint64)address'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAppParamsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAppParamsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAppParamsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_app_params_get_approval_program(uint64)byte[] method call against the StateAppParamsContract contract + */ + verifyAppParamsGetApprovalProgram(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetApprovalProgram(params))) + return this + }, + /** + * Add a verify_app_params_get_clear_state_program(uint64)byte[] method call against the StateAppParamsContract contract + */ + verifyAppParamsGetClearStateProgram(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetClearStateProgram(params))) + return this + }, + /** + * Add a verify_app_params_get_global_num_uint(uint64)uint64 method call against the StateAppParamsContract contract + */ + verifyAppParamsGetGlobalNumUint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetGlobalNumUint(params))) + return this + }, + /** + * Add a verify_app_params_get_global_num_byte_slice(uint64)uint64 method call against the StateAppParamsContract contract + */ + verifyAppParamsGetGlobalNumByteSlice(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetGlobalNumByteSlice(params))) + return this + }, + /** + * Add a verify_app_params_get_local_num_uint(uint64)uint64 method call against the StateAppParamsContract contract + */ + verifyAppParamsGetLocalNumUint(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetLocalNumUint(params))) + return this + }, + /** + * Add a verify_app_params_get_local_num_byte_slice(uint64)uint64 method call against the StateAppParamsContract contract + */ + verifyAppParamsGetLocalNumByteSlice(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetLocalNumByteSlice(params))) + return this + }, + /** + * Add a verify_app_params_get_extra_program_pages(uint64)uint64 method call against the StateAppParamsContract contract + */ + verifyAppParamsGetExtraProgramPages(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetExtraProgramPages(params))) + return this + }, + /** + * Add a verify_app_params_get_creator(uint64)address method call against the StateAppParamsContract contract + */ + verifyAppParamsGetCreator(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetCreator(params))) + return this + }, + /** + * Add a verify_app_params_get_address(uint64)address method call against the StateAppParamsContract contract + */ + verifyAppParamsGetAddress(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAppParamsGetAddress(params))) + return this + }, + /** + * Add a clear state call to the StateAppParamsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAppParamsContractComposer + } +} +export type StateAppParamsContractComposer = { + /** + * Calls the verify_app_params_get_approval_program(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetApprovalProgram(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_approval_program(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_app_params_get_clear_state_program(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetClearStateProgram(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_clear_state_program(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_app_params_get_global_num_uint(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetGlobalNumUint(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_global_num_uint(uint64)uint64'] | undefined]> + + /** + * Calls the verify_app_params_get_global_num_byte_slice(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetGlobalNumByteSlice(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_global_num_byte_slice(uint64)uint64'] | undefined]> + + /** + * Calls the verify_app_params_get_local_num_uint(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetLocalNumUint(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_local_num_uint(uint64)uint64'] | undefined]> + + /** + * Calls the verify_app_params_get_local_num_byte_slice(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetLocalNumByteSlice(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_local_num_byte_slice(uint64)uint64'] | undefined]> + + /** + * Calls the verify_app_params_get_extra_program_pages(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetExtraProgramPages(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_extra_program_pages(uint64)uint64'] | undefined]> + + /** + * Calls the verify_app_params_get_creator(uint64)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetCreator(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_creator(uint64)address'] | undefined]> + + /** + * Calls the verify_app_params_get_address(uint64)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAppParamsGetAddress(params?: CallParams): StateAppParamsContractComposer<[...TReturns, StateAppParamsContractReturns['verify_app_params_get_address(uint64)address'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the StateAppParamsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAppParamsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAppParamsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAppParamsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetHoldingContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetHoldingContract.ts new file mode 100644 index 0000000..c46961a --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetHoldingContract.ts @@ -0,0 +1,631 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAssetHoldingContract","structs":{},"methods":[{"name":"verify_asset_holding_get","args":[{"type":"address","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_frozen_get","args":[{"type":"address","name":"a"},{"type":"uint64","name":"b"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gY2xhc3MgU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4OGY1MjM1YjQgMHhkZTdhMzlmNiAvLyBtZXRob2QgInZlcmlmeV9hc3NldF9ob2xkaW5nX2dldChhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hc3NldF9mcm96ZW5fZ2V0KGFkZHJlc3MsdWludDY0KWJvb2wiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXQgdmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXQKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdC52ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2NQogICAgLy8gYmFsYW5jZSwgX3ZhbCA9IG9wLkFzc2V0SG9sZGluZ0dldC5hc3NldF9iYWxhbmNlKGEsIGIpCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRIb2xkaW5nQ29udHJhY3QudmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfZnJvemVuX2dldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcwCiAgICAvLyBmcm96ZW4sIF92YWwgPSBvcC5Bc3NldEhvbGRpbmdHZXQuYXNzZXRfZnJvemVuKGEsIGIpCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEZyb3plbgogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIHB1c2hpbnQgMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyYBBBUffHUxG0EAHTEZFEQxGESCAgSPUjW0BN56OfY2GgCOAgAJABsAMRkUMRgUEEM2GgE2GgIXcABIFihMULCBAUM2GgE2GgIXcAFIgAEAgQBPAlQoTFCwgQFD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAssetHoldingContract contract + */ +export type StateAssetHoldingContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_asset_holding_get(address,uint64)uint64': { + a: string + b: bigint | number + } + 'verify_asset_frozen_get(address,uint64)bool': { + a: string + b: bigint | number + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_asset_holding_get(address,uint64)uint64': [a: string, b: bigint | number] + 'verify_asset_frozen_get(address,uint64)bool': [a: string, b: bigint | number] + } +} + +/** + * The return type for each method + */ +export type StateAssetHoldingContractReturns = { + 'verify_asset_holding_get(address,uint64)uint64': bigint + 'verify_asset_frozen_get(address,uint64)bool': boolean +} + +/** + * Defines the types of available calls and state of the StateAssetHoldingContract smart contract. + */ +export type StateAssetHoldingContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_asset_holding_get(address,uint64)uint64' | 'verify_asset_holding_get', { + argsObj: StateAssetHoldingContractArgs['obj']['verify_asset_holding_get(address,uint64)uint64'] + argsTuple: StateAssetHoldingContractArgs['tuple']['verify_asset_holding_get(address,uint64)uint64'] + returns: StateAssetHoldingContractReturns['verify_asset_holding_get(address,uint64)uint64'] + }> + & Record<'verify_asset_frozen_get(address,uint64)bool' | 'verify_asset_frozen_get', { + argsObj: StateAssetHoldingContractArgs['obj']['verify_asset_frozen_get(address,uint64)bool'] + argsTuple: StateAssetHoldingContractArgs['tuple']['verify_asset_frozen_get(address,uint64)bool'] + returns: StateAssetHoldingContractReturns['verify_asset_frozen_get(address,uint64)bool'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAssetHoldingContractSignatures = keyof StateAssetHoldingContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateAssetHoldingContractNonVoidMethodSignatures = keyof StateAssetHoldingContractTypes['methods'] extends infer T ? T extends keyof StateAssetHoldingContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAssetHoldingContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAssetHoldingContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAssetHoldingContract smart contract to the method's return type + */ +export type MethodReturn = StateAssetHoldingContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAssetHoldingContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAssetHoldingContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAssetHoldingContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAssetHoldingContract smart contract + */ +export abstract class StateAssetHoldingContractParamsFactory { + /** + * Constructs a no op call for the verify_asset_holding_get(address,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetHoldingGet(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_holding_get(address,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } + /** + * Constructs a no op call for the verify_asset_frozen_get(address,uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetFrozenGet(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_frozen_get(address,uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateAssetHoldingContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAssetHoldingContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAssetHoldingContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAssetHoldingContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAssetHoldingContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAssetHoldingContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAssetHoldingContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAssetHoldingContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAssetHoldingContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAssetHoldingContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAssetHoldingContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAssetHoldingContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAssetHoldingContract smart contract + */ +export class StateAssetHoldingContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAssetHoldingContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAssetHoldingContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAssetHoldingContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAssetHoldingContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAssetHoldingContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAssetHoldingContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAssetHoldingContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StateAssetHoldingContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_holding_get(address,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetHoldingGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetHoldingContractParamsFactory.verifyAssetHoldingGet(params)) + }, + + /** + * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_frozen_get(address,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetFrozenGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetHoldingContractParamsFactory.verifyAssetFrozenGet(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StateAssetHoldingContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_holding_get(address,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetHoldingGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetHoldingContractParamsFactory.verifyAssetHoldingGet(params)) + }, + + /** + * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_frozen_get(address,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetFrozenGet: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetHoldingContractParamsFactory.verifyAssetFrozenGet(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StateAssetHoldingContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_holding_get(address,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetHoldingGet: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetHoldingContractParamsFactory.verifyAssetHoldingGet(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetHoldingContractReturns['verify_asset_holding_get(address,uint64)uint64'])} + }, + + /** + * Makes a call to the StateAssetHoldingContract smart contract using the `verify_asset_frozen_get(address,uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetFrozenGet: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetHoldingContractParamsFactory.verifyAssetFrozenGet(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetHoldingContractReturns['verify_asset_frozen_get(address,uint64)bool'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAssetHoldingContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAssetHoldingContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAssetHoldingContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_asset_holding_get(address,uint64)uint64 method call against the StateAssetHoldingContract contract + */ + verifyAssetHoldingGet(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetHoldingGet(params))) + return this + }, + /** + * Add a verify_asset_frozen_get(address,uint64)bool method call against the StateAssetHoldingContract contract + */ + verifyAssetFrozenGet(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetFrozenGet(params))) + return this + }, + /** + * Add a clear state call to the StateAssetHoldingContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAssetHoldingContractComposer + } +} +export type StateAssetHoldingContractComposer = { + /** + * Calls the verify_asset_holding_get(address,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetHoldingGet(params?: CallParams): StateAssetHoldingContractComposer<[...TReturns, StateAssetHoldingContractReturns['verify_asset_holding_get(address,uint64)uint64'] | undefined]> + + /** + * Calls the verify_asset_frozen_get(address,uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetFrozenGet(params?: CallParams): StateAssetHoldingContractComposer<[...TReturns, StateAssetHoldingContractReturns['verify_asset_frozen_get(address,uint64)bool'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the StateAssetHoldingContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAssetHoldingContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAssetHoldingContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAssetHoldingContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetParamsContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetParamsContract.ts new file mode 100644 index 0000000..b627ecf --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateAssetParamsContract.ts @@ -0,0 +1,1319 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateAssetParamsContract","structs":{},"methods":[{"name":"verify_asset_params_get_total","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_decimals","args":[{"type":"uint64","name":"a"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_default_frozen","args":[{"type":"uint64","name":"a"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_unit_name","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_name","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_url","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_metadata_hash","args":[{"type":"uint64","name":"a"}],"returns":{"type":"byte[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_manager","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_reserve","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_freeze","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_clawback","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"verify_asset_params_get_creator","args":[{"type":"uint64","name":"a"}],"returns":{"type":"address"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[142,169,196,230,264,298,332,366,392,418,444,470],"errorMessage":"expected exists by index to match"},{"pc":[140,167,194,228,262,296,330,364,390,416,442,468],"errorMessage":"expected value by index to match"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzQKICAgIC8vIGNsYXNzIFN0YXRlQXNzZXRQYXJhbXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGYwNWRhN2E0IDB4YzBlOWMzMTUgMHhkODUyODI3MyAweGY0NDY4YWQ5IDB4MjI5ZDEyZjcgMHhkZjUzNGY3YiAweGUwNTBiNWE5IDB4OGIyYTJkNTggMHhlZTE1YzRmNyAweDE1NzU0NGZmIDB4MTA0OTJjMDcgMHg1MjI5ZmEzNyAvLyBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3RvdGFsKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlY2ltYWxzKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlZmF1bHRfZnJvemVuKHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWUodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbmFtZSh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmwodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaCh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyKHVpbnQ2NClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9yZXNlcnZlKHVpbnQ2NClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemUodWludDY0KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NsYXdiYWNrKHVpbnQ2NClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jcmVhdG9yKHVpbnQ2NClhZGRyZXNzIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWwgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVjaW1hbHMgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVmYXVsdF9mcm96ZW4gdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdW5pdF9uYW1lIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X25hbWUgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdXJsIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21ldGFkYXRhX2hhc2ggdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWFuYWdlciB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9yZXNlcnZlIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2ZyZWV6ZSB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jbGF3YmFjayB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jcmVhdG9yCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF90b3RhbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTc3CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfdG90YWwoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzgKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF90b3RhbChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3OQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTgwCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVjaW1hbHNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWNpbWFsczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTg1CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfZGVjaW1hbHMoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9kZWNpbWFscyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVmYXVsdF9mcm96ZW5bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTkzCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfZGVmYXVsdF9mcm96ZW4oYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWZhdWx0RnJvemVuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2RlZmF1bHRfZnJvemVuKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlZmF1bHRGcm96ZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxOTUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHB1c2hieXRlcyAweDAwCiAgICBwdXNoaW50IDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3VuaXRfbmFtZShhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3VuaXRfbmFtZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjA0CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X25hbWVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9uYW1lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9uYW1lKGEpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTAKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9uYW1lKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTEKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxMgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmw6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxNwogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3VybChhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTgKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF91cmwoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjE5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21ldGFkYXRhX2hhc2g6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X21ldGFkYXRhX2hhc2goYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNZXRhZGF0YUhhc2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjI2CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbWV0YWRhdGFfaGFzaChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNZXRhZGF0YUhhc2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWFuYWdlcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjMzCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbWFuYWdlcihhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1hbmFnZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjM0CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbWFuYWdlcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjM1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzYKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9yZXNlcnZlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfcmVzZXJ2ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQxCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfcmVzZXJ2ZShhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFJlc2VydmUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQyCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfcmVzZXJ2ZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRSZXNlcnZlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDQKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2ZyZWV6ZShhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldEZyZWV6ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTAKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9mcmVlemUoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTIKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jbGF3YmFja1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NsYXdiYWNrOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTcKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9jbGF3YmFjayhhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NsYXdiYWNrKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjU5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jcmVhdG9yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY3JlYXRvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjY1CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjY2CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjY3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjgKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyABASYBBBUffHUxG0EAYzEZFEQxGESCDATwXaekBMDpwxUE2FKCcwT0RorZBCKdEvcE31NPewTgULWpBIsqLVgE7hXE9wQVdUT/BBBJLAcEUin6NzYaAI4MAAkAJAA/AGEAgwClAMcA6QEDAR0BNwFRADEZFDEYFBBDNhoBF3EANhoBF3EASwNPAhJEEkQWKExQsCJDNhoBF3EBNhoBF3EBSwNPAhJEEkQWKExQsCJDNhoBF3ECNhoBF3ECSwNPAhJEEkSAAQCBAE8CVChMULAiQzYaARdxAzYaARdxA0sDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcQQ2GgEXcQRLA08CEkQSREkVFlcGAkxQKExQsCJDNhoBF3EFNhoBF3EFSwNPAhJEEkRJFRZXBgJMUChMULAiQzYaARdxBjYaARdxBksDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcQc2GgEXcQdLA08CEkQSRChMULAiQzYaARdxCDYaARdxCEsDTwISRBJEKExQsCJDNhoBF3EJNhoBF3EJSwNPAhJEEkQoTFCwIkM2GgEXcQo2GgEXcQpLA08CEkQSRChMULAiQzYaARdxCzYaARdxC0sDTwISRBJEKExQsCJD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateAssetParamsContract contract + */ +export type StateAssetParamsContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify_asset_params_get_total(uint64)uint64': { + a: bigint | number + } + 'verify_asset_params_get_decimals(uint64)uint64': { + a: bigint | number + } + 'verify_asset_params_get_default_frozen(uint64)bool': { + a: bigint | number + } + 'verify_asset_params_get_unit_name(uint64)byte[]': { + a: bigint | number + } + 'verify_asset_params_get_name(uint64)byte[]': { + a: bigint | number + } + 'verify_asset_params_get_url(uint64)byte[]': { + a: bigint | number + } + 'verify_asset_params_get_metadata_hash(uint64)byte[]': { + a: bigint | number + } + 'verify_asset_params_get_manager(uint64)address': { + a: bigint | number + } + 'verify_asset_params_get_reserve(uint64)address': { + a: bigint | number + } + 'verify_asset_params_get_freeze(uint64)address': { + a: bigint | number + } + 'verify_asset_params_get_clawback(uint64)address': { + a: bigint | number + } + 'verify_asset_params_get_creator(uint64)address': { + a: bigint | number + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify_asset_params_get_total(uint64)uint64': [a: bigint | number] + 'verify_asset_params_get_decimals(uint64)uint64': [a: bigint | number] + 'verify_asset_params_get_default_frozen(uint64)bool': [a: bigint | number] + 'verify_asset_params_get_unit_name(uint64)byte[]': [a: bigint | number] + 'verify_asset_params_get_name(uint64)byte[]': [a: bigint | number] + 'verify_asset_params_get_url(uint64)byte[]': [a: bigint | number] + 'verify_asset_params_get_metadata_hash(uint64)byte[]': [a: bigint | number] + 'verify_asset_params_get_manager(uint64)address': [a: bigint | number] + 'verify_asset_params_get_reserve(uint64)address': [a: bigint | number] + 'verify_asset_params_get_freeze(uint64)address': [a: bigint | number] + 'verify_asset_params_get_clawback(uint64)address': [a: bigint | number] + 'verify_asset_params_get_creator(uint64)address': [a: bigint | number] + } +} + +/** + * The return type for each method + */ +export type StateAssetParamsContractReturns = { + 'verify_asset_params_get_total(uint64)uint64': bigint + 'verify_asset_params_get_decimals(uint64)uint64': bigint + 'verify_asset_params_get_default_frozen(uint64)bool': boolean + 'verify_asset_params_get_unit_name(uint64)byte[]': Uint8Array + 'verify_asset_params_get_name(uint64)byte[]': Uint8Array + 'verify_asset_params_get_url(uint64)byte[]': Uint8Array + 'verify_asset_params_get_metadata_hash(uint64)byte[]': Uint8Array + 'verify_asset_params_get_manager(uint64)address': string + 'verify_asset_params_get_reserve(uint64)address': string + 'verify_asset_params_get_freeze(uint64)address': string + 'verify_asset_params_get_clawback(uint64)address': string + 'verify_asset_params_get_creator(uint64)address': string +} + +/** + * Defines the types of available calls and state of the StateAssetParamsContract smart contract. + */ +export type StateAssetParamsContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify_asset_params_get_total(uint64)uint64' | 'verify_asset_params_get_total', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_total(uint64)uint64'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_total(uint64)uint64'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_total(uint64)uint64'] + }> + & Record<'verify_asset_params_get_decimals(uint64)uint64' | 'verify_asset_params_get_decimals', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_decimals(uint64)uint64'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_decimals(uint64)uint64'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_decimals(uint64)uint64'] + }> + & Record<'verify_asset_params_get_default_frozen(uint64)bool' | 'verify_asset_params_get_default_frozen', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_default_frozen(uint64)bool'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_default_frozen(uint64)bool'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_default_frozen(uint64)bool'] + }> + & Record<'verify_asset_params_get_unit_name(uint64)byte[]' | 'verify_asset_params_get_unit_name', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_unit_name(uint64)byte[]'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_unit_name(uint64)byte[]'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_unit_name(uint64)byte[]'] + }> + & Record<'verify_asset_params_get_name(uint64)byte[]' | 'verify_asset_params_get_name', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_name(uint64)byte[]'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_name(uint64)byte[]'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_name(uint64)byte[]'] + }> + & Record<'verify_asset_params_get_url(uint64)byte[]' | 'verify_asset_params_get_url', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_url(uint64)byte[]'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_url(uint64)byte[]'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_url(uint64)byte[]'] + }> + & Record<'verify_asset_params_get_metadata_hash(uint64)byte[]' | 'verify_asset_params_get_metadata_hash', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_metadata_hash(uint64)byte[]'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_metadata_hash(uint64)byte[]'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_metadata_hash(uint64)byte[]'] + }> + & Record<'verify_asset_params_get_manager(uint64)address' | 'verify_asset_params_get_manager', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_manager(uint64)address'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_manager(uint64)address'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_manager(uint64)address'] + }> + & Record<'verify_asset_params_get_reserve(uint64)address' | 'verify_asset_params_get_reserve', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_reserve(uint64)address'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_reserve(uint64)address'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_reserve(uint64)address'] + }> + & Record<'verify_asset_params_get_freeze(uint64)address' | 'verify_asset_params_get_freeze', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_freeze(uint64)address'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_freeze(uint64)address'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_freeze(uint64)address'] + }> + & Record<'verify_asset_params_get_clawback(uint64)address' | 'verify_asset_params_get_clawback', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_clawback(uint64)address'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_clawback(uint64)address'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_clawback(uint64)address'] + }> + & Record<'verify_asset_params_get_creator(uint64)address' | 'verify_asset_params_get_creator', { + argsObj: StateAssetParamsContractArgs['obj']['verify_asset_params_get_creator(uint64)address'] + argsTuple: StateAssetParamsContractArgs['tuple']['verify_asset_params_get_creator(uint64)address'] + returns: StateAssetParamsContractReturns['verify_asset_params_get_creator(uint64)address'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type StateAssetParamsContractSignatures = keyof StateAssetParamsContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateAssetParamsContractNonVoidMethodSignatures = keyof StateAssetParamsContractTypes['methods'] extends infer T ? T extends keyof StateAssetParamsContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateAssetParamsContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateAssetParamsContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateAssetParamsContract smart contract to the method's return type + */ +export type MethodReturn = StateAssetParamsContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateAssetParamsContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateAssetParamsContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateAssetParamsContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateAssetParamsContract smart contract + */ +export abstract class StateAssetParamsContractParamsFactory { + /** + * Constructs a no op call for the verify_asset_params_get_total(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetTotal(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_total(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_decimals(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetDecimals(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_decimals(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_default_frozen(uint64)bool ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetDefaultFrozen(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_default_frozen(uint64)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_unit_name(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetUnitName(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_unit_name(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_name(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetName(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_name(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_url(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetUrl(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_url(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_metadata_hash(uint64)byte[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetMetadataHash(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_metadata_hash(uint64)byte[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_manager(uint64)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetManager(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_manager(uint64)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_reserve(uint64)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetReserve(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_reserve(uint64)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_freeze(uint64)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetFreeze(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_freeze(uint64)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_clawback(uint64)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetClawback(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_clawback(uint64)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } + /** + * Constructs a no op call for the verify_asset_params_get_creator(uint64)address ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verifyAssetParamsGetCreator(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify_asset_params_get_creator(uint64)address' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateAssetParamsContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateAssetParamsContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateAssetParamsContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateAssetParamsContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateAssetParamsContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateAssetParamsContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateAssetParamsContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateAssetParamsContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAssetParamsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAssetParamsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateAssetParamsContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateAssetParamsContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateAssetParamsContract smart contract + */ +export class StateAssetParamsContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateAssetParamsContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StateAssetParamsContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateAssetParamsContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateAssetParamsContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateAssetParamsContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateAssetParamsContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateAssetParamsContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StateAssetParamsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_total(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetTotal: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetTotal(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_decimals(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetDecimals: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDecimals(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_default_frozen(uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetDefaultFrozen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDefaultFrozen(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_unit_name(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetUnitName: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUnitName(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_name(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetName: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetName(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_url(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetUrl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUrl(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_metadata_hash(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetMetadataHash: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetMetadataHash(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_manager(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetManager: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetManager(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_reserve(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetReserve: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetReserve(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_freeze(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetFreeze: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetFreeze(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_clawback(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetClawback: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetClawback(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_creator(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verifyAssetParamsGetCreator: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetCreator(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StateAssetParamsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_total(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetTotal: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetTotal(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_decimals(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetDecimals: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDecimals(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_default_frozen(uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetDefaultFrozen: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDefaultFrozen(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_unit_name(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetUnitName: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUnitName(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_name(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetName: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetName(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_url(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetUrl: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUrl(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_metadata_hash(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetMetadataHash: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetMetadataHash(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_manager(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetManager: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetManager(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_reserve(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetReserve: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetReserve(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_freeze(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetFreeze: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetFreeze(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_clawback(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetClawback: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetClawback(params)) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_creator(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verifyAssetParamsGetCreator: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetCreator(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StateAssetParamsContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_total(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetTotal: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetTotal(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_total(uint64)uint64'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_decimals(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetDecimals: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDecimals(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_decimals(uint64)uint64'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_default_frozen(uint64)bool` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetDefaultFrozen: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetDefaultFrozen(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_default_frozen(uint64)bool'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_unit_name(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetUnitName: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUnitName(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_unit_name(uint64)byte[]'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_name(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetName: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetName(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_name(uint64)byte[]'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_url(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetUrl: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetUrl(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_url(uint64)byte[]'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_metadata_hash(uint64)byte[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetMetadataHash: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetMetadataHash(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_metadata_hash(uint64)byte[]'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_manager(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetManager: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetManager(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_manager(uint64)address'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_reserve(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetReserve: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetReserve(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_reserve(uint64)address'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_freeze(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetFreeze: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetFreeze(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_freeze(uint64)address'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_clawback(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetClawback: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetClawback(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_clawback(uint64)address'])} + }, + + /** + * Makes a call to the StateAssetParamsContract smart contract using the `verify_asset_params_get_creator(uint64)address` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verifyAssetParamsGetCreator: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StateAssetParamsContractParamsFactory.verifyAssetParamsGetCreator(params)) + return {...result, return: result.return as unknown as (undefined | StateAssetParamsContractReturns['verify_asset_params_get_creator(uint64)address'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateAssetParamsContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateAssetParamsContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateAssetParamsContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify_asset_params_get_total(uint64)uint64 method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetTotal(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetTotal(params))) + return this + }, + /** + * Add a verify_asset_params_get_decimals(uint64)uint64 method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetDecimals(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetDecimals(params))) + return this + }, + /** + * Add a verify_asset_params_get_default_frozen(uint64)bool method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetDefaultFrozen(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetDefaultFrozen(params))) + return this + }, + /** + * Add a verify_asset_params_get_unit_name(uint64)byte[] method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetUnitName(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetUnitName(params))) + return this + }, + /** + * Add a verify_asset_params_get_name(uint64)byte[] method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetName(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetName(params))) + return this + }, + /** + * Add a verify_asset_params_get_url(uint64)byte[] method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetUrl(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetUrl(params))) + return this + }, + /** + * Add a verify_asset_params_get_metadata_hash(uint64)byte[] method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetMetadataHash(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetMetadataHash(params))) + return this + }, + /** + * Add a verify_asset_params_get_manager(uint64)address method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetManager(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetManager(params))) + return this + }, + /** + * Add a verify_asset_params_get_reserve(uint64)address method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetReserve(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetReserve(params))) + return this + }, + /** + * Add a verify_asset_params_get_freeze(uint64)address method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetFreeze(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetFreeze(params))) + return this + }, + /** + * Add a verify_asset_params_get_clawback(uint64)address method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetClawback(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetClawback(params))) + return this + }, + /** + * Add a verify_asset_params_get_creator(uint64)address method call against the StateAssetParamsContract contract + */ + verifyAssetParamsGetCreator(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifyAssetParamsGetCreator(params))) + return this + }, + /** + * Add a clear state call to the StateAssetParamsContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateAssetParamsContractComposer + } +} +export type StateAssetParamsContractComposer = { + /** + * Calls the verify_asset_params_get_total(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetTotal(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_total(uint64)uint64'] | undefined]> + + /** + * Calls the verify_asset_params_get_decimals(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetDecimals(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_decimals(uint64)uint64'] | undefined]> + + /** + * Calls the verify_asset_params_get_default_frozen(uint64)bool ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetDefaultFrozen(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_default_frozen(uint64)bool'] | undefined]> + + /** + * Calls the verify_asset_params_get_unit_name(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetUnitName(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_unit_name(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_asset_params_get_name(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetName(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_name(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_asset_params_get_url(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetUrl(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_url(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_asset_params_get_metadata_hash(uint64)byte[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetMetadataHash(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_metadata_hash(uint64)byte[]'] | undefined]> + + /** + * Calls the verify_asset_params_get_manager(uint64)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetManager(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_manager(uint64)address'] | undefined]> + + /** + * Calls the verify_asset_params_get_reserve(uint64)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetReserve(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_reserve(uint64)address'] | undefined]> + + /** + * Calls the verify_asset_params_get_freeze(uint64)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetFreeze(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_freeze(uint64)address'] | undefined]> + + /** + * Calls the verify_asset_params_get_clawback(uint64)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetClawback(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_clawback(uint64)address'] | undefined]> + + /** + * Calls the verify_asset_params_get_creator(uint64)address ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verifyAssetParamsGetCreator(params?: CallParams): StateAssetParamsContractComposer<[...TReturns, StateAssetParamsContractReturns['verify_asset_params_get_creator(uint64)address'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the StateAssetParamsContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateAssetParamsContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateAssetParamsContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateAssetParamsContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StateMutations.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StateMutations.ts new file mode 100644 index 0000000..01c58bc --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StateMutations.ts @@ -0,0 +1,880 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StateMutations","structs":{},"methods":[{"name":"append","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"modify","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get","args":[],"returns":{"type":"(uint64,string)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":3},"local":{"ints":0,"bytes":1}},"keys":{"global":{"no_proxy":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"bm9fcHJveHk="},"glob_assign":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"Z2xvYl9hc3NpZ24="},"glob":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"Z2xvYg=="}},"local":{"loc":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"bG9j"}},"box":{"box":{"keyType":"AVMString","valueType":"(uint64,string)[]","key":"Ym94"}}},"maps":{"global":{},"local":{},"box":{"map":{"keyType":"address","valueType":"(uint64,string)[]","prefix":"bWFw"}}}},"bareActions":{"create":["NoOp"],"call":["OptIn"]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[526,795,931],"errorMessage":"check self.box exists"},{"pc":[481,684,921],"errorMessage":"check self.glob exists"},{"pc":[440,577,916],"errorMessage":"check self.glob_assign exists"},{"pc":[506,742,928],"errorMessage":"check self.loc exists for account"},{"pc":[553,855,938],"errorMessage":"check self.map entry exists"},{"pc":[460,630,912],"errorMessage":"check self.no_proxy exists"},{"pc":[962],"errorMessage":"expected box == no_proxy"},{"pc":[950],"errorMessage":"expected global == no_proxy"},{"pc":[944],"errorMessage":"expected global assign == no_proxy"},{"pc":[956],"errorMessage":"expected local == no_proxy"},{"pc":[966],"errorMessage":"expected map == no_proxy"},{"pc":[593,619,646,672,700,726,758,784,811,837,871,897],"errorMessage":"index access is out of bounds"},{"pc":[585,638,692,750,803,863],"errorMessage":"invalid array length header"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA4CiAgICBieXRlY2Jsb2NrICJib3giICJub19wcm94eSIgMHgwMDAwICJnbG9iX2Fzc2lnbiIgImdsb2IiICJsb2MiIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YSAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0ICJtYXAiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MjQKICAgIC8vIHNlbGYubm9fcHJveHkgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weToyMgogICAgLy8gY2xhc3MgU3RhdGVNdXRhdGlvbnMoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AxMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NTI2ZThiYmYgMHg5NWZlZjEzZCAweDBjMjk0NDRiIC8vIG1ldGhvZCAiYXBwZW5kKCl2b2lkIiwgbWV0aG9kICJtb2RpZnkoKXZvaWQiLCBtZXRob2QgImdldCgpKHVpbnQ2NCxzdHJpbmcpW10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhcHBlbmQgbW9kaWZ5IGdldAogICAgZXJyCgptYWluX2JhcmVfcm91dGluZ0AxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weToyMgogICAgLy8gY2xhc3MgU3RhdGVNdXRhdGlvbnMoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHN3aXRjaCBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDEzIG1haW5fb3B0X2luQDE0CiAgICBlcnIKCm1haW5fb3B0X2luQDE0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMxCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18zIC8vICJnbG9iX2Fzc2lnbiIKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM0CiAgICAvLyBzZWxmLmdsb2IudmFsdWUgPSBNeUFycmF5KCkKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzMKICAgIC8vIHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzQKICAgIC8vIHNlbGYuZ2xvYi52YWx1ZSA9IE15QXJyYXkoKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNQogICAgLy8gc2VsZi5ib3gudmFsdWUgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM1CiAgICAvLyBzZWxmLmJveC52YWx1ZSA9IE15QXJyYXkoKQogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM2CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgdHhuIFNlbmRlcgogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM2CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM3CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM3CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMxCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMzoKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQoYXJyYXlfaXRlbXNfY291bnQ6IHVpbnQ2NCwgYXJyYXlfaGVhZF9hbmRfdGFpbDogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0LCBuZXdfaGVhZF9hbmRfdGFpbDogYnl0ZXMpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQ6CiAgICBwcm90byA0IDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzAgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQoc291cmNlOiBieXRlcywgbmV3X2l0ZW06IGJ5dGVzLCBpbmRleDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBzdWJzdHJpbmcgMCAyCiAgICBkdXAKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAyCiAgICBkaWcgMQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA1CiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZHVwCiAgICBkaWcgNAogICAgLQogICAgY292ZXIgNgogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGNvdmVyIDYKICAgIGRpZyA0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA1CiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgc3dhcAoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDUKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgMgogICAgc3dhcAogICAgcmVwbGFjZTMKICAgIGZyYW1lX2J1cnkgMwogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNQogICAgYiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU11dGF0aW9ucy5zdGF0ZW11dGF0aW9ucy5TdGF0ZU11dGF0aW9ucy5hcHBlbmRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBlbmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDIKICAgIC8vIGFyciA9IHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUuY29weSgpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYl9hc3NpZ24gZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDMKICAgIC8vIGFyci5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIGJ5dGVjIDYgLy8gMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMGEwMDAzNjI2MTdhCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ1CiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gYXJyLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ2CiAgICAvLyBzZWxmLm5vX3Byb3h5LmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vX3Byb3h5IGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQzCiAgICAvLyBhcnIuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBieXRlYyA2IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ2CiAgICAvLyBzZWxmLm5vX3Byb3h5LmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0NwogICAgLy8gc2VsZi5nbG9iLnZhbHVlLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYiBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0NwogICAgLy8gc2VsZi5nbG9iLnZhbHVlLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ4CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImxvYyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxvYyBleGlzdHMgZm9yIGFjY291bnQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0OAogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl0uYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgc3dhcAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ5CiAgICAvLyBzZWxmLmJveC52YWx1ZS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveCBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0OQogICAgLy8gc2VsZi5ib3gudmFsdWUuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18wIC8vICJib3giCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTAKICAgIC8vIHNlbGYubWFwW1R4bi5zZW5kZXJdLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hcCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1MAogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0uYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVNdXRhdGlvbnMuc3RhdGVtdXRhdGlvbnMuU3RhdGVNdXRhdGlvbnMubW9kaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKbW9kaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU2CiAgICAvLyBhcnIgPSBzZWxmLmdsb2JfYXNzaWduLnZhbHVlLmNvcHkoKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImdsb2JfYXNzaWduIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JfYXNzaWduIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU3CiAgICAvLyBhcnJbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NwogICAgLy8gYXJyWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU4CiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gYXJyLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYwCiAgICAvLyBzZWxmLm5vX3Byb3h5WzBdLmJheiA9IG1vZGlmaWVkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAibm9fcHJveHkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9fcHJveHkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NAogICAgLy8gbW9kaWZpZWQgPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgYnl0ZWMgNyAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjAKICAgIC8vIHNlbGYubm9fcHJveHlbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGNvbmNhdAogICAgc3dhcAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBieXRlY18xIC8vICJub19wcm94eSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjEKICAgIC8vIHNlbGYuZ2xvYi52YWx1ZVswXS5iYXogPSBtb2RpZmllZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYiBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MQogICAgLy8gc2VsZi5nbG9iLnZhbHVlWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNCAvLyAiZ2xvYiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjIKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdWzBdLmJheiA9IG1vZGlmaWVkCiAgICB0eG4gU2VuZGVyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJsb2MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sb2MgZXhpc3RzIGZvciBhY2NvdW50CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NAogICAgLy8gbW9kaWZpZWQgPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgYnl0ZWMgNyAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjIKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgc3dhcAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYzCiAgICAvLyBzZWxmLmJveC52YWx1ZVswXS5iYXogPSBtb2RpZmllZAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTQKICAgIC8vIG1vZGlmaWVkID0gYXJjNC5TdHJpbmcoIm1vZGlmaWVkIikKICAgIGJ5dGVjIDcgLy8gMHgwMDA4NmQ2ZjY0Njk2NjY5NjU2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYzCiAgICAvLyBzZWxmLmJveC52YWx1ZVswXS5iYXogPSBtb2RpZmllZAogICAgY29uY2F0CiAgICBzd2FwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjY0CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXVswXS5iYXogPSBtb2RpZmllZAogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hcCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2NAogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl1bMF0uYmF6ID0gbW9kaWZpZWQKICAgIGNvbmNhdAogICAgc3dhcAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU11dGF0aW9ucy5zdGF0ZW11dGF0aW9ucy5TdGF0ZU11dGF0aW9ucy5nZXRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjgKICAgIC8vIGEwID0gc2VsZi5ub19wcm94eS5jb3B5KCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJub19wcm94eSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub19wcm94eSBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2OQogICAgLy8gYTEgPSBzZWxmLmdsb2JfYXNzaWduLnZhbHVlLmNvcHkoKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImdsb2JfYXNzaWduIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JfYXNzaWduIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjcwCiAgICAvLyBhMiA9IHNlbGYuZ2xvYi52YWx1ZS5jb3B5KCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJnbG9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2IgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzEKICAgIC8vIGEzID0gc2VsZi5sb2NbVHhuLnNlbmRlcl0uY29weSgpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubG9jIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjcyCiAgICAvLyBhNCA9IHNlbGYuYm94LnZhbHVlLmNvcHkoKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjczCiAgICAvLyBhNSA9IHNlbGYubWFwW1R4bi5zZW5kZXJdLmNvcHkoKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXAgZW50cnkgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzUKICAgIC8vIGFzc2VydCBhMCA9PSBhMSwgImV4cGVjdGVkIGdsb2JhbCBhc3NpZ24gPT0gbm9fcHJveHkiCiAgICBkaWcgNQogICAgdW5jb3ZlciA1CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGdsb2JhbCBhc3NpZ24gPT0gbm9fcHJveHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3NgogICAgLy8gYXNzZXJ0IGEwID09IGEyLCAiZXhwZWN0ZWQgZ2xvYmFsID09IG5vX3Byb3h5IgogICAgZGlnIDQKICAgIHVuY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgPT0gbm9fcHJveHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3NwogICAgLy8gYXNzZXJ0IGEwID09IGEzLCAiZXhwZWN0ZWQgbG9jYWwgPT0gbm9fcHJveHkiCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxvY2FsID09IG5vX3Byb3h5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzgKICAgIC8vIGFzc2VydCBhMCA9PSBhNCwgImV4cGVjdGVkIGJveCA9PSBub19wcm94eSIKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYm94ID09IG5vX3Byb3h5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzkKICAgIC8vIGFzc2VydCBhMCA9PSBhNSwgImV4cGVjdGVkIG1hcCA9PSBub19wcm94eSIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG1hcCA9PSBub19wcm94eQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAEAAECCCYJA2JveAhub19wcm94eQIAAAtnbG9iX2Fzc2lnbgRnbG9iA2xvYxEAAgAAAAAAAAABAAoAA2JhegoACG1vZGlmaWVkA21hcDEYQAADKSpnMRtBACQxGRREMRhEggMEUm6LvwSV/vE9BAwpREs2GgCOAwE2Ab8DDgAxGY0CACMAAQAxGEQrKmcnBCpnKLxIKCq/MQAnBSpmJwgxAFBJvEgqvyNDMRgUQ4oEAYAASYv+JAuL/CQLIosEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAIowEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiYoDAYv9UQACSReL/VcCAIv/JAtLAUxZi/8jCCQLSwJLAVlLAxVLBYv/CSMJSwFPA08CTUlLBAlOBov+FU4GSwQiTwVSi/5QTwRPAk8DUlBOAkwkC0yLBYsEDEEAIIsDSYsFSU4DWYsCCIsBCRZXBgJLAkxdjAMkCIwFQv/YiwCLA1CMAIkiK2VESSJZTFcCACMnBoj+6StMZyIpZURJIllMVwIAIycGiP7VKUxnIicEZURJIllMVwIAIycGiP7AJwRMZzEASSInBWNESSJZTFcCACMnBoj+pycFTGYovkRJIllMVwIAIycGiP6TKLxIKEy/JwgxAFBJvkRJIllMVwIAIycGiP54SwG8SL8jQyIrZURJVwIASwEiWUsBIllLASMJSwMVSwQkWU8CTU8DTgJSSSVZIkxYJwdQTEQiiP7AK0xnIillRElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/ospTGciJwRlRElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/lUnBExnMQBJIicFY0RJVwIASwEiWUsBIllLASMJSwMVSwQkWU8CTU8DTgJSSSVZIkxYJwdQTEQiiP4bJwVMZii+RElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/eYovEgoTL8nCDEAUEm+RElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/apLAbxIvyNDIillRCIrZUQiJwRlRDEAIicFY0QovkQnCDEAUL5ESwVPBRJESwRPBBJESwNPAxJESwJPAhJESwESRIAEFR98dUxQsCND","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StateMutations contract + */ +export type StateMutationsArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'append()void': Record + 'modify()void': Record + 'get()(uint64,string)[]': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'append()void': [] + 'modify()void': [] + 'get()(uint64,string)[]': [] + } +} + +/** + * The return type for each method + */ +export type StateMutationsReturns = { + 'append()void': void + 'modify()void': void + 'get()(uint64,string)[]': [bigint, string][] +} + +/** + * Defines the types of available calls and state of the StateMutations smart contract. + */ +export type StateMutationsTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'append()void' | 'append', { + argsObj: StateMutationsArgs['obj']['append()void'] + argsTuple: StateMutationsArgs['tuple']['append()void'] + returns: StateMutationsReturns['append()void'] + }> + & Record<'modify()void' | 'modify', { + argsObj: StateMutationsArgs['obj']['modify()void'] + argsTuple: StateMutationsArgs['tuple']['modify()void'] + returns: StateMutationsReturns['modify()void'] + }> + & Record<'get()(uint64,string)[]' | 'get', { + argsObj: StateMutationsArgs['obj']['get()(uint64,string)[]'] + argsTuple: StateMutationsArgs['tuple']['get()(uint64,string)[]'] + returns: StateMutationsReturns['get()(uint64,string)[]'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + global: { + keys: { + noProxy: [bigint, string][] + globAssign: [bigint, string][] + glob: [bigint, string][] + } + maps: {} + } + local: { + keys: { + loc: [bigint, string][] + } + maps: {} + } + box: { + keys: { + box: [bigint, string][] + } + maps: { + map: Map + } + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type StateMutationsSignatures = keyof StateMutationsTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StateMutationsNonVoidMethodSignatures = keyof StateMutationsTypes['methods'] extends infer T ? T extends keyof StateMutationsTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StateMutations smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StateMutationsTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StateMutations smart contract to the method's return type + */ +export type MethodReturn = StateMutationsTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed global state of the application. + */ +export type GlobalKeysState = StateMutationsTypes['state']['global']['keys'] + +/** + * Defines the shape of the keyed local state of the application. + */ +export type LocalKeysState = StateMutationsTypes['state']['local']['keys'] + +/** + * Defines the shape of the keyed box state of the application. + */ +export type BoxKeysState = StateMutationsTypes['state']['box']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StateMutationsCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StateMutationsDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StateMutationsCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StateMutations smart contract + */ +export abstract class StateMutationsParamsFactory { + /** + * Constructs a no op call for the append()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static append(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'append()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the modify()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static modify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'modify()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the get()(uint64,string)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static get(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get()(uint64,string)[]' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StateMutations smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StateMutationsFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StateMutationsFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StateMutationsClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StateMutationsClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StateMutations smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StateMutationsDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StateMutationsClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateMutations smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateMutations smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StateMutations smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StateMutationsClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StateMutations smart contract + */ +export class StateMutationsClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StateMutationsClient` + * + * @param appClient An `AppClient` instance which has been created with the StateMutations app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StateMutationsClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StateMutationsClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StateMutationsClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StateMutationsClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StateMutationsClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateMutations smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The optIn result + */ + bare: (params?: Expand) => { + return this.appClient.params.bare.optIn(params) + }, + }, + + /** + * Makes a clear_state call to an existing instance of the StateMutations smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StateMutations smart contract using the `append()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + append: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(StateMutationsParamsFactory.append(params)) + }, + + /** + * Makes a call to the StateMutations smart contract using the `modify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + modify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(StateMutationsParamsFactory.modify(params)) + }, + + /** + * Makes a call to the StateMutations smart contract using the `get()(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + get: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(StateMutationsParamsFactory.get(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateMutations smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The optIn result + */ + bare: (params?: Expand) => { + return this.appClient.createTransaction.bare.optIn(params) + }, + }, + + /** + * Makes a clear_state call to an existing instance of the StateMutations smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StateMutations smart contract using the `append()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + append: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(StateMutationsParamsFactory.append(params)) + }, + + /** + * Makes a call to the StateMutations smart contract using the `modify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + modify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(StateMutationsParamsFactory.modify(params)) + }, + + /** + * Makes a call to the StateMutations smart contract using the `get()(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + get: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(StateMutationsParamsFactory.get(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available optIn methods + */ + optIn: { + /** + * Opts the user into an existing instance of the StateMutations smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The optIn result + */ + bare: (params?: Expand) => { + return this.appClient.send.bare.optIn(params) + }, + }, + + /** + * Makes a clear_state call to an existing instance of the StateMutations smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StateMutations smart contract using the `append()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + append: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(StateMutationsParamsFactory.append(params)) + return {...result, return: result.return as unknown as (undefined | StateMutationsReturns['append()void'])} + }, + + /** + * Makes a call to the StateMutations smart contract using the `modify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + modify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(StateMutationsParamsFactory.modify(params)) + return {...result, return: result.return as unknown as (undefined | StateMutationsReturns['modify()void'])} + }, + + /** + * Makes a call to the StateMutations smart contract using the `get()(uint64,string)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + get: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(StateMutationsParamsFactory.get(params)) + return {...result, return: result.return as unknown as (undefined | StateMutationsReturns['get()(uint64,string)[]'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StateMutationsClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StateMutations app + */ + state = { + /** + * Methods to access global state for the current StateMutations app + */ + global: { + /** + * Get all current keyed values from global state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.global.getAll() + return { + noProxy: result.no_proxy, + globAssign: result.glob_assign, + glob: result.glob, + } + }, + /** + * Get the current value of the no_proxy key in global state + */ + noProxy: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.global.getValue("no_proxy")) as [bigint, string][] | undefined }, + /** + * Get the current value of the glob_assign key in global state + */ + globAssign: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.global.getValue("glob_assign")) as [bigint, string][] | undefined }, + /** + * Get the current value of the glob key in global state + */ + glob: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.global.getValue("glob")) as [bigint, string][] | undefined }, + }, + /** + * Methods to access local state for the current StateMutations app + */ + local: (address: string | Address) => { + const encodedAddress = typeof address === 'string' ? address : encodeAddress(address.publicKey) + return { + /** + * Get all current keyed values from local state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.local(encodedAddress).getAll() + return { + loc: result.loc, + } + }, + /** + * Get the current value of the loc key in local state + */ + loc: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.local(encodedAddress).getValue("loc")) as [bigint, string][] | undefined }, + } + }, + /** + * Methods to access box state for the current StateMutations app + */ + box: { + /** + * Get all current keyed values from box state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.box.getAll() + return { + box: result.box, + } + }, + /** + * Get the current value of the box key in box state + */ + box: async (): Promise<[bigint, string][] | undefined> => { return (await this.appClient.state.box.getValue("box")) as [bigint, string][] | undefined }, + /** + * Get values from the map map in box state + */ + map: { + /** + * Get all current values of the map map in box state + */ + getMap: async (): Promise> => { return (await this.appClient.state.box.getMap("map")) as Map }, + /** + * Get a current value of the map map by key from box state + */ + value: async (key: string): Promise<[bigint, string][] | undefined> => { return await this.appClient.state.box.getMapValue("map", key) as [bigint, string][] | undefined }, + }, + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): StateMutationsComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a append()void method call against the StateMutations contract + */ + append(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.append(params))) + return this + }, + /** + * Add a modify()void method call against the StateMutations contract + */ + modify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.modify(params))) + return this + }, + /** + * Add a get()(uint64,string)[] method call against the StateMutations contract + */ + get(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.get(params))) + return this + }, + get optIn() { + return { + bare: (params?: AppClientBareCallParams ) => { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.optIn.bare(params))) + return this + }, + } + }, + /** + * Add a clear state call to the StateMutations contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StateMutationsComposer + } +} +export type StateMutationsComposer = { + /** + * Calls the append()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + append(params?: CallParams): StateMutationsComposer<[...TReturns, StateMutationsReturns['append()void'] | undefined]> + + /** + * Calls the modify()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + modify(params?: CallParams): StateMutationsComposer<[...TReturns, StateMutationsReturns['modify()void'] | undefined]> + + /** + * Calls the get()(uint64,string)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + get(params?: CallParams): StateMutationsComposer<[...TReturns, StateMutationsReturns['get()(uint64,string)[]'] | undefined]> + + /** + * Gets available optIn methods + */ + readonly optIn: { + /** + * Opts the user into an existing instance of the StateMutations smart contract using a bare call. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + bare(params?: AppClientBareCallParams ): StateMutationsComposer + } + + /** + * Makes a clear_state call to an existing instance of the StateMutations smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StateMutationsComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StateMutationsComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StateMutationsComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/StaticSizeContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/StaticSizeContract.ts new file mode 100644 index 0000000..a0eb9be --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/StaticSizeContract.ts @@ -0,0 +1,1009 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"StaticSizeContract","structs":{},"methods":[{"name":"test_array","args":[{"type":"uint64","name":"x1"},{"type":"uint64","name":"y1"},{"type":"uint64","name":"x2"},{"type":"uint64","name":"y2"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_extend_from_tuple","args":[{"type":"((uint64,uint64),(uint64,uint64))","name":"some_more"}],"returns":{"type":"(uint64,uint64)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_extend_from_arc4_tuple","args":[{"type":"((uint64,uint64),(uint64,uint64))","name":"some_more"}],"returns":{"type":"(uint64,uint64)[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_bool_array","args":[{"type":"uint64","name":"length"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_arc4_conversion","args":[{"type":"uint64","name":"length"}],"returns":{"type":"uint64[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"sum_array","args":[{"type":"uint64[]","name":"arc4_arr"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"test_arc4_bool","args":[],"returns":{"type":"bool[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":1,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{"count":{"keyType":"AVMString","valueType":"AVMUint64","key":"Y291bnQ="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[1188,1205,1215],"errorMessage":"check self.count exists"},{"pc":[1033],"errorMessage":"expected 3 bytes"},{"pc":[750,761,861,1026,1115],"errorMessage":"expected correct length"},{"pc":[1053,1128],"errorMessage":"expected correct value at 0"},{"pc":[1073,1141],"errorMessage":"expected correct value at 1"},{"pc":[1154],"errorMessage":"expected correct value at 2"},{"pc":[1166],"errorMessage":"expected correct value at 3"},{"pc":[403,478,517,637,665,784,883,1035,1056,1117,1130,1143,1155],"errorMessage":"index access is out of bounds"},{"pc":[653,1018],"errorMessage":"invalid array length header"},{"pc":[729,753,840,908,999,1098],"errorMessage":"max array length exceeded"},{"pc":[283,342,377],"errorMessage":"overflow"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAxNiAxNDQKICAgIGJ5dGVjYmxvY2sgMHggMHgxNTFmN2M3NSAiY291bnQiIDB4MDAgMHgwMDAwCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjM5CiAgICAvLyBzZWxmLmNvdW50ID0gVUludDY0KDApCiAgICBieXRlY18yIC8vICJjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjM3CiAgICAvLyBjbGFzcyBTdGF0aWNTaXplQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDI4ZDdjMWI4IDB4ZmE5Y2I5NzMgMHg2MDM5YTI0MCAweGY4ZmQ2OGE3IDB4MWYwMjhkYjEgMHgwOTZiM2E1OSAweDhkNmUzYTI1IC8vIG1ldGhvZCAidGVzdF9hcnJheSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2V4dGVuZF9mcm9tX3R1cGxlKCgodWludDY0LHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQpKSkodWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAidGVzdF9leHRlbmRfZnJvbV9hcmM0X3R1cGxlKCgodWludDY0LHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQpKSkodWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAidGVzdF9ib29sX2FycmF5KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRlc3RfYXJjNF9jb252ZXJzaW9uKHVpbnQ2NCl1aW50NjRbXSIsIG1ldGhvZCAic3VtX2FycmF5KHVpbnQ2NFtdKXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9hcmM0X2Jvb2woKWJvb2xbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHRlc3RfYXJyYXkgdGVzdF9leHRlbmRfZnJvbV90dXBsZSB0ZXN0X2V4dGVuZF9mcm9tX2FyYzRfdHVwbGUgdGVzdF9ib29sX2FycmF5IHRlc3RfYXJjNF9jb252ZXJzaW9uIHN1bV9hcnJheSB0ZXN0X2FyYzRfYm9vbAogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9iaXRzKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIHJlYWRfc3RlcDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYml0czoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiAyCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwbiAyCiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAtNAogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgY292ZXIgMgogICAgc3dhcAogICAgcHVzaGludCA3CiAgICArCiAgICBpbnRjXzIgLy8gOAogICAgLwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNwogICAgKwogICAgaW50Y18yIC8vIDgKICAgIC8KICAgIGR1cAogICAgY292ZXIgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl9pZl9lbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgLQogICAgYnplcm8KICAgIGZyYW1lX2RpZyA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgNAoKZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl9pZl9lbHNlQDI6CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDE2CiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBmcmFtZV9idXJ5IDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfd2hpbGVfdG9wQDM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfYWZ0ZXJfd2hpbGVANQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBnZXRiaXQKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX3doaWxlX3RvcEAzCgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX3doaWxlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC50ZXN0X2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcnJheToKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDMKICAgIC8vIHNlbGYuY291bnQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQ2CiAgICAvLyBQb2ludCh4PWFyYzQuVUludDY0KCksIHk9VUludDY0KCksIG90aGVyPXNlbGYueHRyYSgpKSwKICAgIGNhbGxzdWIgeHRyYQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0NwogICAgLy8gUG9pbnQoeD14MSwgeT15MSwgb3RoZXI9c2VsZi54dHJhKCkpLAogICAgY2FsbHN1YiB4dHJhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQ4CiAgICAvLyBQb2ludCh4PXgyLCB5PXkyLCBvdGhlcj1zZWxmLnh0cmEoKSksCiAgICBjYWxsc3ViIHh0cmEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDQtNTAKICAgIC8vIHBhdGggPSBSZWZlcmVuY2VBcnJheSgKICAgIC8vICAgICAoCiAgICAvLyAgICAgICAgIFBvaW50KHg9YXJjNC5VSW50NjQoKSwgeT1VSW50NjQoKSwgb3RoZXI9c2VsZi54dHJhKCkpLAogICAgLy8gICAgICAgICBQb2ludCh4PXgxLCB5PXkxLCBvdGhlcj1zZWxmLnh0cmEoKSksCiAgICAvLyAgICAgICAgIFBvaW50KHg9eDIsIHk9eTIsIG90aGVyPXNlbGYueHRyYSgpKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICBkaWcgMTEKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgcHVzaGludCA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMTIKICAgIGRpZyAxCiAgICBifAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTQKICAgIGl0b2IKICAgIHVuY292ZXIgMTUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgZGlnIDkKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgdW5jb3ZlciA5CiAgICBkaWcgNAogICAgYnwKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgdW5jb3ZlciA4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIGJ8CiAgICBjb25jYXQKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjUxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjUxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBkdXAKICAgIHB1c2hpbnQgMwogICAgPAogICAgYnogdGVzdF9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1MgogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuYiA9PSBpICsgMQogICAgZHVwMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjIDQgLy8gMTQ0CiAgICAqCiAgICBpbnRjIDQgLy8gMTQ0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGV4dHJhY3QgMTYgMTI4CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1MwogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuZC5mb28gPT0gaSArIDIKICAgIHN3YXAKICAgIGV4dHJhY3QgNDggMTYKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIHVuY292ZXIgMwogICAgcHVzaGludCAyCiAgICArCiAgICBpdG9iCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1NAogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuZC5iYXIgPT0gKGkgKyAxKSAqIChpICsgMSkKICAgIGV4dHJhY3QgOCA4CiAgICBkaWcgMQogICAgZGlnIDIKICAgICoKICAgIGl0b2IKICAgIGI9PQogICAgYXNzZXJ0CiAgICBidXJ5IDEKICAgIGIgdGVzdF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1NgogICAgLy8gQm94KEltbXV0YWJsZUFycmF5W1BvaW50XSwga2V5PSJhIikudmFsdWUgPSBwYXRoLmZyZWV6ZSgpCiAgICBkdXAKICAgIGxlbgogICAgaW50YyA0IC8vIDE0NAogICAgLwogICAgZHVwCiAgICBidXJ5IDEwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzICJhIgogICAgYm94X2RlbAogICAgcG9wCiAgICBwdXNoYnl0ZXMgImEiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2OAogICAgLy8gbGFzdF9wb2ludCA9IHBhdGhbMF0KICAgIGV4dHJhY3QgMCAxNDQgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIGJ1cnkgMTAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2OQogICAgLy8gbGVuZ3RoID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTcwCiAgICAvLyBmb3IgcG9pbnRfaWR4IGluIHVyYW5nZSgxLCBwYXRoLmxlbmd0aCk6CiAgICBpbnRjXzEgLy8gMQogICAgYnVyeSAzCgp0ZXN0X2FycmF5X2Zvcl9oZWFkZXJANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTcwCiAgICAvLyBmb3IgcG9pbnRfaWR4IGluIHVyYW5nZSgxLCBwYXRoLmxlbmd0aCk6CiAgICBkaWcgMgogICAgZGlnIDgKICAgIDwKICAgIGJ6IHRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDE1CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzEKICAgIC8vIHBvaW50ID0gcGF0aFtwb2ludF9pZHhdCiAgICBkaWcgMwogICAgaW50YyA0IC8vIDE0NAogICAgKgogICAgaW50YyA0IC8vIDE0NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXBuIDIKICAgIGV4dHJhY3QgMCA4CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzIKICAgIC8vIGlmIHBvaW50LnggPCBsYXN0X3BvaW50Lng6CiAgICBkaWcgMTAKICAgIGI8CiAgICBieiB0ZXN0X2FycmF5X2Vsc2VfYm9keUAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzMKICAgIC8vIGR4ID0gbGFzdF9wb2ludC54LmFzX3VpbnQ2NCgpIC0gcG9pbnQueC5hc191aW50NjQoKQogICAgZGlnIDEwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2OAogICAgLy8gbGFzdF9wb2ludCA9IHBhdGhbMF0KICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3MwogICAgLy8gZHggPSBsYXN0X3BvaW50LnguYXNfdWludDY0KCkgLSBwb2ludC54LmFzX3VpbnQ2NCgpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzEKICAgIC8vIHBvaW50ID0gcGF0aFtwb2ludF9pZHhdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzMKICAgIC8vIGR4ID0gbGFzdF9wb2ludC54LmFzX3VpbnQ2NCgpIC0gcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIGJ1cnkgNwoKdGVzdF9hcnJheV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzYKICAgIC8vIGlmIHBvaW50LnkgPCBsYXN0X3BvaW50Lnk6CiAgICBkaWcgMwogICAgZGlnIDYKICAgIDwKICAgIGJ6IHRlc3RfYXJyYXlfZWxzZV9ib2R5QDEzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3NwogICAgLy8gZHkgPSBsYXN0X3BvaW50LnkgLSBwb2ludC55CiAgICBkaWcgNQogICAgZGlnIDQKICAgIC0KCnRlc3RfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTgwCiAgICAvLyBsZW5ndGggKz0gb3Auc3FydChkeCAqIGR4ICsgZHkgKiBkeSkKICAgIGRpZyA3CiAgICBkdXAKICAgICoKICAgIHN3YXAKICAgIGR1cAogICAgKgogICAgKwogICAgc3FydAogICAgZGlnIDUKICAgICsKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzAKICAgIC8vIGZvciBwb2ludF9pZHggaW4gdXJhbmdlKDEsIHBhdGgubGVuZ3RoKToKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAzCiAgICBiIHRlc3RfYXJyYXlfZm9yX2hlYWRlckA3Cgp0ZXN0X2FycmF5X2Vsc2VfYm9keUAxMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTc5CiAgICAvLyBkeSA9IHBvaW50LnkgLSBsYXN0X3BvaW50LnkKICAgIGRpZyAzCiAgICBkaWcgNgogICAgLQogICAgYiB0ZXN0X2FycmF5X2FmdGVyX2lmX2Vsc2VAMTQKCnRlc3RfYXJyYXlfZWxzZV9ib2R5QDEwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzEKICAgIC8vIHBvaW50ID0gcGF0aFtwb2ludF9pZHhdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzUKICAgIC8vIGR4ID0gcG9pbnQueC5hc191aW50NjQoKSAtIGxhc3RfcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjgKICAgIC8vIGxhc3RfcG9pbnQgPSBwYXRoWzBdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzUKICAgIC8vIGR4ID0gcG9pbnQueC5hc191aW50NjQoKSAtIGxhc3RfcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIGJ1cnkgNwogICAgYiB0ZXN0X2FycmF5X2FmdGVyX2lmX2Vsc2VAMTEKCnRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyA0CiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QudGVzdF9leHRlbmRfZnJvbV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZXh0ZW5kX2Zyb21fdHVwbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgMTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMTYgMTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjIKICAgIC8vIGFyci5leHRlbmQoc29tZV9tb3JlKQogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2MwogICAgLy8gbGFzdCA9IGFyclstMV0KICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMTYKICAgIC8KICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyAxNgogICAgKgogICAgZGlnIDIKICAgIHN3YXAKICAgIGludGNfMyAvLyAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY0CiAgICAvLyBhc3NlcnQgbGFzdCA9PSBzb21lX21vcmVbMV0KICAgIGR1cAogICAgdW5jb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY1CiAgICAvLyByZXN1bHQgPSBhcnIuZnJlZXplKCkKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2NgogICAgLy8gYXNzZXJ0IHJlc3VsdFstMV0gPT0gbGFzdAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDE2CiAgICAqCiAgICBpbnRjXzMgLy8gMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfZXh0ZW5kX2Zyb21fYXJjNF90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZXh0ZW5kX2Zyb21fYXJjNF90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojc1CiAgICAvLyByZXR1cm4gYXJyLmZyZWV6ZSgpCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDE2CiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfYm9vbF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYm9vbF9hcnJheToKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3OQogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbYm9vbF0oKQogICAgYnl0ZWNfMCAvLyAweAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGludGNfMSAvLyAxCgp0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjgzCiAgICAvLyBhcnIuYXBwZW5kKGkgJSAyID09IDApCiAgICBkdXBuIDIKICAgIHB1c2hpbnQgMgogICAgJQogICAgIQogICAgZGlnIDQKICAgIHN3YXAKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMgogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojg0CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGgsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGxlbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6ODcKICAgIC8vIGFycjIuZXh0ZW5kKGFycikKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4OAogICAgLy8gYXNzZXJ0IGFycjIubGVuZ3RoID09IGxlbmd0aCAqIDIsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDIKICAgICoKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6OTAKICAgIC8vIGNvdW50ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjkxCiAgICAvLyBmb3IgdmFsIGluIGFycjoKICAgIGxlbgogICAgYnVyeSA3CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1Cgp0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5MQogICAgLy8gZm9yIHZhbCBpbiBhcnI6CiAgICBkaWcgNAogICAgZGlnIDcKICAgIDwKICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9mb3JAMTEKICAgIGRpZyAyCiAgICBkaWcgNQogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5MgogICAgLy8gaWYgdmFsOgogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5MwogICAgLy8gY291bnQgKz0gMQogICAgZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDYKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDk6CiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiB0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckA2Cgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfZm9yQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyA1CiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QudGVzdF9hcmM0X2NvbnZlcnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY29udmVyc2lvbjoKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5OAogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbYXJjNC5VSW50NjRdKCkKICAgIGJ5dGVjXzAgLy8gMHgKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTAxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMSwgbGVuZ3RoICsgMSk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaW50Y18xIC8vIDEKCnRlc3RfYXJjNF9jb252ZXJzaW9uX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTAxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMSwgbGVuZ3RoICsgMSk6CiAgICBkdXAKICAgIGRpZyAyCiAgICA8CiAgICBieiB0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDIKICAgIC8vIGFyci5hcHBlbmQoYXJjNC5VSW50NjQoaSkpCiAgICBkdXBuIDIKICAgIGl0b2IKICAgIGRpZyA0CiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDEKICAgIC8vIGZvciBpIGluIHVyYW5nZSgxLCBsZW5ndGggKyAxKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9hcmM0X2NvbnZlcnNpb25fZm9yX2hlYWRlckAyCgp0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9mb3JANToKICAgIGRpZyAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwMwogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gbGVuZ3RoLCAiZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgiCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBkdXAKICAgIGJ1cnkgOAogICAgZGlnIDQKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTA0CiAgICAvLyBjb3VudCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9hcmM0X2NvbnZlcnNpb25fZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDUKICAgIC8vIGZvciB2YWwgaW4gYXJyOgogICAgZGlnIDQKICAgIGRpZyA3CiAgICA8CiAgICBieiB0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9mb3JAMTEKICAgIGRpZyAyCiAgICBkaWcgNQogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTA2CiAgICAvLyBpZiB2YWw6CiAgICBieXRlY18wIC8vIDB4CiAgICBiIT0KICAgIGJ6IHRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDcKICAgIC8vIGNvdW50ICs9IDEKICAgIGRpZyA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA2Cgp0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9pZl9lbHNlQDk6CiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiB0ZXN0X2FyYzRfY29udmVyc2lvbl9mb3JfaGVhZGVyQDYKCnRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2ZvckAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTA5CiAgICAvLyBhcmM0X2FyciA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSgpCiAgICBieXRlYyA0IC8vIDB4MDAwMAogICAgZGlnIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTEwCiAgICAvLyBhcmM0X2Fyci5leHRlbmQoYXJyKQogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC5zdW1fYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgpzdW1fYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTE3CiAgICAvLyBhcnIuZXh0ZW5kKGFyYzRfYXJyKQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMTkKICAgIC8vIHRvdGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjAKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgIC8KICAgIGludGNfMCAvLyAwCgpzdW1fYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjAKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IHN1bV9hcnJheV9hZnRlcl9mb3JANQogICAgZGlnIDMKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEyMQogICAgLy8gdG90YWwgKz0gaXRlbS5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA0CiAgICArCiAgICBidXJ5IDQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgc3VtX2FycmF5X2Zvcl9oZWFkZXJAMgoKc3VtX2FycmF5X2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0MgogICAgLy8gYXJyLmFwcGVuZChhcmM0LkJvb2woVHhuLnNlbmRlciA9PSBUeG4ucmVjZWl2ZXIpKQogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICA9PQogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQzCiAgICAvLyBhcnIuYXBwZW5kKGFyYzQuQm9vbChUeG4uc2VuZGVyICE9IFR4bi5yZWNlaXZlcikpCiAgICB0eG4gU2VuZGVyCiAgICB0eG4gUmVjZWl2ZXIKICAgICE9CiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ2CiAgICAvLyBkeW5fYXJyLmV4dGVuZChhcnIpCiAgICBsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ1CiAgICAvLyBkeW5fYXJyID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5Cb29sXSgpCiAgICBieXRlYyA0IC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDYKICAgIC8vIGR5bl9hcnIuZXh0ZW5kKGFycikKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDcKICAgIC8vIGFzc2VydCBkeW5fYXJyLmxlbmd0aCA9PSAyLCAiZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgiCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGR1cAogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0OAogICAgLy8gYXNzZXJ0IGR5bl9hcnIuYnl0ZXMubGVuZ3RoID09IDMsICJleHBlY3RlZCAzIGJ5dGVzIgogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDMgYnl0ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ5CiAgICAvLyBhc3NlcnQgZHluX2FyclswXSA9PSAoVHhuLnNlbmRlciA9PSBUeG4ucmVjZWl2ZXIpLCAiZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAwIgogICAgZHVwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMTYKICAgIGdldGJpdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgPT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE1MAogICAgLy8gYXNzZXJ0IGR5bl9hcnJbMV0gPT0gKFR4bi5zZW5kZXIgIT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMSIKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hpbnQgMTcKICAgIGdldGJpdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxCiAgICBpbnRjXzAgLy8gMAoKdGVzdF9hcmM0X2Jvb2xfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTMtMTU1CiAgICAvLyAjIG5vdGU6IG5vdCBzdXBwb3J0ZWQgY3VycmVudGx5CiAgICAvLyAjIGFycjIuZXh0ZW5kKGR5bl9hcnJheSkKICAgIC8vIGZvciBiIGluIGR5bl9hcnI6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2FyYzRfYm9vbF9hZnRlcl9mb3JANQogICAgZHVwbiAyCiAgICBpbnRjXzMgLy8gMTYKICAgICsKICAgIGRpZyA1CiAgICBzd2FwCiAgICBnZXRiaXQKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTYKICAgIC8vIGFycjIuYXBwZW5kKGIpCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FyYzRfYm9vbF9mb3JfaGVhZGVyQDIKCnRlc3RfYXJjNF9ib29sX2FmdGVyX2ZvckA1OgogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTU3CiAgICAvLyBhc3NlcnQgYXJyMi5sZW5ndGggPT0gNCwgImV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoIgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTgKICAgIC8vIGFzc2VydCBhcnIyWzBdID09IChUeG4uc2VuZGVyID09IFR4bi5yZWNlaXZlciksICJleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDAiCiAgICBkdXAKICAgIGV4dHJhY3QgMCAxIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICA9PQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTU5CiAgICAvLyBhc3NlcnQgYXJyMlsxXSA9PSAoVHhuLnNlbmRlciAhPSBUeG4ucmVjZWl2ZXIpLCAiZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxIgogICAgZHVwCiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2MAogICAgLy8gYXNzZXJ0IGFycjJbMl0gPT0gKFR4bi5zZW5kZXIgPT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMiIKICAgIGR1cAogICAgZXh0cmFjdCAyIDEgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG4gU2VuZGVyCiAgICB0eG4gUmVjZWl2ZXIKICAgID09CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjEKICAgIC8vIGFzc2VydCBhcnIyWzNdID09IChUeG4uc2VuZGVyICE9IFR4bi5yZWNlaXZlciksICJleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDMiCiAgICBleHRyYWN0IDMgMSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAzCiAgICBkaWcgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjMKICAgIC8vIHJldHVybiBhcnIuZnJlZXplKCkKICAgIGR1cAogICAgbGVuCiAgICBieXRlYyA0IC8vIDB4MDAwMAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYml0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QueHRyYSgpIC0+IHVpbnQ2NCwgdWludDY0LCBieXRlcywgYnl0ZXMsIGJ5dGVzOgp4dHJhOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjYKICAgIC8vIHNlbGYuY291bnQgKz0gMQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEyOAogICAgLy8gYT1UeG4ubnVtX2FwcF9hcmdzLAogICAgdHhuIE51bUFwcEFyZ3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTMwCiAgICAvLyBjPVR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEzMQogICAgLy8gZD1zZWxmLm1vcmUoKSwKICAgIGNhbGxzdWIgbW9yZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMzIKICAgIC8vIGU9QmlnVUludChzZWxmLmNvdW50KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3VudCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTI3LTEzMwogICAgLy8gcmV0dXJuIFh0cmEoCiAgICAvLyAgICAgYT1UeG4ubnVtX2FwcF9hcmdzLAogICAgLy8gICAgIGI9c2VsZi5jb3VudCwKICAgIC8vICAgICBjPVR4bi5zZW5kZXIsCiAgICAvLyAgICAgZD1zZWxmLm1vcmUoKSwKICAgIC8vICAgICBlPUJpZ1VJbnQoc2VsZi5jb3VudCksCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0Lm1vcmUoKSAtPiBieXRlczoKbW9yZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTM3CiAgICAvLyByZXR1cm4gTW9yZShmb289YXJjNC5VSW50NjQoc2VsZi5jb3VudCArIDEpLCBiYXI9YXJjNC5VSW50NjQoc2VsZi5jb3VudCAqIHNlbGYuY291bnQpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50IGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZGlnIDEKICAgIHVuY292ZXIgMgogICAgKgogICAgaXRvYgogICAgY29uY2F0CiAgICByZXRzdWIK","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CyAFAAEIEJABJgUABBUffHUFY291bnQBAAIAADEYQAADKiJnMRtBAEAxGRREMRhEggcEKNfBuAT6nLlzBGA5okAE+P1opwQfAo2xBAlrOlkEjW46JTYaAI4HAIEB+QI8Ak8CxgM4A2sAMRkUMRgUEEOKBAEoRwKL/CJZRwKL/ghJFlcGAIv8TFwATgJMgQcIJApJTwKBBwgkCklOAgxBAAyLBosFCa+LBExQjAQijACLAyUISYwCi/4IjAGLAosBDEEAIIv9iwBJTgJTiwSLAklOA08CVIwEIwiMAov/CIwAQv/YiwSMAIkiSShHBTYaATYaAhc2GgM2GgQXKiJniAOfiAOciAOZTw4WTw4WUE8NUE8MUEsLFYFADkSBQK9PDEsBq08CTFCAEAAAAAAAAAAAAAAAAAAAAABMUE8OFk8PTFBPDBZPDBZQTwtQTwpQSwkVgUAORE8JSwSrUFBQTwcWTwhMUE8HFk8HFlBPBlBPBVBLBBWBQA5ETwRPBKtQUFAiSYEDDEEAOUpJTgIhBAshBFhXEIBJJFtLAiMITEsBEkRMVzAQSVcACE8DgQIIFqhEVwgISwFLAgsWqERFAUL/wEsBSRUhBApJRQoWVwYCSwFQgAFhvEiAAWFMv1cAkElFC0lXAAhFCiRbRQYiRQUjRQNLAksIDEEAXEsBSwMhBAshBFhHAlcACEwkW0UGSwqkQQA2SwoiW0wiWwlFB0sDSwYMQQAcSwVLBAlLB0kLTEkLCJJLBQhFBUsCIwhFA0L/sEsDSwYJQv/hIltLCiJbCUUHQv/ISwQWKUxQsCNDNhoBSVcAEExXEBBMSwFQSRUlCkkjCSULSwJMJVhJTwQSREwWVwYCTwJQSSJZIwlLAVcCAEwlCyVYTwISRClMULAjQzYaAUkVJQoWVwYCTFApTFCwI0MoRwI2GgEXSShMIwgjSUsCDEEAGEcCgQIYFEsETCsiTwJUUEUEIwhFAUL/4UsCRwIVSwZJTgQSREsBUBVPAoECCxJEIkUHFUUHIkUFSwRLBwxBABpLAksFI1giU0EABksFIwhFBksEIwhFBUL/3ksFFilMULAjQyhHAjYaARdJKEwjCCNJSwIMQQAQRwIWSwRMUEUEIwhFAUL/6UsCFSQKSUUISwQSRCJFBiJFBUsESwcMQQAcSwJLBSQLJFgoqUEABksFIwhFBksEIwhFBUL/3CcESwNQSVcCABUkChZXBgJcAClMULAjQzYaAVcCAEkiTBUkCiJJSwIMQQAWSwNLAUlOAiQLW0sECEUEIwhFAUL/40sCFilMULAjQzEAMQcSKyJPAlQxADEHEysiTwJUUEcCFScESwJPAiSI/HxJTgJJIllJTgNJgQISREsBFYEDEkRJREsBJVMrIk8CVCJTMQAxBxISRCMNRIERUysiTwJUIlMxADEHExJEIklLAwxBABpHAiUISwVMUysiTwJUSwNMUEUDIwhFAUL/30sBSRWBBBJESVcAASJTMQAxBxISRElXAQEiUzEAMQcTEkRJVwIBIlMxADEHEhJEVwMBIlMxADEHExJESwRJFScETgIkiPvWKUxQsCNDIiplRCMIKksBZzEbMQCIAAoiKmVEFk8DTgSJIiplREkjCBZLAU8CCxZQiQ==","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the StaticSizeContract contract + */ +export type StaticSizeContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'test_array(uint64,uint64,uint64,uint64)uint64': { + x1: bigint | number + y1: bigint | number + x2: bigint | number + y2: bigint | number + } + 'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': { + someMore: [[bigint | number, bigint | number], [bigint | number, bigint | number]] + } + 'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': { + someMore: [[bigint | number, bigint | number], [bigint | number, bigint | number]] + } + 'test_bool_array(uint64)uint64': { + length: bigint | number + } + 'test_arc4_conversion(uint64)uint64[]': { + length: bigint | number + } + 'sum_array(uint64[])uint64': { + arc4Arr: bigint[] | number[] + } + 'test_arc4_bool()bool[]': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'test_array(uint64,uint64,uint64,uint64)uint64': [x1: bigint | number, y1: bigint | number, x2: bigint | number, y2: bigint | number] + 'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': [someMore: [[bigint | number, bigint | number], [bigint | number, bigint | number]]] + 'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': [someMore: [[bigint | number, bigint | number], [bigint | number, bigint | number]]] + 'test_bool_array(uint64)uint64': [length: bigint | number] + 'test_arc4_conversion(uint64)uint64[]': [length: bigint | number] + 'sum_array(uint64[])uint64': [arc4Arr: bigint[] | number[]] + 'test_arc4_bool()bool[]': [] + } +} + +/** + * The return type for each method + */ +export type StaticSizeContractReturns = { + 'test_array(uint64,uint64,uint64,uint64)uint64': bigint + 'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': [bigint, bigint][] + 'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]': [bigint, bigint][] + 'test_bool_array(uint64)uint64': bigint + 'test_arc4_conversion(uint64)uint64[]': bigint[] + 'sum_array(uint64[])uint64': bigint + 'test_arc4_bool()bool[]': boolean[] +} + +/** + * Defines the types of available calls and state of the StaticSizeContract smart contract. + */ +export type StaticSizeContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'test_array(uint64,uint64,uint64,uint64)uint64' | 'test_array', { + argsObj: StaticSizeContractArgs['obj']['test_array(uint64,uint64,uint64,uint64)uint64'] + argsTuple: StaticSizeContractArgs['tuple']['test_array(uint64,uint64,uint64,uint64)uint64'] + returns: StaticSizeContractReturns['test_array(uint64,uint64,uint64,uint64)uint64'] + }> + & Record<'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]' | 'test_extend_from_tuple', { + argsObj: StaticSizeContractArgs['obj']['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] + argsTuple: StaticSizeContractArgs['tuple']['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] + returns: StaticSizeContractReturns['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] + }> + & Record<'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]' | 'test_extend_from_arc4_tuple', { + argsObj: StaticSizeContractArgs['obj']['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] + argsTuple: StaticSizeContractArgs['tuple']['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] + returns: StaticSizeContractReturns['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] + }> + & Record<'test_bool_array(uint64)uint64' | 'test_bool_array', { + argsObj: StaticSizeContractArgs['obj']['test_bool_array(uint64)uint64'] + argsTuple: StaticSizeContractArgs['tuple']['test_bool_array(uint64)uint64'] + returns: StaticSizeContractReturns['test_bool_array(uint64)uint64'] + }> + & Record<'test_arc4_conversion(uint64)uint64[]' | 'test_arc4_conversion', { + argsObj: StaticSizeContractArgs['obj']['test_arc4_conversion(uint64)uint64[]'] + argsTuple: StaticSizeContractArgs['tuple']['test_arc4_conversion(uint64)uint64[]'] + returns: StaticSizeContractReturns['test_arc4_conversion(uint64)uint64[]'] + }> + & Record<'sum_array(uint64[])uint64' | 'sum_array', { + argsObj: StaticSizeContractArgs['obj']['sum_array(uint64[])uint64'] + argsTuple: StaticSizeContractArgs['tuple']['sum_array(uint64[])uint64'] + returns: StaticSizeContractReturns['sum_array(uint64[])uint64'] + }> + & Record<'test_arc4_bool()bool[]' | 'test_arc4_bool', { + argsObj: StaticSizeContractArgs['obj']['test_arc4_bool()bool[]'] + argsTuple: StaticSizeContractArgs['tuple']['test_arc4_bool()bool[]'] + returns: StaticSizeContractReturns['test_arc4_bool()bool[]'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + global: { + keys: { + count: bigint + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type StaticSizeContractSignatures = keyof StaticSizeContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StaticSizeContractNonVoidMethodSignatures = keyof StaticSizeContractTypes['methods'] extends infer T ? T extends keyof StaticSizeContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the StaticSizeContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StaticSizeContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StaticSizeContract smart contract to the method's return type + */ +export type MethodReturn = StaticSizeContractTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed global state of the application. + */ +export type GlobalKeysState = StaticSizeContractTypes['state']['global']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StaticSizeContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type StaticSizeContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StaticSizeContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StaticSizeContract smart contract + */ +export abstract class StaticSizeContractParamsFactory { + /** + * Constructs a no op call for the test_array(uint64,uint64,uint64,uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_array(uint64,uint64,uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.x1, params.args.y1, params.args.x2, params.args.y2], + } + } + /** + * Constructs a no op call for the test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testExtendFromTuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.someMore], + } + } + /** + * Constructs a no op call for the test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testExtendFromArc4Tuple(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.someMore], + } + } + /** + * Constructs a no op call for the test_bool_array(uint64)uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testBoolArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_bool_array(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.length], + } + } + /** + * Constructs a no op call for the test_arc4_conversion(uint64)uint64[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testArc4Conversion(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_arc4_conversion(uint64)uint64[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.length], + } + } + /** + * Constructs a no op call for the sum_array(uint64[])uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static sumArray(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'sum_array(uint64[])uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.arc4Arr], + } + } + /** + * Constructs a no op call for the test_arc4_bool()bool[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testArc4Bool(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_arc4_bool()bool[]' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StaticSizeContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StaticSizeContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `StaticSizeContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StaticSizeContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StaticSizeContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StaticSizeContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StaticSizeContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new StaticSizeContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StaticSizeContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StaticSizeContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the StaticSizeContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new StaticSizeContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the StaticSizeContract smart contract + */ +export class StaticSizeContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `StaticSizeContractClient` + * + * @param appClient An `AppClient` instance which has been created with the StaticSizeContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `StaticSizeContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `StaticSizeContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StaticSizeContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StaticSizeContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StaticSizeContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the StaticSizeContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_array(uint64,uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StaticSizeContractParamsFactory.testArray(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testExtendFromTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StaticSizeContractParamsFactory.testExtendFromTuple(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testExtendFromArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StaticSizeContractParamsFactory.testExtendFromArc4Tuple(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_bool_array(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testBoolArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StaticSizeContractParamsFactory.testBoolArray(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_arc4_conversion(uint64)uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testArc4Conversion: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StaticSizeContractParamsFactory.testArc4Conversion(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `sum_array(uint64[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + sumArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.params.call(StaticSizeContractParamsFactory.sumArray(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_arc4_bool()bool[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(StaticSizeContractParamsFactory.testArc4Bool(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the StaticSizeContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_array(uint64,uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testArray(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testExtendFromTuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testExtendFromTuple(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testExtendFromArc4Tuple: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testExtendFromArc4Tuple(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_bool_array(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testBoolArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testBoolArray(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_arc4_conversion(uint64)uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testArc4Conversion: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testArc4Conversion(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `sum_array(uint64[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + sumArray: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) => { + return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.sumArray(params)) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_arc4_bool()bool[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testArc4Bool: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(StaticSizeContractParamsFactory.testArc4Bool(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the StaticSizeContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_array(uint64,uint64,uint64,uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testArray(params)) + return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_array(uint64,uint64,uint64,uint64)uint64'])} + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testExtendFromTuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testExtendFromTuple(params)) + return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'])} + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testExtendFromArc4Tuple: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testExtendFromArc4Tuple(params)) + return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'])} + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_bool_array(uint64)uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testBoolArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testBoolArray(params)) + return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_bool_array(uint64)uint64'])} + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_arc4_conversion(uint64)uint64[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testArc4Conversion: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testArc4Conversion(params)) + return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_arc4_conversion(uint64)uint64[]'])} + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `sum_array(uint64[])uint64` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + sumArray: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => { + const result = await this.appClient.send.call(StaticSizeContractParamsFactory.sumArray(params)) + return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['sum_array(uint64[])uint64'])} + }, + + /** + * Makes a call to the StaticSizeContract smart contract using the `test_arc4_bool()bool[]` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testArc4Bool: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(StaticSizeContractParamsFactory.testArc4Bool(params)) + return {...result, return: result.return as unknown as (undefined | StaticSizeContractReturns['test_arc4_bool()bool[]'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new StaticSizeContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current StaticSizeContract app + */ + state = { + /** + * Methods to access global state for the current StaticSizeContract app + */ + global: { + /** + * Get all current keyed values from global state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.global.getAll() + return { + count: result.count, + } + }, + /** + * Get the current value of the count key in global state + */ + count: async (): Promise => { return (await this.appClient.state.global.getValue("count")) as bigint | undefined }, + }, + } + + public newGroup(composerConfig?: TransactionComposerConfig): StaticSizeContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a test_array(uint64,uint64,uint64,uint64)uint64 method call against the StaticSizeContract contract + */ + testArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testArray(params))) + return this + }, + /** + * Add a test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] method call against the StaticSizeContract contract + */ + testExtendFromTuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testExtendFromTuple(params))) + return this + }, + /** + * Add a test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] method call against the StaticSizeContract contract + */ + testExtendFromArc4Tuple(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testExtendFromArc4Tuple(params))) + return this + }, + /** + * Add a test_bool_array(uint64)uint64 method call against the StaticSizeContract contract + */ + testBoolArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testBoolArray(params))) + return this + }, + /** + * Add a test_arc4_conversion(uint64)uint64[] method call against the StaticSizeContract contract + */ + testArc4Conversion(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testArc4Conversion(params))) + return this + }, + /** + * Add a sum_array(uint64[])uint64 method call against the StaticSizeContract contract + */ + sumArray(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.sumArray(params))) + return this + }, + /** + * Add a test_arc4_bool()bool[] method call against the StaticSizeContract contract + */ + testArc4Bool(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testArc4Bool(params))) + return this + }, + /** + * Add a clear state call to the StaticSizeContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as StaticSizeContractComposer + } +} +export type StaticSizeContractComposer = { + /** + * Calls the test_array(uint64,uint64,uint64,uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testArray(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_array(uint64,uint64,uint64,uint64)uint64'] | undefined]> + + /** + * Calls the test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testExtendFromTuple(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] | undefined]> + + /** + * Calls the test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testExtendFromArc4Tuple(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]'] | undefined]> + + /** + * Calls the test_bool_array(uint64)uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testBoolArray(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_bool_array(uint64)uint64'] | undefined]> + + /** + * Calls the test_arc4_conversion(uint64)uint64[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testArc4Conversion(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_arc4_conversion(uint64)uint64[]'] | undefined]> + + /** + * Calls the sum_array(uint64[])uint64 ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + sumArray(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['sum_array(uint64[])uint64'] | undefined]> + + /** + * Calls the test_arc4_bool()bool[] ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testArc4Bool(params?: CallParams): StaticSizeContractComposer<[...TReturns, StaticSizeContractReturns['test_arc4_bool()bool[]'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the StaticSizeContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StaticSizeContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StaticSizeContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StaticSizeContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/TuplesContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/TuplesContract.ts new file mode 100644 index 0000000..1e2fe54 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/TuplesContract.ts @@ -0,0 +1,558 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"TuplesContract","structs":{},"methods":[{"name":"test_tuple_with_primitive_type","args":[],"returns":{"type":"(uint64,bool)"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9UdXBsZXMvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgVHVwbGVzQ29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHg3MjI5ZDc5YSAvLyBtZXRob2QgInRlc3RfdHVwbGVfd2l0aF9wcmltaXRpdmVfdHlwZSgpKHVpbnQ2NCxib29sKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdF90dXBsZV93aXRoX3ByaW1pdGl2ZV90eXBlX3JvdXRlQDMKICAgIGVycgoKbWFpbl90ZXN0X3R1cGxlX3dpdGhfcHJpbWl0aXZlX3R5cGVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9UdXBsZXMvY29udHJhY3QucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDAwMDA4MAogICAgbG9nCiAgICBwdXNoaW50IDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4K","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAogARyKdeaNhoAjgEAAQAxGRQxGBBEgA0VH3x1AAAAAAAAAACAsIEBQzEZFDEYFBBD","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the TuplesContract contract + */ +export type TuplesContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'test_tuple_with_primitive_type()(uint64,bool)': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'test_tuple_with_primitive_type()(uint64,bool)': [] + } +} + +/** + * The return type for each method + */ +export type TuplesContractReturns = { + 'test_tuple_with_primitive_type()(uint64,bool)': [bigint, boolean] +} + +/** + * Defines the types of available calls and state of the TuplesContract smart contract. + */ +export type TuplesContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'test_tuple_with_primitive_type()(uint64,bool)' | 'test_tuple_with_primitive_type', { + argsObj: TuplesContractArgs['obj']['test_tuple_with_primitive_type()(uint64,bool)'] + argsTuple: TuplesContractArgs['tuple']['test_tuple_with_primitive_type()(uint64,bool)'] + returns: TuplesContractReturns['test_tuple_with_primitive_type()(uint64,bool)'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type TuplesContractSignatures = keyof TuplesContractTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type TuplesContractNonVoidMethodSignatures = keyof TuplesContractTypes['methods'] extends infer T ? T extends keyof TuplesContractTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the TuplesContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = TuplesContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the TuplesContract smart contract to the method's return type + */ +export type MethodReturn = TuplesContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type TuplesContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type TuplesContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: TuplesContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the TuplesContract smart contract + */ +export abstract class TuplesContractParamsFactory { + /** + * Constructs a no op call for the test_tuple_with_primitive_type()(uint64,bool) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static testTupleWithPrimitiveType(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'test_tuple_with_primitive_type()(uint64,bool)' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the TuplesContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class TuplesContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `TuplesContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new TuplesContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new TuplesContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the TuplesContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: TuplesContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new TuplesContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the TuplesContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the TuplesContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the TuplesContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new TuplesContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the TuplesContract smart contract + */ +export class TuplesContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `TuplesContractClient` + * + * @param appClient An `AppClient` instance which has been created with the TuplesContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `TuplesContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `TuplesContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new TuplesContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `TuplesContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new TuplesContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the TuplesContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the TuplesContract smart contract using the `test_tuple_with_primitive_type()(uint64,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + testTupleWithPrimitiveType: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(TuplesContractParamsFactory.testTupleWithPrimitiveType(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the TuplesContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the TuplesContract smart contract using the `test_tuple_with_primitive_type()(uint64,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + testTupleWithPrimitiveType: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(TuplesContractParamsFactory.testTupleWithPrimitiveType(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the TuplesContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the TuplesContract smart contract using the `test_tuple_with_primitive_type()(uint64,bool)` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + testTupleWithPrimitiveType: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(TuplesContractParamsFactory.testTupleWithPrimitiveType(params)) + return {...result, return: result.return as unknown as (undefined | TuplesContractReturns['test_tuple_with_primitive_type()(uint64,bool)'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new TuplesContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current TuplesContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): TuplesContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a test_tuple_with_primitive_type()(uint64,bool) method call against the TuplesContract contract + */ + testTupleWithPrimitiveType(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.testTupleWithPrimitiveType(params))) + return this + }, + /** + * Add a clear state call to the TuplesContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as TuplesContractComposer + } +} +export type TuplesContractComposer = { + /** + * Calls the test_tuple_with_primitive_type()(uint64,bool) ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + testTupleWithPrimitiveType(params?: CallParams): TuplesContractComposer<[...TReturns, TuplesContractReturns['test_tuple_with_primitive_type()(uint64,bool)'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the TuplesContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): TuplesContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): TuplesContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type TuplesContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/contracts/VerifierContract.ts b/examples/p-py/projects/p-py-frontend/src/contracts/VerifierContract.ts new file mode 100644 index 0000000..9633b90 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/contracts/VerifierContract.ts @@ -0,0 +1,554 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^10 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi' +import { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact' +import { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client' +import { Address, encodeAddress } from '@algorandfoundation/algokit-utils' +import { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/types/app-client' +import { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/types/composer' + +export const APP_SPEC: Arc56Contract = {"name":"VerifierContract","structs":{},"methods":[{"name":"verify","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[56],"errorMessage":"Txn must be pay"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvdmVyaWZpZXIucHk6MTEKICAgIC8vIGNsYXNzIFZlcmlmaWVyQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweDY1YTlhZWNjIC8vIG1ldGhvZCAidmVyaWZ5KCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl92ZXJpZnlfcm91dGVAMwogICAgZXJyCgptYWluX3ZlcmlmeV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC92ZXJpZmllci5weToxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiB2ZXJpZnkKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLmR5bmFtaWNfaXR4bl9ncm91cC52ZXJpZmllci5WZXJpZmllckNvbnRyYWN0LnZlcmlmeVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvdmVyaWZpZXIucHk6MTQKICAgIC8vIGZvciBpIGluIHVyYW5nZShUeG4uZ3JvdXBfaW5kZXgpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIHB1c2hpbnQgMAoKdmVyaWZ5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9keW5hbWljX2l0eG5fZ3JvdXAvdmVyaWZpZXIucHk6MTQKICAgIC8vIGZvciBpIGluIHVyYW5nZShUeG4uZ3JvdXBfaW5kZXgpOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogdmVyaWZ5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL3ZlcmlmaWVyLnB5OjE2CiAgICAvLyBhc3NlcnQgdHhuLnR5cGUgPT0gVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQsICJUeG4gbXVzdCBiZSBwYXkiCiAgICBkdXBuIDIKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIFR4biBtdXN0IGJlIHBheQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL2R5bmFtaWNfaXR4bl9ncm91cC92ZXJpZmllci5weToxNAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKFR4bi5ncm91cF9pbmRleCk6CiAgICBwdXNoaW50IDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB2ZXJpZnlfZm9yX2hlYWRlckAyCgp2ZXJpZnlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvZHluYW1pY19pdHhuX2dyb3VwL3ZlcmlmaWVyLnB5OjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgARlqa7MNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEMxFoEASUsCDEEAEEcCOBCBARJEgQEIRQFC/+mBAUM=","clear":"C4EBQw=="},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the VerifierContract contract + */ +export type VerifierContractArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'verify()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'verify()void': [] + } +} + +/** + * The return type for each method + */ +export type VerifierContractReturns = { + 'verify()void': void +} + +/** + * Defines the types of available calls and state of the VerifierContract smart contract. + */ +export type VerifierContractTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'verify()void' | 'verify', { + argsObj: VerifierContractArgs['obj']['verify()void'] + argsTuple: VerifierContractArgs['tuple']['verify()void'] + returns: VerifierContractReturns['verify()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type VerifierContractSignatures = keyof VerifierContractTypes['methods'] +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the VerifierContract smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = VerifierContractTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the VerifierContract smart contract to the method's return type + */ +export type MethodReturn = VerifierContractTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type VerifierContractCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type VerifierContractDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: VerifierContractCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the VerifierContract smart contract + */ +export abstract class VerifierContractParamsFactory { + /** + * Constructs a no op call for the verify()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static verify(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'verify()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } +} + +/** + * A factory to create and deploy one or more instance of the VerifierContract smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class VerifierContractFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `VerifierContractFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new VerifierContractClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new VerifierContractClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the VerifierContract smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: VerifierContractDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new VerifierContractClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the VerifierContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the VerifierContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the VerifierContract smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new VerifierContractClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the VerifierContract smart contract + */ +export class VerifierContractClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `VerifierContractClient` + * + * @param appClient An `AppClient` instance which has been created with the VerifierContract app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `VerifierContractClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `VerifierContractClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new VerifierContractClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `VerifierContractClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new VerifierContractClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the VerifierContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the VerifierContract smart contract using the `verify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + verify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.params.call(VerifierContractParamsFactory.verify(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the VerifierContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the VerifierContract smart contract using the `verify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + verify: (params: CallParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + return this.appClient.createTransaction.call(VerifierContractParamsFactory.verify(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the VerifierContract smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the VerifierContract smart contract using the `verify()void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + verify: async (params: CallParams & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => { + const result = await this.appClient.send.call(VerifierContractParamsFactory.verify(params)) + return {...result, return: result.return as unknown as (undefined | VerifierContractReturns['verify()void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new VerifierContractClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current VerifierContract app + */ + state = { + } + + public newGroup(composerConfig?: TransactionComposerConfig): VerifierContractComposer { + const client = this + const composer = this.algorand.newGroup(composerConfig) + let promiseChain:Promise = Promise.resolve() + return { + /** + * Add a verify()void method call against the VerifierContract contract + */ + verify(params: CallParams & { onComplete?: OnApplicationComplete.NoOp }) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verify(params))) + return this + }, + /** + * Add a clear state call to the VerifierContract contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map(val => val.returnValue) + } + } + } as unknown as VerifierContractComposer + } +} +export type VerifierContractComposer = { + /** + * Calls the verify()void ABI method. + * + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + verify(params?: CallParams): VerifierContractComposer<[...TReturns, VerifierContractReturns['verify()void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the VerifierContract smart contract. + * + * @param params Any additional parameters for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): VerifierContractComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): VerifierContractComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type VerifierContractComposerResults = Expand + diff --git a/examples/p-py/projects/p-py-frontend/src/interfaces/network.ts b/examples/p-py/projects/p-py-frontend/src/interfaces/network.ts new file mode 100644 index 0000000..fdb97ae --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/interfaces/network.ts @@ -0,0 +1,25 @@ +import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/network-client' + +export interface AlgoViteClientConfig extends AlgoClientConfig { + /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ + server: string + /** The port to use e.g. 4001, 443, etc. */ + port: string | number + /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ + token: string + /** String representing current Algorand Network type (testnet/mainnet and etc) */ + network: string +} + +export interface AlgoViteKMDConfig extends AlgoClientConfig { + /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ + server: string + /** The port to use e.g. 4001, 443, etc. */ + port: string | number + /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ + token: string + /** KMD wallet name */ + wallet: string + /** KMD wallet password */ + password: string +} diff --git a/examples/p-py/projects/p-py-frontend/src/main.tsx b/examples/p-py/projects/p-py-frontend/src/main.tsx new file mode 100644 index 0000000..adf72ec --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/main.tsx @@ -0,0 +1,13 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App' +import './styles/main.css' +import ErrorBoundary from './components/ErrorBoundary' + +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + + + + + , +) diff --git a/examples/p-py/projects/p-py-frontend/src/styles/main.css b/examples/p-py/projects/p-py-frontend/src/styles/main.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/styles/main.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/examples/p-py/projects/p-py-frontend/src/utils/ellipseAddress.spec.tsx b/examples/p-py/projects/p-py-frontend/src/utils/ellipseAddress.spec.tsx new file mode 100644 index 0000000..2cbff10 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/utils/ellipseAddress.spec.tsx @@ -0,0 +1,15 @@ +import { ellipseAddress } from './ellipseAddress' + +describe('ellipseAddress', () => { + it('should return ellipsed address with specified width', () => { + const address = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + const result = ellipseAddress(address, 4) + expect(result).toBe('aaaa...aaaa') + }) + + it('should return empty string when address is empty', () => { + const address = '' + const result = ellipseAddress(address) + expect(result).toBe('') + }) +}) diff --git a/examples/p-py/projects/p-py-frontend/src/utils/ellipseAddress.ts b/examples/p-py/projects/p-py-frontend/src/utils/ellipseAddress.ts new file mode 100644 index 0000000..db97e48 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/utils/ellipseAddress.ts @@ -0,0 +1,3 @@ +export function ellipseAddress(address: string | null, width = 6): string { + return address ? `${address.slice(0, width)}...${address.slice(-width)}` : (address ?? '') +} diff --git a/examples/p-py/projects/p-py-frontend/src/utils/network/getAlgoClientConfigs.ts b/examples/p-py/projects/p-py-frontend/src/utils/network/getAlgoClientConfigs.ts new file mode 100644 index 0000000..b5121f8 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/utils/network/getAlgoClientConfigs.ts @@ -0,0 +1,41 @@ +import { AlgoViteClientConfig, AlgoViteKMDConfig } from '../../interfaces/network' + +export function getAlgodConfigFromViteEnvironment(): AlgoViteClientConfig { + if (!import.meta.env.VITE_ALGOD_SERVER) { + throw new Error('Attempt to get default algod configuration without specifying VITE_ALGOD_SERVER in the environment variables') + } + + return { + server: import.meta.env.VITE_ALGOD_SERVER, + port: import.meta.env.VITE_ALGOD_PORT, + token: import.meta.env.VITE_ALGOD_TOKEN, + network: import.meta.env.VITE_ALGOD_NETWORK, + } +} + +export function getIndexerConfigFromViteEnvironment(): AlgoViteClientConfig { + if (!import.meta.env.VITE_INDEXER_SERVER) { + throw new Error('Attempt to get default algod configuration without specifying VITE_INDEXER_SERVER in the environment variables') + } + + return { + server: import.meta.env.VITE_INDEXER_SERVER, + port: import.meta.env.VITE_INDEXER_PORT, + token: import.meta.env.VITE_INDEXER_TOKEN, + network: import.meta.env.VITE_ALGOD_NETWORK, + } +} + +export function getKmdConfigFromViteEnvironment(): AlgoViteKMDConfig { + if (!import.meta.env.VITE_KMD_SERVER) { + throw new Error('Attempt to get default kmd configuration without specifying VITE_KMD_SERVER in the environment variables') + } + + return { + server: import.meta.env.VITE_KMD_SERVER, + port: import.meta.env.VITE_KMD_PORT, + token: import.meta.env.VITE_KMD_TOKEN, + wallet: import.meta.env.VITE_KMD_WALLET, + password: import.meta.env.VITE_KMD_PASSWORD, + } +} diff --git a/examples/p-py/projects/p-py-frontend/src/vite-env.d.ts b/examples/p-py/projects/p-py-frontend/src/vite-env.d.ts new file mode 100644 index 0000000..67c2d30 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/src/vite-env.d.ts @@ -0,0 +1,24 @@ +/// + +interface ImportMetaEnv { + readonly VITE_ENVIRONMENT: string + + readonly VITE_ALGOD_TOKEN: string + readonly VITE_ALGOD_SERVER: string + readonly VITE_ALGOD_PORT: string + readonly VITE_ALGOD_NETWORK: string + + readonly VITE_INDEXER_TOKEN: string + readonly VITE_INDEXER_SERVER: string + readonly VITE_INDEXER_PORT: string + + readonly VITE_KMD_TOKEN: string + readonly VITE_KMD_SERVER: string + readonly VITE_KMD_PORT: string + readonly VITE_KMD_PASSWORD: string + readonly VITE_KMD_WALLET: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/examples/p-py/projects/p-py-frontend/tailwind.config.cjs b/examples/p-py/projects/p-py-frontend/tailwind.config.cjs new file mode 100644 index 0000000..eaaba6c --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/tailwind.config.cjs @@ -0,0 +1,12 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ['./src/**/*.{js,ts,jsx,tsx}'], + theme: { + extend: {}, + }, + daisyui: { + themes: ['lofi'], + logs: false, + }, + plugins: [require('daisyui')], +} diff --git a/examples/p-py/projects/p-py-frontend/tests/example.spec.ts b/examples/p-py/projects/p-py-frontend/tests/example.spec.ts new file mode 100644 index 0000000..a62aae4 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/tests/example.spec.ts @@ -0,0 +1,40 @@ +import { algorandFixture } from '@algorandfoundation/algokit-utils/testing' +import { expect, test } from '@playwright/test' + +const localnet = algorandFixture() + +test.beforeEach(async ({ page }) => { + await localnet.newScope() + await page.goto('http://localhost:5173/') +}) + +test('has title', async ({ page }) => { + // Expect a title "to contain" a substring. + await expect(page).toHaveTitle('AlgoKit React Template') +}) + +test('get started link', async ({ page }) => { + await expect(page.getByTestId('getting-started')).toHaveText('Getting started') +}) + +test('authentication and dummy payment transaction', async ({ page }) => { + page.on('dialog', async (dialog) => { + dialog.message() === 'KMD password' ? await dialog.accept() : await dialog.dismiss() + }) + + // 1. Must be able to connect to a KMD wallet provider + await page.getByTestId('connect-wallet').click() + await page.getByTestId('kmd-connect').click() + await page.getByTestId('close-wallet-modal').click() + + // 2. Must be able to send a dummy payment transaction + await page.getByTestId('transactions-demo').click() + + await page.getByTestId('receiver-address').fill(localnet.context.testAccount.toString()) + await page.getByTestId('send-algo').click() + + // 3. Must be able to see a notification that the transaction was sent + const notification = await page.getByText('Transaction sent:') + await notification.waitFor() + expect(notification).toBeTruthy() +}) diff --git a/examples/p-py/projects/p-py-frontend/tsconfig.json b/examples/p-py/projects/p-py-frontend/tsconfig.json new file mode 100644 index 0000000..855bfc3 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/tsconfig.json @@ -0,0 +1,38 @@ +{ + "compilerOptions": { + "target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + "module": "ESNext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + "declaration": true /* Generates corresponding '.d.ts' file. */, + "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, + "sourceMap": true /* Generates corresponding '.map' file. */, + "strict": true /* Enable all strict type-checking options. */, + "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, + "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, + "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */, + "skipLibCheck": true /* Skip type checking of declaration files. */, + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, + "allowJs": false, + "allowSyntheticDefaultImports": true, + "moduleResolution": "Bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "outDir": "./dist/" + }, + "include": [ + "src/**/*.ts", + "src/**/*.tsx", + "vite.config.js", + "src/utils/ellipseAddress.spec.tsx", + "src/utils/ellipseAddress.spec.tsx", + "src/main.tsx", + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/examples/p-py/projects/p-py-frontend/tsconfig.node.json b/examples/p-py/projects/p-py-frontend/tsconfig.node.json new file mode 100644 index 0000000..e32f207 --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "NodeNext", + "moduleResolution": "NodeNext", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/examples/p-py/projects/p-py-frontend/vite.config.ts b/examples/p-py/projects/p-py-frontend/vite.config.ts new file mode 100644 index 0000000..e42dc7c --- /dev/null +++ b/examples/p-py/projects/p-py-frontend/vite.config.ts @@ -0,0 +1,15 @@ +import react from '@vitejs/plugin-react' +import { defineConfig } from 'vite' +import { nodePolyfills } from 'vite-plugin-node-polyfills' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + react(), + nodePolyfills({ + globals: { + Buffer: true, + }, + }), + ], +}) diff --git a/examples/p-tls/.algokit/.copier-answers.yml b/examples/p-tls/.algokit/.copier-answers.yml index 84d7ec4..f4161b3 100644 --- a/examples/p-tls/.algokit/.copier-answers.yml +++ b/examples/p-tls/.algokit/.copier-answers.yml @@ -1,6 +1,6 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 2.1.8-11-g7668422 -_src_path: /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template +_commit: +_src_path: author_email: None author_name: None cloud_provider: netlify diff --git a/examples/p-tls/.algokit/generators/create-devcontainer/copier.yaml b/examples/p-tls/.algokit/generators/create-devcontainer/copier.yaml new file mode 100644 index 0000000..e98f334 --- /dev/null +++ b/examples/p-tls/.algokit/generators/create-devcontainer/copier.yaml @@ -0,0 +1,4 @@ +_tasks: + - "echo '==== Successfully generated new .devcontainer.json file 🚀 ===='" + +_templates_suffix: ".j2" diff --git a/examples/p-tls/.algokit/generators/create-devcontainer/devcontainer.json b/examples/p-tls/.algokit/generators/create-devcontainer/devcontainer.json new file mode 100644 index 0000000..6452c65 --- /dev/null +++ b/examples/p-tls/.algokit/generators/create-devcontainer/devcontainer.json @@ -0,0 +1,19 @@ +{ + "forwardPorts": [4001, 4002, 8980, 5173], + "portsAttributes": { + "4001": { + "label": "algod" + }, + "4002": { + "label": "kmd" + }, + "8980": { + "label": "indexer" + }, + "5173": { + "label": "vite" + } + }, + "postCreateCommand": "mkdir -p ~/.config/algokit && pipx install algokit && sudo chown -R codespace:codespace ~/.config/algokit", + "postStartCommand": "for i in {1..5}; do algokit localnet status > /dev/null 2>&1 && break || sleep 30; algokit localnet reset; done" +} diff --git a/examples/p-tls/.editorconfig b/examples/p-tls/.editorconfig new file mode 100644 index 0000000..5e550a1 --- /dev/null +++ b/examples/p-tls/.editorconfig @@ -0,0 +1,10 @@ +[*] +charset = utf-8 +insert_final_newline = true +end_of_line = lf +indent_style = space +indent_size = 2 +tab_width = 2 +max_line_length = 140 +trim_trailing_whitespace = true +single_quote = true diff --git a/examples/p-tls/.gitattributes b/examples/p-tls/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/examples/p-tls/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/examples/p-tls/.github/workflows/p-tls-frontend-cd.yaml b/examples/p-tls/.github/workflows/p-tls-frontend-cd.yaml new file mode 100644 index 0000000..e964778 --- /dev/null +++ b/examples/p-tls/.github/workflows/p-tls-frontend-cd.yaml @@ -0,0 +1,36 @@ +name: Release p-tls-frontend + +on: + workflow_call: +permissions: + contents: read + packages: read + +jobs: + + deploy: + runs-on: ubuntu-latest + name: Deploy to Netlify + environment: frontend-prod + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup node + uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Install algokit + run: pipx install algokit + + - name: Bootstrap dependencies + run: algokit project bootstrap all --project-name 'p-tls-frontend' + + - name: Publish to Netlify + env: + NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} + NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} + run: algokit project run ci-deploy-netlify + \ No newline at end of file diff --git a/examples/p-tls/.github/workflows/p-tls-frontend-ci.yaml b/examples/p-tls/.github/workflows/p-tls-frontend-ci.yaml new file mode 100644 index 0000000..22ded3e --- /dev/null +++ b/examples/p-tls/.github/workflows/p-tls-frontend-ci.yaml @@ -0,0 +1,47 @@ +name: Validate p-tls-frontend + +on: + + workflow_call: + + +jobs: + validate: + runs-on: 'ubuntu-latest' + steps: + - name: Check out repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup node + uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Install poetry + run: pipx install poetry + + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: "poetry" + + - name: Install algokit + run: pipx install algokit + + - name: Install dependencies + run: algokit project bootstrap all --project-name 'p-tls-frontend' + + + - name: Run linters + run: algokit project run lint --project-name 'p-tls-frontend' + + + - name: Run unit tests + run: algokit project run test --project-name 'p-tls-frontend' + + + - name: Build + run: algokit project run build --project-name 'p-tls-frontend' diff --git a/examples/p-tls/.gitignore b/examples/p-tls/.gitignore new file mode 100644 index 0000000..4105eb2 --- /dev/null +++ b/examples/p-tls/.gitignore @@ -0,0 +1,170 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Ruff (linter) +.ruff_cache/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +.idea/ +!.idea/runConfigurations + +# macOS +.DS_Store + +# Received approval test files +*.received.* + +# NPM +node_modules + diff --git a/examples/p-tls/copy_files.sh b/examples/p-tls/copy_files.sh deleted file mode 100644 index 749b01f..0000000 --- a/examples/p-tls/copy_files.sh +++ /dev/null @@ -1,23 +0,0 @@ - -#!/bin/bash -# Script to copy required files to the frontend project -# Usage: ./copy_files.sh - - -project_name="$1" -frontend_root="./projects/${project_name}-frontend" - -# Ensure directories exist -mkdir -p "${frontend_root}/src/components" - -# Copy files -cp "./inject_content/Home.tsx" "${frontend_root}/src/Home.tsx" -cp "./inject_content/AppCalls.tsx" "${frontend_root}/src/components/AppCalls.tsx" - -echo "Template completed successfully!" -# remove inject_content folder -rm -rf "./inject_content" -# self destruct the file -rm -f "$0" - - diff --git a/examples/p-tls/projects/.gitkeep b/examples/p-tls/projects/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/examples/p-tls/projects/p-tls-contracts/.algokit.toml b/examples/p-tls/projects/p-tls-contracts/.algokit.toml new file mode 100644 index 0000000..795d662 --- /dev/null +++ b/examples/p-tls/projects/p-tls-contracts/.algokit.toml @@ -0,0 +1,15 @@ +[algokit] +min_version = "v2.0.0" + +[project] +type = 'contract' +name = 'p-tls-contracts' +artifacts = 'contracts/artifacts' + +[project.run] +build = { commands = [ + 'npm run build', +], description = 'Build all smart contracts in the project' } +test = { commands = [ + 'npm run test', +], description = 'Run smart contract tests' } diff --git a/examples/p-tls/projects/p-tls-contracts/.eslintrc.js b/examples/p-tls/projects/p-tls-contracts/.eslintrc.js new file mode 100644 index 0000000..0fede66 --- /dev/null +++ b/examples/p-tls/projects/p-tls-contracts/.eslintrc.js @@ -0,0 +1,56 @@ +module.exports = { + env: { + browser: true, + es2021: true, + }, + extends: [ + 'airbnb-base', + 'plugin:import/errors', + 'plugin:import/warnings', + 'plugin:import/typescript', + 'plugin:prettier/recommended', + ], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + plugins: ['@typescript-eslint'], + rules: { + '@typescript-eslint/no-explicit-any': 'error', + '@typescript-eslint/ban-ts-comment': 'warn', + 'import/prefer-default-export': 'off', + 'import/extensions': [ + 'error', + 'ignorePackages', + { + js: 'never', + jsx: 'never', + ts: 'never', + tsx: 'never', + }, + ], + 'import/no-extraneous-dependencies': [ + 'error', + { + devDependencies: ['**/*.test.ts'], + }, + ], + }, + overrides: [ + { + files: ['*.algo.ts'], + rules: { + 'import/no-extraneous-dependencies': 'off', + 'object-shorthand': 'off', + 'class-methods-use-this': 'off', + 'no-undef': 'off', + 'max-classes-per-file': 'off', + 'no-bitwise': 'off', + 'operator-assignment': 'off', + 'prefer-template': 'off', + 'prefer-destructuring': 'off', + }, + }, + ], +}; diff --git a/examples/p-tls/projects/p-tls-contracts/.gitignore b/examples/p-tls/projects/p-tls-contracts/.gitignore new file mode 100644 index 0000000..40b878d --- /dev/null +++ b/examples/p-tls/projects/p-tls-contracts/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/examples/p-tls/projects/p-tls-contracts/.prettierrc.toml b/examples/p-tls/projects/p-tls-contracts/.prettierrc.toml new file mode 100644 index 0000000..d979519 --- /dev/null +++ b/examples/p-tls/projects/p-tls-contracts/.prettierrc.toml @@ -0,0 +1,6 @@ +# .prettierrc.toml +trailingComma = "es5" +tabWidth = 2 +semi = true +singleQuote = true +printWidth = 120 \ No newline at end of file diff --git a/examples/p-tls/projects/p-tls-contracts/.vscode/extensions.json b/examples/p-tls/projects/p-tls-contracts/.vscode/extensions.json new file mode 100644 index 0000000..c582379 --- /dev/null +++ b/examples/p-tls/projects/p-tls-contracts/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + ] + } \ No newline at end of file diff --git a/examples/p-tls/projects/p-tls-contracts/.vscode/settings.json b/examples/p-tls/projects/p-tls-contracts/.vscode/settings.json new file mode 100644 index 0000000..99a5c70 --- /dev/null +++ b/examples/p-tls/projects/p-tls-contracts/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit" + }, +} \ No newline at end of file diff --git a/examples/p-tls/projects/p-tls-contracts/README.md b/examples/p-tls/projects/p-tls-contracts/README.md new file mode 100644 index 0000000..6800947 --- /dev/null +++ b/examples/p-tls/projects/p-tls-contracts/README.md @@ -0,0 +1,25 @@ +# TEALScript Project + +## Documentation + +For TEALScript documentation, go to https://tealscript.algo.xyz + +## Usage + +### Algokit + +This template assumes you have a local network running on your machine. The easiet way to setup a local network is with [algokit](https://github.com/algorandfoundation/algokit-cli). If you don't have Algokit or its dependencies installed locally you can open this repository in a GitHub codespace via https://codespaces.new and choosing this repo. + +### Build Contract + +`npm run build` will compile the contract to TEAL and generate an ABI and appspec JSON in [./contracts/artifacts](./contracts/artifacts/) and a algokit TypeScript client in [./contracts/clients](./contracts/clients/). + +`npm run compile-contract` or `npm run generate-client` can be used to compile the contract or generate the contract seperately. + +### Run Tests + +`npm run test` will execute the tests defined in [./\_\_test\_\_](./__test__) + +### Lint + +`npm run lint` will lint the contracts and tests with ESLint. diff --git a/examples/p-tls/projects/p-tls-contracts/__test__/Calculator.test.ts b/examples/p-tls/projects/p-tls-contracts/__test__/Calculator.test.ts new file mode 100644 index 0000000..6c94ecc --- /dev/null +++ b/examples/p-tls/projects/p-tls-contracts/__test__/Calculator.test.ts @@ -0,0 +1,46 @@ +import { describe, test, expect, beforeAll, beforeEach } from '@jest/globals'; +import { algorandFixture } from '@algorandfoundation/algokit-utils/testing'; +import { Config } from '@algorandfoundation/algokit-utils'; +import { CalculatorClient, CalculatorFactory } from '../contracts/clients/CalculatorClient'; + +const fixture = algorandFixture(); +Config.configure({ populateAppCallResources: true }); + +let appClient: CalculatorClient; + +describe('Calculator', () => { + beforeEach(fixture.beforeEach); + + beforeAll(async () => { + await fixture.beforeEach(); + const { testAccount } = fixture.context; + const { algorand } = fixture; + + const factory = new CalculatorFactory({ + algorand, + defaultSender: testAccount.addr, + }); + + const createResult = await factory.send.create.createApplication(); + appClient = createResult.appClient; + }); + + test('sum', async () => { + const a = 13; + const b = 37; + const sum = await appClient.send.doMath({ args: { a, b, operation: 'sum' } }); + expect(sum.return).toBe(BigInt(a + b)); + }); + + test('difference', async () => { + const a = 13; + const b = 37; + const diff = await appClient.send.doMath({ args: { a, b, operation: 'difference' } }); + expect(diff.return).toBe(BigInt(a >= b ? a - b : b - a)); + }); + + test('hello', async () => { + const hello = await appClient.send.hello({ args: { name: 'world!' } }); + expect(hello.return).toBe('Hello, world!'); + }); +}); diff --git a/examples/p-tls/projects/p-tls-contracts/contracts/Calculator.algo.ts b/examples/p-tls/projects/p-tls-contracts/contracts/Calculator.algo.ts new file mode 100644 index 0000000..9b36280 --- /dev/null +++ b/examples/p-tls/projects/p-tls-contracts/contracts/Calculator.algo.ts @@ -0,0 +1,57 @@ +import { Contract } from '@algorandfoundation/tealscript'; + +export class Calculator extends Contract { + /** + * Calculates the sum of two numbers + * + * @param a + * @param b + * @returns The sum of a and b + */ + private getSum(a: uint64, b: uint64): uint64 { + return a + b; + } + + /** + * Calculates the difference between two numbers + * + * @param a + * @param b + * @returns The difference between a and b. + */ + private getDifference(a: uint64, b: uint64): uint64 { + return a >= b ? a - b : b - a; + } + + /** + * A method that takes two numbers and does either addition or subtraction + * + * @param a The first uint64 + * @param b The second uint64 + * @param operation The operation to perform. Can be either 'sum' or 'difference' + * + * @returns The result of the operation + */ + doMath(a: uint64, b: uint64, operation: string): uint64 { + let result: uint64; + + if (operation === 'sum') { + result = this.getSum(a, b); + } else if (operation === 'difference') { + result = this.getDifference(a, b); + } else throw Error('Invalid operation'); + + return result; + } + + /** + * A demonstration method used in the AlgoKit fullstack template. + * Greets the user by name. + * + * @param name The name of the user to greet. + * @returns A greeting message to the user. + */ + hello(name: string): string { + return 'Hello, ' + name; + } +} diff --git a/examples/p-tls/projects/p-tls-contracts/contracts/clients/.gitkeep b/examples/p-tls/projects/p-tls-contracts/contracts/clients/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/examples/p-tls/projects/p-tls-contracts/contracts/clients/CalculatorClient.ts b/examples/p-tls/projects/p-tls-contracts/contracts/clients/CalculatorClient.ts new file mode 100644 index 0000000..d3674b9 --- /dev/null +++ b/examples/p-tls/projects/p-tls-contracts/contracts/clients/CalculatorClient.ts @@ -0,0 +1,742 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^7 + */ +import { AlgorandClientInterface } from '@algorandfoundation/algokit-utils/types/algorand-client-interface' +import { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app' +import { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56' +import { + AppClient as _AppClient, + AppClientMethodCallParams, + AppClientParams, + AppClientBareCallParams, + CallOnComplete, + AppClientCompilationParams, + ResolveAppClientByCreatorAndName, + ResolveAppClientByNetwork, + CloneAppClientParams, +} from '@algorandfoundation/algokit-utils/types/app-client' +import { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer' +import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' +import SimulateResponse = modelsv2.SimulateResponse + +export const APP_SPEC: Arc56Contract = {"name":"Calculator","desc":"","methods":[{"name":"doMath","desc":"A method that takes two numbers and does either addition or subtraction","args":[{"name":"a","type":"uint64","desc":"The first uint64"},{"name":"b","type":"uint64","desc":"The second uint64"},{"name":"operation","type":"string","desc":"The operation to perform. Can be either 'sum' or 'difference'"}],"returns":{"type":"uint64","desc":"The result of the operation"},"actions":{"create":[],"call":["NoOp"]}},{"name":"hello","desc":"A demonstration method used in the AlgoKit fullstack template.\nGreets the user by name.","args":[{"name":"name","type":"string","desc":"The name of the user to greet."}],"returns":{"type":"string","desc":"A greeting message to the user."},"actions":{"create":[],"call":["NoOp"]}},{"name":"createApplication","args":[],"returns":{"type":"void"},"actions":{"create":["NoOp"],"call":[]}}],"arcs":[4,56],"structs":{},"state":{"schema":{"global":{"bytes":0,"ints":0},"local":{"bytes":0,"ints":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":[],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"teal":1,"source":"contracts/Calculator.algo.ts:3","pc":[0]},{"teal":2,"source":"contracts/Calculator.algo.ts:3","pc":[1,2,3]},{"teal":3,"source":"contracts/Calculator.algo.ts:3","pc":[4,5,6,7,8,9,10]},{"teal":15,"source":"contracts/Calculator.algo.ts:3","pc":[11,12]},{"teal":16,"source":"contracts/Calculator.algo.ts:3","pc":[13]},{"teal":17,"source":"contracts/Calculator.algo.ts:3","pc":[14,15]},{"teal":18,"source":"contracts/Calculator.algo.ts:3","pc":[16]},{"teal":19,"source":"contracts/Calculator.algo.ts:3","pc":[17,18]},{"teal":20,"source":"contracts/Calculator.algo.ts:3","pc":[19]},{"teal":21,"source":"contracts/Calculator.algo.ts:3","pc":[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]},{"teal":25,"source":"contracts/Calculator.algo.ts:3","errorMessage":"The requested action is not implemented in this contract. Are you using the correct OnComplete? Did you set your app ID?","pc":[46]},{"teal":35,"source":"contracts/Calculator.algo.ts:11","pc":[47,48,49]},{"teal":39,"source":"contracts/Calculator.algo.ts:12","pc":[50,51]},{"teal":40,"source":"contracts/Calculator.algo.ts:12","pc":[52,53]},{"teal":41,"source":"contracts/Calculator.algo.ts:12","pc":[54]},{"teal":42,"source":"contracts/Calculator.algo.ts:11","pc":[55]},{"teal":52,"source":"contracts/Calculator.algo.ts:22","pc":[56,57,58]},{"teal":56,"source":"contracts/Calculator.algo.ts:23","pc":[59,60]},{"teal":57,"source":"contracts/Calculator.algo.ts:23","pc":[61,62]},{"teal":58,"source":"contracts/Calculator.algo.ts:23","pc":[63]},{"teal":59,"source":"contracts/Calculator.algo.ts:23","pc":[64,65,66]},{"teal":60,"source":"contracts/Calculator.algo.ts:23","pc":[67,68]},{"teal":61,"source":"contracts/Calculator.algo.ts:23","pc":[69,70]},{"teal":62,"source":"contracts/Calculator.algo.ts:23","pc":[71]},{"teal":63,"source":"contracts/Calculator.algo.ts:23","pc":[72,73,74]},{"teal":66,"source":"contracts/Calculator.algo.ts:23","pc":[75,76]},{"teal":67,"source":"contracts/Calculator.algo.ts:23","pc":[77,78]},{"teal":68,"source":"contracts/Calculator.algo.ts:23","pc":[79]},{"teal":71,"source":"contracts/Calculator.algo.ts:22","pc":[80]},{"teal":76,"source":"contracts/Calculator.algo.ts:35","pc":[81]},{"teal":79,"source":"contracts/Calculator.algo.ts:35","pc":[82,83,84]},{"teal":80,"source":"contracts/Calculator.algo.ts:35","pc":[85,86,87]},{"teal":83,"source":"contracts/Calculator.algo.ts:35","pc":[88,89,90]},{"teal":84,"source":"contracts/Calculator.algo.ts:35","pc":[91]},{"teal":87,"source":"contracts/Calculator.algo.ts:35","pc":[92,93,94]},{"teal":88,"source":"contracts/Calculator.algo.ts:35","pc":[95]},{"teal":91,"source":"contracts/Calculator.algo.ts:35","pc":[96,97,98]},{"teal":92,"source":"contracts/Calculator.algo.ts:35","pc":[99]},{"teal":93,"source":"contracts/Calculator.algo.ts:35","pc":[100]},{"teal":94,"source":"contracts/Calculator.algo.ts:35","pc":[101]},{"teal":95,"source":"contracts/Calculator.algo.ts:35","pc":[102]},{"teal":96,"source":"contracts/Calculator.algo.ts:35","pc":[103]},{"teal":108,"source":"contracts/Calculator.algo.ts:35","pc":[104,105,106]},{"teal":111,"source":"contracts/Calculator.algo.ts:35","pc":[107,108]},{"teal":116,"source":"contracts/Calculator.algo.ts:38","pc":[109,110]},{"teal":117,"source":"contracts/Calculator.algo.ts:38","pc":[111,112,113,114,115]},{"teal":118,"source":"contracts/Calculator.algo.ts:38","pc":[116]},{"teal":119,"source":"contracts/Calculator.algo.ts:38","pc":[117,118,119]},{"teal":124,"source":"contracts/Calculator.algo.ts:39","pc":[120,121]},{"teal":125,"source":"contracts/Calculator.algo.ts:39","pc":[122,123]},{"teal":126,"source":"contracts/Calculator.algo.ts:39","pc":[124,125,126]},{"teal":127,"source":"contracts/Calculator.algo.ts:39","pc":[127,128]},{"teal":128,"source":"contracts/Calculator.algo.ts:38","pc":[129,130,131]},{"teal":133,"source":"contracts/Calculator.algo.ts:40","pc":[132,133]},{"teal":134,"source":"contracts/Calculator.algo.ts:40","pc":[134,135,136,137,138,139,140,141,142,143,144,145]},{"teal":135,"source":"contracts/Calculator.algo.ts:40","pc":[146]},{"teal":136,"source":"contracts/Calculator.algo.ts:40","pc":[147,148,149]},{"teal":141,"source":"contracts/Calculator.algo.ts:41","pc":[150,151]},{"teal":142,"source":"contracts/Calculator.algo.ts:41","pc":[152,153]},{"teal":143,"source":"contracts/Calculator.algo.ts:41","pc":[154,155,156]},{"teal":144,"source":"contracts/Calculator.algo.ts:41","pc":[157,158]},{"teal":145,"source":"contracts/Calculator.algo.ts:40","pc":[159,160,161]},{"teal":149,"source":"contracts/Calculator.algo.ts:42","errorMessage":"Invalid operation","pc":[162]},{"teal":154,"source":"contracts/Calculator.algo.ts:44","pc":[163,164]},{"teal":157,"source":"contracts/Calculator.algo.ts:35","pc":[165,166]},{"teal":158,"source":"contracts/Calculator.algo.ts:35","pc":[167]},{"teal":163,"source":"contracts/Calculator.algo.ts:54","pc":[168]},{"teal":166,"source":"contracts/Calculator.algo.ts:54","pc":[169,170,171]},{"teal":167,"source":"contracts/Calculator.algo.ts:54","pc":[172,173,174]},{"teal":170,"source":"contracts/Calculator.algo.ts:54","pc":[175,176,177]},{"teal":171,"source":"contracts/Calculator.algo.ts:54","pc":[178]},{"teal":172,"source":"contracts/Calculator.algo.ts:54","pc":[179]},{"teal":173,"source":"contracts/Calculator.algo.ts:54","pc":[180]},{"teal":174,"source":"contracts/Calculator.algo.ts:54","pc":[181,182,183]},{"teal":175,"source":"contracts/Calculator.algo.ts:54","pc":[184]},{"teal":176,"source":"contracts/Calculator.algo.ts:54","pc":[185]},{"teal":177,"source":"contracts/Calculator.algo.ts:54","pc":[186]},{"teal":178,"source":"contracts/Calculator.algo.ts:54","pc":[187]},{"teal":179,"source":"contracts/Calculator.algo.ts:54","pc":[188]},{"teal":180,"source":"contracts/Calculator.algo.ts:54","pc":[189]},{"teal":190,"source":"contracts/Calculator.algo.ts:54","pc":[190,191,192]},{"teal":194,"source":"contracts/Calculator.algo.ts:55","pc":[193,194,195,196,197,198,199,200,201]},{"teal":195,"source":"contracts/Calculator.algo.ts:55","pc":[202,203]},{"teal":196,"source":"contracts/Calculator.algo.ts:55","pc":[204]},{"teal":197,"source":"contracts/Calculator.algo.ts:54","pc":[205]},{"teal":200,"source":"contracts/Calculator.algo.ts:3","pc":[206]},{"teal":201,"source":"contracts/Calculator.algo.ts:3","pc":[207]},{"teal":204,"source":"contracts/Calculator.algo.ts:3","pc":[208,209,210,211,212,213]},{"teal":205,"source":"contracts/Calculator.algo.ts:3","pc":[214,215,216]},{"teal":206,"source":"contracts/Calculator.algo.ts:3","pc":[217,218,219,220]},{"teal":209,"source":"contracts/Calculator.algo.ts:3","errorMessage":"this contract does not implement the given ABI method for create NoOp","pc":[221]},{"teal":212,"source":"contracts/Calculator.algo.ts:3","pc":[222,223,224,225,226,227]},{"teal":213,"source":"contracts/Calculator.algo.ts:3","pc":[228,229,230,231,232,233]},{"teal":214,"source":"contracts/Calculator.algo.ts:3","pc":[234,235,236]},{"teal":215,"source":"contracts/Calculator.algo.ts:3","pc":[237,238,239,240,241,242]},{"teal":218,"source":"contracts/Calculator.algo.ts:3","errorMessage":"this contract does not implement the given ABI method for call NoOp","pc":[243]}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCmludGNibG9jayAxCmJ5dGVjYmxvY2sgMHgxNTFmN2M3NQoKLy8gVGhpcyBURUFMIHdhcyBnZW5lcmF0ZWQgYnkgVEVBTFNjcmlwdCB2MC4xMDcuMgovLyBodHRwczovL2dpdGh1Yi5jb20vYWxnb3JhbmRmb3VuZGF0aW9uL1RFQUxTY3JpcHQKCi8vIFRoaXMgY29udHJhY3QgaXMgY29tcGxpYW50IHdpdGggYW5kL29yIGltcGxlbWVudHMgdGhlIGZvbGxvd2luZyBBUkNzOiBbIEFSQzQgXQoKLy8gVGhlIGZvbGxvd2luZyB0ZW4gbGluZXMgb2YgVEVBTCBoYW5kbGUgaW5pdGlhbCBwcm9ncmFtIGZsb3cKLy8gVGhpcyBwYXR0ZXJuIGlzIHVzZWQgdG8gbWFrZSBpdCBlYXN5IGZvciBhbnlvbmUgdG8gcGFyc2UgdGhlIHN0YXJ0IG9mIHRoZSBwcm9ncmFtIGFuZCBkZXRlcm1pbmUgaWYgYSBzcGVjaWZpYyBhY3Rpb24gaXMgYWxsb3dlZAovLyBIZXJlLCBhY3Rpb24gcmVmZXJzIHRvIHRoZSBPbkNvbXBsZXRlIGluIGNvbWJpbmF0aW9uIHdpdGggd2hldGhlciB0aGUgYXBwIGlzIGJlaW5nIGNyZWF0ZWQgb3IgY2FsbGVkCi8vIEV2ZXJ5IHBvc3NpYmxlIGFjdGlvbiBmb3IgdGhpcyBjb250cmFjdCBpcyByZXByZXNlbnRlZCBpbiB0aGUgc3dpdGNoIHN0YXRlbWVudAovLyBJZiB0aGUgYWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgY29udHJhY3QsIGl0cyByZXNwZWN0aXZlIGJyYW5jaCB3aWxsIGJlICIqTk9UX0lNUExFTUVOVEVEIiB3aGljaCBqdXN0IGNvbnRhaW5zICJlcnIiCnR4biBBcHBsaWNhdGlvbklECiEKcHVzaGludCA2CioKdHhuIE9uQ29tcGxldGlvbgorCnN3aXRjaCAqY2FsbF9Ob09wICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqY3JlYXRlX05vT3AgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVECgoqTk9UX0lNUExFTUVOVEVEOgoJLy8gVGhlIHJlcXVlc3RlZCBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoaXMgY29udHJhY3QuIEFyZSB5b3UgdXNpbmcgdGhlIGNvcnJlY3QgT25Db21wbGV0ZT8gRGlkIHlvdSBzZXQgeW91ciBhcHAgSUQ/CgllcnIKCi8vIGdldFN1bShhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NAovLwovLyBDYWxjdWxhdGVzIHRoZSBzdW0gb2YgdHdvIG51bWJlcnMKLy8KLy8gQHBhcmFtIGEKLy8gQHBhcmFtIGIKLy8gQHJldHVybnMgVGhlIHN1bSBvZiBhIGFuZCBiCmdldFN1bToKCXByb3RvIDIgMQoKCS8vIGNvbnRyYWN0cy9DYWxjdWxhdG9yLmFsZ28udHM6MTIKCS8vIHJldHVybiBhICsgYjsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCSsKCXJldHN1YgoKLy8gZ2V0RGlmZmVyZW5jZShhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NAovLwovLyBDYWxjdWxhdGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIG51bWJlcnMKLy8KLy8gQHBhcmFtIGEKLy8gQHBhcmFtIGIKLy8gQHJldHVybnMgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGFuZCBiLgpnZXREaWZmZXJlbmNlOgoJcHJvdG8gMiAxCgoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czoyMwoJLy8gcmV0dXJuIGEgPj0gYiA/IGEgLSBiIDogYiAtIGE7CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0Cgk+PQoJYnogKnRlcm5hcnkwX2ZhbHNlCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0CgktCgliICp0ZXJuYXJ5MF9lbmQKCip0ZXJuYXJ5MF9mYWxzZToKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCS0KCip0ZXJuYXJ5MF9lbmQ6CglyZXRzdWIKCi8vIGRvTWF0aCh1aW50NjQsdWludDY0LHN0cmluZyl1aW50NjQKKmFiaV9yb3V0ZV9kb01hdGg6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGVjIDAgLy8gMHgxNTFmN2M3NQoKCS8vIG9wZXJhdGlvbjogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglleHRyYWN0IDIgMAoKCS8vIGI6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJYnRvaQoKCS8vIGE6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZG9NYXRoKHVpbnQ2NCx1aW50NjQsc3RyaW5nKXVpbnQ2NAoJY2FsbHN1YiBkb01hdGgKCWl0b2IKCWNvbmNhdAoJbG9nCglpbnRjIDAgLy8gMQoJcmV0dXJuCgovLyBkb01hdGgoYTogdWludDY0LCBiOiB1aW50NjQsIG9wZXJhdGlvbjogc3RyaW5nKTogdWludDY0Ci8vCi8vIEEgbWV0aG9kIHRoYXQgdGFrZXMgdHdvIG51bWJlcnMgYW5kIGRvZXMgZWl0aGVyIGFkZGl0aW9uIG9yIHN1YnRyYWN0aW9uCi8vCi8vIEBwYXJhbSBhIFRoZSBmaXJzdCB1aW50NjQKLy8gQHBhcmFtIGIgVGhlIHNlY29uZCB1aW50NjQKLy8gQHBhcmFtIG9wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0uIENhbiBiZSBlaXRoZXIgJ3N1bScgb3IgJ2RpZmZlcmVuY2UnCi8vCi8vIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbgpkb01hdGg6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJcHVzaGJ5dGVzIDB4CgoJLy8gKmlmMF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy9DYWxjdWxhdG9yLmFsZ28udHM6MzgKCS8vIG9wZXJhdGlvbiA9PT0gJ3N1bScKCWZyYW1lX2RpZyAtMyAvLyBvcGVyYXRpb246IHN0cmluZwoJcHVzaGJ5dGVzIDB4NzM3NTZkIC8vICJzdW0iCgk9PQoJYnogKmlmMF9lbHNlaWYxX2NvbmRpdGlvbgoKCS8vICppZjBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czozOQoJLy8gcmVzdWx0ID0gdGhpcy5nZXRTdW0oYSwgYikKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCWNhbGxzdWIgZ2V0U3VtCglmcmFtZV9idXJ5IDAgLy8gcmVzdWx0OiB1aW50NjQKCWIgKmlmMF9lbmQKCippZjBfZWxzZWlmMV9jb25kaXRpb246CgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjQwCgkvLyBvcGVyYXRpb24gPT09ICdkaWZmZXJlbmNlJwoJZnJhbWVfZGlnIC0zIC8vIG9wZXJhdGlvbjogc3RyaW5nCglwdXNoYnl0ZXMgMHg2NDY5NjY2NjY1NzI2NTZlNjM2NSAvLyAiZGlmZmVyZW5jZSIKCT09CglieiAqaWYwX2Vsc2UKCgkvLyAqaWYwX2Vsc2VpZjFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czo0MQoJLy8gcmVzdWx0ID0gdGhpcy5nZXREaWZmZXJlbmNlKGEsIGIpCglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CgljYWxsc3ViIGdldERpZmZlcmVuY2UKCWZyYW1lX2J1cnkgMCAvLyByZXN1bHQ6IHVpbnQ2NAoJYiAqaWYwX2VuZAoKKmlmMF9lbHNlOgoJLy8gSW52YWxpZCBvcGVyYXRpb24KCWVycgoKKmlmMF9lbmQ6CgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjQ0CgkvLyByZXR1cm4gcmVzdWx0OwoJZnJhbWVfZGlnIDAgLy8gcmVzdWx0OiB1aW50NjQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gaGVsbG8oc3RyaW5nKXN0cmluZwoqYWJpX3JvdXRlX2hlbGxvOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlYyAwIC8vIDB4MTUxZjdjNzUKCgkvLyBuYW1lOiBzdHJpbmcKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgoJLy8gZXhlY3V0ZSBoZWxsbyhzdHJpbmcpc3RyaW5nCgljYWxsc3ViIGhlbGxvCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWludGMgMCAvLyAxCglyZXR1cm4KCi8vIGhlbGxvKG5hbWU6IHN0cmluZyk6IHN0cmluZwovLwovLyBBIGRlbW9uc3RyYXRpb24gbWV0aG9kIHVzZWQgaW4gdGhlIEFsZ29LaXQgZnVsbHN0YWNrIHRlbXBsYXRlLgovLyBHcmVldHMgdGhlIHVzZXIgYnkgbmFtZS4KLy8KLy8gQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHVzZXIgdG8gZ3JlZXQuCi8vIEByZXR1cm5zIEEgZ3JlZXRpbmcgbWVzc2FnZSB0byB0aGUgdXNlci4KaGVsbG86Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjU1CgkvLyByZXR1cm4gJ0hlbGxvLCAnICsgbmFtZTsKCXB1c2hieXRlcyAweDQ4NjU2YzZjNmYyYzIwIC8vICJIZWxsbywgIgoJZnJhbWVfZGlnIC0xIC8vIG5hbWU6IHN0cmluZwoJY29uY2F0CglyZXRzdWIKCiphYmlfcm91dGVfY3JlYXRlQXBwbGljYXRpb246CglpbnRjIDAgLy8gMQoJcmV0dXJuCgoqY3JlYXRlX05vT3A6CglwdXNoYnl0ZXMgMHhiODQ0N2IzNiAvLyBtZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKCl2b2lkIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9jcmVhdGVBcHBsaWNhdGlvbgoKCS8vIHRoaXMgY29udHJhY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBnaXZlbiBBQkkgbWV0aG9kIGZvciBjcmVhdGUgTm9PcAoJZXJyCgoqY2FsbF9Ob09wOgoJcHVzaGJ5dGVzIDB4NzZhN2VmMzMgLy8gbWV0aG9kICJkb01hdGgodWludDY0LHVpbnQ2NCxzdHJpbmcpdWludDY0IgoJcHVzaGJ5dGVzIDB4MDJiZWNlMTEgLy8gbWV0aG9kICJoZWxsbyhzdHJpbmcpc3RyaW5nIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9kb01hdGggKmFiaV9yb3V0ZV9oZWxsbwoKCS8vIHRoaXMgY29udHJhY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBnaXZlbiBBQkkgbWV0aG9kIGZvciBjYWxsIE5vT3AKCWVycg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEw"},"byteCode":{"approval":"CiABASYBBBUffHUxGBSBBgsxGQiNDACwAAAAAAAAAAAAAACiAAAAAAAAAAAAAACKAgGL/4v+CImKAgGL/4v+D0EACIv/i/4JQgAFi/6L/wmJKDYaA1cCADYaAhc2GgEXiAAFFlCwIkOKAwGAAIv9gANzdW0SQQAMi/6L/4j/sIwAQgAfi/2ACmRpZmZlcmVuY2USQQAMi/6L/4j/m4wAQgABAIsAjACJKDYaAVcCAIgADEkVFlcGAkxQULAiQ4oBAYAHSGVsbG8sIIv/UIkiQ4AEuER7NjYaAI4B//EAgAR2p+8zgAQCvs4RNhoAjgL/Xv+1AA==","clear":"Cg=="},"compilerInfo":{"compiler":"algod","compilerVersion":{"major":4,"minor":4,"patch":1,"commitHash":"7b607ce4"}}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the Calculator contract + */ +export type CalculatorArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'doMath(uint64,uint64,string)uint64': { + /** + * The first uint64 + */ + a: bigint | number + /** + * The second uint64 + */ + b: bigint | number + /** + * The operation to perform. Can be either 'sum' or 'difference' + */ + operation: string + } + 'hello(string)string': { + /** + * The name of the user to greet. + */ + name: string + } + 'createApplication()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'doMath(uint64,uint64,string)uint64': [a: bigint | number, b: bigint | number, operation: string] + 'hello(string)string': [name: string] + 'createApplication()void': [] + } +} + +/** + * The return type for each method + */ +export type CalculatorReturns = { + 'doMath(uint64,uint64,string)uint64': bigint + 'hello(string)string': string + 'createApplication()void': void +} + +/** + * Defines the types of available calls and state of the Calculator smart contract. + */ +export type CalculatorTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'doMath(uint64,uint64,string)uint64' | 'doMath', { + argsObj: CalculatorArgs['obj']['doMath(uint64,uint64,string)uint64'] + argsTuple: CalculatorArgs['tuple']['doMath(uint64,uint64,string)uint64'] + /** + * The result of the operation + */ + returns: CalculatorReturns['doMath(uint64,uint64,string)uint64'] + }> + & Record<'hello(string)string' | 'hello', { + argsObj: CalculatorArgs['obj']['hello(string)string'] + argsTuple: CalculatorArgs['tuple']['hello(string)string'] + /** + * A greeting message to the user. + */ + returns: CalculatorReturns['hello(string)string'] + }> + & Record<'createApplication()void' | 'createApplication', { + argsObj: CalculatorArgs['obj']['createApplication()void'] + argsTuple: CalculatorArgs['tuple']['createApplication()void'] + returns: CalculatorReturns['createApplication()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type CalculatorSignatures = keyof CalculatorTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type CalculatorNonVoidMethodSignatures = keyof CalculatorTypes['methods'] extends infer T ? T extends keyof CalculatorTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the Calculator smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = CalculatorTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the Calculator smart contract to the method's return type + */ +export type MethodReturn = CalculatorTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type CalculatorCreateCallParams = + | Expand & {method: 'createApplication'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema> + | Expand & {method: 'createApplication()void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema> +/** + * Defines arguments required for the deploy method. + */ +export type CalculatorDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: CalculatorCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the Calculator smart contract + */ +export abstract class CalculatorParamsFactory { + /** + * Gets available create ABI call param factories + */ + static get create() { + return { + _resolveByMethod(params: TParams) { + switch(params.method) { + case 'createApplication': + case 'createApplication()void': + return CalculatorParamsFactory.create.createApplication(params) + } + throw new Error(`Unknown ' + verb + ' method`) + }, + + /** + * Constructs create ABI call params for the Calculator smart contract using the createApplication()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + createApplication(params: CallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} { + return { + ...params, + method: 'createApplication()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + + /** + * Constructs a no op call for the doMath(uint64,uint64,string)uint64 ABI method + * + * A method that takes two numbers and does either addition or subtraction + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static doMath(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'doMath(uint64,uint64,string)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.operation], + } + } + /** + * Constructs a no op call for the hello(string)string ABI method + * + * A demonstration method used in the AlgoKit fullstack template. + Greets the user by name. + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static hello(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'hello(string)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.name], + } + } +} + +/** + * A factory to create and deploy one or more instance of the Calculator smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class CalculatorFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `CalculatorFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClientInterface { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new CalculatorClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new CalculatorClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the Calculator smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: CalculatorDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + createParams: params.createParams?.method ? CalculatorParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (CalculatorCreateCallParams & { args: Uint8Array[] }) : undefined, + }) + return { result: result.result, appClient: new CalculatorClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Calculator smart contract using the createApplication()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create params + */ + createApplication: (params: CallParams & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { + return this.appFactory.params.create(CalculatorParamsFactory.create.createApplication(params)) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Calculator smart contract using the createApplication()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create transaction + */ + createApplication: (params: CallParams & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { + return this.appFactory.createTransaction.create(CalculatorParamsFactory.create.createApplication(params)) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Calculator smart contract using an ABI method call using the createApplication()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create result + */ + createApplication: async (params: CallParams & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { + const result = await this.appFactory.send.create(CalculatorParamsFactory.create.createApplication(params)) + return { result: { ...result.result, return: result.result.return as unknown as (undefined | CalculatorReturns['createApplication()void']) }, appClient: new CalculatorClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the Calculator smart contract + */ +export class CalculatorClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `CalculatorClient` + * + * @param appClient An `AppClient` instance which has been created with the Calculator app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `CalculatorClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Checks for decode errors on the given return value and maps the return value to the return type for the given method + * @returns The typed return value or undefined if there was no value + */ + decodeReturnValue(method: TSignature, returnValue: ABIReturn | undefined) { + return returnValue !== undefined ? getArc56ReturnValue>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined + } + + /** + * Returns a new `CalculatorClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new CalculatorClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `CalculatorClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new CalculatorClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClientInterface { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the Calculator smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. + * + * A method that takes two numbers and does either addition or subtraction + * + * @param params The params for the smart contract call + * @returns The call params: The result of the operation + */ + doMath: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(CalculatorParamsFactory.doMath(params)) + }, + + /** + * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. + * + * A demonstration method used in the AlgoKit fullstack template. + Greets the user by name. + + * + * @param params The params for the smart contract call + * @returns The call params: A greeting message to the user. + */ + hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(CalculatorParamsFactory.hello(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the Calculator smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. + * + * A method that takes two numbers and does either addition or subtraction + * + * @param params The params for the smart contract call + * @returns The call transaction: The result of the operation + */ + doMath: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(CalculatorParamsFactory.doMath(params)) + }, + + /** + * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. + * + * A demonstration method used in the AlgoKit fullstack template. + Greets the user by name. + + * + * @param params The params for the smart contract call + * @returns The call transaction: A greeting message to the user. + */ + hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(CalculatorParamsFactory.hello(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the Calculator smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. + * + * A method that takes two numbers and does either addition or subtraction + * + * @param params The params for the smart contract call + * @returns The call result: The result of the operation + */ + doMath: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(CalculatorParamsFactory.doMath(params)) + return {...result, return: result.return as unknown as (undefined | CalculatorReturns['doMath(uint64,uint64,string)uint64'])} + }, + + /** + * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. + * + * A demonstration method used in the AlgoKit fullstack template. + Greets the user by name. + + * + * @param params The params for the smart contract call + * @returns The call result: A greeting message to the user. + */ + hello: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(CalculatorParamsFactory.hello(params)) + return {...result, return: result.return as unknown as (undefined | CalculatorReturns['hello(string)string'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new CalculatorClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current Calculator app + */ + state = { + } + + public newGroup(): CalculatorComposer { + const client = this + const composer = this.algorand.newGroup() + let promiseChain:Promise = Promise.resolve() + const resultMappers: Array any)> = [] + return { + /** + * Add a doMath(uint64,uint64,string)uint64 method call against the Calculator contract + */ + doMath(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.doMath(params))) + resultMappers.push((v) => client.decodeReturnValue('doMath(uint64,uint64,string)uint64', v)) + return this + }, + /** + * Add a hello(string)string method call against the Calculator contract + */ + hello(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hello(params))) + resultMappers.push((v) => client.decodeReturnValue('hello(string)string', v)) + return this + }, + /** + * Add a clear state call to the Calculator contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + } + } + } as unknown as CalculatorComposer + } +} +export type CalculatorComposer = { + /** + * Calls the doMath(uint64,uint64,string)uint64 ABI method. + * + * A method that takes two numbers and does either addition or subtraction + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + doMath(params?: CallParams): CalculatorComposer<[...TReturns, CalculatorReturns['doMath(uint64,uint64,string)uint64'] | undefined]> + + /** + * Calls the hello(string)string ABI method. + * + * A demonstration method used in the AlgoKit fullstack template. + Greets the user by name. + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + hello(params?: CallParams): CalculatorComposer<[...TReturns, CalculatorReturns['hello(string)string'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the Calculator smart contract. + * + * @param args The arguments for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): CalculatorComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): CalculatorComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type CalculatorComposerResults = Expand + diff --git a/examples/p-tls/projects/p-tls-contracts/jest.config.js b/examples/p-tls/projects/p-tls-contracts/jest.config.js new file mode 100644 index 0000000..6f5ef4e --- /dev/null +++ b/examples/p-tls/projects/p-tls-contracts/jest.config.js @@ -0,0 +1,6 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + testTimeout: 60000 +}; diff --git a/examples/p-tls/projects/p-tls-contracts/package.json b/examples/p-tls/projects/p-tls-contracts/package.json new file mode 100644 index 0000000..5bffbdd --- /dev/null +++ b/examples/p-tls/projects/p-tls-contracts/package.json @@ -0,0 +1,36 @@ +{ + "name": "p-tls-contracts", + "version": "0.0.0", + "license": "MIT", + "scripts": { + "generate-client": "algokit generate client contracts/artifacts/ --language typescript --output contracts/clients/{contract_name}Client.ts", + "compile-contract": "tealscript contracts/*.algo.ts contracts/artifacts", + "generate-components": "algokit-generate-component contracts/artifacts/Calculator.arc32.json contracts/artifacts/components", + "build": "npm run compile-contract && npm run generate-client", + "test": "npm run build && jest", + "lint": "eslint . --ext .ts", + "fix": "eslint . --ext .ts --fix" + }, + "dependencies": { + "@algorandfoundation/algokit-utils": "^7.0.0", + "algosdk": ">=2.9.0 <3.0" + }, + "devDependencies": { + "@algorandfoundation/algokit-client-generator": "^4.0.0", + "@algorandfoundation/tealscript": "latest", + "@jest/globals": "^29.5.0", + "@joe-p/algokit-generate-component": "^0.2.0", + "@typescript-eslint/eslint-plugin": "^5.13.0", + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^7.32.0 || ^8.2.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-airbnb-typescript": "^17.0.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-prettier": "^5.0.1", + "jest": "^29.5.0", + "prettier": "^3.0.3", + "ts-jest": "^29.1.0", + "typescript": "5.0.2" + } +} diff --git a/examples/p-tls/projects/p-tls-contracts/tsconfig.json b/examples/p-tls/projects/p-tls-contracts/tsconfig.json new file mode 100644 index 0000000..5e3106d --- /dev/null +++ b/examples/p-tls/projects/p-tls-contracts/tsconfig.json @@ -0,0 +1,103 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/examples/p-tls/projects/p-tls-frontend/.algokit.toml b/examples/p-tls/projects/p-tls-frontend/.algokit.toml new file mode 100644 index 0000000..2d172f8 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/.algokit.toml @@ -0,0 +1,17 @@ +[algokit] +min_version = "v2.0.0" + +[project] +type = "frontend" +name = 'p-tls-frontend' +artifacts = "src/contracts" + +[project.run] +build = { commands = ['npm run build'], description = 'Build frontend' } +test = { commands = ['npm run test'], description = 'Run frontend tests' } +lint = { commands = ['npm run lint'], description = 'Lint frontend code' } +ci-deploy-netlify = { commands = [ + 'npm install --global netlify-cli@latest', + 'netlify login', + 'netlify deploy --build --prod' + ], description = 'Deploy to Netlify' } diff --git a/examples/p-tls/projects/p-tls-frontend/.algokit/.copier-answers.yml b/examples/p-tls/projects/p-tls-frontend/.algokit/.copier-answers.yml new file mode 100644 index 0000000..0b7115b --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/.algokit/.copier-answers.yml @@ -0,0 +1,9 @@ +# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY +_commit: 1.1.1 +_src_path: gh:algorandfoundation/algokit-react-frontend-template +author_email: None +author_name: None +cloud_provider: netlify +preset_name: production +project_name: p-tls-frontend + diff --git a/examples/p-tls/projects/p-tls-frontend/.editorconfig b/examples/p-tls/projects/p-tls-frontend/.editorconfig new file mode 100644 index 0000000..a83b72c --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/.editorconfig @@ -0,0 +1,9 @@ +[*] +charset = utf-8 +insert_final_newline = true +end_of_line = lf +indent_style = space +indent_size = 2 +tab_width = 2 +max_line_length = 140 +trim_trailing_whitespace = true diff --git a/examples/p-tls/projects/p-tls-frontend/.env.template b/examples/p-tls/projects/p-tls-frontend/.env.template new file mode 100644 index 0000000..eb4b229 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/.env.template @@ -0,0 +1,67 @@ +# ====================== +# LocalNet configuration +# uncomment below to use +# ====================== + +VITE_ENVIRONMENT=local + +# Algod +VITE_ALGOD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +VITE_ALGOD_SERVER=http://localhost +VITE_ALGOD_PORT=4001 +VITE_ALGOD_NETWORK=localnet + +# Indexer +VITE_INDEXER_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +VITE_INDEXER_SERVER=http://localhost +VITE_INDEXER_PORT=8980 + +# KMD +# Please note: +# 1. This is only needed for LocalNet since +# by default KMD provider is ignored on other networks. +# 2. AlgoKit LocalNet starts with a single wallet called 'unencrypted-default-wallet', +# with heaps of tokens available for testing. +VITE_KMD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +VITE_KMD_SERVER=http://localhost +VITE_KMD_PORT=4002 +VITE_KMD_WALLET="unencrypted-default-wallet" +VITE_KMD_PASSWORD="" + +# # ====================== +# # TestNet configuration: +# # uncomment below to use +# # ====================== + +# VITE_ENVIRONMENT=local + +# # Algod +# VITE_ALGOD_TOKEN="" +# VITE_ALGOD_SERVER="https://testnet-api.algonode.cloud" +# VITE_ALGOD_PORT="" +# VITE_ALGOD_NETWORK="testnet" + +# # Indexer +# VITE_INDEXER_TOKEN="" +# VITE_INDEXER_SERVER="https://testnet-idx.algonode.cloud" +# VITE_INDEXER_PORT="" + + +# # ====================== +# # MainNet configuration: +# # uncomment below to use +# # ====================== + +# VITE_ENVIRONMENT=production + +# # Algod +# VITE_ALGOD_TOKEN="" +# VITE_ALGOD_SERVER="https://mainnet-api.algonode.cloud" +# VITE_ALGOD_PORT="" +# VITE_ALGOD_NETWORK="mainnet" + +# # Indexer +# VITE_INDEXER_TOKEN="" +# VITE_INDEXER_SERVER="https://mainnet-idx.algonode.cloud" +# VITE_INDEXER_PORT="" + diff --git a/examples/p-tls/projects/p-tls-frontend/.eslintrc b/examples/p-tls/projects/p-tls-frontend/.eslintrc new file mode 100644 index 0000000..868fe37 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/.eslintrc @@ -0,0 +1,27 @@ +{ + "root": true, + "env": { + "node": true + }, + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint", "prettier"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "plugin:prettier/recommended" + ], + "rules": { + "prettier/prettier": "warn", + "no-console": "warn", + "@typescript-eslint/no-unused-vars": [ + "warn", + { + "ignoreRestSiblings": true, + "argsIgnorePattern": "^_", + "destructuredArrayIgnorePattern": "^_" + } + ], + "prefer-template": "error" + } +} diff --git a/examples/p-tls/projects/p-tls-frontend/.gitignore b/examples/p-tls/projects/p-tls-frontend/.gitignore new file mode 100644 index 0000000..b1ce837 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/.gitignore @@ -0,0 +1,38 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + + +# dotenv environment variable files +.env +env/ + +# misc +/dist +.DS_Store + + +npm-debug.log* +yarn-debug.log* +yarn-error.log* +/test-results/ +/playwright-report/ +/playwright/.cache/ + +# PyCharm +.idea +!.idea/ +.idea/* +!.idea/runConfigurations/ + +.vercel +.netlify diff --git a/examples/p-tls/projects/p-tls-frontend/.npmrc b/examples/p-tls/projects/p-tls-frontend/.npmrc new file mode 100644 index 0000000..c42da84 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/.npmrc @@ -0,0 +1 @@ +engine-strict = true diff --git a/examples/p-tls/projects/p-tls-frontend/.prettierignore b/examples/p-tls/projects/p-tls-frontend/.prettierignore new file mode 100644 index 0000000..dbda6ae --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/.prettierignore @@ -0,0 +1,12 @@ +# don't ever format node_modules +node_modules +# don't lint format output (make sure it's set to your correct build folder name) +dist +build +# don't format nyc coverage output +coverage +# don't format generated types +**/generated/types.d.ts +**/generated/types.ts +# don't format ide files +.idea diff --git a/examples/p-tls/projects/p-tls-frontend/.prettierrc.cjs b/examples/p-tls/projects/p-tls-frontend/.prettierrc.cjs new file mode 100644 index 0000000..066b8e5 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/.prettierrc.cjs @@ -0,0 +1,10 @@ +module.exports = { + singleQuote: true, + jsxSingleQuote: false, + semi: false, + tabWidth: 2, + trailingComma: 'all', + printWidth: 140, + endOfLine: 'lf', + arrowParens: 'always', +} diff --git a/examples/p-tls/projects/p-tls-frontend/.vscode/extensions.json b/examples/p-tls/projects/p-tls-frontend/.vscode/extensions.json new file mode 100644 index 0000000..5c94122 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/.vscode/extensions.json @@ -0,0 +1,14 @@ +{ + "recommendations": [ + "EditorConfig.EditorConfig", + "dotenv.dotenv-vscode", + "esbenp.prettier-vscode", + "dbaeumer.vscode-eslint", + "krysenlo.vite-plugin-eslint-problemmatcher", + "ms-playwright.playwright", + "Orta.vscode-jest", + "bradlc.vscode-tailwindcss", + "csstools.postcss", + ] +} + diff --git a/examples/p-tls/projects/p-tls-frontend/.vscode/launch.json b/examples/p-tls/projects/p-tls-frontend/.vscode/launch.json new file mode 100644 index 0000000..7edaf04 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/.vscode/launch.json @@ -0,0 +1,68 @@ +{ + "configurations": [ + { + "type": "msedge", + "request": "launch", + "name": "Run (Edge)", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}", + "presentation": { + "hidden": false, + "group": "2. Web" + } + }, + { + "type": "chrome", + "request": "launch", + "name": "Run (Chrome)", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}", + "presentation": { + "hidden": false, + "group": "2. Web" + } + }, + { + "type": "firefox", + "request": "launch", + "name": "Run (Firefox)", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}", + "presentation": { + "hidden": false, + "group": "2. Web" + } + }, + { + "name": "Run dApp", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev"], + "cwd": "${workspaceRoot}", + "console": "integratedTerminal", + "skipFiles": ["/**", "node_modules/**"], + "presentation": { + "hidden": false, + "group": "1. Run Project", + "order": 1 + } + }, + { + "name": "Run dApp (+ LocalNet)", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev"], + "cwd": "${workspaceRoot}", + "console": "integratedTerminal", + "skipFiles": ["/**", "node_modules/**"], + "preLaunchTask": "Start AlgoKit LocalNet", + "presentation": { + "hidden": false, + "group": "1. Run Project", + "order": 1 + } + } + ] +} diff --git a/examples/p-tls/projects/p-tls-frontend/.vscode/settings.json b/examples/p-tls/projects/p-tls-frontend/.vscode/settings.json new file mode 100644 index 0000000..f1d7017 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/.vscode/settings.json @@ -0,0 +1,13 @@ +{ + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + "source.organizeImports": "explicit" + }, + "dotenv.enableAutocloaking": false, + "jest.autoRun": { + "watch": false, + "onSave": "test-file" + } +} diff --git a/examples/p-tls/projects/p-tls-frontend/.vscode/tasks.json b/examples/p-tls/projects/p-tls-frontend/.vscode/tasks.json new file mode 100644 index 0000000..d611c4f --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/.vscode/tasks.json @@ -0,0 +1,15 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Start AlgoKit LocalNet", + "command": "algokit", + "args": ["localnet", "start"], + "type": "shell", + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + } + ] +} diff --git a/examples/p-tls/projects/p-tls-frontend/README.md b/examples/p-tls/projects/p-tls-frontend/README.md new file mode 100644 index 0000000..298fd93 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/README.md @@ -0,0 +1,124 @@ +# p-tls-frontend + +This starter React project has been generated using AlgoKit. See below for default getting started instructions. + +# Setup + +### Initial Setup + +#### 1. Clone the Repository +Start by cloning this repository to your local machine. + +#### 2. Install Pre-requisites +Ensure the following pre-requisites are installed and properly configured: + +- **npm**: Node package manager. Install from [Node.js Installation Guide](https://nodejs.org/en/download/). Verify with `npm -v` to see version `18.12`+. +- **AlgoKit CLI**: Essential for project setup and operations. Install the latest version from [AlgoKit CLI Installation Guide](https://github.com/algorandfoundation/algokit-cli#install). Verify installation with `algokit --version`, expecting `2.0.0` or later. + +#### 3. Bootstrap Your Local Environment +Run the following commands within the project folder: + +- **Install Project Dependencies**: With `algokit project bootstrap all`, ensure all dependencies are ready. + +### Development Workflow + +#### Terminal +Directly manage and interact with your project using AlgoKit commands: + +1. **Build Contracts**: `algokit project run build` builds react web app and links with smart contracts in workspace, if any. +2. Remaining set of command for linting, testing and deployment can be found in respective [package.json](./package.json) file and [.algokit.toml](./.algokit.toml) files. + +#### VS Code +For a seamless experience with breakpoint debugging and other features: + +1. **Open Project**: In VS Code, open the repository root. +2. **Install Extensions**: Follow prompts to install recommended extensions. +3. **Debugging**: + - Use `F5` to start debugging. + - **Windows Users**: Select the Python interpreter at `./.venv/Scripts/python.exe` via `Ctrl/Cmd + Shift + P` > `Python: Select Interpreter` before the first run. + +#### Other IDEs +While primarily optimized for VS Code, Jetbrains WebStorm has base support for this project: + +1. **Open Project**: In your JetBrains IDE, open the repository root. +2. **Automatic Setup**: The IDE should configure the Python interpreter and virtual environment. +3. **Debugging**: Use `Shift+F10` or `Ctrl+R` to start debugging. Note: Windows users may encounter issues with pre-launch tasks due to a known bug. See [JetBrains forums](https://youtrack.jetbrains.com/issue/IDEA-277486/Shell-script-configuration-cannot-run-as-before-launch-task) for workarounds. + +## AlgoKit Workspaces and Project Management +This project supports both standalone and monorepo setups through AlgoKit workspaces. Leverage [`algokit project run`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md) commands for efficient monorepo project orchestration and management across multiple projects within a workspace. + +> Please note, by default frontend is pre configured to run against Algorand LocalNet. If you want to run against TestNet or MainNet, comment out the current environment variable and uncomment the relevant one in [`.env`](.env) file that is created after running bootstrap command and based on [`.env.template`](.env.template). + +### Continuous Integration + +This project uses [GitHub Actions](https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions) to define CI workflows, which are located in the [.github/workflows](`../../.github/workflows`) folder. + +For pull requests and pushes to `main` branch against this repository the following checks are automatically performed by GitHub Actions: + +- `install`: Installs dependencies using `npm` +- `lint`: Lints the codebase using `ESLint` +- `build`: Builds the codebase using `vite` + +> Please note, if you instantiated the project via `algokit init` without explicitly specifying the `--no-workspace` flag, we will automatically attempt to move the contents of the `.github` folder to the root of the workspace. + +### Continuous Deployment + +The project template provides base Github Actions workflows for continuous deployment to [Netlify](https://www.netlify.com/) or [Vercel](https://vercel.com/). These workflows are located in the [`.github/workflows`](./.github/workflows) folder. + +**Please note**: when configuring the github repository for the first time. Depending on selected provider you will need to set the provider secrets in the repository settings. Default setup provided by the template allows you to manage the secrets via environment variables and secrets on your github repository. + + +#### Setting up environment variables and secrets for webapp deployment + +For Vercel: +1. Retrieve your [Vercel Access Token](https://vercel.com/support/articles/how-do-i-use-a-vercel-api-access-token) +2. Install the [Vercel CLI](https://vercel.com/cli) and run `vercel login` +3. Inside your folder, run `vercel link` to create a new Vercel project +4. Inside the generated `.vercel` folder, save the `projectId` and `orgId` from the `project.json` +5. Inside GitHub, add `VERCEL_TOKEN`, `VERCEL_ORG_ID`, and `VERCEL_PROJECT_ID` as [secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets). +6. Create an .env file containing ENV vars for the project (pointing to testnet or mainnet), drag and drop the .env file to upload initial batch of default environment variables to your vercel project. +7. Upon invocation, CD pipeline will pull the VITE_ prefixed environment variables, build the project and deploy to the specified environment. + +For Netlify: +1. Retrieve your [Netlify Access Token](https://docs.netlify.com/cli/get-started/#obtain-a-token-in-the-netlify-ui) +2. Inside your folder run `netlify login` +3. Inside your folder run `netlify sites:create` to create a new site, obtain NETLIFY_SITE_ID from the output +4. Inside GitHub, add `NETLIFY_AUTH_TOKEN` and `NETLIFY_SITE_ID` as [secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets). +5. Define the VITE_ prefixed environment variables in netlify environment variables under site settings. +6. Upon invocation, CD pipeline will build the project and deploy to the specified environment. + +> If you prefer alternative deployment methods, you can modify the relevant workflow files from the [`.github/workflows`](./.github/workflows) folder or modify deploy scripts in `.algokit.toml`. + + +# Algorand Wallet integrations + +The template comes with [`use-wallet`](https://github.com/txnlab/use-wallet) integration, which provides a React hook for connecting to an Algorand wallet providers. The following wallet providers are included by default: +- LocalNet: +- - [KMD/Local Wallet](https://github.com/TxnLab/use-wallet#kmd-algorand-key-management-daemon) - Algorand's Key Management Daemon (KMD) is a service that manages Algorand private keys and signs transactions. Works best with AlgoKit LocalNet and allows you to easily test and interact with your dApps locally. +- TestNet and others: +- - [Pera Wallet](https://perawallet.app). +- - [Defly Wallet](https://defly.app). +- - [Exodus Wallet](https://www.exodus.com). +- - [Daffi Wallet](https://www.daffi.me). + +Refer to official [`use-wallet`](https://github.com/txnlab/use-wallet) documentation for detailed guidelines on how to integrate with other wallet providers (such as WalletConnect v2). Too see implementation details on the use wallet hook and initialization of extra wallet providers refer to [`App.tsx`](./src/App.tsx). + +# Tools + +This project makes use of React and Tailwind to provider a base project configuration to develop frontends for your Algorand dApps and interactions with smart contracts. The following tools are in use: + +- [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-ts) - Various TypeScript utilities to simplify interactions with Algorand and AlgoKit. +- [React](https://reactjs.org/) - A JavaScript library for building user interfaces. +- [Tailwind CSS](https://tailwindcss.com/) - A utility-first CSS framework for rapidly building custom designs. +- [daisyUI](https://daisyui.com/) - A component library for Tailwind CSS. +- [use-wallet](https://github.com/txnlab/use-wallet) - A React hook for connecting to an Algorand wallet providers. +- [npm](https://www.npmjs.com/): Node.js package manager +- [jest](https://jestjs.io/): JavaScript testing framework +- [playwright](https://playwright.dev/): Browser automation library +- [Prettier](https://prettier.io/): Opinionated code formatter +- [ESLint](https://eslint.org/): Tool for identifying and reporting on patterns in JavaScript +- Github Actions workflows for build validation +It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. +# Integrating with smart contracts and application clients + +Refer to the detailed guidance on [integrating with smart contracts and application clients](./src/contracts/README.md). In essence, for any smart contract codebase generated with AlgoKit or other tools that produce compile contracts into ARC34 compliant app specifications, you can use the `algokit generate` command to generate TypeScript or Python typed client. Once generated simply drag and drop the generated client into `./src/contracts` and import it into your React components as you see fit. diff --git a/examples/p-tls/projects/p-tls-frontend/index.html b/examples/p-tls/projects/p-tls-frontend/index.html new file mode 100644 index 0000000..5a2ef4f --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/index.html @@ -0,0 +1,12 @@ + + + + + + AlgoKit React Template + + +
+ + + diff --git a/examples/p-tls/projects/p-tls-frontend/jest.config.ts b/examples/p-tls/projects/p-tls-frontend/jest.config.ts new file mode 100644 index 0000000..28a8c3d --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/jest.config.ts @@ -0,0 +1,20 @@ +import type { Config } from '@jest/types' + +const config: Config.InitialOptions = { + preset: 'ts-jest', + testEnvironment: 'node', + testMatch: ['**/*.spec.ts', '**/*.spec.tsx'], + moduleDirectories: ['node_modules', 'src'], + transform: { + '': [ + 'ts-jest', + { + tsconfig: 'tsconfig.test.json', + }, + ], + }, + coveragePathIgnorePatterns: ['tests'], + testPathIgnorePatterns: ['/tests/'], + } + +export default config diff --git a/examples/p-tls/projects/p-tls-frontend/package.json b/examples/p-tls/projects/p-tls-frontend/package.json new file mode 100644 index 0000000..15dcb19 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/package.json @@ -0,0 +1,81 @@ +{ + "name": "p-tls-frontend", + "version": "0.1.0", + "author": { + "name": "None", + "email": "None" + }, + "private": true, + "type": "module", + "engines": { + "node": ">=20.0", + "npm": ">=9.0" + }, + "devDependencies": { + "@algorandfoundation/algokit-client-generator": "^5.0.0", + "@types/node": "^18.17.14", + "@types/react": "^18.2.11", + "@types/react-dom": "^18.2.4", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.14", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.1.3", + "@typescript-eslint/eslint-plugin": "^7.0.2", + "@typescript-eslint/parser": "^7.0.2", + "postcss": "^8.4.24", + "tailwindcss": "3.3.2", + "ts-jest": "^29.1.1", + "@types/jest": "29.5.2", + "ts-node": "^10.9.1", + "typescript": "^5.1.6", + "@playwright/test": "^1.35.0", + "playwright": "^1.35.0", + "vite": "^5.0.0", + "vite-plugin-node-polyfills": "^0.22.0" + }, + "dependencies": { + "@algorandfoundation/algokit-utils": "^9.0.0", + "@blockshake/defly-connect": "^1.2.1", + "@perawallet/connect": "^1.4.1", + "@txnlab/use-wallet": "^4.0.0", + "@txnlab/use-wallet-react": "^4.0.0", + "algosdk": "^3.0.0", + "daisyui": "^4.0.0", + "notistack": "^3.0.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "tslib": "^2.6.2" + }, + "scripts": { + "generate:app-clients": "algokit project link --all", + "dev": "npm run generate:app-clients && vite", + "build": "npm run generate:app-clients && tsc && vite build", + "test": "jest --coverage --passWithNoTests", + "playwright:test": "playwright test", + "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "lint:fix": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0 --fix", + "preview": "vite preview" + }, + "eslintConfig": { + "extends": [ + "react-app/jest", + "react-app" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "overrides": { + "ws@>7.0.0 <7.5.9": "7.5.10" + } +} diff --git a/examples/p-tls/projects/p-tls-frontend/playwright.config.ts b/examples/p-tls/projects/p-tls-frontend/playwright.config.ts new file mode 100644 index 0000000..d7cbca6 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/playwright.config.ts @@ -0,0 +1,73 @@ +import { defineConfig, devices } from '@playwright/test' + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './tests', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + // baseURL: 'http://127.0.0.1:3000', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + testIdAttribute: 'data-test-id', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, + }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ..devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: 'npm run dev', + url: 'http://localhost:5173', + reuseExistingServer: !process.env.CI, + }, +}) diff --git a/examples/p-tls/projects/p-tls-frontend/postcss.config.cjs b/examples/p-tls/projects/p-tls-frontend/postcss.config.cjs new file mode 100644 index 0000000..33ad091 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/postcss.config.cjs @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/examples/p-tls/projects/p-tls-frontend/public/index.html b/examples/p-tls/projects/p-tls-frontend/public/index.html new file mode 100644 index 0000000..0d3a3a5 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/public/index.html @@ -0,0 +1,37 @@ + + + + + + + + + + React App + + + +
+ + + diff --git a/examples/p-tls/projects/p-tls-frontend/public/robots.txt b/examples/p-tls/projects/p-tls-frontend/public/robots.txt new file mode 100644 index 0000000..e9e57dc --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/examples/p-tls/projects/p-tls-frontend/src/App.tsx b/examples/p-tls/projects/p-tls-frontend/src/App.tsx new file mode 100644 index 0000000..f346006 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/src/App.tsx @@ -0,0 +1,56 @@ +import { SupportedWallet, WalletId, WalletManager, WalletProvider } from '@txnlab/use-wallet-react' +import { SnackbarProvider } from 'notistack' +import Home from './Home' +import { getAlgodConfigFromViteEnvironment, getKmdConfigFromViteEnvironment } from './utils/network/getAlgoClientConfigs' + +let supportedWallets: SupportedWallet[] +if (import.meta.env.VITE_ALGOD_NETWORK === 'localnet') { + const kmdConfig = getKmdConfigFromViteEnvironment() + supportedWallets = [ + { + id: WalletId.KMD, + options: { + baseServer: kmdConfig.server, + token: String(kmdConfig.token), + port: String(kmdConfig.port), + }, + }, + ] +} else { + supportedWallets = [ + { id: WalletId.DEFLY }, + { id: WalletId.PERA }, + { id: WalletId.EXODUS }, + // If you are interested in WalletConnect v2 provider + // refer to https://github.com/TxnLab/use-wallet for detailed integration instructions + ] +} + +export default function App() { + const algodConfig = getAlgodConfigFromViteEnvironment() + + const walletManager = new WalletManager({ + wallets: supportedWallets, + defaultNetwork: algodConfig.network, + networks: { + [algodConfig.network]: { + algod: { + baseServer: algodConfig.server, + port: algodConfig.port, + token: String(algodConfig.token), + }, + }, + }, + options: { + resetNetwork: true, + }, + }) + + return ( + + + + + + ) +} diff --git a/examples/p-tls/inject_content/Home.tsx b/examples/p-tls/projects/p-tls-frontend/src/Home.tsx similarity index 100% rename from examples/p-tls/inject_content/Home.tsx rename to examples/p-tls/projects/p-tls-frontend/src/Home.tsx diff --git a/examples/p-tls/projects/p-tls-frontend/src/assets/logo.svg b/examples/p-tls/projects/p-tls-frontend/src/assets/logo.svg new file mode 100644 index 0000000..7169476 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/src/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/examples/p-tls/projects/p-tls-frontend/src/components/Account.tsx b/examples/p-tls/projects/p-tls-frontend/src/components/Account.tsx new file mode 100644 index 0000000..081ce47 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/src/components/Account.tsx @@ -0,0 +1,24 @@ +import { useWallet } from '@txnlab/use-wallet-react' +import { useMemo } from 'react' +import { ellipseAddress } from '../utils/ellipseAddress' +import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' + +const Account = () => { + const { activeAddress } = useWallet() + const algoConfig = getAlgodConfigFromViteEnvironment() + + const networkName = useMemo(() => { + return algoConfig.network === '' ? 'localnet' : algoConfig.network.toLocaleLowerCase() + }, [algoConfig.network]) + + return ( +
+ ) +} + +export default Account diff --git a/examples/p-tls/inject_content/AppCalls.tsx b/examples/p-tls/projects/p-tls-frontend/src/components/AppCalls.tsx similarity index 100% rename from examples/p-tls/inject_content/AppCalls.tsx rename to examples/p-tls/projects/p-tls-frontend/src/components/AppCalls.tsx diff --git a/examples/p-tls/projects/p-tls-frontend/src/components/ConnectWallet.tsx b/examples/p-tls/projects/p-tls-frontend/src/components/ConnectWallet.tsx new file mode 100644 index 0000000..8ff01dc --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/src/components/ConnectWallet.tsx @@ -0,0 +1,86 @@ +import { useWallet, Wallet, WalletId } from '@txnlab/use-wallet-react' +import Account from './Account' + +interface ConnectWalletInterface { + openModal: boolean + closeModal: () => void +} + +const ConnectWallet = ({ openModal, closeModal }: ConnectWalletInterface) => { + const { wallets, activeAddress } = useWallet() + + const isKmd = (wallet: Wallet) => wallet.id === WalletId.KMD + + return ( + +
+

Select wallet provider

+ +
+ {activeAddress && ( + <> + +
+ + )} + + {!activeAddress && + wallets?.map((wallet) => ( + + ))} +
+ +
+ + {activeAddress && ( + + )} +
+ +
+ ) +} +export default ConnectWallet diff --git a/examples/p-tls/projects/p-tls-frontend/src/components/ErrorBoundary.tsx b/examples/p-tls/projects/p-tls-frontend/src/components/ErrorBoundary.tsx new file mode 100644 index 0000000..435bf61 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/src/components/ErrorBoundary.tsx @@ -0,0 +1,46 @@ +import React, { ReactNode } from 'react' + +interface ErrorBoundaryProps { + children: ReactNode +} + +interface ErrorBoundaryState { + hasError: boolean + error: Error | null +} + +class ErrorBoundary extends React.Component { + constructor(props: ErrorBoundaryProps) { + super(props) + this.state = { hasError: false, error: null } + } + + static getDerivedStateFromError(error: Error): ErrorBoundaryState { + // Update state so the next render will show the fallback UI. + return { hasError: true, error: error } + } + + render(): ReactNode { + if (this.state.hasError) { + // You can render any custom fallback UI + return ( +
+
+
+

Error occured

+

+ {this.state.error?.message.includes('Attempt to get default algod configuration') + ? 'Please make sure to set up your environment variables correctly. Create a .env file based on .env.template and fill in the required values. This controls the network and credentials for connections with Algod and Indexer.' + : this.state.error?.message} +

+
+
+
+ ) + } + + return this.props.children + } +} + +export default ErrorBoundary diff --git a/examples/p-tls/projects/p-tls-frontend/src/components/Transact.tsx b/examples/p-tls/projects/p-tls-frontend/src/components/Transact.tsx new file mode 100644 index 0000000..2ba3e96 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/src/components/Transact.tsx @@ -0,0 +1,80 @@ +import { algo, AlgorandClient } from '@algorandfoundation/algokit-utils' +import { useWallet } from '@txnlab/use-wallet-react' +import { useSnackbar } from 'notistack' +import { useState } from 'react' +import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' + +interface TransactInterface { + openModal: boolean + setModalState: (value: boolean) => void +} + +const Transact = ({ openModal, setModalState }: TransactInterface) => { + const [loading, setLoading] = useState(false) + const [receiverAddress, setReceiverAddress] = useState('') + + const algodConfig = getAlgodConfigFromViteEnvironment() + const algorand = AlgorandClient.fromConfig({ algodConfig }) + + const { enqueueSnackbar } = useSnackbar() + + const { transactionSigner, activeAddress } = useWallet() + + const handleSubmitAlgo = async () => { + setLoading(true) + + if (!transactionSigner || !activeAddress) { + enqueueSnackbar('Please connect wallet first', { variant: 'warning' }) + return + } + + try { + enqueueSnackbar('Sending transaction...', { variant: 'info' }) + const result = await algorand.send.payment({ + signer: transactionSigner, + sender: activeAddress, + receiver: receiverAddress, + amount: algo(1), + }) + enqueueSnackbar(`Transaction sent: ${result.txIds[0]}`, { variant: 'success' }) + setReceiverAddress('') + } catch (e) { + enqueueSnackbar('Failed to send transaction', { variant: 'error' }) + } + + setLoading(false) + } + + return ( + +
+

Send payment transaction

+
+ { + setReceiverAddress(e.target.value) + }} + /> +
+ + +
+
+
+ ) +} + +export default Transact diff --git a/examples/p-tls/projects/p-tls-frontend/src/contracts/Calculator.ts b/examples/p-tls/projects/p-tls-frontend/src/contracts/Calculator.ts new file mode 100644 index 0000000..01af943 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/src/contracts/Calculator.ts @@ -0,0 +1,742 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^7 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app' +import { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56' +import { + AppClient as _AppClient, + AppClientMethodCallParams, + AppClientParams, + AppClientBareCallParams, + CallOnComplete, + AppClientCompilationParams, + ResolveAppClientByCreatorAndName, + ResolveAppClientByNetwork, + CloneAppClientParams, +} from '@algorandfoundation/algokit-utils/types/app-client' +import { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer' +import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' +import SimulateResponse = modelsv2.SimulateResponse + +export const APP_SPEC: Arc56Contract = {"name":"Calculator","desc":"","methods":[{"name":"doMath","desc":"A method that takes two numbers and does either addition or subtraction","args":[{"name":"a","type":"uint64","desc":"The first uint64"},{"name":"b","type":"uint64","desc":"The second uint64"},{"name":"operation","type":"string","desc":"The operation to perform. Can be either 'sum' or 'difference'"}],"returns":{"type":"uint64","desc":"The result of the operation"},"actions":{"create":[],"call":["NoOp"]}},{"name":"hello","desc":"A demonstration method used in the AlgoKit fullstack template.\nGreets the user by name.","args":[{"name":"name","type":"string","desc":"The name of the user to greet."}],"returns":{"type":"string","desc":"A greeting message to the user."},"actions":{"create":[],"call":["NoOp"]}},{"name":"createApplication","args":[],"returns":{"type":"void"},"actions":{"create":["NoOp"],"call":[]}}],"arcs":[4,56],"structs":{},"state":{"schema":{"global":{"bytes":0,"ints":0},"local":{"bytes":0,"ints":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":[],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"teal":1,"source":"contracts/Calculator.algo.ts:3","pc":[0]},{"teal":2,"source":"contracts/Calculator.algo.ts:3","pc":[1,2,3]},{"teal":3,"source":"contracts/Calculator.algo.ts:3","pc":[4,5,6,7,8,9,10]},{"teal":15,"source":"contracts/Calculator.algo.ts:3","pc":[11,12]},{"teal":16,"source":"contracts/Calculator.algo.ts:3","pc":[13]},{"teal":17,"source":"contracts/Calculator.algo.ts:3","pc":[14,15]},{"teal":18,"source":"contracts/Calculator.algo.ts:3","pc":[16]},{"teal":19,"source":"contracts/Calculator.algo.ts:3","pc":[17,18]},{"teal":20,"source":"contracts/Calculator.algo.ts:3","pc":[19]},{"teal":21,"source":"contracts/Calculator.algo.ts:3","pc":[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]},{"teal":25,"source":"contracts/Calculator.algo.ts:3","errorMessage":"The requested action is not implemented in this contract. Are you using the correct OnComplete? Did you set your app ID?","pc":[46]},{"teal":35,"source":"contracts/Calculator.algo.ts:11","pc":[47,48,49]},{"teal":39,"source":"contracts/Calculator.algo.ts:12","pc":[50,51]},{"teal":40,"source":"contracts/Calculator.algo.ts:12","pc":[52,53]},{"teal":41,"source":"contracts/Calculator.algo.ts:12","pc":[54]},{"teal":42,"source":"contracts/Calculator.algo.ts:11","pc":[55]},{"teal":52,"source":"contracts/Calculator.algo.ts:22","pc":[56,57,58]},{"teal":56,"source":"contracts/Calculator.algo.ts:23","pc":[59,60]},{"teal":57,"source":"contracts/Calculator.algo.ts:23","pc":[61,62]},{"teal":58,"source":"contracts/Calculator.algo.ts:23","pc":[63]},{"teal":59,"source":"contracts/Calculator.algo.ts:23","pc":[64,65,66]},{"teal":60,"source":"contracts/Calculator.algo.ts:23","pc":[67,68]},{"teal":61,"source":"contracts/Calculator.algo.ts:23","pc":[69,70]},{"teal":62,"source":"contracts/Calculator.algo.ts:23","pc":[71]},{"teal":63,"source":"contracts/Calculator.algo.ts:23","pc":[72,73,74]},{"teal":66,"source":"contracts/Calculator.algo.ts:23","pc":[75,76]},{"teal":67,"source":"contracts/Calculator.algo.ts:23","pc":[77,78]},{"teal":68,"source":"contracts/Calculator.algo.ts:23","pc":[79]},{"teal":71,"source":"contracts/Calculator.algo.ts:22","pc":[80]},{"teal":76,"source":"contracts/Calculator.algo.ts:35","pc":[81]},{"teal":79,"source":"contracts/Calculator.algo.ts:35","pc":[82,83,84]},{"teal":80,"source":"contracts/Calculator.algo.ts:35","pc":[85,86,87]},{"teal":83,"source":"contracts/Calculator.algo.ts:35","pc":[88,89,90]},{"teal":84,"source":"contracts/Calculator.algo.ts:35","pc":[91]},{"teal":87,"source":"contracts/Calculator.algo.ts:35","pc":[92,93,94]},{"teal":88,"source":"contracts/Calculator.algo.ts:35","pc":[95]},{"teal":91,"source":"contracts/Calculator.algo.ts:35","pc":[96,97,98]},{"teal":92,"source":"contracts/Calculator.algo.ts:35","pc":[99]},{"teal":93,"source":"contracts/Calculator.algo.ts:35","pc":[100]},{"teal":94,"source":"contracts/Calculator.algo.ts:35","pc":[101]},{"teal":95,"source":"contracts/Calculator.algo.ts:35","pc":[102]},{"teal":96,"source":"contracts/Calculator.algo.ts:35","pc":[103]},{"teal":108,"source":"contracts/Calculator.algo.ts:35","pc":[104,105,106]},{"teal":111,"source":"contracts/Calculator.algo.ts:35","pc":[107,108]},{"teal":116,"source":"contracts/Calculator.algo.ts:38","pc":[109,110]},{"teal":117,"source":"contracts/Calculator.algo.ts:38","pc":[111,112,113,114,115]},{"teal":118,"source":"contracts/Calculator.algo.ts:38","pc":[116]},{"teal":119,"source":"contracts/Calculator.algo.ts:38","pc":[117,118,119]},{"teal":124,"source":"contracts/Calculator.algo.ts:39","pc":[120,121]},{"teal":125,"source":"contracts/Calculator.algo.ts:39","pc":[122,123]},{"teal":126,"source":"contracts/Calculator.algo.ts:39","pc":[124,125,126]},{"teal":127,"source":"contracts/Calculator.algo.ts:39","pc":[127,128]},{"teal":128,"source":"contracts/Calculator.algo.ts:38","pc":[129,130,131]},{"teal":133,"source":"contracts/Calculator.algo.ts:40","pc":[132,133]},{"teal":134,"source":"contracts/Calculator.algo.ts:40","pc":[134,135,136,137,138,139,140,141,142,143,144,145]},{"teal":135,"source":"contracts/Calculator.algo.ts:40","pc":[146]},{"teal":136,"source":"contracts/Calculator.algo.ts:40","pc":[147,148,149]},{"teal":141,"source":"contracts/Calculator.algo.ts:41","pc":[150,151]},{"teal":142,"source":"contracts/Calculator.algo.ts:41","pc":[152,153]},{"teal":143,"source":"contracts/Calculator.algo.ts:41","pc":[154,155,156]},{"teal":144,"source":"contracts/Calculator.algo.ts:41","pc":[157,158]},{"teal":145,"source":"contracts/Calculator.algo.ts:40","pc":[159,160,161]},{"teal":149,"source":"contracts/Calculator.algo.ts:42","errorMessage":"Invalid operation","pc":[162]},{"teal":154,"source":"contracts/Calculator.algo.ts:44","pc":[163,164]},{"teal":157,"source":"contracts/Calculator.algo.ts:35","pc":[165,166]},{"teal":158,"source":"contracts/Calculator.algo.ts:35","pc":[167]},{"teal":163,"source":"contracts/Calculator.algo.ts:54","pc":[168]},{"teal":166,"source":"contracts/Calculator.algo.ts:54","pc":[169,170,171]},{"teal":167,"source":"contracts/Calculator.algo.ts:54","pc":[172,173,174]},{"teal":170,"source":"contracts/Calculator.algo.ts:54","pc":[175,176,177]},{"teal":171,"source":"contracts/Calculator.algo.ts:54","pc":[178]},{"teal":172,"source":"contracts/Calculator.algo.ts:54","pc":[179]},{"teal":173,"source":"contracts/Calculator.algo.ts:54","pc":[180]},{"teal":174,"source":"contracts/Calculator.algo.ts:54","pc":[181,182,183]},{"teal":175,"source":"contracts/Calculator.algo.ts:54","pc":[184]},{"teal":176,"source":"contracts/Calculator.algo.ts:54","pc":[185]},{"teal":177,"source":"contracts/Calculator.algo.ts:54","pc":[186]},{"teal":178,"source":"contracts/Calculator.algo.ts:54","pc":[187]},{"teal":179,"source":"contracts/Calculator.algo.ts:54","pc":[188]},{"teal":180,"source":"contracts/Calculator.algo.ts:54","pc":[189]},{"teal":190,"source":"contracts/Calculator.algo.ts:54","pc":[190,191,192]},{"teal":194,"source":"contracts/Calculator.algo.ts:55","pc":[193,194,195,196,197,198,199,200,201]},{"teal":195,"source":"contracts/Calculator.algo.ts:55","pc":[202,203]},{"teal":196,"source":"contracts/Calculator.algo.ts:55","pc":[204]},{"teal":197,"source":"contracts/Calculator.algo.ts:54","pc":[205]},{"teal":200,"source":"contracts/Calculator.algo.ts:3","pc":[206]},{"teal":201,"source":"contracts/Calculator.algo.ts:3","pc":[207]},{"teal":204,"source":"contracts/Calculator.algo.ts:3","pc":[208,209,210,211,212,213]},{"teal":205,"source":"contracts/Calculator.algo.ts:3","pc":[214,215,216]},{"teal":206,"source":"contracts/Calculator.algo.ts:3","pc":[217,218,219,220]},{"teal":209,"source":"contracts/Calculator.algo.ts:3","errorMessage":"this contract does not implement the given ABI method for create NoOp","pc":[221]},{"teal":212,"source":"contracts/Calculator.algo.ts:3","pc":[222,223,224,225,226,227]},{"teal":213,"source":"contracts/Calculator.algo.ts:3","pc":[228,229,230,231,232,233]},{"teal":214,"source":"contracts/Calculator.algo.ts:3","pc":[234,235,236]},{"teal":215,"source":"contracts/Calculator.algo.ts:3","pc":[237,238,239,240,241,242]},{"teal":218,"source":"contracts/Calculator.algo.ts:3","errorMessage":"this contract does not implement the given ABI method for call NoOp","pc":[243]}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCmludGNibG9jayAxCmJ5dGVjYmxvY2sgMHgxNTFmN2M3NQoKLy8gVGhpcyBURUFMIHdhcyBnZW5lcmF0ZWQgYnkgVEVBTFNjcmlwdCB2MC4xMDcuMgovLyBodHRwczovL2dpdGh1Yi5jb20vYWxnb3JhbmRmb3VuZGF0aW9uL1RFQUxTY3JpcHQKCi8vIFRoaXMgY29udHJhY3QgaXMgY29tcGxpYW50IHdpdGggYW5kL29yIGltcGxlbWVudHMgdGhlIGZvbGxvd2luZyBBUkNzOiBbIEFSQzQgXQoKLy8gVGhlIGZvbGxvd2luZyB0ZW4gbGluZXMgb2YgVEVBTCBoYW5kbGUgaW5pdGlhbCBwcm9ncmFtIGZsb3cKLy8gVGhpcyBwYXR0ZXJuIGlzIHVzZWQgdG8gbWFrZSBpdCBlYXN5IGZvciBhbnlvbmUgdG8gcGFyc2UgdGhlIHN0YXJ0IG9mIHRoZSBwcm9ncmFtIGFuZCBkZXRlcm1pbmUgaWYgYSBzcGVjaWZpYyBhY3Rpb24gaXMgYWxsb3dlZAovLyBIZXJlLCBhY3Rpb24gcmVmZXJzIHRvIHRoZSBPbkNvbXBsZXRlIGluIGNvbWJpbmF0aW9uIHdpdGggd2hldGhlciB0aGUgYXBwIGlzIGJlaW5nIGNyZWF0ZWQgb3IgY2FsbGVkCi8vIEV2ZXJ5IHBvc3NpYmxlIGFjdGlvbiBmb3IgdGhpcyBjb250cmFjdCBpcyByZXByZXNlbnRlZCBpbiB0aGUgc3dpdGNoIHN0YXRlbWVudAovLyBJZiB0aGUgYWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgY29udHJhY3QsIGl0cyByZXNwZWN0aXZlIGJyYW5jaCB3aWxsIGJlICIqTk9UX0lNUExFTUVOVEVEIiB3aGljaCBqdXN0IGNvbnRhaW5zICJlcnIiCnR4biBBcHBsaWNhdGlvbklECiEKcHVzaGludCA2CioKdHhuIE9uQ29tcGxldGlvbgorCnN3aXRjaCAqY2FsbF9Ob09wICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqY3JlYXRlX05vT3AgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVECgoqTk9UX0lNUExFTUVOVEVEOgoJLy8gVGhlIHJlcXVlc3RlZCBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoaXMgY29udHJhY3QuIEFyZSB5b3UgdXNpbmcgdGhlIGNvcnJlY3QgT25Db21wbGV0ZT8gRGlkIHlvdSBzZXQgeW91ciBhcHAgSUQ/CgllcnIKCi8vIGdldFN1bShhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NAovLwovLyBDYWxjdWxhdGVzIHRoZSBzdW0gb2YgdHdvIG51bWJlcnMKLy8KLy8gQHBhcmFtIGEKLy8gQHBhcmFtIGIKLy8gQHJldHVybnMgVGhlIHN1bSBvZiBhIGFuZCBiCmdldFN1bToKCXByb3RvIDIgMQoKCS8vIGNvbnRyYWN0cy9DYWxjdWxhdG9yLmFsZ28udHM6MTIKCS8vIHJldHVybiBhICsgYjsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCSsKCXJldHN1YgoKLy8gZ2V0RGlmZmVyZW5jZShhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NAovLwovLyBDYWxjdWxhdGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIG51bWJlcnMKLy8KLy8gQHBhcmFtIGEKLy8gQHBhcmFtIGIKLy8gQHJldHVybnMgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGFuZCBiLgpnZXREaWZmZXJlbmNlOgoJcHJvdG8gMiAxCgoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czoyMwoJLy8gcmV0dXJuIGEgPj0gYiA/IGEgLSBiIDogYiAtIGE7CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0Cgk+PQoJYnogKnRlcm5hcnkwX2ZhbHNlCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0CgktCgliICp0ZXJuYXJ5MF9lbmQKCip0ZXJuYXJ5MF9mYWxzZToKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCS0KCip0ZXJuYXJ5MF9lbmQ6CglyZXRzdWIKCi8vIGRvTWF0aCh1aW50NjQsdWludDY0LHN0cmluZyl1aW50NjQKKmFiaV9yb3V0ZV9kb01hdGg6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGVjIDAgLy8gMHgxNTFmN2M3NQoKCS8vIG9wZXJhdGlvbjogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglleHRyYWN0IDIgMAoKCS8vIGI6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJYnRvaQoKCS8vIGE6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZG9NYXRoKHVpbnQ2NCx1aW50NjQsc3RyaW5nKXVpbnQ2NAoJY2FsbHN1YiBkb01hdGgKCWl0b2IKCWNvbmNhdAoJbG9nCglpbnRjIDAgLy8gMQoJcmV0dXJuCgovLyBkb01hdGgoYTogdWludDY0LCBiOiB1aW50NjQsIG9wZXJhdGlvbjogc3RyaW5nKTogdWludDY0Ci8vCi8vIEEgbWV0aG9kIHRoYXQgdGFrZXMgdHdvIG51bWJlcnMgYW5kIGRvZXMgZWl0aGVyIGFkZGl0aW9uIG9yIHN1YnRyYWN0aW9uCi8vCi8vIEBwYXJhbSBhIFRoZSBmaXJzdCB1aW50NjQKLy8gQHBhcmFtIGIgVGhlIHNlY29uZCB1aW50NjQKLy8gQHBhcmFtIG9wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0uIENhbiBiZSBlaXRoZXIgJ3N1bScgb3IgJ2RpZmZlcmVuY2UnCi8vCi8vIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbgpkb01hdGg6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJcHVzaGJ5dGVzIDB4CgoJLy8gKmlmMF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy9DYWxjdWxhdG9yLmFsZ28udHM6MzgKCS8vIG9wZXJhdGlvbiA9PT0gJ3N1bScKCWZyYW1lX2RpZyAtMyAvLyBvcGVyYXRpb246IHN0cmluZwoJcHVzaGJ5dGVzIDB4NzM3NTZkIC8vICJzdW0iCgk9PQoJYnogKmlmMF9lbHNlaWYxX2NvbmRpdGlvbgoKCS8vICppZjBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czozOQoJLy8gcmVzdWx0ID0gdGhpcy5nZXRTdW0oYSwgYikKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCWNhbGxzdWIgZ2V0U3VtCglmcmFtZV9idXJ5IDAgLy8gcmVzdWx0OiB1aW50NjQKCWIgKmlmMF9lbmQKCippZjBfZWxzZWlmMV9jb25kaXRpb246CgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjQwCgkvLyBvcGVyYXRpb24gPT09ICdkaWZmZXJlbmNlJwoJZnJhbWVfZGlnIC0zIC8vIG9wZXJhdGlvbjogc3RyaW5nCglwdXNoYnl0ZXMgMHg2NDY5NjY2NjY1NzI2NTZlNjM2NSAvLyAiZGlmZmVyZW5jZSIKCT09CglieiAqaWYwX2Vsc2UKCgkvLyAqaWYwX2Vsc2VpZjFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czo0MQoJLy8gcmVzdWx0ID0gdGhpcy5nZXREaWZmZXJlbmNlKGEsIGIpCglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CgljYWxsc3ViIGdldERpZmZlcmVuY2UKCWZyYW1lX2J1cnkgMCAvLyByZXN1bHQ6IHVpbnQ2NAoJYiAqaWYwX2VuZAoKKmlmMF9lbHNlOgoJLy8gSW52YWxpZCBvcGVyYXRpb24KCWVycgoKKmlmMF9lbmQ6CgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjQ0CgkvLyByZXR1cm4gcmVzdWx0OwoJZnJhbWVfZGlnIDAgLy8gcmVzdWx0OiB1aW50NjQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gaGVsbG8oc3RyaW5nKXN0cmluZwoqYWJpX3JvdXRlX2hlbGxvOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlYyAwIC8vIDB4MTUxZjdjNzUKCgkvLyBuYW1lOiBzdHJpbmcKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgoJLy8gZXhlY3V0ZSBoZWxsbyhzdHJpbmcpc3RyaW5nCgljYWxsc3ViIGhlbGxvCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWludGMgMCAvLyAxCglyZXR1cm4KCi8vIGhlbGxvKG5hbWU6IHN0cmluZyk6IHN0cmluZwovLwovLyBBIGRlbW9uc3RyYXRpb24gbWV0aG9kIHVzZWQgaW4gdGhlIEFsZ29LaXQgZnVsbHN0YWNrIHRlbXBsYXRlLgovLyBHcmVldHMgdGhlIHVzZXIgYnkgbmFtZS4KLy8KLy8gQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHVzZXIgdG8gZ3JlZXQuCi8vIEByZXR1cm5zIEEgZ3JlZXRpbmcgbWVzc2FnZSB0byB0aGUgdXNlci4KaGVsbG86Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjU1CgkvLyByZXR1cm4gJ0hlbGxvLCAnICsgbmFtZTsKCXB1c2hieXRlcyAweDQ4NjU2YzZjNmYyYzIwIC8vICJIZWxsbywgIgoJZnJhbWVfZGlnIC0xIC8vIG5hbWU6IHN0cmluZwoJY29uY2F0CglyZXRzdWIKCiphYmlfcm91dGVfY3JlYXRlQXBwbGljYXRpb246CglpbnRjIDAgLy8gMQoJcmV0dXJuCgoqY3JlYXRlX05vT3A6CglwdXNoYnl0ZXMgMHhiODQ0N2IzNiAvLyBtZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKCl2b2lkIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9jcmVhdGVBcHBsaWNhdGlvbgoKCS8vIHRoaXMgY29udHJhY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBnaXZlbiBBQkkgbWV0aG9kIGZvciBjcmVhdGUgTm9PcAoJZXJyCgoqY2FsbF9Ob09wOgoJcHVzaGJ5dGVzIDB4NzZhN2VmMzMgLy8gbWV0aG9kICJkb01hdGgodWludDY0LHVpbnQ2NCxzdHJpbmcpdWludDY0IgoJcHVzaGJ5dGVzIDB4MDJiZWNlMTEgLy8gbWV0aG9kICJoZWxsbyhzdHJpbmcpc3RyaW5nIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9kb01hdGggKmFiaV9yb3V0ZV9oZWxsbwoKCS8vIHRoaXMgY29udHJhY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBnaXZlbiBBQkkgbWV0aG9kIGZvciBjYWxsIE5vT3AKCWVycg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEw"},"byteCode":{"approval":"CiABASYBBBUffHUxGBSBBgsxGQiNDACwAAAAAAAAAAAAAACiAAAAAAAAAAAAAACKAgGL/4v+CImKAgGL/4v+D0EACIv/i/4JQgAFi/6L/wmJKDYaA1cCADYaAhc2GgEXiAAFFlCwIkOKAwGAAIv9gANzdW0SQQAMi/6L/4j/sIwAQgAfi/2ACmRpZmZlcmVuY2USQQAMi/6L/4j/m4wAQgABAIsAjACJKDYaAVcCAIgADEkVFlcGAkxQULAiQ4oBAYAHSGVsbG8sIIv/UIkiQ4AEuER7NjYaAI4B//EAgAR2p+8zgAQCvs4RNhoAjgL/Xv+1AA==","clear":"Cg=="},"compilerInfo":{"compiler":"algod","compilerVersion":{"major":4,"minor":4,"patch":1,"commitHash":"7b607ce4"}}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the Calculator contract + */ +export type CalculatorArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'doMath(uint64,uint64,string)uint64': { + /** + * The first uint64 + */ + a: bigint | number + /** + * The second uint64 + */ + b: bigint | number + /** + * The operation to perform. Can be either 'sum' or 'difference' + */ + operation: string + } + 'hello(string)string': { + /** + * The name of the user to greet. + */ + name: string + } + 'createApplication()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'doMath(uint64,uint64,string)uint64': [a: bigint | number, b: bigint | number, operation: string] + 'hello(string)string': [name: string] + 'createApplication()void': [] + } +} + +/** + * The return type for each method + */ +export type CalculatorReturns = { + 'doMath(uint64,uint64,string)uint64': bigint + 'hello(string)string': string + 'createApplication()void': void +} + +/** + * Defines the types of available calls and state of the Calculator smart contract. + */ +export type CalculatorTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'doMath(uint64,uint64,string)uint64' | 'doMath', { + argsObj: CalculatorArgs['obj']['doMath(uint64,uint64,string)uint64'] + argsTuple: CalculatorArgs['tuple']['doMath(uint64,uint64,string)uint64'] + /** + * The result of the operation + */ + returns: CalculatorReturns['doMath(uint64,uint64,string)uint64'] + }> + & Record<'hello(string)string' | 'hello', { + argsObj: CalculatorArgs['obj']['hello(string)string'] + argsTuple: CalculatorArgs['tuple']['hello(string)string'] + /** + * A greeting message to the user. + */ + returns: CalculatorReturns['hello(string)string'] + }> + & Record<'createApplication()void' | 'createApplication', { + argsObj: CalculatorArgs['obj']['createApplication()void'] + argsTuple: CalculatorArgs['tuple']['createApplication()void'] + returns: CalculatorReturns['createApplication()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type CalculatorSignatures = keyof CalculatorTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type CalculatorNonVoidMethodSignatures = keyof CalculatorTypes['methods'] extends infer T ? T extends keyof CalculatorTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the Calculator smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = CalculatorTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the Calculator smart contract to the method's return type + */ +export type MethodReturn = CalculatorTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type CalculatorCreateCallParams = + | Expand & {method: 'createApplication'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema> + | Expand & {method: 'createApplication()void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema> +/** + * Defines arguments required for the deploy method. + */ +export type CalculatorDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: CalculatorCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the Calculator smart contract + */ +export abstract class CalculatorParamsFactory { + /** + * Gets available create ABI call param factories + */ + static get create() { + return { + _resolveByMethod(params: TParams) { + switch(params.method) { + case 'createApplication': + case 'createApplication()void': + return CalculatorParamsFactory.create.createApplication(params) + } + throw new Error(`Unknown ' + verb + ' method`) + }, + + /** + * Constructs create ABI call params for the Calculator smart contract using the createApplication()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + createApplication(params: CallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} { + return { + ...params, + method: 'createApplication()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + + /** + * Constructs a no op call for the doMath(uint64,uint64,string)uint64 ABI method + * + * A method that takes two numbers and does either addition or subtraction + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static doMath(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'doMath(uint64,uint64,string)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.operation], + } + } + /** + * Constructs a no op call for the hello(string)string ABI method + * + * A demonstration method used in the AlgoKit fullstack template. + Greets the user by name. + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static hello(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'hello(string)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.name], + } + } +} + +/** + * A factory to create and deploy one or more instance of the Calculator smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class CalculatorFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `CalculatorFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new CalculatorClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new CalculatorClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the Calculator smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: CalculatorDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + createParams: params.createParams?.method ? CalculatorParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (CalculatorCreateCallParams & { args: Uint8Array[] }) : undefined, + }) + return { result: result.result, appClient: new CalculatorClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Calculator smart contract using the createApplication()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create params + */ + createApplication: (params: CallParams & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { + return this.appFactory.params.create(CalculatorParamsFactory.create.createApplication(params)) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Calculator smart contract using the createApplication()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create transaction + */ + createApplication: (params: CallParams & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { + return this.appFactory.createTransaction.create(CalculatorParamsFactory.create.createApplication(params)) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Calculator smart contract using an ABI method call using the createApplication()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create result + */ + createApplication: async (params: CallParams & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { + const result = await this.appFactory.send.create(CalculatorParamsFactory.create.createApplication(params)) + return { result: { ...result.result, return: result.result.return as unknown as (undefined | CalculatorReturns['createApplication()void']) }, appClient: new CalculatorClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the Calculator smart contract + */ +export class CalculatorClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `CalculatorClient` + * + * @param appClient An `AppClient` instance which has been created with the Calculator app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `CalculatorClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Checks for decode errors on the given return value and maps the return value to the return type for the given method + * @returns The typed return value or undefined if there was no value + */ + decodeReturnValue(method: TSignature, returnValue: ABIReturn | undefined) { + return returnValue !== undefined ? getArc56ReturnValue>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined + } + + /** + * Returns a new `CalculatorClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new CalculatorClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `CalculatorClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new CalculatorClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the Calculator smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. + * + * A method that takes two numbers and does either addition or subtraction + * + * @param params The params for the smart contract call + * @returns The call params: The result of the operation + */ + doMath: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(CalculatorParamsFactory.doMath(params)) + }, + + /** + * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. + * + * A demonstration method used in the AlgoKit fullstack template. + Greets the user by name. + + * + * @param params The params for the smart contract call + * @returns The call params: A greeting message to the user. + */ + hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(CalculatorParamsFactory.hello(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the Calculator smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. + * + * A method that takes two numbers and does either addition or subtraction + * + * @param params The params for the smart contract call + * @returns The call transaction: The result of the operation + */ + doMath: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(CalculatorParamsFactory.doMath(params)) + }, + + /** + * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. + * + * A demonstration method used in the AlgoKit fullstack template. + Greets the user by name. + + * + * @param params The params for the smart contract call + * @returns The call transaction: A greeting message to the user. + */ + hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(CalculatorParamsFactory.hello(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the Calculator smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. + * + * A method that takes two numbers and does either addition or subtraction + * + * @param params The params for the smart contract call + * @returns The call result: The result of the operation + */ + doMath: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(CalculatorParamsFactory.doMath(params)) + return {...result, return: result.return as unknown as (undefined | CalculatorReturns['doMath(uint64,uint64,string)uint64'])} + }, + + /** + * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. + * + * A demonstration method used in the AlgoKit fullstack template. + Greets the user by name. + + * + * @param params The params for the smart contract call + * @returns The call result: A greeting message to the user. + */ + hello: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(CalculatorParamsFactory.hello(params)) + return {...result, return: result.return as unknown as (undefined | CalculatorReturns['hello(string)string'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new CalculatorClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current Calculator app + */ + state = { + } + + public newGroup(): CalculatorComposer { + const client = this + const composer = this.algorand.newGroup() + let promiseChain:Promise = Promise.resolve() + const resultMappers: Array any)> = [] + return { + /** + * Add a doMath(uint64,uint64,string)uint64 method call against the Calculator contract + */ + doMath(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.doMath(params))) + resultMappers.push((v) => client.decodeReturnValue('doMath(uint64,uint64,string)uint64', v)) + return this + }, + /** + * Add a hello(string)string method call against the Calculator contract + */ + hello(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hello(params))) + resultMappers.push((v) => client.decodeReturnValue('hello(string)string', v)) + return this + }, + /** + * Add a clear state call to the Calculator contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + } + } + } as unknown as CalculatorComposer + } +} +export type CalculatorComposer = { + /** + * Calls the doMath(uint64,uint64,string)uint64 ABI method. + * + * A method that takes two numbers and does either addition or subtraction + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + doMath(params?: CallParams): CalculatorComposer<[...TReturns, CalculatorReturns['doMath(uint64,uint64,string)uint64'] | undefined]> + + /** + * Calls the hello(string)string ABI method. + * + * A demonstration method used in the AlgoKit fullstack template. + Greets the user by name. + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + hello(params?: CallParams): CalculatorComposer<[...TReturns, CalculatorReturns['hello(string)string'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the Calculator smart contract. + * + * @param args The arguments for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): CalculatorComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): CalculatorComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type CalculatorComposerResults = Expand + diff --git a/examples/p-tls/projects/p-tls-frontend/src/contracts/README.md b/examples/p-tls/projects/p-tls-frontend/src/contracts/README.md new file mode 100644 index 0000000..04629b1 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/src/contracts/README.md @@ -0,0 +1,14 @@ +## How to connect my web app with Algorand smart contracts? + +The following folder is reserved for the Algorand Application Clients. The clients are used to interact with instances of Algorand Smart Contracts (ASC1s) deployed on-chain. + +To integrate this react frontend template with your smart contracts codebase, perform the following steps: + +1. Generate the typed client using `algokit generate client -l typescript -o {path/to/this/folder}` or using the dedicated `link` command `algokit project link` (ensure to invoke it from the root of this react project). Using the `link` command is especially useful within workspaces that have multiple contract projects. +2. The generated typescript client should be ready to be imported and used in this react frontend template, making it a full fledged dApp. + +> Please note, by default this template defines `"generate:app-clients": "algokit project link --all"` which is a shortcut to automatically link TEAL code from all `contract` projects in the workspace as typed clients into the `frontend` project that is invoking the `link` command. Refer to [documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/link.md) to read more about `link` command. + +## **How to interact with the smart contract?** + +The generated client provides a set of functions that can be used to interact with the ABI (Application Binary Interface) compliant Algorand smart contract. For example, if the smart contract has a function called `hello`, the generated client will have a function called `hello` that can be used to interact with the smart contract. Refer to a [full-stack end-to-end starter template](https://github.com/algorandfoundation/algokit-fullstack-template) for a reference example on invoking and interacting with typescript typed clients generated. diff --git a/examples/p-tls/projects/p-tls-frontend/src/interfaces/network.ts b/examples/p-tls/projects/p-tls-frontend/src/interfaces/network.ts new file mode 100644 index 0000000..a458edc --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/src/interfaces/network.ts @@ -0,0 +1,26 @@ +import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/types/network-client' +import type { TokenHeader } from 'algosdk/dist/types/client/urlTokenBaseHTTPClient' + +export interface AlgoViteClientConfig extends AlgoClientConfig { + /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ + server: string + /** The port to use e.g. 4001, 443, etc. */ + port: string | number + /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ + token: string | TokenHeader + /** String representing current Algorand Network type (testnet/mainnet and etc) */ + network: string +} + +export interface AlgoViteKMDConfig extends AlgoClientConfig { + /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ + server: string + /** The port to use e.g. 4001, 443, etc. */ + port: string | number + /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ + token: string | TokenHeader + /** KMD wallet name */ + wallet: string + /** KMD wallet password */ + password: string +} diff --git a/examples/p-tls/projects/p-tls-frontend/src/main.tsx b/examples/p-tls/projects/p-tls-frontend/src/main.tsx new file mode 100644 index 0000000..adf72ec --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/src/main.tsx @@ -0,0 +1,13 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App' +import './styles/main.css' +import ErrorBoundary from './components/ErrorBoundary' + +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + + + + + , +) diff --git a/examples/p-tls/projects/p-tls-frontend/src/styles/main.css b/examples/p-tls/projects/p-tls-frontend/src/styles/main.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/src/styles/main.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/examples/p-tls/projects/p-tls-frontend/src/utils/ellipseAddress.spec.tsx b/examples/p-tls/projects/p-tls-frontend/src/utils/ellipseAddress.spec.tsx new file mode 100644 index 0000000..2cbff10 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/src/utils/ellipseAddress.spec.tsx @@ -0,0 +1,15 @@ +import { ellipseAddress } from './ellipseAddress' + +describe('ellipseAddress', () => { + it('should return ellipsed address with specified width', () => { + const address = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + const result = ellipseAddress(address, 4) + expect(result).toBe('aaaa...aaaa') + }) + + it('should return empty string when address is empty', () => { + const address = '' + const result = ellipseAddress(address) + expect(result).toBe('') + }) +}) diff --git a/examples/p-tls/projects/p-tls-frontend/src/utils/ellipseAddress.ts b/examples/p-tls/projects/p-tls-frontend/src/utils/ellipseAddress.ts new file mode 100644 index 0000000..db97e48 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/src/utils/ellipseAddress.ts @@ -0,0 +1,3 @@ +export function ellipseAddress(address: string | null, width = 6): string { + return address ? `${address.slice(0, width)}...${address.slice(-width)}` : (address ?? '') +} diff --git a/examples/p-tls/projects/p-tls-frontend/src/utils/network/getAlgoClientConfigs.ts b/examples/p-tls/projects/p-tls-frontend/src/utils/network/getAlgoClientConfigs.ts new file mode 100644 index 0000000..b5121f8 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/src/utils/network/getAlgoClientConfigs.ts @@ -0,0 +1,41 @@ +import { AlgoViteClientConfig, AlgoViteKMDConfig } from '../../interfaces/network' + +export function getAlgodConfigFromViteEnvironment(): AlgoViteClientConfig { + if (!import.meta.env.VITE_ALGOD_SERVER) { + throw new Error('Attempt to get default algod configuration without specifying VITE_ALGOD_SERVER in the environment variables') + } + + return { + server: import.meta.env.VITE_ALGOD_SERVER, + port: import.meta.env.VITE_ALGOD_PORT, + token: import.meta.env.VITE_ALGOD_TOKEN, + network: import.meta.env.VITE_ALGOD_NETWORK, + } +} + +export function getIndexerConfigFromViteEnvironment(): AlgoViteClientConfig { + if (!import.meta.env.VITE_INDEXER_SERVER) { + throw new Error('Attempt to get default algod configuration without specifying VITE_INDEXER_SERVER in the environment variables') + } + + return { + server: import.meta.env.VITE_INDEXER_SERVER, + port: import.meta.env.VITE_INDEXER_PORT, + token: import.meta.env.VITE_INDEXER_TOKEN, + network: import.meta.env.VITE_ALGOD_NETWORK, + } +} + +export function getKmdConfigFromViteEnvironment(): AlgoViteKMDConfig { + if (!import.meta.env.VITE_KMD_SERVER) { + throw new Error('Attempt to get default kmd configuration without specifying VITE_KMD_SERVER in the environment variables') + } + + return { + server: import.meta.env.VITE_KMD_SERVER, + port: import.meta.env.VITE_KMD_PORT, + token: import.meta.env.VITE_KMD_TOKEN, + wallet: import.meta.env.VITE_KMD_WALLET, + password: import.meta.env.VITE_KMD_PASSWORD, + } +} diff --git a/examples/p-tls/projects/p-tls-frontend/src/vite-env.d.ts b/examples/p-tls/projects/p-tls-frontend/src/vite-env.d.ts new file mode 100644 index 0000000..67c2d30 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/src/vite-env.d.ts @@ -0,0 +1,24 @@ +/// + +interface ImportMetaEnv { + readonly VITE_ENVIRONMENT: string + + readonly VITE_ALGOD_TOKEN: string + readonly VITE_ALGOD_SERVER: string + readonly VITE_ALGOD_PORT: string + readonly VITE_ALGOD_NETWORK: string + + readonly VITE_INDEXER_TOKEN: string + readonly VITE_INDEXER_SERVER: string + readonly VITE_INDEXER_PORT: string + + readonly VITE_KMD_TOKEN: string + readonly VITE_KMD_SERVER: string + readonly VITE_KMD_PORT: string + readonly VITE_KMD_PASSWORD: string + readonly VITE_KMD_WALLET: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/examples/p-tls/projects/p-tls-frontend/tailwind.config.cjs b/examples/p-tls/projects/p-tls-frontend/tailwind.config.cjs new file mode 100644 index 0000000..eaaba6c --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/tailwind.config.cjs @@ -0,0 +1,12 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ['./src/**/*.{js,ts,jsx,tsx}'], + theme: { + extend: {}, + }, + daisyui: { + themes: ['lofi'], + logs: false, + }, + plugins: [require('daisyui')], +} diff --git a/examples/p-tls/projects/p-tls-frontend/tests/example.spec.ts b/examples/p-tls/projects/p-tls-frontend/tests/example.spec.ts new file mode 100644 index 0000000..a62aae4 --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/tests/example.spec.ts @@ -0,0 +1,40 @@ +import { algorandFixture } from '@algorandfoundation/algokit-utils/testing' +import { expect, test } from '@playwright/test' + +const localnet = algorandFixture() + +test.beforeEach(async ({ page }) => { + await localnet.newScope() + await page.goto('http://localhost:5173/') +}) + +test('has title', async ({ page }) => { + // Expect a title "to contain" a substring. + await expect(page).toHaveTitle('AlgoKit React Template') +}) + +test('get started link', async ({ page }) => { + await expect(page.getByTestId('getting-started')).toHaveText('Getting started') +}) + +test('authentication and dummy payment transaction', async ({ page }) => { + page.on('dialog', async (dialog) => { + dialog.message() === 'KMD password' ? await dialog.accept() : await dialog.dismiss() + }) + + // 1. Must be able to connect to a KMD wallet provider + await page.getByTestId('connect-wallet').click() + await page.getByTestId('kmd-connect').click() + await page.getByTestId('close-wallet-modal').click() + + // 2. Must be able to send a dummy payment transaction + await page.getByTestId('transactions-demo').click() + + await page.getByTestId('receiver-address').fill(localnet.context.testAccount.toString()) + await page.getByTestId('send-algo').click() + + // 3. Must be able to see a notification that the transaction was sent + const notification = await page.getByText('Transaction sent:') + await notification.waitFor() + expect(notification).toBeTruthy() +}) diff --git a/examples/p-tls/projects/p-tls-frontend/tsconfig.json b/examples/p-tls/projects/p-tls-frontend/tsconfig.json new file mode 100644 index 0000000..5cde02a --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/tsconfig.json @@ -0,0 +1,38 @@ +{ + "compilerOptions": { + "target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + "module": "ES2022" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + "declaration": true /* Generates corresponding '.d.ts' file. */, + "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, + "sourceMap": true /* Generates corresponding '.map' file. */, + "strict": true /* Enable all strict type-checking options. */, + "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, + "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, + "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */, + "skipLibCheck": true /* Skip type checking of declaration files. */, + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, + "allowJs": false, + "allowSyntheticDefaultImports": true, + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "outDir": "./dist/" + }, + "include": [ + "src/**/*.ts", + "src/**/*.tsx", + "vite.config.js", + "src/utils/ellipseAddress.spec.tsx", + "src/utils/ellipseAddress.spec.tsx", + "src/main.tsx", + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/examples/p-tls/projects/p-tls-frontend/tsconfig.node.json b/examples/p-tls/projects/p-tls-frontend/tsconfig.node.json new file mode 100644 index 0000000..9d31e2a --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/examples/p-tls/projects/p-tls-frontend/vite.config.ts b/examples/p-tls/projects/p-tls-frontend/vite.config.ts new file mode 100644 index 0000000..e42dc7c --- /dev/null +++ b/examples/p-tls/projects/p-tls-frontend/vite.config.ts @@ -0,0 +1,15 @@ +import react from '@vitejs/plugin-react' +import { defineConfig } from 'vite' +import { nodePolyfills } from 'vite-plugin-node-polyfills' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + react(), + nodePolyfills({ + globals: { + Buffer: true, + }, + }), + ], +}) diff --git a/examples/p-ts/.algokit/.copier-answers.yml b/examples/p-ts/.algokit/.copier-answers.yml index 133142c..2f108ef 100644 --- a/examples/p-ts/.algokit/.copier-answers.yml +++ b/examples/p-ts/.algokit/.copier-answers.yml @@ -1,6 +1,6 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 2.1.8-11-g7668422 -_src_path: /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template +_commit: +_src_path: author_email: None author_name: None cloud_provider: netlify diff --git a/examples/p-ts/.algokit/generators/create-devcontainer/copier.yaml b/examples/p-ts/.algokit/generators/create-devcontainer/copier.yaml new file mode 100644 index 0000000..e98f334 --- /dev/null +++ b/examples/p-ts/.algokit/generators/create-devcontainer/copier.yaml @@ -0,0 +1,4 @@ +_tasks: + - "echo '==== Successfully generated new .devcontainer.json file 🚀 ===='" + +_templates_suffix: ".j2" diff --git a/examples/p-ts/.algokit/generators/create-devcontainer/devcontainer.json b/examples/p-ts/.algokit/generators/create-devcontainer/devcontainer.json new file mode 100644 index 0000000..6452c65 --- /dev/null +++ b/examples/p-ts/.algokit/generators/create-devcontainer/devcontainer.json @@ -0,0 +1,19 @@ +{ + "forwardPorts": [4001, 4002, 8980, 5173], + "portsAttributes": { + "4001": { + "label": "algod" + }, + "4002": { + "label": "kmd" + }, + "8980": { + "label": "indexer" + }, + "5173": { + "label": "vite" + } + }, + "postCreateCommand": "mkdir -p ~/.config/algokit && pipx install algokit && sudo chown -R codespace:codespace ~/.config/algokit", + "postStartCommand": "for i in {1..5}; do algokit localnet status > /dev/null 2>&1 && break || sleep 30; algokit localnet reset; done" +} diff --git a/examples/p-ts/.editorconfig b/examples/p-ts/.editorconfig new file mode 100644 index 0000000..5e550a1 --- /dev/null +++ b/examples/p-ts/.editorconfig @@ -0,0 +1,10 @@ +[*] +charset = utf-8 +insert_final_newline = true +end_of_line = lf +indent_style = space +indent_size = 2 +tab_width = 2 +max_line_length = 140 +trim_trailing_whitespace = true +single_quote = true diff --git a/examples/p-ts/.gitattributes b/examples/p-ts/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/examples/p-ts/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/examples/p-ts/.github/workflows/p-ts-contracts-cd.yaml b/examples/p-ts/.github/workflows/p-ts-contracts-cd.yaml new file mode 100644 index 0000000..9a5bb9c --- /dev/null +++ b/examples/p-ts/.github/workflows/p-ts-contracts-cd.yaml @@ -0,0 +1,45 @@ +name: Release p-ts-contracts + +on: + workflow_call: + +jobs: + deploy-testnet: + runs-on: "ubuntu-latest" + + environment: contract-testnet + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Use Node.js 22.x + uses: actions/setup-node@v4 + with: + node-version: '22.x' + cache: 'npm' + cache-dependency-path: '**/package-lock.json' + + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install algokit + run: pipx install algokit + + - name: Bootstrap dependencies + run: algokit project bootstrap all --project-name 'p-ts-contracts' + + - name: Configure git + shell: bash + run: | + # set git user and email as test invoke git + git config --global user.email "actions@github.com" && git config --global user.name "github-actions" + + - name: Deploy to testnet + run: algokit project deploy testnet --project-name 'p-ts-contracts' + env: + # This is the account that becomes the creator of the contract + DEPLOYER_MNEMONIC: ${{ secrets.DEPLOYER_MNEMONIC }} + # The dispenser account is used to ensure the deployer account is funded + DISPENSER_MNEMONIC: ${{ secrets.DISPENSER_MNEMONIC }} diff --git a/examples/p-ts/.github/workflows/p-ts-contracts-ci.yaml b/examples/p-ts/.github/workflows/p-ts-contracts-ci.yaml new file mode 100644 index 0000000..1af199f --- /dev/null +++ b/examples/p-ts/.github/workflows/p-ts-contracts-ci.yaml @@ -0,0 +1,72 @@ +name: Validate p-ts-contracts + +on: + workflow_call: + +jobs: + validate: + runs-on: "ubuntu-latest" + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Use Node.js 22.x + uses: actions/setup-node@v4 + with: + node-version: '22.x' + cache: 'npm' + cache-dependency-path: "**/package-lock.json" + + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install algokit + run: pipx install algokit + + - name: Start LocalNet + run: algokit localnet start + + - name: Bootstrap dependencies + run: algokit project bootstrap all --project-name 'p-ts-contracts' + + - name: Configure git + shell: bash + run: | + # set git user and email as test invoke git + git config --global user.email "actions@github.com" && git config --global user.name "github-actions" + + + - name: Audit dependencies + run: algokit project run audit --project-name 'p-ts-contracts' + + + + - name: Lint and format + run: algokit project run lint --project-name 'p-ts-contracts' + + + + - name: Run tests + shell: bash + run: | + set -o pipefail + algokit project run test --project-name 'p-ts-contracts' + + + - name: Build smart contracts + run: algokit project run build --project-name 'p-ts-contracts' + + - name: Scan TEAL files for issues + run: algokit project run audit-teal --project-name 'p-ts-contracts' + + # # Uncomment to enable TEAL static analysis with snapshoting using Tealer package + # # Would first require running locally using audit-teal command and committing the snapshots into source control + # # Please note, tealer has a known bug that may result in large snapshot file sizes, track resolution here: + # # https://github.com/crytic/tealer/issues/101 + # - name: Check output stability of the smart contracts + # run: algokit project run ci-teal-diff --project-name 'p-ts-contracts' + + - name: Run deployer against LocalNet + run: algokit project deploy localnet --project-name 'p-ts-contracts' diff --git a/examples/p-ts/.github/workflows/p-ts-frontend-cd.yaml b/examples/p-ts/.github/workflows/p-ts-frontend-cd.yaml new file mode 100644 index 0000000..07e75a3 --- /dev/null +++ b/examples/p-ts/.github/workflows/p-ts-frontend-cd.yaml @@ -0,0 +1,36 @@ +name: Release p-ts-frontend + +on: + workflow_call: +permissions: + contents: read + packages: read + +jobs: + + deploy: + runs-on: ubuntu-latest + name: Deploy to Netlify + environment: frontend-prod + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup node + uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Install algokit + run: pipx install algokit + + - name: Bootstrap dependencies + run: algokit project bootstrap all --project-name 'p-ts-frontend' + + - name: Publish to Netlify + env: + NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} + NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} + run: algokit project run ci-deploy-netlify + \ No newline at end of file diff --git a/examples/p-ts/.github/workflows/p-ts-frontend-ci.yaml b/examples/p-ts/.github/workflows/p-ts-frontend-ci.yaml new file mode 100644 index 0000000..ae1ffdb --- /dev/null +++ b/examples/p-ts/.github/workflows/p-ts-frontend-ci.yaml @@ -0,0 +1,47 @@ +name: Validate p-ts-frontend + +on: + + workflow_call: + + +jobs: + validate: + runs-on: 'ubuntu-latest' + steps: + - name: Check out repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup node + uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Install poetry + run: pipx install poetry + + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: "poetry" + + - name: Install algokit + run: pipx install algokit + + - name: Install dependencies + run: algokit project bootstrap all --project-name 'p-ts-frontend' + + + - name: Run linters + run: algokit project run lint --project-name 'p-ts-frontend' + + + - name: Run unit tests + run: algokit project run test --project-name 'p-ts-frontend' + + + - name: Build + run: algokit project run build --project-name 'p-ts-frontend' diff --git a/examples/p-ts/.gitignore b/examples/p-ts/.gitignore new file mode 100644 index 0000000..4105eb2 --- /dev/null +++ b/examples/p-ts/.gitignore @@ -0,0 +1,170 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Ruff (linter) +.ruff_cache/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +.idea/ +!.idea/runConfigurations + +# macOS +.DS_Store + +# Received approval test files +*.received.* + +# NPM +node_modules + diff --git a/examples/p-ts/copy_files.sh b/examples/p-ts/copy_files.sh deleted file mode 100644 index 749b01f..0000000 --- a/examples/p-ts/copy_files.sh +++ /dev/null @@ -1,23 +0,0 @@ - -#!/bin/bash -# Script to copy required files to the frontend project -# Usage: ./copy_files.sh - - -project_name="$1" -frontend_root="./projects/${project_name}-frontend" - -# Ensure directories exist -mkdir -p "${frontend_root}/src/components" - -# Copy files -cp "./inject_content/Home.tsx" "${frontend_root}/src/Home.tsx" -cp "./inject_content/AppCalls.tsx" "${frontend_root}/src/components/AppCalls.tsx" - -echo "Template completed successfully!" -# remove inject_content folder -rm -rf "./inject_content" -# self destruct the file -rm -f "$0" - - diff --git a/examples/p-ts/projects/.gitkeep b/examples/p-ts/projects/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit.toml b/examples/p-ts/projects/p-ts-contracts/.algokit.toml new file mode 100644 index 0000000..ee84255 --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/.algokit.toml @@ -0,0 +1,56 @@ +[algokit] +min_version = "v2.6.0" + +[generate.smart-contract] +description = "Generate a new smart contract for existing project" +path = ".algokit/generators/create_contract" + +[generate.env-file] +description = "Generate a new generic or Algorand network specific .env file" +path = ".algokit/generators/create_env_file" + +[project] +type = 'contract' +name = 'p-ts-contracts' +artifacts = 'smart_contracts/artifacts' + +[project.deploy] +command = "npm run deploy:ci" + +[project.deploy.testnet] +environment_secrets = [ + "DEPLOYER_MNEMONIC", + "DISPENSER_MNEMONIC", +] + +[project.deploy.mainnet] +environment_secrets = [ + "DEPLOYER_MNEMONIC", + "DISPENSER_MNEMONIC", +] + +[project.run] +# Commands intended for use locally and in CI +build = { commands = [ + 'npm run build', +], description = 'Build all smart contracts in the project' } +test = { commands = [ + 'npm run test', +], description = 'Run smart contract tests using vitest' } +audit = { commands = [ + 'npm run audit', +], description = 'Audit with better-npm-audit' } +lint = { commands = [ + 'npm run lint', + 'npm run format', +], description = 'Perform linting' } +audit-teal = { commands = [ + # 🚨 IMPORTANT 🚨: For strict TEAL validation, remove --exclude statements. The default starter contract is not for production. Ensure thorough testing and adherence to best practices in smart contract development. This is not a replacement for a professional audit. + 'algokit task analyze smart_contracts/artifacts --recursive --force --exclude rekey-to --exclude is-updatable --exclude missing-fee-check --exclude is-deletable --exclude can-close-asset --exclude can-close-account --exclude unprotected-deletable --exclude unprotected-updatable', +], description = 'Audit TEAL files' } + +# Commands intented for CI only, prefixed with `ci-` by convention +ci-teal-diff = { commands = [ + 'git add -N ./smart_contracts/artifacts', + 'git diff --exit-code --minimal ./smart_contracts/artifacts', +], description = 'Check TEAL files for differences' } diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/.copier-answers.yml b/examples/p-ts/projects/p-ts-contracts/.algokit/.copier-answers.yml new file mode 100644 index 0000000..bec35c4 --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/.algokit/.copier-answers.yml @@ -0,0 +1,9 @@ +# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY +_commit: 0.3.7 +_src_path: gh:algorandfoundation/algokit-typescript-template +author_email: None +author_name: None +contract_name: hello_world +preset_name: production +project_name: p-ts-contracts + diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/copier.yaml b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/copier.yaml new file mode 100644 index 0000000..82f2c4a --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/copier.yaml @@ -0,0 +1,15 @@ +_tasks: + - "echo '==== Successfully initialized new smart contract 🚀 ===='" + +contract_name: + type: str + help: Name of your new contract. + placeholder: "my-new-contract" + default: "my-new-contract" + +include_tests: + type: bool + help: Should we include testing files? + default: 'yes' + +_templates_suffix: ".j2" diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.algo.ts.j2 b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.algo.ts.j2 new file mode 100644 index 0000000..344c1a1 --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.algo.ts.j2 @@ -0,0 +1,7 @@ +import { Contract } from '@algorandfoundation/algorand-typescript' + +export class {{ contract_name.split('_')|map('capitalize')|join }} extends Contract { + {% if preset_name != 'starter' %}public {% endif %}hello(name: string): string { + return `Hello, ${name}` + } +} diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 new file mode 100644 index 0000000..4626980 --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 @@ -0,0 +1,33 @@ +import { AlgorandClient } from '@algorandfoundation/algokit-utils' +import { {{ contract_name.split('_')|map('capitalize')|join }}Factory } from '../artifacts/{{ contract_name }}/{{ contract_name.split('_')|map('capitalize')|join }}Client' + +// Below is a showcase of various deployment options you can use in TypeScript Client +export async function deploy() { + console.log('=== Deploying {{ contract_name.split('_')|map('capitalize')|join }} ===') + + const algorand = AlgorandClient.fromEnvironment() + const deployer = await algorand.account.fromEnvironment('DEPLOYER') + + const factory = algorand.client.getTypedAppFactory({{ contract_name.split('_')|map('capitalize')|join }}Factory, { + defaultSender: deployer.addr, + }) + + const { appClient, result } = await factory.deploy({ onUpdate: 'append', onSchemaBreak: 'append' }) + + // If app was just created fund the app account + if (['create', 'replace'].includes(result.operationPerformed)) { + await algorand.send.payment({ + amount: (1).algo(), + sender: deployer.addr, + receiver: appClient.appAddress, + }) + } + + const method = 'hello' + const response = await appClient.send.hello({ + args: { name: 'world' }, + }) + console.log( + `Called ${method} on ${appClient.appClient.appName} (${appClient.appClient.appId}) with name = world, received: ${response.return}`, + ) +} diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 new file mode 100644 index 0000000..146e270 --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 @@ -0,0 +1,36 @@ +import { Config } from '@algorandfoundation/algokit-utils' +import { algorandFixture } from '@algorandfoundation/algokit-utils/testing' +import { Address } from 'algosdk' +import { beforeAll, beforeEach, describe, expect, test } from 'vitest' +import { {{ contract_name.split('_')|map('capitalize')|join }}Factory } from '../artifacts/{{ contract_name }}/{{ contract_name.split('_')|map('capitalize')|join }}Client' + +describe('{{ contract_name.split('_')|map('capitalize')|join }} contract', () => { + const localnet = algorandFixture() + beforeAll(() => { + Config.configure({ + debug: true, + // traceAll: true, + }) + }) + beforeEach(localnet.newScope) + + const deploy = async (account: Address) => { + const factory = localnet.algorand.client.getTypedAppFactory({{ contract_name.split('_')|map('capitalize')|join }}Factory, { + defaultSender: account, + }) + + const { appClient } = await factory.deploy({ onUpdate: 'append', onSchemaBreak: 'append' }) + return { client: appClient } + } + + test('says hello', async () => { + const { testAccount } = localnet.context + const { client } = await deploy(testAccount) + + const result = await client.send.hello({ args: { name: 'World' } }) + + expect(result.return).toBe('Hello World') + }) + +}) + diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.spec.ts{% endif %}.j2 b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.spec.ts{% endif %}.j2 new file mode 100644 index 0000000..e7a7414 --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.spec.ts{% endif %}.j2 @@ -0,0 +1,14 @@ +import { TestExecutionContext } from '@algorandfoundation/algorand-typescript-testing' +import { describe, expect, it } from 'vitest' +import { {{ contract_name.split('_')|map('capitalize')|join }} } from './contract.algo' + +describe('{{ contract_name.split('_')|map('capitalize')|join }} contract', () => { + const ctx = new TestExecutionContext() + it('Logs the returned value when sayHello is called', () => { + const contract = ctx.contract.create({{ contract_name.split('_')|map('capitalize')|join }}) + + const result = contract.hello('Sally') + + expect(result).toBe('Hello Sally') + }) +}) diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/copier.yaml b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/copier.yaml new file mode 100644 index 0000000..afa2cac --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/copier.yaml @@ -0,0 +1,49 @@ +_tasks: + - "echo '==== Successfully generated new .env file 🚀 ===='" + +target_network: + type: str + help: Name of your target network. + choices: + - mainnet + - testnet + - localnet + - custom + default: "localnet" + when: "{{ not use_generic_env }}" + +custom_network_name: + type: str + help: Name of your custom Algorand network. + placeholder: "custom" + when: "{{ not use_generic_env and target_network == 'custom' }}" + +is_localnet: + type: bool + help: Whether to deploy on localnet. + placeholder: "true" + default: "{{ target_network == 'localnet' and not use_generic_env }}" + when: 'false' + +is_testnet: + type: bool + help: Whether to deploy on testnet. + placeholder: "true" + default: "{{ target_network == 'testnet' and not use_generic_env }}" + when: 'false' + +is_mainnet: + type: bool + help: Whether to deploy on mainnet. + placeholder: "true" + default: "{{ target_network == 'mainnet' and not use_generic_env }}" + when: 'false' + +is_customnet: + type: bool + help: Whether to deploy on custom network. + placeholder: "true" + default: "{{ target_network == 'custom' and not use_generic_env }}" + when: 'false' + +_templates_suffix: ".j2" diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} new file mode 100644 index 0000000..cfc9f21 --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} @@ -0,0 +1,7 @@ +# this file contains algorand network settings for interacting with testnet via algonode +ALGOD_TOKEN={YOUR_ALGOD_TOKEN} +ALGOD_SERVER={YOUR_ALGOD_SERVER_URL} +ALGOD_PORT={YOUR_ALGOD_PORT} +INDEXER_TOKEN={YOUR_INDEXER_TOKEN} +INDEXER_SERVER={YOUR_INDEXER_SERVER_URL} +INDEXER_PORT={YOUR_INDEXER_PORT} diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} new file mode 100644 index 0000000..fcbf442 --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} @@ -0,0 +1,7 @@ +# this file should contain environment variables specific to algokit localnet +ALGOD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +ALGOD_SERVER=http://localhost +ALGOD_PORT=4001 +INDEXER_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +INDEXER_SERVER=http://localhost +INDEXER_PORT=8980 diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} new file mode 100644 index 0000000..bb9a787 --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} @@ -0,0 +1,3 @@ +# this file contains algorand network settings for interacting with testnet via algonode +ALGOD_SERVER=https://mainnet-api.algonode.cloud +INDEXER_SERVER=https://mainnet-idx.algonode.cloud diff --git a/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} new file mode 100644 index 0000000..eeea43d --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} @@ -0,0 +1,3 @@ +# this file contains algorand network settings for interacting with testnet via algonode +ALGOD_SERVER=https://testnet-api.algonode.cloud +INDEXER_SERVER=https://testnet-idx.algonode.cloud diff --git a/examples/p-ts/projects/p-ts-contracts/.editorconfig b/examples/p-ts/projects/p-ts-contracts/.editorconfig new file mode 100644 index 0000000..0a71b07 --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/.editorconfig @@ -0,0 +1,7 @@ +root=true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true diff --git a/examples/p-ts/projects/p-ts-contracts/.gitignore b/examples/p-ts/projects/p-ts-contracts/.gitignore new file mode 100644 index 0000000..25494bf --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/.gitignore @@ -0,0 +1,62 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +# Dependency directories +node_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# Editor/OS directories and files +.DS_Store +*.suo + +# IntelliJ family +.idea +!.idea/ +.idea/* +!.idea/runConfigurations/ + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# Compiled code +dist/ +build/ + +# Coverage report +coverage + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# Received approval test files +*.received.* + +# AlgoKit +debug_traces/ +.algokit/static-analysis/ # Replace with .algokit/static-analysis/tealer/ to enable snapshot checks in CI +.algokit/sources diff --git a/examples/p-ts/projects/p-ts-contracts/.npmrc b/examples/p-ts/projects/p-ts-contracts/.npmrc new file mode 100644 index 0000000..c42da84 --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/.npmrc @@ -0,0 +1 @@ +engine-strict = true diff --git a/examples/p-ts/projects/p-ts-contracts/.prettierignore b/examples/p-ts/projects/p-ts-contracts/.prettierignore new file mode 100644 index 0000000..8ca71b1 --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/.prettierignore @@ -0,0 +1,13 @@ +# don't ever format node_modules +node_modules +# don't lint format output (make sure it's set to your correct build folder name) +dist +build +# don't format nyc coverage output +coverage +# don't format generated types +**/generated/types.d.ts +**/generated/types.ts +# don't format ide files +.idea +smart_contracts/artifacts diff --git a/examples/p-ts/projects/p-ts-contracts/.prettierrc.js b/examples/p-ts/projects/p-ts-contracts/.prettierrc.js new file mode 100644 index 0000000..c484d0e --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/.prettierrc.js @@ -0,0 +1,10 @@ +module.exports = { + singleQuote: true, + jsxSingleQuote: false, + semi: false, + tabWidth: 2, + trailingComma: 'all', + printWidth: 120, + endOfLine: 'lf', + arrowParens: 'always', +} diff --git a/examples/p-ts/projects/p-ts-contracts/.tours/getting-started-with-your-algokit-project.tour b/examples/p-ts/projects/p-ts-contracts/.tours/getting-started-with-your-algokit-project.tour new file mode 100644 index 0000000..a9ea37c --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/.tours/getting-started-with-your-algokit-project.tour @@ -0,0 +1,56 @@ +{ + "$schema": "https://aka.ms/codetour-schema", + "title": "Getting Started with Your AlgoKit Project", + "steps": [ + { + "file": "README.md", + "description": "Welcome to your brand new AlgoKit template-based project. In this tour, we will guide you through the main features and capabilities included in the template.", + "line": 3 + }, + { + "file": "README.md", + "description": "Start by ensuring you have followed the setup of pre-requisites.", + "line": 9 + }, + { + "file": ".algokit.toml", + "description": "This is the main configuration file used by algokit-cli to manage the project. The default template includes a starter 'Hello World' contract that is deployed via the `algokit-utils` package. To create a new smart contract, you can use the [`algokit generate`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md) command and invoke a pre-bundled generator template by running `algokit generate smart-contract` (see how it is defined in the `.algokit.toml`, you can create your own generators if needed). This action will create a new folder in the `smart_contracts` directory, named after your project. Each folder contains a `contract.algo.ts` file, which is the entry point for your contract implementation, and `deployConfig.ts` file, that perform the deployment of the contract. Additionally you can define custom commands to run (similar to `npm` scripts), see definitions under `[project]` section in `.algokit.toml`.", + "line": 1 + }, + { + "file": "smart_contracts/hello_world/deploy-config.ts", + "description": "The default deployment scripts invoke a sample method on the starter contract that demonstrates how to interact with your deployed Algorand on-chain applications using the [`AlgoKit Typed Clients`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md#1-typed-clients) feature. The invocation if deploy is aliased in `.algokit.toml` file, allowing simple deployments via `algokit project deploy` command.", + "line": 32 + }, + { + "file": "smart_contracts/hello_world/contact.spec.ts", + "description": "The default tests provided demonstrate an example of setting up in-memory fast unit tests with the Algorand TypeScript testing library that mocks AVM functionality.", + "line": 5 + }, + { + "file": "smart_contracts/hello_world/contact.e2e.spec.ts", + "description": "The default tests provided demonstrate an example of setting up an end-to-end test with fixtures, and testing smart contract calls against a LocalNet network via an AlgoKit typed client.", + "line": 7 + }, + { + "file": ".env.localnet.template", + "description": "Environment files are a crucial mechanism that allows you to set up the [`algokit deploy`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/deploy.md) feature to simplify deploying your contracts in CI/CD environments (please note we still recommend careful evaluation when it comes to deployment to MainNet). Clone the file and remove the `.template` suffix to apply the changes to deployment scripts and launch configurations. The network prefix `localnet|testnet|mainnet` is primarily optimized for `algokit deploy`. The order of loading the variables is `.env.{network}` < `.env`.", + "line": 2 + }, + { + "file": ".vscode/launch.json", + "description": "Refer to the pre-bundled Visual Studio launch configurations, offering various options on how to execute the build and deployment of your smart contracts. Alternatively execute `algokit project run` to see list of available custom commands.", + "line": 5 + }, + { + "file": ".vscode/extensions.json", + "description": "We highly recommend installing the recommended extensions to get the most out of this template starter project in your VSCode IDE.", + "line": 3 + }, + { + "file": "smart_contracts/index.ts", + "description": "Uncomment the following line to enable artifacts required for the [AlgoKit AVM Debugger](https://github.com/algorandfoundation/algokit-avm-vscode-debugger) that run for every single call rather than just failures. This VSCode plugin is available on the [VSCode Extension Marketplace](https://marketplace.visualstudio.com/items?itemName=algorandfoundation.algokit-avm-vscode-debugger) for every call. A new folder will be automatically created in the `.algokit` directory with source maps of all TEAL contracts in this workspace, as well as traces that will appear in a folder at the root of the workspace. You can then use the traces as entry points to trigger the debug extension. Make sure to have the `.algokit.toml` file available at the root of the workspace.", + "line": 13 + } + ] +} diff --git a/examples/p-ts/projects/p-ts-contracts/.vscode/extensions.json b/examples/p-ts/projects/p-ts-contracts/.vscode/extensions.json new file mode 100644 index 0000000..cb71192 --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/.vscode/extensions.json @@ -0,0 +1,10 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "vitest.explorer", + "editorconfig.editorconfig", + "vsls-contrib.codetour", + "algorandfoundation.algokit-avm-vscode-debugger" + ] +} diff --git a/examples/p-ts/projects/p-ts-contracts/.vscode/launch.json b/examples/p-ts/projects/p-ts-contracts/.vscode/launch.json new file mode 100644 index 0000000..093ebb1 --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/.vscode/launch.json @@ -0,0 +1,58 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Build & Deploy contracts", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "deploy"], + "cwd": "${workspaceFolder}/smart_contracts", + "console": "integratedTerminal", + "skipFiles": ["/**", "node_modules/**"], + "preLaunchTask": "Build contracts (+ LocalNet)", + "env": { + "ALGOD_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "ALGOD_SERVER": "http://localhost", + "ALGOD_PORT": "4001", + "INDEXER_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "INDEXER_SERVER": "http://localhost", + "INDEXER_PORT": "8980" + } + }, + { + "name": "Deploy contracts", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "deploy"], + "cwd": "${workspaceFolder}/smart_contracts", + "console": "integratedTerminal", + "skipFiles": ["/**", "node_modules/**"], + "env": { + "ALGOD_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "ALGOD_SERVER": "http://localhost", + "ALGOD_PORT": "4001", + "INDEXER_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "INDEXER_SERVER": "http://localhost", + "INDEXER_PORT": "8980" + } + }, + { + "name": "Build contracts", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "build"], + "cwd": "${workspaceFolder}", + "console": "integratedTerminal", + "skipFiles": ["/**", "node_modules/**"], + }, + { + "type": "avm", + "request": "launch", + "name": "Debug AVM executions", + "simulateTraceFile": "${workspaceFolder}/${command:PickSimulateTraceFile}", + "stopOnEntry": true + } + ] +} diff --git a/examples/p-ts/projects/p-ts-contracts/.vscode/settings.json b/examples/p-ts/projects/p-ts-contracts/.vscode/settings.json new file mode 100644 index 0000000..b60a0a2 --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/.vscode/settings.json @@ -0,0 +1,19 @@ +{ + "files.eol": "\n", + "algorandTypeScript.languageServer.enable": true, + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.codeActionsOnSave": { + "source.organizeImports": "explicit" + }, + "jest.enable": false, + "files.associations": { + ".github/**/*.yml": "github-actions-workflow" + }, + "eslint.enable": true, + "eslint.validate": ["typescript"], + "eslint.options": { + "extensions": [".ts"] + }, + "eslint.workingDirectories": ["./smart_contracts"] + } diff --git a/examples/p-ts/projects/p-ts-contracts/.vscode/tasks.json b/examples/p-ts/projects/p-ts-contracts/.vscode/tasks.json new file mode 100644 index 0000000..55310ab --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/.vscode/tasks.json @@ -0,0 +1,69 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Build contracts", + "type": "npm", + "script": "build", + "path": "${workspaceFolder}", + "options": { + "cwd": "${workspaceFolder}" + }, + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [] + }, + { + "label": "Build contracts (+ LocalNet)", + "type": "npm", + "script": "build", + "path": "${workspaceFolder}", + "options": { + "cwd": "${workspaceFolder}" + }, + "dependsOn": "Start AlgoKit LocalNet", + "problemMatcher": [] + }, + { + "label": "Start AlgoKit LocalNet", + "command": "algokit", + "args": ["localnet", "start"], + "type": "shell", + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + }, + { + "label": "Stop AlgoKit LocalNet", + "command": "algokit", + "args": ["localnet", "stop"], + "type": "shell", + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + }, + { + "label": "Reset AlgoKit LocalNet", + "command": "algokit", + "args": ["localnet", "reset"], + "type": "shell", + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + }, + { + "label": "Analyze TEAL contracts with AlgoKit Tealer integration", + "command": "algokit", + "args": ["task", "analyze", "${workspaceFolder}/.algokit", "--recursive", "--force"], + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + } + ] +} diff --git a/examples/p-ts/projects/p-ts-contracts/README.md b/examples/p-ts/projects/p-ts-contracts/README.md new file mode 100644 index 0000000..ae958d7 --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/README.md @@ -0,0 +1,157 @@ +# p-ts-contracts + +This project has been generated using AlgoKit. See below for default getting started instructions. + +# Setup + +### Pre-requisites + +- [Nodejs 22](https://nodejs.org/en/download) or later +- [AlgoKit CLI 2.5](https://github.com/algorandfoundation/algokit-cli?tab=readme-ov-file#install) or later +- [Docker](https://www.docker.com/) (only required for LocalNet) +- [Puya Compiler 4.4.4](https://pypi.org/project/puyapy/) or later + +> For interactive tour over the codebase, download [vsls-contrib.codetour](https://marketplace.visualstudio.com/items?itemName=vsls-contrib.codetour) extension for VS Code, then open the [`.codetour.json`](./.tours/getting-started-with-your-algokit-project.tour) file in code tour extension. + +### Initial Setup + +#### 1. Clone the Repository +Start by cloning this repository to your local machine. + +#### 2. Install Pre-requisites +Ensure the following pre-requisites are installed and properly configured: + +- **Docker**: Required for running a local Algorand network. +- **AlgoKit CLI**: Essential for project setup and operations. Verify installation with `algokit --version`, expecting `2.6.0` or later. + +#### 3. Bootstrap Your Local Environment +Run the following commands within the project folder: + +- **Setup Project**: Execute `algokit project bootstrap all` to install dependencies and setup npm dependencies. +- **Configure environment**: Execute `algokit generate env-file -a target_network localnet` to create a `.env.localnet` file with default configuration for `localnet`. +- **Start LocalNet**: Use `algokit localnet start` to initiate a local Algorand network. + +### Development Workflow + +#### Terminal +Directly manage and interact with your project using AlgoKit commands: + +1. **Build Contracts**: `algokit project run build` compiles all smart contracts. You can also specify a specific contract by passing the name of the contract folder as an extra argument. +For example: `algokit project run build -- hello_world` will only build the `hello_world` contract. +2. **Deploy**: Use `algokit project deploy localnet` to deploy contracts to the local network. You can also specify a specific contract by passing the name of the contract folder as an extra argument. +For example: `algokit project deploy localnet -- hello_world` will only deploy the `hello_world` contract. + +#### VS Code +For a seamless experience with breakpoint debugging and other features: + +1. **Open Project**: In VS Code, open the repository root. +2. **Install Extensions**: Follow prompts to install recommended extensions. +3. **Debugging**: + - Use `F5` to start debugging. + +#### JetBrains IDEs +While primarily optimized for VS Code, JetBrains IDEs are supported: + +1. **Open Project**: In your JetBrains IDE, open the repository root. +2. **Automatic Setup**: The IDE should configure the Node.js environment. +3. **Debugging**: Use `Shift+F10` or `Ctrl+R` to start debugging. Note: Windows users may encounter issues with pre-launch tasks due to a known bug. See [JetBrains forums](https://youtrack.jetbrains.com/issue/IDEA-277486/Shell-script-configuration-cannot-run-as-before-launch-task) for workarounds. + +## AlgoKit Workspaces and Project Management +This project supports both standalone and monorepo setups through AlgoKit workspaces. Leverage [`algokit project run`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md) commands for efficient monorepo project orchestration and management across multiple projects within a workspace. + +## AlgoKit Generators + +This template provides a set of [algokit generators](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md) that allow you to further modify the project instantiated from the template to fit your needs, as well as giving you a base to build your own extensions to invoke via the `algokit generate` command. + +### Generate Smart Contract + +By default the template creates a single `HelloWorld` contract under hello_world folder in the `smart_contracts` directory. To add a new contract: + +1. From the root of the project (`../`) execute `algokit generate smart-contract`. This will create a new starter smart contract and deployment configuration file under `{your_contract_name}` subfolder in the `smart_contracts` directory. +2. Each contract potentially has different creation parameters and deployment steps. Hence, you need to define your deployment logic in `deploy-config.ts` file. +3. Technically, you need to reference your contract deployment logic in the `index.ts` file. However, by default, `index.ts` will auto import all TypeScript deployment files under `smart_contracts` directory. If you want to manually import specific contracts, modify the default code provided by the template in `index.ts` file. + +> Please note, above is just a suggested convention tailored for the base configuration and structure of this template. The default code supplied by the template in the `index.ts` file is tailored for the suggested convention. You are free to modify the structure and naming conventions as you see fit. + +### Generate '.env' files + +By default the template instance does not contain any env files to deploy to different networks. Using [`algokit project deploy`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/deploy.md) against `localnet` | `testnet` | `mainnet` will use default values for `algod` and `indexer` unless overwritten via `.env` or `.env.{target_network}`. + +To generate a new `.env` or `.env.{target_network}` file, run `algokit generate env-file` + +### Debugging Smart Contracts + +This project is optimized to work with AlgoKit AVM Debugger extension. To activate it: + +Refer to the commented header in the `index.ts` file in the `smart_contracts` folder.Since you have opted in to include VSCode launch configurations in your project, you can also use the `Debug TEAL via AlgoKit AVM Debugger` launch configuration to interactively select an available trace file and launch the debug session for your smart contract. + + +For information on using and setting up the `AlgoKit AVM Debugger` VSCode extension refer [here](https://github.com/algorandfoundation/algokit-avm-vscode-debugger). To install the extension from the VSCode Marketplace, use the following link: [AlgoKit AVM Debugger extension](https://marketplace.visualstudio.com/items?itemName=algorandfoundation.algokit-avm-vscode-debugger).### Continuous Integration / Continuous Deployment (CI/CD) + +This project uses [GitHub Actions](https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions) to define CI/CD workflows, which are located in the [.github/workflows](`../../.github/workflows`) folder. + +> Please note, if you instantiated the project with --workspace flag in `algokit init` it will automatically attempt to move the contents of the `.github` folder to the root of the workspace. + +### AlgoKit Workspaces + +To define custom `algokit project run` commands refer to [documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md). This allows orchestration of commands spanning across multiple projects within an algokit workspace based project (monorepo). + +#### Setting up GitHub for CI/CD workflow and TestNet deployment + + 1. Every time you have a change to your smart contract, and when you first initialize the project you need to [build the contract](#initial-setup) and then commit the `smart_contracts/artifacts` folder so the [output stability](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/articles/output_stability.md) tests pass + 2. Decide what values you want to use for the `allowUpdate` and `allowDelete` parameters specified in [`deploy-config.ts`](./smart_contracts/hello_world/deploy-config.ts). + When deploying to LocalNet these values are both set to `true` for convenience. But for non-LocalNet networks + they are more conservative and use `false` + These default values will allow the smart contract to be deployed initially, but will not allow the app to be updated or deleted if is changed and the build will instead fail. + To help you decide it may be helpful to read the [AlgoKit Utils app deployment documentation](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/docs/capabilities/app-deploy.md) or the [AlgoKit smart contract deployment architecture](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/architecture-decisions/2023-01-12_smart-contract-deployment.md#upgradeable-and-deletable-contracts). + 3. Create a [Github Environment](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#creating-an-environment) named `Test`. + Note: If you have a private repository and don't have GitHub Enterprise then Environments won't work and you'll need to convert the GitHub Action to use a different approach. Ignore this step if you picked `Starter` preset. + 4. Create or obtain a mnemonic for an Algorand account for use on TestNet to deploy apps, referred to as the `DEPLOYER` account. + 5. Store the mnemonic as a [secret](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#environment-secrets) `DEPLOYER_MNEMONIC` + in the Test environment created in step 3. + 6. The account used to deploy the smart contract will require enough funds to create the app, and also fund it. There are two approaches available here: + * Either, ensure the account is funded outside of CI/CD. + In Testnet, funds can be obtained by using the [Algorand TestNet dispenser](https://bank.testnet.algorand.network/) and we recommend provisioning 50 ALGOs. + * Or, fund the account as part of the CI/CD process by using a `DISPENSER_MNEMONIC` GitHub Environment secret to point to a separate `DISPENSER` account that you maintain ALGOs in (similarly, you need to provision ALGOs into this account using the [TestNet dispenser](https://bank.testnet.algorand.network/)). + +#### Continuous Integration + +For pull requests and pushes to `main` branch against this repository the following checks are automatically performed by GitHub Actions: + - NPM dependencies are audited using [better-npm-audit](https://github.com/jeemok/better-npm-audit#readme) + - Code formatting is performed using [Prettier](https://prettier.io/) + - Linting is checked using [ESLint](https://eslint.org/) +- The base framework for testing is [vitest](https://vitest.dev/), and the project includes two separate kinds of tests: +- - `Algorand TypeScript` smart contract unit tests, that are run using [`algorand-typescript-testing`](https://github.com/algorandfoundation/algorand-typescript-testing), which are executed in a Node.js intepreter emulating major AVM behaviour +- - End-to-end (e2e) `AppClient` tests that are run against `algokit localnet` and test the behaviour in a real network environment + - Smart contract artifacts are built + - Smart contract artifacts are checked for [output stability](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/articles/output_stability.md). + - Smart contract is deployed to a AlgoKit LocalNet instance + +> NOTE: By default smart contract artifacts are compiled with `--debug-level` set to 0, to change this, modify the compiler invocation under the `build` script in `package.json` + +#### Continuous Deployment + +For pushes to `main` branch, after the above checks pass, the following deployment actions are performed: + - The smart contract(s) are deployed to TestNet using [AlgoNode](https://algonode.io). + +> Please note deployment is also performed via `algokit deploy` command which can be invoked both via CI as seen on this project, or locally. For more information on how to use `algokit deploy` please see [AlgoKit documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/deploy.md). + +# Tools + +This project makes use of Algorand TypeScript to build Algorand smart contracts. The following tools are in use: + +- [Algorand](https://www.algorand.com/) - Layer 1 Blockchain; [Developer portal](https://dev.algorand.co/), [Why Algorand?](https://dev.algorand.co/getting-started/why-algorand/) +- [AlgoKit](https://github.com/algorandfoundation/algokit-cli) - One-stop shop tool for developers building on the Algorand network; [docs](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/algokit.md), [intro tutorial](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/tutorials/intro.md) +- [Algorand TypeScript](https://github.com/algorandfoundation/puya-ts/) - A semantically and syntactically compatible, typed TypeScript language that works with standard TypeScript tooling and allows you to express smart contracts (apps) and smart signatures (logic signatures) for deployment on the Algorand Virtual Machine (AVM); [docs](https://github.com/algorandfoundation/puya-ts/), [examples](https://github.com/algorandfoundation/puya-ts/tree/main/examples) +- [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-ts) - A set of core Algorand utilities that make it easier to build solutions on Algorand. +- [NPM](https://www.npmjs.com/): TypeScript packaging and dependency management. +- [TypeScript](https://www.typescriptlang.org/): Strongly typed programming language that builds on JavaScript +- [ts-node-dev](https://github.com/wclr/ts-node-dev): TypeScript development execution environment- [Prettier](https://prettier.io/): A code formatter.- [ESLint](https://eslint.org/): A JavaScript / TypeScript linter. +- [vitest](https://vitest.dev/): Automated testing. +- [better-npm-audit](https://github.com/jeemok/better-npm-audit#readme): Tool for scanning JavaScript / TypeScript environments for packages with known vulnerabilities. + + +It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. + + + diff --git a/examples/p-ts/projects/p-ts-contracts/eslint.config.mjs b/examples/p-ts/projects/p-ts-contracts/eslint.config.mjs new file mode 100644 index 0000000..4d2428a --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/eslint.config.mjs @@ -0,0 +1,18 @@ +import eslint from '@eslint/js' +import tseslint from 'typescript-eslint' +import globals from 'globals' + +export default tseslint.config( + eslint.configs.recommended, + tseslint.configs.recommended, + { + languageOptions: { + globals: { + ...globals.node, + }, + }, + rules: { + '@typescript-eslint/explicit-member-accessibility': 'warn', + }, + }, +); diff --git a/examples/p-ts/projects/p-ts-contracts/package.json b/examples/p-ts/projects/p-ts-contracts/package.json new file mode 100644 index 0000000..5ab70fb --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/package.json @@ -0,0 +1,48 @@ +{ + "name": "smart_contracts", + "version": "1.0.0", + "description": "Smart contract deployer", + "main": "smart_contracts/index.ts", + "scripts": { + "build": "algokit compile ts smart_contracts --output-source-map --out-dir artifacts && algokit generate client smart_contracts/artifacts --output {app_spec_dir}/{contract_name}Client.ts", + "deploy": "ts-node-dev --transpile-only --watch .env -r dotenv/config smart_contracts/index.ts", + "deploy:ci": "ts-node --transpile-only -r dotenv/config smart_contracts/index.ts", + "lint": "eslint smart_contracts", + "lint:fix": "eslint smart_contracts --fix", + "audit": "better-npm-audit audit", + "format": "prettier --write .", + "test": "vitest run --coverage", + "test:watch": "vitest watch", + "check-types": "tsc --noEmit" + }, + "engines": { + "node": ">=22.0", + "npm": ">=9.0" + }, + "dependencies": { + "@algorandfoundation/algorand-typescript": "^1.0.1" + }, + "devDependencies": { + "@algorandfoundation/algokit-client-generator": "^6.0.0", + "@algorandfoundation/algokit-utils": "^9.0.0", + "@algorandfoundation/algokit-utils-debug": "^1.0.4", + "@algorandfoundation/puya-ts": "^1.0.1", + "@rollup/plugin-typescript": "^12.1.2", + "@tsconfig/node22": "^22.0.0", + "algosdk": "^3.0.0", + "better-npm-audit": "^3.11.0", + "dotenv": "^16.4.7", + "eslint": "^9.18.0", + "@eslint/js": "^9.18.0", + "typescript-eslint": "^8.19.1", + "prettier": "^3.4.2", + "ts-node-dev": "^2.0.0", + "@algorandfoundation/algorand-typescript-testing": "^1.0.1", + "vitest": "^2.1.8", + "@vitest/coverage-v8": "^2.1.8", + "typescript": "^5.7.3" + }, + "overrides": { + "esbuild": "0.25.0" + } +} diff --git a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.spec.ts b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.spec.ts new file mode 100644 index 0000000..664eb72 --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.spec.ts @@ -0,0 +1,14 @@ +import { TestExecutionContext } from '@algorandfoundation/algorand-typescript-testing' +import { describe, expect, it } from 'vitest' +import { HelloWorld } from './contract.algo' + +describe('HelloWorld contract', () => { + const ctx = new TestExecutionContext() + it('Logs the returned value when sayHello is called', () => { + const contract = ctx.contract.create(HelloWorld) + + const result = contract.hello('Sally') + + expect(result).toBe('Hello, Sally') + }) +}) diff --git a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.ts b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.ts new file mode 100644 index 0000000..5e2fcfe --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.algo.ts @@ -0,0 +1,7 @@ +import { Contract } from '@algorandfoundation/algorand-typescript' + +export class HelloWorld extends Contract { + public hello(name: string): string { + return `Hello, ${name}` + } +} diff --git a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.e2e.spec.ts b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.e2e.spec.ts new file mode 100644 index 0000000..981099c --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/contract.e2e.spec.ts @@ -0,0 +1,53 @@ +import { Config } from '@algorandfoundation/algokit-utils' +import { registerDebugEventHandlers } from '@algorandfoundation/algokit-utils-debug' +import { algorandFixture } from '@algorandfoundation/algokit-utils/testing' +import { Address } from 'algosdk' +import { beforeAll, beforeEach, describe, expect, test } from 'vitest' +import { HelloWorldFactory } from '../artifacts/hello_world/HelloWorldClient' + +describe('HelloWorld contract', () => { + const localnet = algorandFixture() + beforeAll(() => { + Config.configure({ + debug: true, + // traceAll: true, + }) + registerDebugEventHandlers() + }) + beforeEach(localnet.newScope) + + const deploy = async (account: Address) => { + const factory = localnet.algorand.client.getTypedAppFactory(HelloWorldFactory, { + defaultSender: account, + }) + + const { appClient } = await factory.deploy({ + onUpdate: 'append', + onSchemaBreak: 'append', + }) + return { client: appClient } + } + + test('says hello', async () => { + const { testAccount } = localnet.context + const { client } = await deploy(testAccount) + + const result = await client.send.hello({ args: { name: 'World' } }) + + expect(result.return).toBe('Hello, World') + }) + + test('simulate says hello with correct budget consumed', async () => { + const { testAccount } = localnet.context + const { client } = await deploy(testAccount) + const result = await client + .newGroup() + .hello({ args: { name: 'World' } }) + .hello({ args: { name: 'Jane' } }) + .simulate() + + expect(result.returns[0]).toBe('Hello, World') + expect(result.returns[1]).toBe('Hello, Jane') + expect(result.simulateResponse.txnGroups[0].appBudgetConsumed).toBeLessThan(100) + }) +}) diff --git a/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/deploy-config.ts b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/deploy-config.ts new file mode 100644 index 0000000..6b9d652 --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/smart_contracts/hello_world/deploy-config.ts @@ -0,0 +1,33 @@ +import { AlgorandClient } from '@algorandfoundation/algokit-utils' +import { HelloWorldFactory } from '../artifacts/hello_world/HelloWorldClient' + +// Below is a showcase of various deployment options you can use in TypeScript Client +export async function deploy() { + console.log('=== Deploying HelloWorld ===') + + const algorand = AlgorandClient.fromEnvironment() + const deployer = await algorand.account.fromEnvironment('DEPLOYER') + + const factory = algorand.client.getTypedAppFactory(HelloWorldFactory, { + defaultSender: deployer.addr, + }) + + const { appClient, result } = await factory.deploy({ onUpdate: 'append', onSchemaBreak: 'append' }) + + // If app was just created fund the app account + if (['create', 'replace'].includes(result.operationPerformed)) { + await algorand.send.payment({ + amount: (1).algo(), + sender: deployer.addr, + receiver: appClient.appAddress, + }) + } + + const method = 'hello' + const response = await appClient.send.hello({ + args: { name: 'world' }, + }) + console.log( + `Called ${method} on ${appClient.appClient.appName} (${appClient.appClient.appId}) with name = world, received: ${response.return}`, + ) +} diff --git a/examples/p-ts/projects/p-ts-contracts/smart_contracts/index.ts b/examples/p-ts/projects/p-ts-contracts/smart_contracts/index.ts new file mode 100644 index 0000000..6030d0e --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/smart_contracts/index.ts @@ -0,0 +1,62 @@ +import { Config } from '@algorandfoundation/algokit-utils' +import { registerDebugEventHandlers } from '@algorandfoundation/algokit-utils-debug' +import { consoleLogger } from '@algorandfoundation/algokit-utils/types/logging' +import * as fs from 'node:fs' +import * as path from 'node:path' + +// Uncomment the traceAll option to enable auto generation of AVM Debugger compliant sourceMap and simulation trace file for all AVM calls. +// Learn more about using AlgoKit AVM Debugger to debug your TEAL source codes and inspect various kinds of Algorand transactions in atomic groups -> https://github.com/algorandfoundation/algokit-avm-vscode-Debugger + +Config.configure({ + logger: consoleLogger, + debug: true, + // traceAll: true, +}) +registerDebugEventHandlers() + +// base directory +const baseDir = path.resolve(__dirname) + +// function to validate and dynamically import a module +async function importDeployerIfExists(dir: string) { + const deployerPath = path.resolve(dir, 'deploy-config') + if (fs.existsSync(deployerPath + '.ts') || fs.existsSync(deployerPath + '.js')) { + const deployer = await import(deployerPath) + return { ...deployer, name: path.basename(dir) } + } + return null +} + +// get a list of all deployers from the subdirectories +async function getDeployers() { + const directories = fs + .readdirSync(baseDir, { withFileTypes: true }) + .filter((dirent) => dirent.isDirectory()) + .map((dirent) => path.resolve(baseDir, dirent.name)) + + const deployers = await Promise.all(directories.map(importDeployerIfExists)) + return deployers.filter((deployer) => deployer !== null) // Filter out null values +} + +// execute all the deployers +(async () => { + const contractName = process.argv.length > 2 ? process.argv[2] : undefined + const contractDeployers = await getDeployers() + + const filteredDeployers = contractName + ? contractDeployers.filter(deployer => deployer.name === contractName) + : contractDeployers + + if (contractName && filteredDeployers.length === 0) { + console.warn(`No deployer found for contract name: ${contractName}`) + return + } + + for (const deployer of filteredDeployers) { + try { + await deployer.deploy() + } catch (e) { + console.error(`Error deploying ${deployer.name}:`, e) + } + } +})() diff --git a/examples/p-ts/projects/p-ts-contracts/tsconfig.json b/examples/p-ts/projects/p-ts-contracts/tsconfig.json new file mode 100644 index 0000000..d989075 --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "target": "ES2020", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "strict": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "allowJs": false, + "allowSyntheticDefaultImports": true, + "module": "CommonJS", + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "lib": [ + "ESNext" + ], + }, + "include": ["smart_contracts/**/*.ts"], + "exclude": ["node_modules", "dist", "coverage"] +} diff --git a/examples/p-ts/projects/p-ts-contracts/tsconfig.test.json b/examples/p-ts/projects/p-ts-contracts/tsconfig.test.json new file mode 100644 index 0000000..6cc09d9 --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/tsconfig.test.json @@ -0,0 +1,14 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "noEmit": true, + "target": "ES2023", + "module": "ESNext", + "lib": ["ES2023"], + "moduleResolution": "Bundler", + "resolveJsonModule": true, + "esModuleInterop": true + }, + "include": ["**/*.ts", "**/*.mts"], + "exclude": ["node_modules"] +} diff --git a/examples/p-ts/projects/p-ts-contracts/vitest.config.mts b/examples/p-ts/projects/p-ts-contracts/vitest.config.mts new file mode 100644 index 0000000..abb2d2a --- /dev/null +++ b/examples/p-ts/projects/p-ts-contracts/vitest.config.mts @@ -0,0 +1,21 @@ +import { puyaTsTransformer } from '@algorandfoundation/algorand-typescript-testing/vitest-transformer' +import typescript from '@rollup/plugin-typescript' +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + esbuild: {}, + test: { + testTimeout: 10000, + coverage: { + provider: 'v8', + }, + }, + plugins: [ + typescript({ + tsconfig: './tsconfig.test.json', + transformers: { + before: [puyaTsTransformer], + }, + }), + ], +}) diff --git a/examples/p-ts/projects/p-ts-frontend/.algokit.toml b/examples/p-ts/projects/p-ts-frontend/.algokit.toml new file mode 100644 index 0000000..73ac309 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/.algokit.toml @@ -0,0 +1,17 @@ +[algokit] +min_version = "v2.0.0" + +[project] +type = "frontend" +name = 'p-ts-frontend' +artifacts = "src/contracts" + +[project.run] +build = { commands = ['npm run build'], description = 'Build frontend' } +test = { commands = ['npm run test'], description = 'Run frontend tests' } +lint = { commands = ['npm run lint'], description = 'Lint frontend code' } +ci-deploy-netlify = { commands = [ + 'npm install --global netlify-cli@latest', + 'netlify login', + 'netlify deploy --build --prod' + ], description = 'Deploy to Netlify' } diff --git a/examples/p-ts/projects/p-ts-frontend/.algokit/.copier-answers.yml b/examples/p-ts/projects/p-ts-frontend/.algokit/.copier-answers.yml new file mode 100644 index 0000000..3e2a5d9 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/.algokit/.copier-answers.yml @@ -0,0 +1,9 @@ +# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY +_commit: 1.1.1 +_src_path: gh:algorandfoundation/algokit-react-frontend-template +author_email: None +author_name: None +cloud_provider: netlify +preset_name: production +project_name: p-ts-frontend + diff --git a/examples/p-ts/projects/p-ts-frontend/.editorconfig b/examples/p-ts/projects/p-ts-frontend/.editorconfig new file mode 100644 index 0000000..a83b72c --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/.editorconfig @@ -0,0 +1,9 @@ +[*] +charset = utf-8 +insert_final_newline = true +end_of_line = lf +indent_style = space +indent_size = 2 +tab_width = 2 +max_line_length = 140 +trim_trailing_whitespace = true diff --git a/examples/p-ts/projects/p-ts-frontend/.env.template b/examples/p-ts/projects/p-ts-frontend/.env.template new file mode 100644 index 0000000..eb4b229 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/.env.template @@ -0,0 +1,67 @@ +# ====================== +# LocalNet configuration +# uncomment below to use +# ====================== + +VITE_ENVIRONMENT=local + +# Algod +VITE_ALGOD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +VITE_ALGOD_SERVER=http://localhost +VITE_ALGOD_PORT=4001 +VITE_ALGOD_NETWORK=localnet + +# Indexer +VITE_INDEXER_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +VITE_INDEXER_SERVER=http://localhost +VITE_INDEXER_PORT=8980 + +# KMD +# Please note: +# 1. This is only needed for LocalNet since +# by default KMD provider is ignored on other networks. +# 2. AlgoKit LocalNet starts with a single wallet called 'unencrypted-default-wallet', +# with heaps of tokens available for testing. +VITE_KMD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +VITE_KMD_SERVER=http://localhost +VITE_KMD_PORT=4002 +VITE_KMD_WALLET="unencrypted-default-wallet" +VITE_KMD_PASSWORD="" + +# # ====================== +# # TestNet configuration: +# # uncomment below to use +# # ====================== + +# VITE_ENVIRONMENT=local + +# # Algod +# VITE_ALGOD_TOKEN="" +# VITE_ALGOD_SERVER="https://testnet-api.algonode.cloud" +# VITE_ALGOD_PORT="" +# VITE_ALGOD_NETWORK="testnet" + +# # Indexer +# VITE_INDEXER_TOKEN="" +# VITE_INDEXER_SERVER="https://testnet-idx.algonode.cloud" +# VITE_INDEXER_PORT="" + + +# # ====================== +# # MainNet configuration: +# # uncomment below to use +# # ====================== + +# VITE_ENVIRONMENT=production + +# # Algod +# VITE_ALGOD_TOKEN="" +# VITE_ALGOD_SERVER="https://mainnet-api.algonode.cloud" +# VITE_ALGOD_PORT="" +# VITE_ALGOD_NETWORK="mainnet" + +# # Indexer +# VITE_INDEXER_TOKEN="" +# VITE_INDEXER_SERVER="https://mainnet-idx.algonode.cloud" +# VITE_INDEXER_PORT="" + diff --git a/examples/p-ts/projects/p-ts-frontend/.eslintrc b/examples/p-ts/projects/p-ts-frontend/.eslintrc new file mode 100644 index 0000000..868fe37 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/.eslintrc @@ -0,0 +1,27 @@ +{ + "root": true, + "env": { + "node": true + }, + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint", "prettier"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "plugin:prettier/recommended" + ], + "rules": { + "prettier/prettier": "warn", + "no-console": "warn", + "@typescript-eslint/no-unused-vars": [ + "warn", + { + "ignoreRestSiblings": true, + "argsIgnorePattern": "^_", + "destructuredArrayIgnorePattern": "^_" + } + ], + "prefer-template": "error" + } +} diff --git a/examples/p-ts/projects/p-ts-frontend/.gitignore b/examples/p-ts/projects/p-ts-frontend/.gitignore new file mode 100644 index 0000000..b1ce837 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/.gitignore @@ -0,0 +1,38 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + + +# dotenv environment variable files +.env +env/ + +# misc +/dist +.DS_Store + + +npm-debug.log* +yarn-debug.log* +yarn-error.log* +/test-results/ +/playwright-report/ +/playwright/.cache/ + +# PyCharm +.idea +!.idea/ +.idea/* +!.idea/runConfigurations/ + +.vercel +.netlify diff --git a/examples/p-ts/projects/p-ts-frontend/.npmrc b/examples/p-ts/projects/p-ts-frontend/.npmrc new file mode 100644 index 0000000..c42da84 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/.npmrc @@ -0,0 +1 @@ +engine-strict = true diff --git a/examples/p-ts/projects/p-ts-frontend/.prettierignore b/examples/p-ts/projects/p-ts-frontend/.prettierignore new file mode 100644 index 0000000..dbda6ae --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/.prettierignore @@ -0,0 +1,12 @@ +# don't ever format node_modules +node_modules +# don't lint format output (make sure it's set to your correct build folder name) +dist +build +# don't format nyc coverage output +coverage +# don't format generated types +**/generated/types.d.ts +**/generated/types.ts +# don't format ide files +.idea diff --git a/examples/p-ts/projects/p-ts-frontend/.prettierrc.cjs b/examples/p-ts/projects/p-ts-frontend/.prettierrc.cjs new file mode 100644 index 0000000..066b8e5 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/.prettierrc.cjs @@ -0,0 +1,10 @@ +module.exports = { + singleQuote: true, + jsxSingleQuote: false, + semi: false, + tabWidth: 2, + trailingComma: 'all', + printWidth: 140, + endOfLine: 'lf', + arrowParens: 'always', +} diff --git a/examples/p-ts/projects/p-ts-frontend/.vscode/extensions.json b/examples/p-ts/projects/p-ts-frontend/.vscode/extensions.json new file mode 100644 index 0000000..5c94122 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/.vscode/extensions.json @@ -0,0 +1,14 @@ +{ + "recommendations": [ + "EditorConfig.EditorConfig", + "dotenv.dotenv-vscode", + "esbenp.prettier-vscode", + "dbaeumer.vscode-eslint", + "krysenlo.vite-plugin-eslint-problemmatcher", + "ms-playwright.playwright", + "Orta.vscode-jest", + "bradlc.vscode-tailwindcss", + "csstools.postcss", + ] +} + diff --git a/examples/p-ts/projects/p-ts-frontend/.vscode/launch.json b/examples/p-ts/projects/p-ts-frontend/.vscode/launch.json new file mode 100644 index 0000000..7edaf04 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/.vscode/launch.json @@ -0,0 +1,68 @@ +{ + "configurations": [ + { + "type": "msedge", + "request": "launch", + "name": "Run (Edge)", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}", + "presentation": { + "hidden": false, + "group": "2. Web" + } + }, + { + "type": "chrome", + "request": "launch", + "name": "Run (Chrome)", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}", + "presentation": { + "hidden": false, + "group": "2. Web" + } + }, + { + "type": "firefox", + "request": "launch", + "name": "Run (Firefox)", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}", + "presentation": { + "hidden": false, + "group": "2. Web" + } + }, + { + "name": "Run dApp", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev"], + "cwd": "${workspaceRoot}", + "console": "integratedTerminal", + "skipFiles": ["/**", "node_modules/**"], + "presentation": { + "hidden": false, + "group": "1. Run Project", + "order": 1 + } + }, + { + "name": "Run dApp (+ LocalNet)", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev"], + "cwd": "${workspaceRoot}", + "console": "integratedTerminal", + "skipFiles": ["/**", "node_modules/**"], + "preLaunchTask": "Start AlgoKit LocalNet", + "presentation": { + "hidden": false, + "group": "1. Run Project", + "order": 1 + } + } + ] +} diff --git a/examples/p-ts/projects/p-ts-frontend/.vscode/settings.json b/examples/p-ts/projects/p-ts-frontend/.vscode/settings.json new file mode 100644 index 0000000..f1d7017 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/.vscode/settings.json @@ -0,0 +1,13 @@ +{ + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + "source.organizeImports": "explicit" + }, + "dotenv.enableAutocloaking": false, + "jest.autoRun": { + "watch": false, + "onSave": "test-file" + } +} diff --git a/examples/p-ts/projects/p-ts-frontend/.vscode/tasks.json b/examples/p-ts/projects/p-ts-frontend/.vscode/tasks.json new file mode 100644 index 0000000..d611c4f --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/.vscode/tasks.json @@ -0,0 +1,15 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Start AlgoKit LocalNet", + "command": "algokit", + "args": ["localnet", "start"], + "type": "shell", + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + } + ] +} diff --git a/examples/p-ts/projects/p-ts-frontend/README.md b/examples/p-ts/projects/p-ts-frontend/README.md new file mode 100644 index 0000000..ae242a6 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/README.md @@ -0,0 +1,124 @@ +# p-ts-frontend + +This starter React project has been generated using AlgoKit. See below for default getting started instructions. + +# Setup + +### Initial Setup + +#### 1. Clone the Repository +Start by cloning this repository to your local machine. + +#### 2. Install Pre-requisites +Ensure the following pre-requisites are installed and properly configured: + +- **npm**: Node package manager. Install from [Node.js Installation Guide](https://nodejs.org/en/download/). Verify with `npm -v` to see version `18.12`+. +- **AlgoKit CLI**: Essential for project setup and operations. Install the latest version from [AlgoKit CLI Installation Guide](https://github.com/algorandfoundation/algokit-cli#install). Verify installation with `algokit --version`, expecting `2.0.0` or later. + +#### 3. Bootstrap Your Local Environment +Run the following commands within the project folder: + +- **Install Project Dependencies**: With `algokit project bootstrap all`, ensure all dependencies are ready. + +### Development Workflow + +#### Terminal +Directly manage and interact with your project using AlgoKit commands: + +1. **Build Contracts**: `algokit project run build` builds react web app and links with smart contracts in workspace, if any. +2. Remaining set of command for linting, testing and deployment can be found in respective [package.json](./package.json) file and [.algokit.toml](./.algokit.toml) files. + +#### VS Code +For a seamless experience with breakpoint debugging and other features: + +1. **Open Project**: In VS Code, open the repository root. +2. **Install Extensions**: Follow prompts to install recommended extensions. +3. **Debugging**: + - Use `F5` to start debugging. + - **Windows Users**: Select the Python interpreter at `./.venv/Scripts/python.exe` via `Ctrl/Cmd + Shift + P` > `Python: Select Interpreter` before the first run. + +#### Other IDEs +While primarily optimized for VS Code, Jetbrains WebStorm has base support for this project: + +1. **Open Project**: In your JetBrains IDE, open the repository root. +2. **Automatic Setup**: The IDE should configure the Python interpreter and virtual environment. +3. **Debugging**: Use `Shift+F10` or `Ctrl+R` to start debugging. Note: Windows users may encounter issues with pre-launch tasks due to a known bug. See [JetBrains forums](https://youtrack.jetbrains.com/issue/IDEA-277486/Shell-script-configuration-cannot-run-as-before-launch-task) for workarounds. + +## AlgoKit Workspaces and Project Management +This project supports both standalone and monorepo setups through AlgoKit workspaces. Leverage [`algokit project run`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md) commands for efficient monorepo project orchestration and management across multiple projects within a workspace. + +> Please note, by default frontend is pre configured to run against Algorand LocalNet. If you want to run against TestNet or MainNet, comment out the current environment variable and uncomment the relevant one in [`.env`](.env) file that is created after running bootstrap command and based on [`.env.template`](.env.template). + +### Continuous Integration + +This project uses [GitHub Actions](https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions) to define CI workflows, which are located in the [.github/workflows](`../../.github/workflows`) folder. + +For pull requests and pushes to `main` branch against this repository the following checks are automatically performed by GitHub Actions: + +- `install`: Installs dependencies using `npm` +- `lint`: Lints the codebase using `ESLint` +- `build`: Builds the codebase using `vite` + +> Please note, if you instantiated the project via `algokit init` without explicitly specifying the `--no-workspace` flag, we will automatically attempt to move the contents of the `.github` folder to the root of the workspace. + +### Continuous Deployment + +The project template provides base Github Actions workflows for continuous deployment to [Netlify](https://www.netlify.com/) or [Vercel](https://vercel.com/). These workflows are located in the [`.github/workflows`](./.github/workflows) folder. + +**Please note**: when configuring the github repository for the first time. Depending on selected provider you will need to set the provider secrets in the repository settings. Default setup provided by the template allows you to manage the secrets via environment variables and secrets on your github repository. + + +#### Setting up environment variables and secrets for webapp deployment + +For Vercel: +1. Retrieve your [Vercel Access Token](https://vercel.com/support/articles/how-do-i-use-a-vercel-api-access-token) +2. Install the [Vercel CLI](https://vercel.com/cli) and run `vercel login` +3. Inside your folder, run `vercel link` to create a new Vercel project +4. Inside the generated `.vercel` folder, save the `projectId` and `orgId` from the `project.json` +5. Inside GitHub, add `VERCEL_TOKEN`, `VERCEL_ORG_ID`, and `VERCEL_PROJECT_ID` as [secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets). +6. Create an .env file containing ENV vars for the project (pointing to testnet or mainnet), drag and drop the .env file to upload initial batch of default environment variables to your vercel project. +7. Upon invocation, CD pipeline will pull the VITE_ prefixed environment variables, build the project and deploy to the specified environment. + +For Netlify: +1. Retrieve your [Netlify Access Token](https://docs.netlify.com/cli/get-started/#obtain-a-token-in-the-netlify-ui) +2. Inside your folder run `netlify login` +3. Inside your folder run `netlify sites:create` to create a new site, obtain NETLIFY_SITE_ID from the output +4. Inside GitHub, add `NETLIFY_AUTH_TOKEN` and `NETLIFY_SITE_ID` as [secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets). +5. Define the VITE_ prefixed environment variables in netlify environment variables under site settings. +6. Upon invocation, CD pipeline will build the project and deploy to the specified environment. + +> If you prefer alternative deployment methods, you can modify the relevant workflow files from the [`.github/workflows`](./.github/workflows) folder or modify deploy scripts in `.algokit.toml`. + + +# Algorand Wallet integrations + +The template comes with [`use-wallet`](https://github.com/txnlab/use-wallet) integration, which provides a React hook for connecting to an Algorand wallet providers. The following wallet providers are included by default: +- LocalNet: +- - [KMD/Local Wallet](https://github.com/TxnLab/use-wallet#kmd-algorand-key-management-daemon) - Algorand's Key Management Daemon (KMD) is a service that manages Algorand private keys and signs transactions. Works best with AlgoKit LocalNet and allows you to easily test and interact with your dApps locally. +- TestNet and others: +- - [Pera Wallet](https://perawallet.app). +- - [Defly Wallet](https://defly.app). +- - [Exodus Wallet](https://www.exodus.com). +- - [Daffi Wallet](https://www.daffi.me). + +Refer to official [`use-wallet`](https://github.com/txnlab/use-wallet) documentation for detailed guidelines on how to integrate with other wallet providers (such as WalletConnect v2). Too see implementation details on the use wallet hook and initialization of extra wallet providers refer to [`App.tsx`](./src/App.tsx). + +# Tools + +This project makes use of React and Tailwind to provider a base project configuration to develop frontends for your Algorand dApps and interactions with smart contracts. The following tools are in use: + +- [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-ts) - Various TypeScript utilities to simplify interactions with Algorand and AlgoKit. +- [React](https://reactjs.org/) - A JavaScript library for building user interfaces. +- [Tailwind CSS](https://tailwindcss.com/) - A utility-first CSS framework for rapidly building custom designs. +- [daisyUI](https://daisyui.com/) - A component library for Tailwind CSS. +- [use-wallet](https://github.com/txnlab/use-wallet) - A React hook for connecting to an Algorand wallet providers. +- [npm](https://www.npmjs.com/): Node.js package manager +- [jest](https://jestjs.io/): JavaScript testing framework +- [playwright](https://playwright.dev/): Browser automation library +- [Prettier](https://prettier.io/): Opinionated code formatter +- [ESLint](https://eslint.org/): Tool for identifying and reporting on patterns in JavaScript +- Github Actions workflows for build validation +It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. +# Integrating with smart contracts and application clients + +Refer to the detailed guidance on [integrating with smart contracts and application clients](./src/contracts/README.md). In essence, for any smart contract codebase generated with AlgoKit or other tools that produce compile contracts into ARC34 compliant app specifications, you can use the `algokit generate` command to generate TypeScript or Python typed client. Once generated simply drag and drop the generated client into `./src/contracts` and import it into your React components as you see fit. diff --git a/examples/p-ts/projects/p-ts-frontend/index.html b/examples/p-ts/projects/p-ts-frontend/index.html new file mode 100644 index 0000000..5a2ef4f --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/index.html @@ -0,0 +1,12 @@ + + + + + + AlgoKit React Template + + +
+ + + diff --git a/examples/p-ts/projects/p-ts-frontend/jest.config.ts b/examples/p-ts/projects/p-ts-frontend/jest.config.ts new file mode 100644 index 0000000..28a8c3d --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/jest.config.ts @@ -0,0 +1,20 @@ +import type { Config } from '@jest/types' + +const config: Config.InitialOptions = { + preset: 'ts-jest', + testEnvironment: 'node', + testMatch: ['**/*.spec.ts', '**/*.spec.tsx'], + moduleDirectories: ['node_modules', 'src'], + transform: { + '': [ + 'ts-jest', + { + tsconfig: 'tsconfig.test.json', + }, + ], + }, + coveragePathIgnorePatterns: ['tests'], + testPathIgnorePatterns: ['/tests/'], + } + +export default config diff --git a/examples/p-ts/projects/p-ts-frontend/package.json b/examples/p-ts/projects/p-ts-frontend/package.json new file mode 100644 index 0000000..0592346 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/package.json @@ -0,0 +1,81 @@ +{ + "name": "p-ts-frontend", + "version": "0.1.0", + "author": { + "name": "None", + "email": "None" + }, + "private": true, + "type": "module", + "engines": { + "node": ">=20.0", + "npm": ">=9.0" + }, + "devDependencies": { + "@algorandfoundation/algokit-client-generator": "^5.0.0", + "@types/node": "^18.17.14", + "@types/react": "^18.2.11", + "@types/react-dom": "^18.2.4", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.14", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.1.3", + "@typescript-eslint/eslint-plugin": "^7.0.2", + "@typescript-eslint/parser": "^7.0.2", + "postcss": "^8.4.24", + "tailwindcss": "3.3.2", + "ts-jest": "^29.1.1", + "@types/jest": "29.5.2", + "ts-node": "^10.9.1", + "typescript": "^5.1.6", + "@playwright/test": "^1.35.0", + "playwright": "^1.35.0", + "vite": "^5.0.0", + "vite-plugin-node-polyfills": "^0.22.0" + }, + "dependencies": { + "@algorandfoundation/algokit-utils": "^9.0.0", + "@blockshake/defly-connect": "^1.2.1", + "@perawallet/connect": "^1.4.1", + "@txnlab/use-wallet": "^4.0.0", + "@txnlab/use-wallet-react": "^4.0.0", + "algosdk": "^3.0.0", + "daisyui": "^4.0.0", + "notistack": "^3.0.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "tslib": "^2.6.2" + }, + "scripts": { + "generate:app-clients": "algokit project link --all", + "dev": "npm run generate:app-clients && vite", + "build": "npm run generate:app-clients && tsc && vite build", + "test": "jest --coverage --passWithNoTests", + "playwright:test": "playwright test", + "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "lint:fix": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0 --fix", + "preview": "vite preview" + }, + "eslintConfig": { + "extends": [ + "react-app/jest", + "react-app" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "overrides": { + "ws@>7.0.0 <7.5.9": "7.5.10" + } +} diff --git a/examples/p-ts/projects/p-ts-frontend/playwright.config.ts b/examples/p-ts/projects/p-ts-frontend/playwright.config.ts new file mode 100644 index 0000000..d7cbca6 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/playwright.config.ts @@ -0,0 +1,73 @@ +import { defineConfig, devices } from '@playwright/test' + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './tests', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + // baseURL: 'http://127.0.0.1:3000', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + testIdAttribute: 'data-test-id', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, + }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ..devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: 'npm run dev', + url: 'http://localhost:5173', + reuseExistingServer: !process.env.CI, + }, +}) diff --git a/examples/p-ts/projects/p-ts-frontend/postcss.config.cjs b/examples/p-ts/projects/p-ts-frontend/postcss.config.cjs new file mode 100644 index 0000000..33ad091 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/postcss.config.cjs @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/examples/p-ts/projects/p-ts-frontend/public/index.html b/examples/p-ts/projects/p-ts-frontend/public/index.html new file mode 100644 index 0000000..0d3a3a5 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/public/index.html @@ -0,0 +1,37 @@ + + + + + + + + + + React App + + + +
+ + + diff --git a/examples/p-ts/projects/p-ts-frontend/public/robots.txt b/examples/p-ts/projects/p-ts-frontend/public/robots.txt new file mode 100644 index 0000000..e9e57dc --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/examples/p-ts/projects/p-ts-frontend/src/App.tsx b/examples/p-ts/projects/p-ts-frontend/src/App.tsx new file mode 100644 index 0000000..f346006 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/src/App.tsx @@ -0,0 +1,56 @@ +import { SupportedWallet, WalletId, WalletManager, WalletProvider } from '@txnlab/use-wallet-react' +import { SnackbarProvider } from 'notistack' +import Home from './Home' +import { getAlgodConfigFromViteEnvironment, getKmdConfigFromViteEnvironment } from './utils/network/getAlgoClientConfigs' + +let supportedWallets: SupportedWallet[] +if (import.meta.env.VITE_ALGOD_NETWORK === 'localnet') { + const kmdConfig = getKmdConfigFromViteEnvironment() + supportedWallets = [ + { + id: WalletId.KMD, + options: { + baseServer: kmdConfig.server, + token: String(kmdConfig.token), + port: String(kmdConfig.port), + }, + }, + ] +} else { + supportedWallets = [ + { id: WalletId.DEFLY }, + { id: WalletId.PERA }, + { id: WalletId.EXODUS }, + // If you are interested in WalletConnect v2 provider + // refer to https://github.com/TxnLab/use-wallet for detailed integration instructions + ] +} + +export default function App() { + const algodConfig = getAlgodConfigFromViteEnvironment() + + const walletManager = new WalletManager({ + wallets: supportedWallets, + defaultNetwork: algodConfig.network, + networks: { + [algodConfig.network]: { + algod: { + baseServer: algodConfig.server, + port: algodConfig.port, + token: String(algodConfig.token), + }, + }, + }, + options: { + resetNetwork: true, + }, + }) + + return ( + + + + + + ) +} diff --git a/examples/p-ts/inject_content/Home.tsx b/examples/p-ts/projects/p-ts-frontend/src/Home.tsx similarity index 100% rename from examples/p-ts/inject_content/Home.tsx rename to examples/p-ts/projects/p-ts-frontend/src/Home.tsx diff --git a/examples/p-ts/projects/p-ts-frontend/src/assets/logo.svg b/examples/p-ts/projects/p-ts-frontend/src/assets/logo.svg new file mode 100644 index 0000000..7169476 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/src/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/examples/p-ts/projects/p-ts-frontend/src/components/Account.tsx b/examples/p-ts/projects/p-ts-frontend/src/components/Account.tsx new file mode 100644 index 0000000..081ce47 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/src/components/Account.tsx @@ -0,0 +1,24 @@ +import { useWallet } from '@txnlab/use-wallet-react' +import { useMemo } from 'react' +import { ellipseAddress } from '../utils/ellipseAddress' +import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' + +const Account = () => { + const { activeAddress } = useWallet() + const algoConfig = getAlgodConfigFromViteEnvironment() + + const networkName = useMemo(() => { + return algoConfig.network === '' ? 'localnet' : algoConfig.network.toLocaleLowerCase() + }, [algoConfig.network]) + + return ( +
+ ) +} + +export default Account diff --git a/examples/p-ts/inject_content/AppCalls.tsx b/examples/p-ts/projects/p-ts-frontend/src/components/AppCalls.tsx similarity index 100% rename from examples/p-ts/inject_content/AppCalls.tsx rename to examples/p-ts/projects/p-ts-frontend/src/components/AppCalls.tsx diff --git a/examples/p-ts/projects/p-ts-frontend/src/components/ConnectWallet.tsx b/examples/p-ts/projects/p-ts-frontend/src/components/ConnectWallet.tsx new file mode 100644 index 0000000..8ff01dc --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/src/components/ConnectWallet.tsx @@ -0,0 +1,86 @@ +import { useWallet, Wallet, WalletId } from '@txnlab/use-wallet-react' +import Account from './Account' + +interface ConnectWalletInterface { + openModal: boolean + closeModal: () => void +} + +const ConnectWallet = ({ openModal, closeModal }: ConnectWalletInterface) => { + const { wallets, activeAddress } = useWallet() + + const isKmd = (wallet: Wallet) => wallet.id === WalletId.KMD + + return ( + +
+

Select wallet provider

+ +
+ {activeAddress && ( + <> + +
+ + )} + + {!activeAddress && + wallets?.map((wallet) => ( + + ))} +
+ +
+ + {activeAddress && ( + + )} +
+ +
+ ) +} +export default ConnectWallet diff --git a/examples/p-ts/projects/p-ts-frontend/src/components/ErrorBoundary.tsx b/examples/p-ts/projects/p-ts-frontend/src/components/ErrorBoundary.tsx new file mode 100644 index 0000000..435bf61 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/src/components/ErrorBoundary.tsx @@ -0,0 +1,46 @@ +import React, { ReactNode } from 'react' + +interface ErrorBoundaryProps { + children: ReactNode +} + +interface ErrorBoundaryState { + hasError: boolean + error: Error | null +} + +class ErrorBoundary extends React.Component { + constructor(props: ErrorBoundaryProps) { + super(props) + this.state = { hasError: false, error: null } + } + + static getDerivedStateFromError(error: Error): ErrorBoundaryState { + // Update state so the next render will show the fallback UI. + return { hasError: true, error: error } + } + + render(): ReactNode { + if (this.state.hasError) { + // You can render any custom fallback UI + return ( +
+
+
+

Error occured

+

+ {this.state.error?.message.includes('Attempt to get default algod configuration') + ? 'Please make sure to set up your environment variables correctly. Create a .env file based on .env.template and fill in the required values. This controls the network and credentials for connections with Algod and Indexer.' + : this.state.error?.message} +

+
+
+
+ ) + } + + return this.props.children + } +} + +export default ErrorBoundary diff --git a/examples/p-ts/projects/p-ts-frontend/src/components/Transact.tsx b/examples/p-ts/projects/p-ts-frontend/src/components/Transact.tsx new file mode 100644 index 0000000..2ba3e96 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/src/components/Transact.tsx @@ -0,0 +1,80 @@ +import { algo, AlgorandClient } from '@algorandfoundation/algokit-utils' +import { useWallet } from '@txnlab/use-wallet-react' +import { useSnackbar } from 'notistack' +import { useState } from 'react' +import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' + +interface TransactInterface { + openModal: boolean + setModalState: (value: boolean) => void +} + +const Transact = ({ openModal, setModalState }: TransactInterface) => { + const [loading, setLoading] = useState(false) + const [receiverAddress, setReceiverAddress] = useState('') + + const algodConfig = getAlgodConfigFromViteEnvironment() + const algorand = AlgorandClient.fromConfig({ algodConfig }) + + const { enqueueSnackbar } = useSnackbar() + + const { transactionSigner, activeAddress } = useWallet() + + const handleSubmitAlgo = async () => { + setLoading(true) + + if (!transactionSigner || !activeAddress) { + enqueueSnackbar('Please connect wallet first', { variant: 'warning' }) + return + } + + try { + enqueueSnackbar('Sending transaction...', { variant: 'info' }) + const result = await algorand.send.payment({ + signer: transactionSigner, + sender: activeAddress, + receiver: receiverAddress, + amount: algo(1), + }) + enqueueSnackbar(`Transaction sent: ${result.txIds[0]}`, { variant: 'success' }) + setReceiverAddress('') + } catch (e) { + enqueueSnackbar('Failed to send transaction', { variant: 'error' }) + } + + setLoading(false) + } + + return ( + +
+

Send payment transaction

+
+ { + setReceiverAddress(e.target.value) + }} + /> +
+ + +
+
+
+ ) +} + +export default Transact diff --git a/examples/p-ts/projects/p-ts-frontend/src/contracts/HelloWorld.ts b/examples/p-ts/projects/p-ts-frontend/src/contracts/HelloWorld.ts new file mode 100644 index 0000000..5b0f375 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/src/contracts/HelloWorld.ts @@ -0,0 +1,581 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^7 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app' +import { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56' +import { + AppClient as _AppClient, + AppClientMethodCallParams, + AppClientParams, + AppClientBareCallParams, + CallOnComplete, + AppClientCompilationParams, + ResolveAppClientByCreatorAndName, + ResolveAppClientByNetwork, + CloneAppClientParams, +} from '@algorandfoundation/algokit-utils/types/app-client' +import { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer' +import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' +import SimulateResponse = modelsv2.SimulateResponse + +export const APP_SPEC: Arc56Contract = {"name":"HelloWorld","structs":{},"methods":[{"name":"hello","args":[{"type":"string","name":"name"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[37],"errorMessage":"OnCompletion must be NoOp && can only call when creating"},{"pc":[26],"errorMessage":"OnCompletion must be NoOp && can only call when not creating"},{"pc":[47],"errorMessage":"invalid array length header"},{"pc":[55],"errorMessage":"invalid number of bytes for arc4.dynamic_array"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgSGVsbG9Xb3JsZCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2hlbGxvX3JvdXRlQDMKICAgIGVycgoKbWFpbl9oZWxsb19yb3V0ZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gcHVibGljIGhlbGxvKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGIgaGVsbG8KCm1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgSGVsbG9Xb3JsZCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LmFsZ28udHM6OkhlbGxvV29ybGQuaGVsbG9bcm91dGluZ10oKSAtPiB2b2lkOgpoZWxsbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIHB1YmxpYyBoZWxsbyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBwdXNoaW50IDAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5hbGdvLnRzOjUKICAgIC8vIHJldHVybiBgSGVsbG8sICR7bmFtZX1gCiAgICBwdXNoYnl0ZXMgIkhlbGxvLCAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIHB1YmxpYyBoZWxsbyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcgewogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgAQCvs4RNhoAjgEAAQAxGRQxGBBEQgALMRkUMRgUEESBAUM2GgFJgQBZgQIISwEVEkRXAgCAB0hlbGxvLCBMUEkVFlcGAkxQgAQVH3x1TFCwgQFD","clear":"C4EBQw=="},"compilerInfo":{"compiler":"puya","compilerVersion":{"major":5,"minor":3,"patch":2}},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the HelloWorld contract + */ +export type HelloWorldArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'hello(string)string': { + name: string + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'hello(string)string': [name: string] + } +} + +/** + * The return type for each method + */ +export type HelloWorldReturns = { + 'hello(string)string': string +} + +/** + * Defines the types of available calls and state of the HelloWorld smart contract. + */ +export type HelloWorldTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'hello(string)string' | 'hello', { + argsObj: HelloWorldArgs['obj']['hello(string)string'] + argsTuple: HelloWorldArgs['tuple']['hello(string)string'] + returns: HelloWorldReturns['hello(string)string'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type HelloWorldSignatures = keyof HelloWorldTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type HelloWorldNonVoidMethodSignatures = keyof HelloWorldTypes['methods'] extends infer T ? T extends keyof HelloWorldTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the HelloWorld smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = HelloWorldTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the HelloWorld smart contract to the method's return type + */ +export type MethodReturn = HelloWorldTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type HelloWorldCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type HelloWorldDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: HelloWorldCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the HelloWorld smart contract + */ +export abstract class HelloWorldParamsFactory { + /** + * Constructs a no op call for the hello(string)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static hello(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'hello(string)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.name], + } + } +} + +/** + * A factory to create and deploy one or more instance of the HelloWorld smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class HelloWorldFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `HelloWorldFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new HelloWorldClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new HelloWorldClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the HelloWorld smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: HelloWorldDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new HelloWorldClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the HelloWorld smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the HelloWorld smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the HelloWorld smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new HelloWorldClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the HelloWorld smart contract + */ +export class HelloWorldClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `HelloWorldClient` + * + * @param appClient An `AppClient` instance which has been created with the HelloWorld app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `HelloWorldClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Checks for decode errors on the given return value and maps the return value to the return type for the given method + * @returns The typed return value or undefined if there was no value + */ + decodeReturnValue(method: TSignature, returnValue: ABIReturn | undefined) { + return returnValue !== undefined ? getArc56ReturnValue>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined + } + + /** + * Returns a new `HelloWorldClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new HelloWorldClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `HelloWorldClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new HelloWorldClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the HelloWorld smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(HelloWorldParamsFactory.hello(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the HelloWorld smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(HelloWorldParamsFactory.hello(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the HelloWorld smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + hello: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(HelloWorldParamsFactory.hello(params)) + return {...result, return: result.return as unknown as (undefined | HelloWorldReturns['hello(string)string'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new HelloWorldClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current HelloWorld app + */ + state = { + } + + public newGroup(): HelloWorldComposer { + const client = this + const composer = this.algorand.newGroup() + let promiseChain:Promise = Promise.resolve() + const resultMappers: Array any)> = [] + return { + /** + * Add a hello(string)string method call against the HelloWorld contract + */ + hello(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hello(params))) + resultMappers.push((v) => client.decodeReturnValue('hello(string)string', v)) + return this + }, + /** + * Add a clear state call to the HelloWorld contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + } + } + } as unknown as HelloWorldComposer + } +} +export type HelloWorldComposer = { + /** + * Calls the hello(string)string ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + hello(params?: CallParams): HelloWorldComposer<[...TReturns, HelloWorldReturns['hello(string)string'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the HelloWorld smart contract. + * + * @param args The arguments for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): HelloWorldComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): HelloWorldComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type HelloWorldComposerResults = Expand + diff --git a/examples/p-ts/projects/p-ts-frontend/src/contracts/README.md b/examples/p-ts/projects/p-ts-frontend/src/contracts/README.md new file mode 100644 index 0000000..04629b1 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/src/contracts/README.md @@ -0,0 +1,14 @@ +## How to connect my web app with Algorand smart contracts? + +The following folder is reserved for the Algorand Application Clients. The clients are used to interact with instances of Algorand Smart Contracts (ASC1s) deployed on-chain. + +To integrate this react frontend template with your smart contracts codebase, perform the following steps: + +1. Generate the typed client using `algokit generate client -l typescript -o {path/to/this/folder}` or using the dedicated `link` command `algokit project link` (ensure to invoke it from the root of this react project). Using the `link` command is especially useful within workspaces that have multiple contract projects. +2. The generated typescript client should be ready to be imported and used in this react frontend template, making it a full fledged dApp. + +> Please note, by default this template defines `"generate:app-clients": "algokit project link --all"` which is a shortcut to automatically link TEAL code from all `contract` projects in the workspace as typed clients into the `frontend` project that is invoking the `link` command. Refer to [documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/link.md) to read more about `link` command. + +## **How to interact with the smart contract?** + +The generated client provides a set of functions that can be used to interact with the ABI (Application Binary Interface) compliant Algorand smart contract. For example, if the smart contract has a function called `hello`, the generated client will have a function called `hello` that can be used to interact with the smart contract. Refer to a [full-stack end-to-end starter template](https://github.com/algorandfoundation/algokit-fullstack-template) for a reference example on invoking and interacting with typescript typed clients generated. diff --git a/examples/p-ts/projects/p-ts-frontend/src/interfaces/network.ts b/examples/p-ts/projects/p-ts-frontend/src/interfaces/network.ts new file mode 100644 index 0000000..a458edc --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/src/interfaces/network.ts @@ -0,0 +1,26 @@ +import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/types/network-client' +import type { TokenHeader } from 'algosdk/dist/types/client/urlTokenBaseHTTPClient' + +export interface AlgoViteClientConfig extends AlgoClientConfig { + /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ + server: string + /** The port to use e.g. 4001, 443, etc. */ + port: string | number + /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ + token: string | TokenHeader + /** String representing current Algorand Network type (testnet/mainnet and etc) */ + network: string +} + +export interface AlgoViteKMDConfig extends AlgoClientConfig { + /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ + server: string + /** The port to use e.g. 4001, 443, etc. */ + port: string | number + /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ + token: string | TokenHeader + /** KMD wallet name */ + wallet: string + /** KMD wallet password */ + password: string +} diff --git a/examples/p-ts/projects/p-ts-frontend/src/main.tsx b/examples/p-ts/projects/p-ts-frontend/src/main.tsx new file mode 100644 index 0000000..adf72ec --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/src/main.tsx @@ -0,0 +1,13 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App' +import './styles/main.css' +import ErrorBoundary from './components/ErrorBoundary' + +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + + + + + , +) diff --git a/examples/p-ts/projects/p-ts-frontend/src/styles/main.css b/examples/p-ts/projects/p-ts-frontend/src/styles/main.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/src/styles/main.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/examples/p-ts/projects/p-ts-frontend/src/utils/ellipseAddress.spec.tsx b/examples/p-ts/projects/p-ts-frontend/src/utils/ellipseAddress.spec.tsx new file mode 100644 index 0000000..2cbff10 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/src/utils/ellipseAddress.spec.tsx @@ -0,0 +1,15 @@ +import { ellipseAddress } from './ellipseAddress' + +describe('ellipseAddress', () => { + it('should return ellipsed address with specified width', () => { + const address = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + const result = ellipseAddress(address, 4) + expect(result).toBe('aaaa...aaaa') + }) + + it('should return empty string when address is empty', () => { + const address = '' + const result = ellipseAddress(address) + expect(result).toBe('') + }) +}) diff --git a/examples/p-ts/projects/p-ts-frontend/src/utils/ellipseAddress.ts b/examples/p-ts/projects/p-ts-frontend/src/utils/ellipseAddress.ts new file mode 100644 index 0000000..db97e48 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/src/utils/ellipseAddress.ts @@ -0,0 +1,3 @@ +export function ellipseAddress(address: string | null, width = 6): string { + return address ? `${address.slice(0, width)}...${address.slice(-width)}` : (address ?? '') +} diff --git a/examples/p-ts/projects/p-ts-frontend/src/utils/network/getAlgoClientConfigs.ts b/examples/p-ts/projects/p-ts-frontend/src/utils/network/getAlgoClientConfigs.ts new file mode 100644 index 0000000..b5121f8 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/src/utils/network/getAlgoClientConfigs.ts @@ -0,0 +1,41 @@ +import { AlgoViteClientConfig, AlgoViteKMDConfig } from '../../interfaces/network' + +export function getAlgodConfigFromViteEnvironment(): AlgoViteClientConfig { + if (!import.meta.env.VITE_ALGOD_SERVER) { + throw new Error('Attempt to get default algod configuration without specifying VITE_ALGOD_SERVER in the environment variables') + } + + return { + server: import.meta.env.VITE_ALGOD_SERVER, + port: import.meta.env.VITE_ALGOD_PORT, + token: import.meta.env.VITE_ALGOD_TOKEN, + network: import.meta.env.VITE_ALGOD_NETWORK, + } +} + +export function getIndexerConfigFromViteEnvironment(): AlgoViteClientConfig { + if (!import.meta.env.VITE_INDEXER_SERVER) { + throw new Error('Attempt to get default algod configuration without specifying VITE_INDEXER_SERVER in the environment variables') + } + + return { + server: import.meta.env.VITE_INDEXER_SERVER, + port: import.meta.env.VITE_INDEXER_PORT, + token: import.meta.env.VITE_INDEXER_TOKEN, + network: import.meta.env.VITE_ALGOD_NETWORK, + } +} + +export function getKmdConfigFromViteEnvironment(): AlgoViteKMDConfig { + if (!import.meta.env.VITE_KMD_SERVER) { + throw new Error('Attempt to get default kmd configuration without specifying VITE_KMD_SERVER in the environment variables') + } + + return { + server: import.meta.env.VITE_KMD_SERVER, + port: import.meta.env.VITE_KMD_PORT, + token: import.meta.env.VITE_KMD_TOKEN, + wallet: import.meta.env.VITE_KMD_WALLET, + password: import.meta.env.VITE_KMD_PASSWORD, + } +} diff --git a/examples/p-ts/projects/p-ts-frontend/src/vite-env.d.ts b/examples/p-ts/projects/p-ts-frontend/src/vite-env.d.ts new file mode 100644 index 0000000..67c2d30 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/src/vite-env.d.ts @@ -0,0 +1,24 @@ +/// + +interface ImportMetaEnv { + readonly VITE_ENVIRONMENT: string + + readonly VITE_ALGOD_TOKEN: string + readonly VITE_ALGOD_SERVER: string + readonly VITE_ALGOD_PORT: string + readonly VITE_ALGOD_NETWORK: string + + readonly VITE_INDEXER_TOKEN: string + readonly VITE_INDEXER_SERVER: string + readonly VITE_INDEXER_PORT: string + + readonly VITE_KMD_TOKEN: string + readonly VITE_KMD_SERVER: string + readonly VITE_KMD_PORT: string + readonly VITE_KMD_PASSWORD: string + readonly VITE_KMD_WALLET: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/examples/p-ts/projects/p-ts-frontend/tailwind.config.cjs b/examples/p-ts/projects/p-ts-frontend/tailwind.config.cjs new file mode 100644 index 0000000..eaaba6c --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/tailwind.config.cjs @@ -0,0 +1,12 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ['./src/**/*.{js,ts,jsx,tsx}'], + theme: { + extend: {}, + }, + daisyui: { + themes: ['lofi'], + logs: false, + }, + plugins: [require('daisyui')], +} diff --git a/examples/p-ts/projects/p-ts-frontend/tests/example.spec.ts b/examples/p-ts/projects/p-ts-frontend/tests/example.spec.ts new file mode 100644 index 0000000..a62aae4 --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/tests/example.spec.ts @@ -0,0 +1,40 @@ +import { algorandFixture } from '@algorandfoundation/algokit-utils/testing' +import { expect, test } from '@playwright/test' + +const localnet = algorandFixture() + +test.beforeEach(async ({ page }) => { + await localnet.newScope() + await page.goto('http://localhost:5173/') +}) + +test('has title', async ({ page }) => { + // Expect a title "to contain" a substring. + await expect(page).toHaveTitle('AlgoKit React Template') +}) + +test('get started link', async ({ page }) => { + await expect(page.getByTestId('getting-started')).toHaveText('Getting started') +}) + +test('authentication and dummy payment transaction', async ({ page }) => { + page.on('dialog', async (dialog) => { + dialog.message() === 'KMD password' ? await dialog.accept() : await dialog.dismiss() + }) + + // 1. Must be able to connect to a KMD wallet provider + await page.getByTestId('connect-wallet').click() + await page.getByTestId('kmd-connect').click() + await page.getByTestId('close-wallet-modal').click() + + // 2. Must be able to send a dummy payment transaction + await page.getByTestId('transactions-demo').click() + + await page.getByTestId('receiver-address').fill(localnet.context.testAccount.toString()) + await page.getByTestId('send-algo').click() + + // 3. Must be able to see a notification that the transaction was sent + const notification = await page.getByText('Transaction sent:') + await notification.waitFor() + expect(notification).toBeTruthy() +}) diff --git a/examples/p-ts/projects/p-ts-frontend/tsconfig.json b/examples/p-ts/projects/p-ts-frontend/tsconfig.json new file mode 100644 index 0000000..5cde02a --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/tsconfig.json @@ -0,0 +1,38 @@ +{ + "compilerOptions": { + "target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + "module": "ES2022" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + "declaration": true /* Generates corresponding '.d.ts' file. */, + "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, + "sourceMap": true /* Generates corresponding '.map' file. */, + "strict": true /* Enable all strict type-checking options. */, + "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, + "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, + "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */, + "skipLibCheck": true /* Skip type checking of declaration files. */, + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, + "allowJs": false, + "allowSyntheticDefaultImports": true, + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "outDir": "./dist/" + }, + "include": [ + "src/**/*.ts", + "src/**/*.tsx", + "vite.config.js", + "src/utils/ellipseAddress.spec.tsx", + "src/utils/ellipseAddress.spec.tsx", + "src/main.tsx", + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/examples/p-ts/projects/p-ts-frontend/tsconfig.node.json b/examples/p-ts/projects/p-ts-frontend/tsconfig.node.json new file mode 100644 index 0000000..9d31e2a --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/examples/p-ts/projects/p-ts-frontend/vite.config.ts b/examples/p-ts/projects/p-ts-frontend/vite.config.ts new file mode 100644 index 0000000..e42dc7c --- /dev/null +++ b/examples/p-ts/projects/p-ts-frontend/vite.config.ts @@ -0,0 +1,15 @@ +import react from '@vitejs/plugin-react' +import { defineConfig } from 'vite' +import { nodePolyfills } from 'vite-plugin-node-polyfills' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + react(), + nodePolyfills({ + globals: { + Buffer: true, + }, + }), + ], +}) diff --git a/examples/s-py/.algokit/.copier-answers.yml b/examples/s-py/.algokit/.copier-answers.yml index b9b0549..ec84665 100644 --- a/examples/s-py/.algokit/.copier-answers.yml +++ b/examples/s-py/.algokit/.copier-answers.yml @@ -1,6 +1,6 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 2.1.8-11-g7668422 -_src_path: /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template +_commit: +_src_path: author_email: None author_name: None contract_name: hello_world diff --git a/examples/s-py/.algokit/generators/create-devcontainer/copier.yaml b/examples/s-py/.algokit/generators/create-devcontainer/copier.yaml new file mode 100644 index 0000000..e98f334 --- /dev/null +++ b/examples/s-py/.algokit/generators/create-devcontainer/copier.yaml @@ -0,0 +1,4 @@ +_tasks: + - "echo '==== Successfully generated new .devcontainer.json file 🚀 ===='" + +_templates_suffix: ".j2" diff --git a/examples/s-py/.algokit/generators/create-devcontainer/devcontainer.json b/examples/s-py/.algokit/generators/create-devcontainer/devcontainer.json new file mode 100644 index 0000000..6452c65 --- /dev/null +++ b/examples/s-py/.algokit/generators/create-devcontainer/devcontainer.json @@ -0,0 +1,19 @@ +{ + "forwardPorts": [4001, 4002, 8980, 5173], + "portsAttributes": { + "4001": { + "label": "algod" + }, + "4002": { + "label": "kmd" + }, + "8980": { + "label": "indexer" + }, + "5173": { + "label": "vite" + } + }, + "postCreateCommand": "mkdir -p ~/.config/algokit && pipx install algokit && sudo chown -R codespace:codespace ~/.config/algokit", + "postStartCommand": "for i in {1..5}; do algokit localnet status > /dev/null 2>&1 && break || sleep 30; algokit localnet reset; done" +} diff --git a/examples/s-py/.editorconfig b/examples/s-py/.editorconfig new file mode 100644 index 0000000..5e550a1 --- /dev/null +++ b/examples/s-py/.editorconfig @@ -0,0 +1,10 @@ +[*] +charset = utf-8 +insert_final_newline = true +end_of_line = lf +indent_style = space +indent_size = 2 +tab_width = 2 +max_line_length = 140 +trim_trailing_whitespace = true +single_quote = true diff --git a/examples/s-py/.gitattributes b/examples/s-py/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/examples/s-py/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/examples/s-py/.gitignore b/examples/s-py/.gitignore new file mode 100644 index 0000000..4105eb2 --- /dev/null +++ b/examples/s-py/.gitignore @@ -0,0 +1,170 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Ruff (linter) +.ruff_cache/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +.idea/ +!.idea/runConfigurations + +# macOS +.DS_Store + +# Received approval test files +*.received.* + +# NPM +node_modules + diff --git a/examples/s-py/copy_files.sh b/examples/s-py/copy_files.sh deleted file mode 100644 index 749b01f..0000000 --- a/examples/s-py/copy_files.sh +++ /dev/null @@ -1,23 +0,0 @@ - -#!/bin/bash -# Script to copy required files to the frontend project -# Usage: ./copy_files.sh - - -project_name="$1" -frontend_root="./projects/${project_name}-frontend" - -# Ensure directories exist -mkdir -p "${frontend_root}/src/components" - -# Copy files -cp "./inject_content/Home.tsx" "${frontend_root}/src/Home.tsx" -cp "./inject_content/AppCalls.tsx" "${frontend_root}/src/components/AppCalls.tsx" - -echo "Template completed successfully!" -# remove inject_content folder -rm -rf "./inject_content" -# self destruct the file -rm -f "$0" - - diff --git a/examples/s-py/projects/.gitkeep b/examples/s-py/projects/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/examples/s-py/projects/s-py-contracts/.algokit.toml b/examples/s-py/projects/s-py-contracts/.algokit.toml new file mode 100644 index 0000000..57fc076 --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/.algokit.toml @@ -0,0 +1,46 @@ +[algokit] +min_version = "v2.0.0" + +[generate.smart-contract] +description = "Generate a new smart contract for existing project" +path = ".algokit/generators/create_contract" + +[generate.env-file] +description = "Generate a new generic or Algorand network specific .env file" +path = ".algokit/generators/create_env_file" + +[project] +type = 'contract' +name = 's-py-contracts' +artifacts = 'smart_contracts/artifacts' + +[project.deploy] +command = "npm run deploy:ci" + +[project.deploy.testnet] +environment_secrets = [ + "DEPLOYER_MNEMONIC", +] + +[project.deploy.mainnet] +environment_secrets = [ + "DEPLOYER_MNEMONIC", +] + +[project.run] +# Commands intented for use locally and in CI +build = { commands = [ + 'poetry run python -m smart_contracts build', +], description = 'Build all smart contracts in the project' } +lint = { commands = [ +], description = 'Perform linting' } +audit-teal = { commands = [ + # 🚨 IMPORTANT 🚨: For strict TEAL validation, remove --exclude statements. The default starter contract is not for production. Ensure thorough testing and adherence to best practices in smart contract development. This is not a replacement for a professional audit. + 'algokit task analyze smart_contracts/artifacts --recursive --force --exclude rekey-to --exclude is-updatable --exclude missing-fee-check --exclude is-deletable --exclude can-close-asset --exclude can-close-account --exclude unprotected-deletable --exclude unprotected-updatable', +], description = 'Audit TEAL files' } + +# Commands intented for CI only, prefixed with `ci-` by convention +ci-teal-diff = { commands = [ + 'git add -N ./smart_contracts/artifacts', + 'git diff --exit-code --minimal ./smart_contracts/artifacts', +], description = 'Check TEAL files for differences' } diff --git a/examples/s-py/projects/s-py-contracts/.algokit/.copier-answers.yml b/examples/s-py/projects/s-py-contracts/.algokit/.copier-answers.yml new file mode 100644 index 0000000..6c2b784 --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/.algokit/.copier-answers.yml @@ -0,0 +1,10 @@ +# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY +_commit: 1.8.1 +_src_path: gh:algorandfoundation/algokit-python-template +author_email: None +author_name: None +contract_name: hello_world +deployment_language: typescript +preset_name: starter +project_name: s-py-contracts + diff --git a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/copier.yaml b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/copier.yaml new file mode 100644 index 0000000..73805de --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/copier.yaml @@ -0,0 +1,10 @@ +_tasks: + - "echo '==== Successfully initialized new smart contract 🚀 ===='" + +contract_name: + type: str + help: Name of your new contract. + placeholder: "my-new-contract" + default: "my-new-contract" + +_templates_suffix: ".j2" diff --git a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.py.j2 b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.py.j2 new file mode 100644 index 0000000..829e3a0 --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.py.j2 @@ -0,0 +1,9 @@ +# pyright: reportMissingModuleSource=false +from algopy import ARC4Contract, String +from algopy.arc4 import abimethod + + +class {{ contract_name.split('_')|map('capitalize')|join }}(ARC4Contract): + @abimethod() + def hello(self, name: String) -> String: + return "Hello, " + name diff --git a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 new file mode 100644 index 0000000..11464e7 --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 @@ -0,0 +1,33 @@ +import { AlgorandClient } from '@algorandfoundation/algokit-utils' +import { {{ contract_name.split('_')|map('capitalize')|join }}Factory } from '../artifacts/{{ contract_name }}/{{ contract_name.split('_')|map('capitalize')|join }}Client' + +// Below is a showcase of various deployment options you can use in TypeScript Client +export async function deploy() { + console.log('=== Deploying {{ contract_name.split('_')|map('capitalize')|join }} ===') + + const algorand = AlgorandClient.fromEnvironment() + const deployer = await algorand.account.fromEnvironment('DEPLOYER') + + const factory = algorand.client.getTypedAppFactory({{ contract_name.split('_')|map('capitalize')|join }}Factory, { + defaultSender: deployer.addr, + }) + + const { appClient, result } = await factory.deploy({ onUpdate: 'append', onSchemaBreak: 'append' }) + + // If app was just created fund the app account + if (['create', 'replace'].includes(result.operationPerformed)) { + await algorand.send.payment({ + amount: (1).algo(), + sender: deployer.addr, + receiver: app.appAddress, + }) + } + + const method = 'hello' + const response = await appClient.send.hello({ + args: { name: 'world' }, + }) + console.log( + `Called ${method} on ${appClient.appClient.appName} (${appClient.appClient.appId}) with name = world, received: ${response.return}`, + ) +} diff --git a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/copier.yaml b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/copier.yaml new file mode 100644 index 0000000..afa2cac --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/copier.yaml @@ -0,0 +1,49 @@ +_tasks: + - "echo '==== Successfully generated new .env file 🚀 ===='" + +target_network: + type: str + help: Name of your target network. + choices: + - mainnet + - testnet + - localnet + - custom + default: "localnet" + when: "{{ not use_generic_env }}" + +custom_network_name: + type: str + help: Name of your custom Algorand network. + placeholder: "custom" + when: "{{ not use_generic_env and target_network == 'custom' }}" + +is_localnet: + type: bool + help: Whether to deploy on localnet. + placeholder: "true" + default: "{{ target_network == 'localnet' and not use_generic_env }}" + when: 'false' + +is_testnet: + type: bool + help: Whether to deploy on testnet. + placeholder: "true" + default: "{{ target_network == 'testnet' and not use_generic_env }}" + when: 'false' + +is_mainnet: + type: bool + help: Whether to deploy on mainnet. + placeholder: "true" + default: "{{ target_network == 'mainnet' and not use_generic_env }}" + when: 'false' + +is_customnet: + type: bool + help: Whether to deploy on custom network. + placeholder: "true" + default: "{{ target_network == 'custom' and not use_generic_env }}" + when: 'false' + +_templates_suffix: ".j2" diff --git a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} new file mode 100644 index 0000000..cfc9f21 --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} @@ -0,0 +1,7 @@ +# this file contains algorand network settings for interacting with testnet via algonode +ALGOD_TOKEN={YOUR_ALGOD_TOKEN} +ALGOD_SERVER={YOUR_ALGOD_SERVER_URL} +ALGOD_PORT={YOUR_ALGOD_PORT} +INDEXER_TOKEN={YOUR_INDEXER_TOKEN} +INDEXER_SERVER={YOUR_INDEXER_SERVER_URL} +INDEXER_PORT={YOUR_INDEXER_PORT} diff --git a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} new file mode 100644 index 0000000..fcbf442 --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} @@ -0,0 +1,7 @@ +# this file should contain environment variables specific to algokit localnet +ALGOD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +ALGOD_SERVER=http://localhost +ALGOD_PORT=4001 +INDEXER_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +INDEXER_SERVER=http://localhost +INDEXER_PORT=8980 diff --git a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} new file mode 100644 index 0000000..bb9a787 --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} @@ -0,0 +1,3 @@ +# this file contains algorand network settings for interacting with testnet via algonode +ALGOD_SERVER=https://mainnet-api.algonode.cloud +INDEXER_SERVER=https://mainnet-idx.algonode.cloud diff --git a/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} new file mode 100644 index 0000000..eeea43d --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} @@ -0,0 +1,3 @@ +# this file contains algorand network settings for interacting with testnet via algonode +ALGOD_SERVER=https://testnet-api.algonode.cloud +INDEXER_SERVER=https://testnet-idx.algonode.cloud diff --git a/examples/s-py/projects/s-py-contracts/.editorconfig b/examples/s-py/projects/s-py-contracts/.editorconfig new file mode 100644 index 0000000..e2fda34 --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/.editorconfig @@ -0,0 +1,10 @@ +root=true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true + +[*.py] +indent_size = 4 diff --git a/examples/s-py/projects/s-py-contracts/.gitignore b/examples/s-py/projects/s-py-contracts/.gitignore new file mode 100644 index 0000000..070829c --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/.gitignore @@ -0,0 +1,180 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ +coverage/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +.env.* +!.env.*.template +!.env.template +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Ruff (linter) +.ruff_cache/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +.idea +!.idea/ +.idea/* +!.idea/runConfigurations/ + +# macOS +.DS_Store + +# Received approval test files +*.received.* + +# NPM +node_modules + +# AlgoKit +debug_traces/ +.algokit/static-analysis/ # Replace with .algokit/static-analysis/tealer/ to enable snapshot checks in CI +.algokit/sources diff --git a/examples/s-py/projects/s-py-contracts/.npmrc b/examples/s-py/projects/s-py-contracts/.npmrc new file mode 100644 index 0000000..c42da84 --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/.npmrc @@ -0,0 +1 @@ +engine-strict = true diff --git a/examples/s-py/projects/s-py-contracts/.prettierignore b/examples/s-py/projects/s-py-contracts/.prettierignore new file mode 100644 index 0000000..dbda6ae --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/.prettierignore @@ -0,0 +1,12 @@ +# don't ever format node_modules +node_modules +# don't lint format output (make sure it's set to your correct build folder name) +dist +build +# don't format nyc coverage output +coverage +# don't format generated types +**/generated/types.d.ts +**/generated/types.ts +# don't format ide files +.idea diff --git a/examples/s-py/projects/s-py-contracts/.prettierrc.js b/examples/s-py/projects/s-py-contracts/.prettierrc.js new file mode 100644 index 0000000..c484d0e --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/.prettierrc.js @@ -0,0 +1,10 @@ +module.exports = { + singleQuote: true, + jsxSingleQuote: false, + semi: false, + tabWidth: 2, + trailingComma: 'all', + printWidth: 120, + endOfLine: 'lf', + arrowParens: 'always', +} diff --git a/examples/s-py/projects/s-py-contracts/.tours/getting-started-with-your-algokit-project.tour b/examples/s-py/projects/s-py-contracts/.tours/getting-started-with-your-algokit-project.tour new file mode 100644 index 0000000..4a58a5b --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/.tours/getting-started-with-your-algokit-project.tour @@ -0,0 +1,51 @@ +{ + "$schema": "https://aka.ms/codetour-schema", + "title": "Getting Started with Your AlgoKit Project", + "steps": [ + { + "file": "README.md", + "description": "Welcome to your brand new AlgoKit template-based project. In this tour, we will guide you through the main features and capabilities included in the template.", + "line": 3 + }, + { + "file": "README.md", + "description": "Start by ensuring you have followed the setup of pre-requisites.", + "line": 9 + }, + { + "file": ".algokit.toml", + "description": "This is the main configuration file used by algokit-cli to manage the project. The default template includes a starter 'Hello World' contract that is deployed via the `algokit-utils` package (either `ts` or `py`, depending on your choice). To create a new smart contract, you can use the [`algokit generate`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md) command and invoke a pre-bundled generator template by running `algokit generate smart-contract` (see how it is defined in the `.algokit.toml`, you can create your own generators if needed). This action will create a new folder in the `smart_contracts` directory, named after your project. Each folder contains a `contract.py` file, which is the entry point for your contract implementation, and `deploy_config.py` | `deployConfig.ts` files (depending on the language chosen for the template), that perform the deployment of the contract. Additionally you can define custom commands to run (similar to `npm` scripts), see definitions under `[project]` section in `.algokit.toml`.", + "line": 1 + }, + { + "file": "smart_contracts/hello_world/deploy-config.ts", + "description": "The default deployment scripts invoke a sample method on the starter contract that demonstrates how to interact with your deployed Algorand on-chain applications using the [`AlgoKit Typed Clients`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md#1-typed-clients) feature. The invocation if deploy is aliased in `.algokit.toml` file, allowing simple deployments via `algokit project deploy` command.", + "line": 32 + }, + { + "file": ".env.localnet.template", + "description": "Environment files are a crucial mechanism that allows you to set up the [`algokit deploy`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/deploy.md) feature to simplify deploying your contracts in CI/CD environments (please note we still recommend careful evaluation when it comes to deployment to MainNet). Clone the file and remove the `.template` suffix to apply the changes to deployment scripts and launch configurations. The network prefix `localnet|testnet|mainnet` is primarily optimized for `algokit deploy`. The order of loading the variables is `.env.{network}` < `.env`.", + "line": 2 + }, + { + "file": ".vscode/launch.json", + "description": "Refer to the pre-bundled Visual Studio launch configurations, offering various options on how to execute the build and deployment of your smart contracts. Alternatively execute `algokit project run` to see list of available custom commands.", + "line": 5 + }, + { + "file": ".vscode/extensions.json", + "description": "We highly recommend installing the recommended extensions to get the most out of this template starter project in your VSCode IDE.", + "line": 3 + }, + { + "file": "smart_contracts/index.ts", + "description": "Uncomment the following lines to enable complementary utilities that will generate artifacts required for the [AlgoKit AVM Debugger](https://github.com/algorandfoundation/algokit-avm-vscode-debugger) VSCode plugin available on the [VSCode Extension Marketplace](https://marketplace.visualstudio.com/items?itemName=algorandfoundation.algokit-avm-vscode-debugger). A new folder will be automatically created in the `.algokit` directory with source maps of all TEAL contracts in this workspace, as well as traces that will appear in a folder at the root of the workspace. You can then use the traces as entry points to trigger the debug extension. Make sure to have the `.algokit.toml` file available at the root of the workspace.", + "line": 15 + }, + { + "file": "smart_contracts/_helpers/__init__.py", + "description": "This folder contains helper scripts for contract management. These automate tasks like compiling, generating clients, and deploying. Usually, you won't need to edit these files, but advanced users can expand them for custom needs.", + "line": 1 + } + ] +} diff --git a/examples/s-py/projects/s-py-contracts/.vscode/extensions.json b/examples/s-py/projects/s-py-contracts/.vscode/extensions.json new file mode 100644 index 0000000..e5ca4ca --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/.vscode/extensions.json @@ -0,0 +1,10 @@ +{ + "recommendations": [ + "ms-python.python", + "esbenp.prettier-vscode", + "tamasfe.even-better-toml", + "editorconfig.editorconfig", + "vsls-contrib.codetour", + "algorandfoundation.algokit-avm-vscode-debugger" + ] +} diff --git a/examples/s-py/projects/s-py-contracts/.vscode/launch.json b/examples/s-py/projects/s-py-contracts/.vscode/launch.json new file mode 100644 index 0000000..6c40d26 --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/.vscode/launch.json @@ -0,0 +1,57 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Build & Deploy contracts", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "deploy"], + "cwd": "${workspaceFolder}/smart_contracts", + "console": "integratedTerminal", + "skipFiles": ["/**", "node_modules/**"], + "preLaunchTask": "Build contracts (+ LocalNet)", + "env": { + "ALGOD_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "ALGOD_SERVER": "http://localhost", + "ALGOD_PORT": "4001", + "INDEXER_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "INDEXER_SERVER": "http://localhost", + "INDEXER_PORT": "8980" + } + }, + { + "name": "Deploy contracts", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "deploy"], + "cwd": "${workspaceFolder}/smart_contracts", + "console": "integratedTerminal", + "skipFiles": ["/**", "node_modules/**"], + "env": { + "ALGOD_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "ALGOD_SERVER": "http://localhost", + "ALGOD_PORT": "4001", + "INDEXER_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "INDEXER_SERVER": "http://localhost", + "INDEXER_PORT": "8980" + } + }, + { + "name": "Build contracts", + "type": "python", + "request": "launch", + "module": "smart_contracts", + "args": ["build"], + "cwd": "${workspaceFolder}" + }, + { + "type": "avm", + "request": "launch", + "name": "Debug TEAL via AlgoKit AVM Debugger", + "simulateTraceFile": "${workspaceFolder}/${command:PickSimulateTraceFile}", + "stopOnEntry": true + } + ] +} diff --git a/examples/s-py/projects/s-py-contracts/.vscode/settings.json b/examples/s-py/projects/s-py-contracts/.vscode/settings.json new file mode 100644 index 0000000..e4046da --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/.vscode/settings.json @@ -0,0 +1,38 @@ +{ + // General - see also /.editorconfig + "editor.formatOnSave": true, + "files.exclude": { + "**/.git": true, + "**/.DS_Store": true, + "**/Thumbs.db": true, + ".mypy_cache": true, + ".pytest_cache": true, + ".ruff_cache": true, + "**/__pycache__": true, + ".idea": true + }, + + // TypeScript + "editor.defaultFormatter": "esbenp.prettier-vscode", + + // Python + "python.analysis.autoImportCompletions": true, + "python.analysis.extraPaths": ["${workspaceFolder}/smart_contracts"], + "python.analysis.diagnosticSeverityOverrides": { + "reportMissingModuleSource": "none" + }, + "python.defaultInterpreterPath": "${workspaceFolder}/.venv", + "[python]": { + "editor.codeActionsOnSave": { + "source.fixAll": "explicit", + // Prevent default import sorting from running; Ruff will sort imports for us anyway + "source.organizeImports": "never" + }, + "editor.defaultFormatter": null, + }, + + // On Windows, if execution policy is set to Signed (default) then it won't be able to activate the venv + // so instead let's set it to RemoteSigned for VS Code terminal + "terminal.integrated.shellArgs.windows": ["-ExecutionPolicy", "RemoteSigned"], + "algorandPython.languageServer.enable": true, +} diff --git a/examples/s-py/projects/s-py-contracts/.vscode/tasks.json b/examples/s-py/projects/s-py-contracts/.vscode/tasks.json new file mode 100644 index 0000000..eb1e767 --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/.vscode/tasks.json @@ -0,0 +1,79 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Build contracts", + "command": "${workspaceFolder}/.venv/bin/python", + "windows": { + "command": "${workspaceFolder}/.venv/Scripts/python.exe" + }, + "args": ["-m", "smart_contracts", "build"], + "options": { + "cwd": "${workspaceFolder}" + }, + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [] + }, + { + "label": "Build contracts (+ LocalNet)", + "command": "${workspaceFolder}/.venv/bin/python", + "windows": { + "command": "${workspaceFolder}/.venv/Scripts/python.exe" + }, + "args": ["-m", "smart_contracts", "build"], + "options": { + "cwd": "${workspaceFolder}" + }, + "dependsOn": "Start AlgoKit LocalNet", + "problemMatcher": [] + }, + { + "label": "Start AlgoKit LocalNet", + "command": "algokit", + "args": ["localnet", "start"], + "type": "shell", + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + }, + { + "label": "Stop AlgoKit LocalNet", + "command": "algokit", + "args": ["localnet", "stop"], + "type": "shell", + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + }, + { + "label": "Reset AlgoKit LocalNet", + "command": "algokit", + "args": ["localnet", "reset"], + "type": "shell", + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + }, + { + "label": "Analyze TEAL contracts with AlgoKit Tealer integration", + "command": "algokit", + "args": [ + "task", + "analyze", + "${workspaceFolder}/.algokit", + "--recursive", + "--force" + ], + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + } + ] +} diff --git a/examples/s-py/projects/s-py-contracts/README.md b/examples/s-py/projects/s-py-contracts/README.md new file mode 100644 index 0000000..5634432 --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/README.md @@ -0,0 +1,106 @@ +# s-py-contracts + +This project has been generated using AlgoKit. See below for default getting started instructions. + +# Setup + +### Pre-requisites + +- [Python 3.12](https://www.python.org/downloads/) or later +- [Docker](https://www.docker.com/) (only required for LocalNet) + +> For interactive tour over the codebase, download [vsls-contrib.codetour](https://marketplace.visualstudio.com/items?itemName=vsls-contrib.codetour) extension for VS Code, then open the [`.codetour.json`](./.tours/getting-started-with-your-algokit-project.tour) file in code tour extension. + +### Initial Setup + +#### 1. Clone the Repository +Start by cloning this repository to your local machine. + +#### 2. Install Pre-requisites +Ensure the following pre-requisites are installed and properly configured: + +- **Docker**: Required for running a local Algorand network. [Install Docker](https://www.docker.com/). +- **AlgoKit CLI**: Essential for project setup and operations. Install the latest version from [AlgoKit CLI Installation Guide](https://github.com/algorandfoundation/algokit-cli#install). Verify installation with `algokit --version`, expecting `2.0.0` or later. + +#### 3. Bootstrap Your Local Environment +Run the following commands within the project folder: + +- **Install Poetry**: Required for Python dependency management. [Installation Guide](https://python-poetry.org/docs/#installation). Verify with `poetry -V` to see version `1.2`+. +- **Setup Project**: Execute `algokit project bootstrap all` to install dependencies and setup a Python virtual environment in `.venv`. +- **Configure environment**: Execute `algokit generate env-file -a target_network localnet` to create a `.env.localnet` file with default configuration for `localnet`. +- **Start LocalNet**: Use `algokit localnet start` to initiate a local Algorand network. + +### Development Workflow + +#### Terminal +Directly manage and interact with your project using AlgoKit commands: + +1. **Build Contracts**: `algokit project run build` compiles all smart contracts. You can also specify a specific contract by passing the name of the contract folder as an extra argument. +For example: `algokit project run build -- hello_world` will only build the `hello_world` contract. +2. **Deploy**: Use `algokit project deploy localnet` to deploy contracts to the local network. You can also specify a specific contract by passing the name of the contract folder as an extra argument. +For example: `algokit project deploy localnet -- hello_world` will only deploy the `hello_world` contract. + +#### VS Code +For a seamless experience with breakpoint debugging and other features: + +1. **Open Project**: In VS Code, open the repository root. +2. **Install Extensions**: Follow prompts to install recommended extensions. +3. **Debugging**: + - Use `F5` to start debugging. + - **Windows Users**: Select the Python interpreter at `./.venv/Scripts/python.exe` via `Ctrl/Cmd + Shift + P` > `Python: Select Interpreter` before the first run. + +#### JetBrains IDEs +While primarily optimized for VS Code, JetBrains IDEs are supported: + +1. **Open Project**: In your JetBrains IDE, open the repository root. +2. **Automatic Setup**: The IDE should configure the Python interpreter and virtual environment. +3. **Debugging**: Use `Shift+F10` or `Ctrl+R` to start debugging. Note: Windows users may encounter issues with pre-launch tasks due to a known bug. See [JetBrains forums](https://youtrack.jetbrains.com/issue/IDEA-277486/Shell-script-configuration-cannot-run-as-before-launch-task) for workarounds. + +## AlgoKit Workspaces and Project Management +This project supports both standalone and monorepo setups through AlgoKit workspaces. Leverage [`algokit project run`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md) commands for efficient monorepo project orchestration and management across multiple projects within a workspace. + +## AlgoKit Generators + +This template provides a set of [algokit generators](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md) that allow you to further modify the project instantiated from the template to fit your needs, as well as giving you a base to build your own extensions to invoke via the `algokit generate` command. + +### Generate Smart Contract + +By default the template creates a single `HelloWorld` contract under hello_world folder in the `smart_contracts` directory. To add a new contract: + +1. From the root of the project (`../`) execute `algokit generate smart-contract`. This will create a new starter smart contract and deployment configuration file under `{your_contract_name}` subfolder in the `smart_contracts` directory. +2. Each contract potentially has different creation parameters and deployment steps. Hence, you need to define your deployment logic in `deploy-config.ts`file. +3. `config.py` file will automatically build all contracts in the `smart_contracts` directory. If you want to build specific contracts manually, modify the default code provided by the template in `config.py` file. +4. Since you are generating a TypeScript client, you also need to reference your contract deployment logic in `index.ts` file. However, similar to config.py, by default, `index.ts` will auto import all TypeScript deployment files under `smart_contracts` directory. If you want to manually import specific contracts, modify the default code provided by the template in `index.ts` file. + +> Please note, above is just a suggested convention tailored for the base configuration and structure of this template. The default code supplied by the template in `config.py` and `index.ts` (if using ts clients) files are tailored for the suggested convention. You are free to modify the structure and naming conventions as you see fit. + +### Generate '.env' files + +By default the template instance does not contain any env files. Using [`algokit project deploy`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/deploy.md) against `localnet` | `testnet` | `mainnet` will use default values for `algod` and `indexer` unless overwritten via `.env` or `.env.{target_network}`. + +To generate a new `.env` or `.env.{target_network}` file, run `algokit generate env-file` + +### Debugging Smart Contracts + +This project is optimized to work with AlgoKit AVM Debugger extension. To activate it: +Refer to the commented header in the `index.ts` file in the `smart_contracts` folder. + +If you have opted in to include VSCode launch configurations in your project, you can also use the `Debug TEAL via AlgoKit AVM Debugger` launch configuration to interactively select an available trace file and launch the debug session for your smart contract. + +For information on using and setting up the `AlgoKit AVM Debugger` VSCode extension refer [here](https://github.com/algorandfoundation/algokit-avm-vscode-debugger). To install the extension from the VSCode Marketplace, use the following link: [AlgoKit AVM Debugger extension](https://marketplace.visualstudio.com/items?itemName=algorandfoundation.algokit-avm-vscode-debugger). + +# Tools + +This project makes use of Algorand Python to build Algorand smart contracts. The following tools are in use: + +- [Algorand](https://www.algorand.com/) - Layer 1 Blockchain; [Developer portal](https://dev.algorand.co/), [Why Algorand?](https://dev.algorand.co/getting-started/why-algorand/) +- [AlgoKit](https://github.com/algorandfoundation/algokit-cli) - One-stop shop tool for developers building on the Algorand network; [docs](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/algokit.md), [intro tutorial](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/tutorials/intro.md) +- [Algorand Python](https://github.com/algorandfoundation/puya) - A semantically and syntactically compatible, typed Python language that works with standard Python tooling and allows you to express smart contracts (apps) and smart signatures (logic signatures) for deployment on the Algorand Virtual Machine (AVM); [docs](https://github.com/algorandfoundation/puya), [examples](https://github.com/algorandfoundation/puya/tree/main/examples) +- [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-ts) - A set of core Algorand utilities that make it easier to build solutions on Algorand. +- [Poetry](https://python-poetry.org/): Python packaging and dependency management. +- [npm](https://www.npmjs.com/): Node.js package manager +- [TypeScript](https://www.typescriptlang.org/): Strongly typed programming language that builds on JavaScript +- [ts-node-dev](https://github.com/wclr/ts-node-dev): TypeScript development execution environment + +It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. + diff --git a/examples/s-py/projects/s-py-contracts/package.json b/examples/s-py/projects/s-py-contracts/package.json new file mode 100644 index 0000000..d612e63 --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/package.json @@ -0,0 +1,27 @@ +{ + "name": "smart_contracts", + "version": "1.0.0", + "description": "Smart contract deployer", + "main": "index.ts", + "scripts": { + "deploy": "ts-node-dev --transpile-only --watch .env -r dotenv/config smart_contracts/index.ts", + "deploy:ci": "ts-node --transpile-only -r dotenv/config smart_contracts/index.ts", + "format": "prettier --write ." + }, + "engines": { + "node": ">=20.0", + "npm": ">=9.0" + }, + "dependencies": { + "@algorandfoundation/algokit-utils": "^9.0.0", + "@algorandfoundation/algokit-utils-debug": "^1.0.2", + "algosdk": "^3.0.0" + }, + "devDependencies": { + "@algorandfoundation/algokit-client-generator": "^6.0.0", + "dotenv": "^16.0.3", + "prettier": "^2.8.4", + "ts-node-dev": "^2.0.0", + "typescript": "^4.9.5" + } +} diff --git a/examples/s-py/projects/s-py-contracts/poetry.toml b/examples/s-py/projects/s-py-contracts/poetry.toml new file mode 100644 index 0000000..5fcef8c --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/poetry.toml @@ -0,0 +1,3 @@ +[virtualenvs] +in-project = true +prefer-active-python = true diff --git a/examples/s-py/projects/s-py-contracts/pyproject.toml b/examples/s-py/projects/s-py-contracts/pyproject.toml new file mode 100644 index 0000000..3fe51a5 --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/pyproject.toml @@ -0,0 +1,22 @@ +[tool.poetry] +name = "s-py-contracts" +version = "0.1.0" +description = "Algorand smart contracts" +authors = ["None "] +readme = "README.md" +package-mode = false + +[tool.poetry.dependencies] +python = "^3.12" +algokit-utils = "^4.0.0" +python-dotenv = "^1.0.0" +algorand-python = "^3" +algorand-python-testing = "^1" + +[tool.poetry.group.dev.dependencies] +puyapy = "*" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + diff --git a/examples/s-py/projects/s-py-contracts/smart_contracts/__init__.py b/examples/s-py/projects/s-py-contracts/smart_contracts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/s-py/projects/s-py-contracts/smart_contracts/__main__.py b/examples/s-py/projects/s-py-contracts/smart_contracts/__main__.py new file mode 100644 index 0000000..41bf978 --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/smart_contracts/__main__.py @@ -0,0 +1,188 @@ +import dataclasses +import importlib +import logging +import subprocess +import sys +from collections.abc import Callable +from pathlib import Path +from shutil import rmtree + +from dotenv import load_dotenv + +# Set up logging and load environment variables. +logging.basicConfig( + level=logging.DEBUG, format="%(asctime)s %(levelname)-10s: %(message)s" +) +logger = logging.getLogger(__name__) +logger.info("Loading .env") +load_dotenv() + +# Determine the root path based on this file's location. +root_path = Path(__file__).parent + +# ----------------------- Contract Configuration ----------------------- # + + +@dataclasses.dataclass +class SmartContract: + path: Path + name: str + deploy: Callable[[], None] | None = None + + +def import_contract(folder: Path) -> Path: + """Imports the contract from a folder if it exists.""" + contract_path = folder / "contract.py" + if contract_path.exists(): + return contract_path + else: + raise Exception(f"Contract not found in {folder}") + + +def import_deploy_if_exists(folder: Path) -> Callable[[], None] | None: + """Imports the deploy function from a folder if it exists.""" + try: + module_name = f"{folder.parent.name}.{folder.name}.deploy_config" + deploy_module = importlib.import_module(module_name) + return deploy_module.deploy # type: ignore[no-any-return, misc] + except ImportError: + return None + + +def has_contract_file(directory: Path) -> bool: + """Checks whether the directory contains a contract.py file.""" + return (directory / "contract.py").exists() + + +# Use the current directory (root_path) as the base for contract folders and exclude +# folders that start with '_' (internal helpers). +contracts: list[SmartContract] = [ + SmartContract( + path=import_contract(folder), + name=folder.name, + deploy=import_deploy_if_exists(folder), + ) + for folder in root_path.iterdir() + if folder.is_dir() and has_contract_file(folder) and not folder.name.startswith("_") +] + +# -------------------------- Build Logic -------------------------- # + +deployment_extension = "ts" + + +def _get_output_path(output_dir: Path, deployment_extension: str) -> Path: + """Constructs the output path for the generated client file.""" + return output_dir / Path( + "{contract_name}" + + ("_client" if deployment_extension == "py" else "Client") + + f".{deployment_extension}" + ) + + +def build(output_dir: Path, contract_path: Path) -> Path: + """ + Builds the contract by exporting (compiling) its source and generating a client. + If the output directory already exists, it is cleared. + """ + output_dir = output_dir.resolve() + if output_dir.exists(): + rmtree(output_dir) + output_dir.mkdir(exist_ok=True, parents=True) + logger.info(f"Exporting {contract_path} to {output_dir}") + + build_result = subprocess.run( + [ + "algokit", + "--no-color", + "compile", + "python", + str(contract_path.resolve()), + f"--out-dir={output_dir}", + "--output-source-map", + ], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + ) + + if build_result.stdout: + print(build_result.stdout) + + if build_result.returncode: + raise Exception(f"Could not build contract:\n{build_result.stdout}") + + # Look for arc56.json files and generate the client based on them. + app_spec_file_names: list[str] = [ + file.name for file in output_dir.glob("*.arc56.json") + ] + + client_file: str | None = None + if not app_spec_file_names: + logger.warning( + "No '*.arc56.json' file found (likely a logic signature being compiled). Skipping client generation." + ) + else: + for file_name in app_spec_file_names: + client_file = file_name + print(file_name) + generate_result = subprocess.run( + [ + "algokit", + "generate", + "client", + str(output_dir), + "--output", + str(_get_output_path(output_dir, deployment_extension)), + ], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + ) + + if generate_result.stdout: + print(generate_result.stdout) + + if generate_result.returncode: + if "No such command" in generate_result.stdout: + raise Exception( + "Could not generate typed client, requires AlgoKit 2.0.0 or later. Please update AlgoKit" + ) + else: + raise Exception( + f"Could not generate typed client:\n{generate_result.stdout}" + ) + if client_file: + return output_dir / client_file + return output_dir + + +# --------------------------- Main Logic --------------------------- # + + +def main(action: str, contract_name: str | None = None) -> None: + """Main entry point to build and/or deploy smart contracts.""" + artifact_path = root_path / "artifacts" + # Filter contracts based on an optional specific contract name. + filtered_contracts = [ + contract + for contract in contracts + if contract_name is None or contract.name == contract_name + ] + + match action: + case "build": + for contract in filtered_contracts: + logger.info(f"Building app at {contract.path}") + build(artifact_path / contract.name, contract.path) + case _: + logger.error(f"Unknown action: {action}") + + +if __name__ == "__main__": + if len(sys.argv) > 2: + main(sys.argv[1], sys.argv[2]) + elif len(sys.argv) > 1: + main(sys.argv[1]) + else: + main("all") diff --git a/examples/s-py/projects/s-py-contracts/smart_contracts/hello_world/contract.py b/examples/s-py/projects/s-py-contracts/smart_contracts/hello_world/contract.py new file mode 100644 index 0000000..8a8d12b --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/smart_contracts/hello_world/contract.py @@ -0,0 +1,8 @@ +from algopy import ARC4Contract, String +from algopy.arc4 import abimethod + + +class HelloWorld(ARC4Contract): + @abimethod() + def hello(self, name: String) -> String: + return "Hello, " + name diff --git a/examples/s-py/projects/s-py-contracts/smart_contracts/hello_world/deploy-config.ts b/examples/s-py/projects/s-py-contracts/smart_contracts/hello_world/deploy-config.ts new file mode 100644 index 0000000..6b9d652 --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/smart_contracts/hello_world/deploy-config.ts @@ -0,0 +1,33 @@ +import { AlgorandClient } from '@algorandfoundation/algokit-utils' +import { HelloWorldFactory } from '../artifacts/hello_world/HelloWorldClient' + +// Below is a showcase of various deployment options you can use in TypeScript Client +export async function deploy() { + console.log('=== Deploying HelloWorld ===') + + const algorand = AlgorandClient.fromEnvironment() + const deployer = await algorand.account.fromEnvironment('DEPLOYER') + + const factory = algorand.client.getTypedAppFactory(HelloWorldFactory, { + defaultSender: deployer.addr, + }) + + const { appClient, result } = await factory.deploy({ onUpdate: 'append', onSchemaBreak: 'append' }) + + // If app was just created fund the app account + if (['create', 'replace'].includes(result.operationPerformed)) { + await algorand.send.payment({ + amount: (1).algo(), + sender: deployer.addr, + receiver: appClient.appAddress, + }) + } + + const method = 'hello' + const response = await appClient.send.hello({ + args: { name: 'world' }, + }) + console.log( + `Called ${method} on ${appClient.appClient.appName} (${appClient.appClient.appId}) with name = world, received: ${response.return}`, + ) +} diff --git a/examples/s-py/projects/s-py-contracts/smart_contracts/index.ts b/examples/s-py/projects/s-py-contracts/smart_contracts/index.ts new file mode 100644 index 0000000..bebecc6 --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/smart_contracts/index.ts @@ -0,0 +1,62 @@ +import * as fs from 'fs' +import * as path from 'path' +import { consoleLogger } from '@algorandfoundation/algokit-utils/types/logging' +import { Config } from '@algorandfoundation/algokit-utils' +// import { registerDebugEventHandlers } from '@algorandfoundation/algokit-utils-debug' // Uncomment to enable persisting artifacts required by AlgoKit AVM Debugger + +// Uncomment the debug and traceAll options to enable auto generation of AVM Debugger compliant sourceMap and simulation trace file. +// Learn more about using AlgoKit AVM Debugger to debug your TEAL source codes and inspect various kinds of Algorand transactions in atomic groups -> https://github.com/algorandfoundation/algokit-avm-vscode-Debugger + +Config.configure({ + logger: consoleLogger, + // debug: true, + // traceAll: true, +}) +// registerDebugEventHandlers() // Uncomment to enable persisting artifacts required by AlgoKit AVM Debugger + +// base directory +const baseDir = path.resolve(__dirname) + +// function to validate and dynamically import a module +async function importDeployerIfExists(dir: string) { + const deployerPath = path.resolve(dir, 'deploy-config') + if (fs.existsSync(deployerPath + '.ts') || fs.existsSync(deployerPath + '.js')) { + const deployer = await import(deployerPath) + return { ...deployer, name: path.basename(dir) } + } + return null +} + +// get a list of all deployers from the subdirectories +async function getDeployers() { + const directories = fs + .readdirSync(baseDir, { withFileTypes: true }) + .filter((dirent) => dirent.isDirectory()) + .map((dirent) => path.resolve(baseDir, dirent.name)) + + const deployers = await Promise.all(directories.map(importDeployerIfExists)) + return deployers.filter((deployer) => deployer !== null) // Filter out null values +} + +// execute all the deployers +(async () => { + const contractName = process.argv.length > 2 ? process.argv[2] : undefined + const contractDeployers = await getDeployers() + + const filteredDeployers = contractName + ? contractDeployers.filter(deployer => deployer.name === contractName) + : contractDeployers + + if (contractName && filteredDeployers.length === 0) { + console.warn(`No deployer found for contract name: ${contractName}`) + return + } + + for (const deployer of filteredDeployers) { + try { + await deployer.deploy() + } catch (e) { + console.error(`Error deploying ${deployer.name}:`, e) + } + } +})() diff --git a/examples/s-py/projects/s-py-contracts/tsconfig.json b/examples/s-py/projects/s-py-contracts/tsconfig.json new file mode 100644 index 0000000..fc75893 --- /dev/null +++ b/examples/s-py/projects/s-py-contracts/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "strict": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "esModuleInterop": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "allowJs": false, + "allowSyntheticDefaultImports": true, + "module": "CommonJS", + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true + }, + "include": ["smart_contracts/**/*.ts"], + "exclude": ["node_modules", "dist", "coverage"] +} diff --git a/examples/s-py/projects/s-py-frontend/.algokit.toml b/examples/s-py/projects/s-py-frontend/.algokit.toml new file mode 100644 index 0000000..4c74fac --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/.algokit.toml @@ -0,0 +1,11 @@ +[algokit] +min_version = "v2.0.0" + +[project] +type = "frontend" +name = 's-py-frontend' +artifacts = "src/contracts" + +[project.run] +build = { commands = ['npm run build'], description = 'Build frontend' } +test = { commands = ['npm run test'], description = 'Run frontend tests' } diff --git a/examples/s-py/projects/s-py-frontend/.algokit/.copier-answers.yml b/examples/s-py/projects/s-py-frontend/.algokit/.copier-answers.yml new file mode 100644 index 0000000..f585cc5 --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/.algokit/.copier-answers.yml @@ -0,0 +1,8 @@ +# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY +_commit: 1.1.1 +_src_path: gh:algorandfoundation/algokit-react-frontend-template +author_email: None +author_name: None +preset_name: starter +project_name: s-py-frontend + diff --git a/examples/s-py/projects/s-py-frontend/.env.template b/examples/s-py/projects/s-py-frontend/.env.template new file mode 100644 index 0000000..eb4b229 --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/.env.template @@ -0,0 +1,67 @@ +# ====================== +# LocalNet configuration +# uncomment below to use +# ====================== + +VITE_ENVIRONMENT=local + +# Algod +VITE_ALGOD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +VITE_ALGOD_SERVER=http://localhost +VITE_ALGOD_PORT=4001 +VITE_ALGOD_NETWORK=localnet + +# Indexer +VITE_INDEXER_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +VITE_INDEXER_SERVER=http://localhost +VITE_INDEXER_PORT=8980 + +# KMD +# Please note: +# 1. This is only needed for LocalNet since +# by default KMD provider is ignored on other networks. +# 2. AlgoKit LocalNet starts with a single wallet called 'unencrypted-default-wallet', +# with heaps of tokens available for testing. +VITE_KMD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +VITE_KMD_SERVER=http://localhost +VITE_KMD_PORT=4002 +VITE_KMD_WALLET="unencrypted-default-wallet" +VITE_KMD_PASSWORD="" + +# # ====================== +# # TestNet configuration: +# # uncomment below to use +# # ====================== + +# VITE_ENVIRONMENT=local + +# # Algod +# VITE_ALGOD_TOKEN="" +# VITE_ALGOD_SERVER="https://testnet-api.algonode.cloud" +# VITE_ALGOD_PORT="" +# VITE_ALGOD_NETWORK="testnet" + +# # Indexer +# VITE_INDEXER_TOKEN="" +# VITE_INDEXER_SERVER="https://testnet-idx.algonode.cloud" +# VITE_INDEXER_PORT="" + + +# # ====================== +# # MainNet configuration: +# # uncomment below to use +# # ====================== + +# VITE_ENVIRONMENT=production + +# # Algod +# VITE_ALGOD_TOKEN="" +# VITE_ALGOD_SERVER="https://mainnet-api.algonode.cloud" +# VITE_ALGOD_PORT="" +# VITE_ALGOD_NETWORK="mainnet" + +# # Indexer +# VITE_INDEXER_TOKEN="" +# VITE_INDEXER_SERVER="https://mainnet-idx.algonode.cloud" +# VITE_INDEXER_PORT="" + diff --git a/examples/s-py/projects/s-py-frontend/.gitignore b/examples/s-py/projects/s-py-frontend/.gitignore new file mode 100644 index 0000000..b1ce837 --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/.gitignore @@ -0,0 +1,38 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + + +# dotenv environment variable files +.env +env/ + +# misc +/dist +.DS_Store + + +npm-debug.log* +yarn-debug.log* +yarn-error.log* +/test-results/ +/playwright-report/ +/playwright/.cache/ + +# PyCharm +.idea +!.idea/ +.idea/* +!.idea/runConfigurations/ + +.vercel +.netlify diff --git a/examples/s-py/projects/s-py-frontend/.npmrc b/examples/s-py/projects/s-py-frontend/.npmrc new file mode 100644 index 0000000..c42da84 --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/.npmrc @@ -0,0 +1 @@ +engine-strict = true diff --git a/examples/s-py/projects/s-py-frontend/.vscode/extensions.json b/examples/s-py/projects/s-py-frontend/.vscode/extensions.json new file mode 100644 index 0000000..6d0554a --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "EditorConfig.EditorConfig", + "dotenv.dotenv-vscode", + ] +} + diff --git a/examples/s-py/projects/s-py-frontend/.vscode/launch.json b/examples/s-py/projects/s-py-frontend/.vscode/launch.json new file mode 100644 index 0000000..7edaf04 --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/.vscode/launch.json @@ -0,0 +1,68 @@ +{ + "configurations": [ + { + "type": "msedge", + "request": "launch", + "name": "Run (Edge)", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}", + "presentation": { + "hidden": false, + "group": "2. Web" + } + }, + { + "type": "chrome", + "request": "launch", + "name": "Run (Chrome)", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}", + "presentation": { + "hidden": false, + "group": "2. Web" + } + }, + { + "type": "firefox", + "request": "launch", + "name": "Run (Firefox)", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}", + "presentation": { + "hidden": false, + "group": "2. Web" + } + }, + { + "name": "Run dApp", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev"], + "cwd": "${workspaceRoot}", + "console": "integratedTerminal", + "skipFiles": ["/**", "node_modules/**"], + "presentation": { + "hidden": false, + "group": "1. Run Project", + "order": 1 + } + }, + { + "name": "Run dApp (+ LocalNet)", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev"], + "cwd": "${workspaceRoot}", + "console": "integratedTerminal", + "skipFiles": ["/**", "node_modules/**"], + "preLaunchTask": "Start AlgoKit LocalNet", + "presentation": { + "hidden": false, + "group": "1. Run Project", + "order": 1 + } + } + ] +} diff --git a/examples/s-py/projects/s-py-frontend/.vscode/settings.json b/examples/s-py/projects/s-py-frontend/.vscode/settings.json new file mode 100644 index 0000000..f34d28b --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "editor.formatOnSave": true, + + "dotenv.enableAutocloaking": false, + +} diff --git a/examples/s-py/projects/s-py-frontend/.vscode/tasks.json b/examples/s-py/projects/s-py-frontend/.vscode/tasks.json new file mode 100644 index 0000000..d611c4f --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/.vscode/tasks.json @@ -0,0 +1,15 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Start AlgoKit LocalNet", + "command": "algokit", + "args": ["localnet", "start"], + "type": "shell", + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + } + ] +} diff --git a/examples/s-py/projects/s-py-frontend/README.md b/examples/s-py/projects/s-py-frontend/README.md new file mode 100644 index 0000000..716ea25 --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/README.md @@ -0,0 +1,76 @@ +# s-py-frontend + +This starter React project has been generated using AlgoKit. See below for default getting started instructions. + +# Setup + +### Initial Setup + +#### 1. Clone the Repository +Start by cloning this repository to your local machine. + +#### 2. Install Pre-requisites +Ensure the following pre-requisites are installed and properly configured: + +- **npm**: Node package manager. Install from [Node.js Installation Guide](https://nodejs.org/en/download/). Verify with `npm -v` to see version `18.12`+. +- **AlgoKit CLI**: Essential for project setup and operations. Install the latest version from [AlgoKit CLI Installation Guide](https://github.com/algorandfoundation/algokit-cli#install). Verify installation with `algokit --version`, expecting `2.0.0` or later. + +#### 3. Bootstrap Your Local Environment +Run the following commands within the project folder: + +- **Install Project Dependencies**: With `algokit project bootstrap all`, ensure all dependencies are ready. + +### Development Workflow + +#### Terminal +Directly manage and interact with your project using AlgoKit commands: + +1. **Build Contracts**: `algokit project run build` builds react web app and links with smart contracts in workspace, if any. +2. Remaining set of command for linting, testing and deployment can be found in respective [package.json](./package.json) file and [.algokit.toml](./.algokit.toml) files. + +#### VS Code +For a seamless experience with breakpoint debugging and other features: + +1. **Open Project**: In VS Code, open the repository root. +2. **Install Extensions**: Follow prompts to install recommended extensions. +3. **Debugging**: + - Use `F5` to start debugging. + - **Windows Users**: Select the Python interpreter at `./.venv/Scripts/python.exe` via `Ctrl/Cmd + Shift + P` > `Python: Select Interpreter` before the first run. + +#### Other IDEs +While primarily optimized for VS Code, Jetbrains WebStorm has base support for this project: + +1. **Open Project**: In your JetBrains IDE, open the repository root. +2. **Automatic Setup**: The IDE should configure the Python interpreter and virtual environment. +3. **Debugging**: Use `Shift+F10` or `Ctrl+R` to start debugging. Note: Windows users may encounter issues with pre-launch tasks due to a known bug. See [JetBrains forums](https://youtrack.jetbrains.com/issue/IDEA-277486/Shell-script-configuration-cannot-run-as-before-launch-task) for workarounds. + +## AlgoKit Workspaces and Project Management +This project supports both standalone and monorepo setups through AlgoKit workspaces. Leverage [`algokit project run`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md) commands for efficient monorepo project orchestration and management across multiple projects within a workspace. + +> Please note, by default frontend is pre configured to run against Algorand LocalNet. If you want to run against TestNet or MainNet, comment out the current environment variable and uncomment the relevant one in [`.env`](.env) file that is created after running bootstrap command and based on [`.env.template`](.env.template). + +# Algorand Wallet integrations + +The template comes with [`use-wallet`](https://github.com/txnlab/use-wallet) integration, which provides a React hook for connecting to an Algorand wallet providers. The following wallet providers are included by default: +- LocalNet: +- - [KMD/Local Wallet](https://github.com/TxnLab/use-wallet#kmd-algorand-key-management-daemon) - Algorand's Key Management Daemon (KMD) is a service that manages Algorand private keys and signs transactions. Works best with AlgoKit LocalNet and allows you to easily test and interact with your dApps locally. +- TestNet and others: +- - [Pera Wallet](https://perawallet.app). +- - [Defly Wallet](https://defly.app). +- - [Exodus Wallet](https://www.exodus.com). +- - [Daffi Wallet](https://www.daffi.me). + +Refer to official [`use-wallet`](https://github.com/txnlab/use-wallet) documentation for detailed guidelines on how to integrate with other wallet providers (such as WalletConnect v2). Too see implementation details on the use wallet hook and initialization of extra wallet providers refer to [`App.tsx`](./src/App.tsx). + +# Tools + +This project makes use of React and Tailwind to provider a base project configuration to develop frontends for your Algorand dApps and interactions with smart contracts. The following tools are in use: + +- [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-ts) - Various TypeScript utilities to simplify interactions with Algorand and AlgoKit. +- [React](https://reactjs.org/) - A JavaScript library for building user interfaces. +- [use-wallet](https://github.com/txnlab/use-wallet) - A React hook for connecting to an Algorand wallet providers. +- [npm](https://www.npmjs.com/): Node.js package manager +It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. +# Integrating with smart contracts and application clients + +Refer to the detailed guidance on [integrating with smart contracts and application clients](./src/contracts/README.md). In essence, for any smart contract codebase generated with AlgoKit or other tools that produce compile contracts into ARC34 compliant app specifications, you can use the `algokit generate` command to generate TypeScript or Python typed client. Once generated simply drag and drop the generated client into `./src/contracts` and import it into your React components as you see fit. diff --git a/examples/s-py/projects/s-py-frontend/index.html b/examples/s-py/projects/s-py-frontend/index.html new file mode 100644 index 0000000..5a2ef4f --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/index.html @@ -0,0 +1,12 @@ + + + + + + AlgoKit React Template + + +
+ + + diff --git a/examples/s-py/projects/s-py-frontend/package.json b/examples/s-py/projects/s-py-frontend/package.json new file mode 100644 index 0000000..a372747 --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/package.json @@ -0,0 +1,64 @@ +{ + "name": "s-py-frontend", + "version": "0.1.0", + "author": { + "name": "None", + "email": "None" + }, + "private": true, + "type": "module", + "engines": { + "node": ">=20.0", + "npm": ">=9.0" + }, + "devDependencies": { + "@algorandfoundation/algokit-client-generator": "^5.0.0", + "@types/node": "^18.17.14", + "@types/react": "^18.2.11", + "@types/react-dom": "^18.2.4", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.14", + "ts-node": "^10.9.1", + "typescript": "^5.1.6", + "vite": "^5.0.0", + "vite-plugin-node-polyfills": "^0.22.0" + }, + "dependencies": { + "@algorandfoundation/algokit-utils": "^9.0.0", + "@blockshake/defly-connect": "^1.2.1", + "@perawallet/connect": "^1.4.1", + "@txnlab/use-wallet": "^4.0.0", + "@txnlab/use-wallet-react": "^4.0.0", + "algosdk": "^3.0.0", + "notistack": "^3.0.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "tslib": "^2.6.2" + }, + "scripts": { + "generate:app-clients": "algokit project link --all", + "dev": "npm run generate:app-clients && vite", + "build": "npm run generate:app-clients && tsc && vite build", + "preview": "vite preview" + }, + "eslintConfig": { + "extends": [ + "react-app" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "overrides": { + "ws@>7.0.0 <7.5.9": "7.5.10" + } +} diff --git a/examples/s-py/projects/s-py-frontend/public/index.html b/examples/s-py/projects/s-py-frontend/public/index.html new file mode 100644 index 0000000..0d3a3a5 --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/public/index.html @@ -0,0 +1,37 @@ + + + + + + + + + + React App + + + +
+ + + diff --git a/examples/s-py/projects/s-py-frontend/public/robots.txt b/examples/s-py/projects/s-py-frontend/public/robots.txt new file mode 100644 index 0000000..e9e57dc --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/examples/s-py/projects/s-py-frontend/src/App.tsx b/examples/s-py/projects/s-py-frontend/src/App.tsx new file mode 100644 index 0000000..f346006 --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/src/App.tsx @@ -0,0 +1,56 @@ +import { SupportedWallet, WalletId, WalletManager, WalletProvider } from '@txnlab/use-wallet-react' +import { SnackbarProvider } from 'notistack' +import Home from './Home' +import { getAlgodConfigFromViteEnvironment, getKmdConfigFromViteEnvironment } from './utils/network/getAlgoClientConfigs' + +let supportedWallets: SupportedWallet[] +if (import.meta.env.VITE_ALGOD_NETWORK === 'localnet') { + const kmdConfig = getKmdConfigFromViteEnvironment() + supportedWallets = [ + { + id: WalletId.KMD, + options: { + baseServer: kmdConfig.server, + token: String(kmdConfig.token), + port: String(kmdConfig.port), + }, + }, + ] +} else { + supportedWallets = [ + { id: WalletId.DEFLY }, + { id: WalletId.PERA }, + { id: WalletId.EXODUS }, + // If you are interested in WalletConnect v2 provider + // refer to https://github.com/TxnLab/use-wallet for detailed integration instructions + ] +} + +export default function App() { + const algodConfig = getAlgodConfigFromViteEnvironment() + + const walletManager = new WalletManager({ + wallets: supportedWallets, + defaultNetwork: algodConfig.network, + networks: { + [algodConfig.network]: { + algod: { + baseServer: algodConfig.server, + port: algodConfig.port, + token: String(algodConfig.token), + }, + }, + }, + options: { + resetNetwork: true, + }, + }) + + return ( + + + + + + ) +} diff --git a/examples/s-py/inject_content/Home.tsx b/examples/s-py/projects/s-py-frontend/src/Home.tsx similarity index 100% rename from examples/s-py/inject_content/Home.tsx rename to examples/s-py/projects/s-py-frontend/src/Home.tsx diff --git a/examples/s-py/projects/s-py-frontend/src/assets/logo.svg b/examples/s-py/projects/s-py-frontend/src/assets/logo.svg new file mode 100644 index 0000000..7169476 --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/src/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/examples/s-py/projects/s-py-frontend/src/components/Account.tsx b/examples/s-py/projects/s-py-frontend/src/components/Account.tsx new file mode 100644 index 0000000..081ce47 --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/src/components/Account.tsx @@ -0,0 +1,24 @@ +import { useWallet } from '@txnlab/use-wallet-react' +import { useMemo } from 'react' +import { ellipseAddress } from '../utils/ellipseAddress' +import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' + +const Account = () => { + const { activeAddress } = useWallet() + const algoConfig = getAlgodConfigFromViteEnvironment() + + const networkName = useMemo(() => { + return algoConfig.network === '' ? 'localnet' : algoConfig.network.toLocaleLowerCase() + }, [algoConfig.network]) + + return ( +
+ ) +} + +export default Account diff --git a/examples/s-py/inject_content/AppCalls.tsx b/examples/s-py/projects/s-py-frontend/src/components/AppCalls.tsx similarity index 100% rename from examples/s-py/inject_content/AppCalls.tsx rename to examples/s-py/projects/s-py-frontend/src/components/AppCalls.tsx diff --git a/examples/s-py/projects/s-py-frontend/src/components/ConnectWallet.tsx b/examples/s-py/projects/s-py-frontend/src/components/ConnectWallet.tsx new file mode 100644 index 0000000..8814cd5 --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/src/components/ConnectWallet.tsx @@ -0,0 +1,86 @@ +import { useWallet, Wallet, WalletId } from '@txnlab/use-wallet-react' +import Account from './Account' + +interface ConnectWalletInterface { + openModal: boolean + closeModal: () => void +} + +const ConnectWallet = ({ openModal, closeModal }: ConnectWalletInterface) => { + const { wallets, activeAddress } = useWallet() + + const isKmd = (wallet: Wallet) => wallet.id === WalletId.KMD + + return ( + +
+

Select wallet provider

+ +
+ {activeAddress && ( + <> + +
+ + )} + + {!activeAddress && + wallets?.map((wallet) => ( + + ))} +
+ +
+ + {activeAddress && ( + + )} +
+ +
+ ) +} +export default ConnectWallet diff --git a/examples/s-py/projects/s-py-frontend/src/components/ErrorBoundary.tsx b/examples/s-py/projects/s-py-frontend/src/components/ErrorBoundary.tsx new file mode 100644 index 0000000..435bf61 --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/src/components/ErrorBoundary.tsx @@ -0,0 +1,46 @@ +import React, { ReactNode } from 'react' + +interface ErrorBoundaryProps { + children: ReactNode +} + +interface ErrorBoundaryState { + hasError: boolean + error: Error | null +} + +class ErrorBoundary extends React.Component { + constructor(props: ErrorBoundaryProps) { + super(props) + this.state = { hasError: false, error: null } + } + + static getDerivedStateFromError(error: Error): ErrorBoundaryState { + // Update state so the next render will show the fallback UI. + return { hasError: true, error: error } + } + + render(): ReactNode { + if (this.state.hasError) { + // You can render any custom fallback UI + return ( +
+
+
+

Error occured

+

+ {this.state.error?.message.includes('Attempt to get default algod configuration') + ? 'Please make sure to set up your environment variables correctly. Create a .env file based on .env.template and fill in the required values. This controls the network and credentials for connections with Algod and Indexer.' + : this.state.error?.message} +

+
+
+
+ ) + } + + return this.props.children + } +} + +export default ErrorBoundary diff --git a/examples/s-py/projects/s-py-frontend/src/components/Transact.tsx b/examples/s-py/projects/s-py-frontend/src/components/Transact.tsx new file mode 100644 index 0000000..59d7cdd --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/src/components/Transact.tsx @@ -0,0 +1,80 @@ +import { algo, AlgorandClient } from '@algorandfoundation/algokit-utils' +import { useWallet } from '@txnlab/use-wallet-react' +import { useSnackbar } from 'notistack' +import { useState } from 'react' +import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' + +interface TransactInterface { + openModal: boolean + setModalState: (value: boolean) => void +} + +const Transact = ({ openModal, setModalState }: TransactInterface) => { + const [loading, setLoading] = useState(false) + const [receiverAddress, setReceiverAddress] = useState('') + + const algodConfig = getAlgodConfigFromViteEnvironment() + const algorand = AlgorandClient.fromConfig({ algodConfig }) + + const { enqueueSnackbar } = useSnackbar() + + const { transactionSigner, activeAddress } = useWallet() + + const handleSubmitAlgo = async () => { + setLoading(true) + + if (!transactionSigner || !activeAddress) { + enqueueSnackbar('Please connect wallet first', { variant: 'warning' }) + return + } + + try { + enqueueSnackbar('Sending transaction...', { variant: 'info' }) + const result = await algorand.send.payment({ + signer: transactionSigner, + sender: activeAddress, + receiver: receiverAddress, + amount: algo(1), + }) + enqueueSnackbar(`Transaction sent: ${result.txIds[0]}`, { variant: 'success' }) + setReceiverAddress('') + } catch (e) { + enqueueSnackbar('Failed to send transaction', { variant: 'error' }) + } + + setLoading(false) + } + + return ( + +
+

Send payment transaction

+
+ { + setReceiverAddress(e.target.value) + }} + /> +
+ + +
+
+
+ ) +} + +export default Transact diff --git a/examples/s-py/projects/s-py-frontend/src/contracts/HelloWorld.ts b/examples/s-py/projects/s-py-frontend/src/contracts/HelloWorld.ts new file mode 100644 index 0000000..d5f247a --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/src/contracts/HelloWorld.ts @@ -0,0 +1,581 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^7 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app' +import { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56' +import { + AppClient as _AppClient, + AppClientMethodCallParams, + AppClientParams, + AppClientBareCallParams, + CallOnComplete, + AppClientCompilationParams, + ResolveAppClientByCreatorAndName, + ResolveAppClientByNetwork, + CloneAppClientParams, +} from '@algorandfoundation/algokit-utils/types/app-client' +import { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer' +import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' +import SimulateResponse = modelsv2.SimulateResponse + +export const APP_SPEC: Arc56Contract = {"name":"HelloWorld","structs":{},"methods":[{"name":"hello","args":[{"type":"string","name":"name"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[44],"errorMessage":"invalid array length header"},{"pc":[52],"errorMessage":"invalid number of bytes for arc4.dynamic_array"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5weTo1CiAgICAvLyBjbGFzcyBIZWxsb1dvcmxkKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2hlbGxvX3JvdXRlQDMKICAgIGVycgoKbWFpbl9oZWxsb19yb3V0ZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LnB5OjYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgaGVsbG8KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLmhlbGxvX3dvcmxkLmNvbnRyYWN0LkhlbGxvV29ybGQuaGVsbG9bcm91dGluZ10oKSAtPiB2b2lkOgpoZWxsbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5weTo2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgcHVzaGludCAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5weTo4CiAgICAvLyByZXR1cm4gIkhlbGxvLCAiICsgbmFtZQogICAgcHVzaGJ5dGVzICJIZWxsbywgIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QucHk6NgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgAQCvs4RNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEM2GgFJgQBZgQIISwEVEkRXAgCAB0hlbGxvLCBMUEkVFlcGAkxQgAQVH3x1TFCwgQFD","clear":"C4EBQw=="},"compilerInfo":{"compiler":"puya","compilerVersion":{"major":5,"minor":7,"patch":1}},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the HelloWorld contract + */ +export type HelloWorldArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'hello(string)string': { + name: string + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'hello(string)string': [name: string] + } +} + +/** + * The return type for each method + */ +export type HelloWorldReturns = { + 'hello(string)string': string +} + +/** + * Defines the types of available calls and state of the HelloWorld smart contract. + */ +export type HelloWorldTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'hello(string)string' | 'hello', { + argsObj: HelloWorldArgs['obj']['hello(string)string'] + argsTuple: HelloWorldArgs['tuple']['hello(string)string'] + returns: HelloWorldReturns['hello(string)string'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type HelloWorldSignatures = keyof HelloWorldTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type HelloWorldNonVoidMethodSignatures = keyof HelloWorldTypes['methods'] extends infer T ? T extends keyof HelloWorldTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the HelloWorld smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = HelloWorldTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the HelloWorld smart contract to the method's return type + */ +export type MethodReturn = HelloWorldTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type HelloWorldCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type HelloWorldDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: HelloWorldCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the HelloWorld smart contract + */ +export abstract class HelloWorldParamsFactory { + /** + * Constructs a no op call for the hello(string)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static hello(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'hello(string)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.name], + } + } +} + +/** + * A factory to create and deploy one or more instance of the HelloWorld smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class HelloWorldFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `HelloWorldFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new HelloWorldClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new HelloWorldClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the HelloWorld smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: HelloWorldDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new HelloWorldClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the HelloWorld smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the HelloWorld smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the HelloWorld smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new HelloWorldClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the HelloWorld smart contract + */ +export class HelloWorldClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `HelloWorldClient` + * + * @param appClient An `AppClient` instance which has been created with the HelloWorld app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `HelloWorldClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Checks for decode errors on the given return value and maps the return value to the return type for the given method + * @returns The typed return value or undefined if there was no value + */ + decodeReturnValue(method: TSignature, returnValue: ABIReturn | undefined) { + return returnValue !== undefined ? getArc56ReturnValue>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined + } + + /** + * Returns a new `HelloWorldClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new HelloWorldClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `HelloWorldClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new HelloWorldClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the HelloWorld smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(HelloWorldParamsFactory.hello(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the HelloWorld smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(HelloWorldParamsFactory.hello(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the HelloWorld smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + hello: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(HelloWorldParamsFactory.hello(params)) + return {...result, return: result.return as unknown as (undefined | HelloWorldReturns['hello(string)string'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new HelloWorldClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current HelloWorld app + */ + state = { + } + + public newGroup(): HelloWorldComposer { + const client = this + const composer = this.algorand.newGroup() + let promiseChain:Promise = Promise.resolve() + const resultMappers: Array any)> = [] + return { + /** + * Add a hello(string)string method call against the HelloWorld contract + */ + hello(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hello(params))) + resultMappers.push((v) => client.decodeReturnValue('hello(string)string', v)) + return this + }, + /** + * Add a clear state call to the HelloWorld contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + } + } + } as unknown as HelloWorldComposer + } +} +export type HelloWorldComposer = { + /** + * Calls the hello(string)string ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + hello(params?: CallParams): HelloWorldComposer<[...TReturns, HelloWorldReturns['hello(string)string'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the HelloWorld smart contract. + * + * @param args The arguments for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): HelloWorldComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): HelloWorldComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type HelloWorldComposerResults = Expand + diff --git a/examples/s-py/projects/s-py-frontend/src/contracts/README.md b/examples/s-py/projects/s-py-frontend/src/contracts/README.md new file mode 100644 index 0000000..04629b1 --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/src/contracts/README.md @@ -0,0 +1,14 @@ +## How to connect my web app with Algorand smart contracts? + +The following folder is reserved for the Algorand Application Clients. The clients are used to interact with instances of Algorand Smart Contracts (ASC1s) deployed on-chain. + +To integrate this react frontend template with your smart contracts codebase, perform the following steps: + +1. Generate the typed client using `algokit generate client -l typescript -o {path/to/this/folder}` or using the dedicated `link` command `algokit project link` (ensure to invoke it from the root of this react project). Using the `link` command is especially useful within workspaces that have multiple contract projects. +2. The generated typescript client should be ready to be imported and used in this react frontend template, making it a full fledged dApp. + +> Please note, by default this template defines `"generate:app-clients": "algokit project link --all"` which is a shortcut to automatically link TEAL code from all `contract` projects in the workspace as typed clients into the `frontend` project that is invoking the `link` command. Refer to [documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/link.md) to read more about `link` command. + +## **How to interact with the smart contract?** + +The generated client provides a set of functions that can be used to interact with the ABI (Application Binary Interface) compliant Algorand smart contract. For example, if the smart contract has a function called `hello`, the generated client will have a function called `hello` that can be used to interact with the smart contract. Refer to a [full-stack end-to-end starter template](https://github.com/algorandfoundation/algokit-fullstack-template) for a reference example on invoking and interacting with typescript typed clients generated. diff --git a/examples/s-py/projects/s-py-frontend/src/interfaces/network.ts b/examples/s-py/projects/s-py-frontend/src/interfaces/network.ts new file mode 100644 index 0000000..a458edc --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/src/interfaces/network.ts @@ -0,0 +1,26 @@ +import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/types/network-client' +import type { TokenHeader } from 'algosdk/dist/types/client/urlTokenBaseHTTPClient' + +export interface AlgoViteClientConfig extends AlgoClientConfig { + /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ + server: string + /** The port to use e.g. 4001, 443, etc. */ + port: string | number + /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ + token: string | TokenHeader + /** String representing current Algorand Network type (testnet/mainnet and etc) */ + network: string +} + +export interface AlgoViteKMDConfig extends AlgoClientConfig { + /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ + server: string + /** The port to use e.g. 4001, 443, etc. */ + port: string | number + /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ + token: string | TokenHeader + /** KMD wallet name */ + wallet: string + /** KMD wallet password */ + password: string +} diff --git a/examples/s-py/projects/s-py-frontend/src/main.tsx b/examples/s-py/projects/s-py-frontend/src/main.tsx new file mode 100644 index 0000000..431a30c --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/src/main.tsx @@ -0,0 +1,13 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App' +import './styles/App.css' +import ErrorBoundary from './components/ErrorBoundary' + +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + + + + + , +) diff --git a/examples/s-py/projects/s-py-frontend/src/styles/App.css b/examples/s-py/projects/s-py-frontend/src/styles/App.css new file mode 100644 index 0000000..ee2b188 --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/src/styles/App.css @@ -0,0 +1,126 @@ +/* App.css */ + +.hero { + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; + background-color: #38b2ac; +} + +.hero-content { + text-align: center; + border-radius: 0.5rem; + padding: 1.5rem; + max-width: 24rem; + background-color: #ffffff; + margin: 0 auto; +} + +.text-4xl { + font-size: 2.25rem; + line-height: 2.5rem; +} + +.font-bold { + font-weight: 700; +} + +.py-6 { + padding-top: 1.5rem; + padding-bottom: 1.5rem; +} + +.grid { + display: grid; +} + +.btn { + margin: 0.5rem; +} + +.btn-primary { + background-color: #1a202c; + color: #fff; +} + +.divider { + border-top: 1px solid #e2e8f0; + margin-top: 1rem; + margin-bottom: 1rem; +} + +.modal { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: rgba(0, 0, 0, 0.6); + display: none; + z-index: 9999; + overflow: auto; +} + +.modal-open { + display: block; +} + +.modal-box { + margin: 2.5em auto; + background: #fff; + border-radius: 0.5em; + width: 40em; + max-width: 90vw; + padding: 1em; +} + +.font-bold { + font-weight: bold; +} + +.text-2xl { + font-size: 1.5rem; +} + +.m-2 { + margin: 0.5rem; +} + +.pt-5 { + padding-top: 1.25rem; +} + +.grid { + display: grid; +} + +.btn { + margin: 0.5rem; + padding: 0.5rem 1rem; + background-color: #00aba2; + color: #fff; +} + +.btn-warning { + background-color: #d69e2e; +} + +.border-1 { + border-width: 1px; +} + +.border-teal-800 { + border-color: #2c7a7b; +} + +.modal-action { + display: grid; + margin-top: 1rem; +} + +.divider { + border-top: 1px solid #e2e8f0; + margin-top: 1rem; + margin-bottom: 1rem; +} diff --git a/examples/s-py/projects/s-py-frontend/src/utils/ellipseAddress.ts b/examples/s-py/projects/s-py-frontend/src/utils/ellipseAddress.ts new file mode 100644 index 0000000..db97e48 --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/src/utils/ellipseAddress.ts @@ -0,0 +1,3 @@ +export function ellipseAddress(address: string | null, width = 6): string { + return address ? `${address.slice(0, width)}...${address.slice(-width)}` : (address ?? '') +} diff --git a/examples/s-py/projects/s-py-frontend/src/utils/network/getAlgoClientConfigs.ts b/examples/s-py/projects/s-py-frontend/src/utils/network/getAlgoClientConfigs.ts new file mode 100644 index 0000000..b5121f8 --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/src/utils/network/getAlgoClientConfigs.ts @@ -0,0 +1,41 @@ +import { AlgoViteClientConfig, AlgoViteKMDConfig } from '../../interfaces/network' + +export function getAlgodConfigFromViteEnvironment(): AlgoViteClientConfig { + if (!import.meta.env.VITE_ALGOD_SERVER) { + throw new Error('Attempt to get default algod configuration without specifying VITE_ALGOD_SERVER in the environment variables') + } + + return { + server: import.meta.env.VITE_ALGOD_SERVER, + port: import.meta.env.VITE_ALGOD_PORT, + token: import.meta.env.VITE_ALGOD_TOKEN, + network: import.meta.env.VITE_ALGOD_NETWORK, + } +} + +export function getIndexerConfigFromViteEnvironment(): AlgoViteClientConfig { + if (!import.meta.env.VITE_INDEXER_SERVER) { + throw new Error('Attempt to get default algod configuration without specifying VITE_INDEXER_SERVER in the environment variables') + } + + return { + server: import.meta.env.VITE_INDEXER_SERVER, + port: import.meta.env.VITE_INDEXER_PORT, + token: import.meta.env.VITE_INDEXER_TOKEN, + network: import.meta.env.VITE_ALGOD_NETWORK, + } +} + +export function getKmdConfigFromViteEnvironment(): AlgoViteKMDConfig { + if (!import.meta.env.VITE_KMD_SERVER) { + throw new Error('Attempt to get default kmd configuration without specifying VITE_KMD_SERVER in the environment variables') + } + + return { + server: import.meta.env.VITE_KMD_SERVER, + port: import.meta.env.VITE_KMD_PORT, + token: import.meta.env.VITE_KMD_TOKEN, + wallet: import.meta.env.VITE_KMD_WALLET, + password: import.meta.env.VITE_KMD_PASSWORD, + } +} diff --git a/examples/s-py/projects/s-py-frontend/src/vite-env.d.ts b/examples/s-py/projects/s-py-frontend/src/vite-env.d.ts new file mode 100644 index 0000000..67c2d30 --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/src/vite-env.d.ts @@ -0,0 +1,24 @@ +/// + +interface ImportMetaEnv { + readonly VITE_ENVIRONMENT: string + + readonly VITE_ALGOD_TOKEN: string + readonly VITE_ALGOD_SERVER: string + readonly VITE_ALGOD_PORT: string + readonly VITE_ALGOD_NETWORK: string + + readonly VITE_INDEXER_TOKEN: string + readonly VITE_INDEXER_SERVER: string + readonly VITE_INDEXER_PORT: string + + readonly VITE_KMD_TOKEN: string + readonly VITE_KMD_SERVER: string + readonly VITE_KMD_PORT: string + readonly VITE_KMD_PASSWORD: string + readonly VITE_KMD_WALLET: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/examples/s-py/projects/s-py-frontend/tsconfig.json b/examples/s-py/projects/s-py-frontend/tsconfig.json new file mode 100644 index 0000000..443b6bd --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/tsconfig.json @@ -0,0 +1,38 @@ +{ + "compilerOptions": { + "target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + "module": "ES2022" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + "declaration": true /* Generates corresponding '.d.ts' file. */, + "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, + "sourceMap": true /* Generates corresponding '.map' file. */, + "strict": true /* Enable all strict type-checking options. */, + "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, + "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, + "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */, + "skipLibCheck": true /* Skip type checking of declaration files. */, + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, + "allowJs": false, + "allowSyntheticDefaultImports": true, + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "outDir": "./dist/" + }, + "include": [ + "src/**/*.ts", + "src/**/*.tsx", + "vite.config.js", + "src/utils/", + "src/utils/", + "src/main.tsx", + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/examples/s-py/projects/s-py-frontend/tsconfig.node.json b/examples/s-py/projects/s-py-frontend/tsconfig.node.json new file mode 100644 index 0000000..9d31e2a --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/examples/s-py/projects/s-py-frontend/vite.config.ts b/examples/s-py/projects/s-py-frontend/vite.config.ts new file mode 100644 index 0000000..e42dc7c --- /dev/null +++ b/examples/s-py/projects/s-py-frontend/vite.config.ts @@ -0,0 +1,15 @@ +import react from '@vitejs/plugin-react' +import { defineConfig } from 'vite' +import { nodePolyfills } from 'vite-plugin-node-polyfills' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + react(), + nodePolyfills({ + globals: { + Buffer: true, + }, + }), + ], +}) diff --git a/examples/s-tls/.algokit/.copier-answers.yml b/examples/s-tls/.algokit/.copier-answers.yml index e19132d..2a5df3e 100644 --- a/examples/s-tls/.algokit/.copier-answers.yml +++ b/examples/s-tls/.algokit/.copier-answers.yml @@ -1,6 +1,6 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 2.1.8-11-g7668422 -_src_path: /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template +_commit: +_src_path: author_email: None author_name: None contract_name: Calculator diff --git a/examples/s-tls/.algokit/generators/create-devcontainer/copier.yaml b/examples/s-tls/.algokit/generators/create-devcontainer/copier.yaml new file mode 100644 index 0000000..e98f334 --- /dev/null +++ b/examples/s-tls/.algokit/generators/create-devcontainer/copier.yaml @@ -0,0 +1,4 @@ +_tasks: + - "echo '==== Successfully generated new .devcontainer.json file 🚀 ===='" + +_templates_suffix: ".j2" diff --git a/examples/s-tls/.algokit/generators/create-devcontainer/devcontainer.json b/examples/s-tls/.algokit/generators/create-devcontainer/devcontainer.json new file mode 100644 index 0000000..6452c65 --- /dev/null +++ b/examples/s-tls/.algokit/generators/create-devcontainer/devcontainer.json @@ -0,0 +1,19 @@ +{ + "forwardPorts": [4001, 4002, 8980, 5173], + "portsAttributes": { + "4001": { + "label": "algod" + }, + "4002": { + "label": "kmd" + }, + "8980": { + "label": "indexer" + }, + "5173": { + "label": "vite" + } + }, + "postCreateCommand": "mkdir -p ~/.config/algokit && pipx install algokit && sudo chown -R codespace:codespace ~/.config/algokit", + "postStartCommand": "for i in {1..5}; do algokit localnet status > /dev/null 2>&1 && break || sleep 30; algokit localnet reset; done" +} diff --git a/examples/s-tls/.editorconfig b/examples/s-tls/.editorconfig new file mode 100644 index 0000000..5e550a1 --- /dev/null +++ b/examples/s-tls/.editorconfig @@ -0,0 +1,10 @@ +[*] +charset = utf-8 +insert_final_newline = true +end_of_line = lf +indent_style = space +indent_size = 2 +tab_width = 2 +max_line_length = 140 +trim_trailing_whitespace = true +single_quote = true diff --git a/examples/s-tls/.gitattributes b/examples/s-tls/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/examples/s-tls/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/examples/s-tls/.gitignore b/examples/s-tls/.gitignore new file mode 100644 index 0000000..4105eb2 --- /dev/null +++ b/examples/s-tls/.gitignore @@ -0,0 +1,170 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Ruff (linter) +.ruff_cache/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +.idea/ +!.idea/runConfigurations + +# macOS +.DS_Store + +# Received approval test files +*.received.* + +# NPM +node_modules + diff --git a/examples/s-tls/copy_files.sh b/examples/s-tls/copy_files.sh deleted file mode 100644 index 749b01f..0000000 --- a/examples/s-tls/copy_files.sh +++ /dev/null @@ -1,23 +0,0 @@ - -#!/bin/bash -# Script to copy required files to the frontend project -# Usage: ./copy_files.sh - - -project_name="$1" -frontend_root="./projects/${project_name}-frontend" - -# Ensure directories exist -mkdir -p "${frontend_root}/src/components" - -# Copy files -cp "./inject_content/Home.tsx" "${frontend_root}/src/Home.tsx" -cp "./inject_content/AppCalls.tsx" "${frontend_root}/src/components/AppCalls.tsx" - -echo "Template completed successfully!" -# remove inject_content folder -rm -rf "./inject_content" -# self destruct the file -rm -f "$0" - - diff --git a/examples/s-tls/projects/.gitkeep b/examples/s-tls/projects/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/examples/s-tls/projects/s-tls-contracts/.algokit.toml b/examples/s-tls/projects/s-tls-contracts/.algokit.toml new file mode 100644 index 0000000..b4b0251 --- /dev/null +++ b/examples/s-tls/projects/s-tls-contracts/.algokit.toml @@ -0,0 +1,15 @@ +[algokit] +min_version = "v2.0.0" + +[project] +type = 'contract' +name = 's-tls-contracts' +artifacts = 'contracts/artifacts' + +[project.run] +build = { commands = [ + 'npm run build', +], description = 'Build all smart contracts in the project' } +test = { commands = [ + 'npm run test', +], description = 'Run smart contract tests' } diff --git a/examples/s-tls/projects/s-tls-contracts/.eslintrc.js b/examples/s-tls/projects/s-tls-contracts/.eslintrc.js new file mode 100644 index 0000000..0fede66 --- /dev/null +++ b/examples/s-tls/projects/s-tls-contracts/.eslintrc.js @@ -0,0 +1,56 @@ +module.exports = { + env: { + browser: true, + es2021: true, + }, + extends: [ + 'airbnb-base', + 'plugin:import/errors', + 'plugin:import/warnings', + 'plugin:import/typescript', + 'plugin:prettier/recommended', + ], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + plugins: ['@typescript-eslint'], + rules: { + '@typescript-eslint/no-explicit-any': 'error', + '@typescript-eslint/ban-ts-comment': 'warn', + 'import/prefer-default-export': 'off', + 'import/extensions': [ + 'error', + 'ignorePackages', + { + js: 'never', + jsx: 'never', + ts: 'never', + tsx: 'never', + }, + ], + 'import/no-extraneous-dependencies': [ + 'error', + { + devDependencies: ['**/*.test.ts'], + }, + ], + }, + overrides: [ + { + files: ['*.algo.ts'], + rules: { + 'import/no-extraneous-dependencies': 'off', + 'object-shorthand': 'off', + 'class-methods-use-this': 'off', + 'no-undef': 'off', + 'max-classes-per-file': 'off', + 'no-bitwise': 'off', + 'operator-assignment': 'off', + 'prefer-template': 'off', + 'prefer-destructuring': 'off', + }, + }, + ], +}; diff --git a/examples/s-tls/projects/s-tls-contracts/.gitignore b/examples/s-tls/projects/s-tls-contracts/.gitignore new file mode 100644 index 0000000..40b878d --- /dev/null +++ b/examples/s-tls/projects/s-tls-contracts/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/examples/s-tls/projects/s-tls-contracts/.prettierrc.toml b/examples/s-tls/projects/s-tls-contracts/.prettierrc.toml new file mode 100644 index 0000000..d979519 --- /dev/null +++ b/examples/s-tls/projects/s-tls-contracts/.prettierrc.toml @@ -0,0 +1,6 @@ +# .prettierrc.toml +trailingComma = "es5" +tabWidth = 2 +semi = true +singleQuote = true +printWidth = 120 \ No newline at end of file diff --git a/examples/s-tls/projects/s-tls-contracts/.vscode/extensions.json b/examples/s-tls/projects/s-tls-contracts/.vscode/extensions.json new file mode 100644 index 0000000..c582379 --- /dev/null +++ b/examples/s-tls/projects/s-tls-contracts/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + ] + } \ No newline at end of file diff --git a/examples/s-tls/projects/s-tls-contracts/.vscode/settings.json b/examples/s-tls/projects/s-tls-contracts/.vscode/settings.json new file mode 100644 index 0000000..99a5c70 --- /dev/null +++ b/examples/s-tls/projects/s-tls-contracts/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit" + }, +} \ No newline at end of file diff --git a/examples/s-tls/projects/s-tls-contracts/README.md b/examples/s-tls/projects/s-tls-contracts/README.md new file mode 100644 index 0000000..6800947 --- /dev/null +++ b/examples/s-tls/projects/s-tls-contracts/README.md @@ -0,0 +1,25 @@ +# TEALScript Project + +## Documentation + +For TEALScript documentation, go to https://tealscript.algo.xyz + +## Usage + +### Algokit + +This template assumes you have a local network running on your machine. The easiet way to setup a local network is with [algokit](https://github.com/algorandfoundation/algokit-cli). If you don't have Algokit or its dependencies installed locally you can open this repository in a GitHub codespace via https://codespaces.new and choosing this repo. + +### Build Contract + +`npm run build` will compile the contract to TEAL and generate an ABI and appspec JSON in [./contracts/artifacts](./contracts/artifacts/) and a algokit TypeScript client in [./contracts/clients](./contracts/clients/). + +`npm run compile-contract` or `npm run generate-client` can be used to compile the contract or generate the contract seperately. + +### Run Tests + +`npm run test` will execute the tests defined in [./\_\_test\_\_](./__test__) + +### Lint + +`npm run lint` will lint the contracts and tests with ESLint. diff --git a/examples/s-tls/projects/s-tls-contracts/__test__/Calculator.test.ts b/examples/s-tls/projects/s-tls-contracts/__test__/Calculator.test.ts new file mode 100644 index 0000000..6c94ecc --- /dev/null +++ b/examples/s-tls/projects/s-tls-contracts/__test__/Calculator.test.ts @@ -0,0 +1,46 @@ +import { describe, test, expect, beforeAll, beforeEach } from '@jest/globals'; +import { algorandFixture } from '@algorandfoundation/algokit-utils/testing'; +import { Config } from '@algorandfoundation/algokit-utils'; +import { CalculatorClient, CalculatorFactory } from '../contracts/clients/CalculatorClient'; + +const fixture = algorandFixture(); +Config.configure({ populateAppCallResources: true }); + +let appClient: CalculatorClient; + +describe('Calculator', () => { + beforeEach(fixture.beforeEach); + + beforeAll(async () => { + await fixture.beforeEach(); + const { testAccount } = fixture.context; + const { algorand } = fixture; + + const factory = new CalculatorFactory({ + algorand, + defaultSender: testAccount.addr, + }); + + const createResult = await factory.send.create.createApplication(); + appClient = createResult.appClient; + }); + + test('sum', async () => { + const a = 13; + const b = 37; + const sum = await appClient.send.doMath({ args: { a, b, operation: 'sum' } }); + expect(sum.return).toBe(BigInt(a + b)); + }); + + test('difference', async () => { + const a = 13; + const b = 37; + const diff = await appClient.send.doMath({ args: { a, b, operation: 'difference' } }); + expect(diff.return).toBe(BigInt(a >= b ? a - b : b - a)); + }); + + test('hello', async () => { + const hello = await appClient.send.hello({ args: { name: 'world!' } }); + expect(hello.return).toBe('Hello, world!'); + }); +}); diff --git a/examples/s-tls/projects/s-tls-contracts/contracts/Calculator.algo.ts b/examples/s-tls/projects/s-tls-contracts/contracts/Calculator.algo.ts new file mode 100644 index 0000000..9b36280 --- /dev/null +++ b/examples/s-tls/projects/s-tls-contracts/contracts/Calculator.algo.ts @@ -0,0 +1,57 @@ +import { Contract } from '@algorandfoundation/tealscript'; + +export class Calculator extends Contract { + /** + * Calculates the sum of two numbers + * + * @param a + * @param b + * @returns The sum of a and b + */ + private getSum(a: uint64, b: uint64): uint64 { + return a + b; + } + + /** + * Calculates the difference between two numbers + * + * @param a + * @param b + * @returns The difference between a and b. + */ + private getDifference(a: uint64, b: uint64): uint64 { + return a >= b ? a - b : b - a; + } + + /** + * A method that takes two numbers and does either addition or subtraction + * + * @param a The first uint64 + * @param b The second uint64 + * @param operation The operation to perform. Can be either 'sum' or 'difference' + * + * @returns The result of the operation + */ + doMath(a: uint64, b: uint64, operation: string): uint64 { + let result: uint64; + + if (operation === 'sum') { + result = this.getSum(a, b); + } else if (operation === 'difference') { + result = this.getDifference(a, b); + } else throw Error('Invalid operation'); + + return result; + } + + /** + * A demonstration method used in the AlgoKit fullstack template. + * Greets the user by name. + * + * @param name The name of the user to greet. + * @returns A greeting message to the user. + */ + hello(name: string): string { + return 'Hello, ' + name; + } +} diff --git a/examples/s-tls/projects/s-tls-contracts/contracts/clients/.gitkeep b/examples/s-tls/projects/s-tls-contracts/contracts/clients/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/examples/s-tls/projects/s-tls-contracts/contracts/clients/CalculatorClient.ts b/examples/s-tls/projects/s-tls-contracts/contracts/clients/CalculatorClient.ts new file mode 100644 index 0000000..d3674b9 --- /dev/null +++ b/examples/s-tls/projects/s-tls-contracts/contracts/clients/CalculatorClient.ts @@ -0,0 +1,742 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^7 + */ +import { AlgorandClientInterface } from '@algorandfoundation/algokit-utils/types/algorand-client-interface' +import { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app' +import { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56' +import { + AppClient as _AppClient, + AppClientMethodCallParams, + AppClientParams, + AppClientBareCallParams, + CallOnComplete, + AppClientCompilationParams, + ResolveAppClientByCreatorAndName, + ResolveAppClientByNetwork, + CloneAppClientParams, +} from '@algorandfoundation/algokit-utils/types/app-client' +import { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer' +import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' +import SimulateResponse = modelsv2.SimulateResponse + +export const APP_SPEC: Arc56Contract = {"name":"Calculator","desc":"","methods":[{"name":"doMath","desc":"A method that takes two numbers and does either addition or subtraction","args":[{"name":"a","type":"uint64","desc":"The first uint64"},{"name":"b","type":"uint64","desc":"The second uint64"},{"name":"operation","type":"string","desc":"The operation to perform. Can be either 'sum' or 'difference'"}],"returns":{"type":"uint64","desc":"The result of the operation"},"actions":{"create":[],"call":["NoOp"]}},{"name":"hello","desc":"A demonstration method used in the AlgoKit fullstack template.\nGreets the user by name.","args":[{"name":"name","type":"string","desc":"The name of the user to greet."}],"returns":{"type":"string","desc":"A greeting message to the user."},"actions":{"create":[],"call":["NoOp"]}},{"name":"createApplication","args":[],"returns":{"type":"void"},"actions":{"create":["NoOp"],"call":[]}}],"arcs":[4,56],"structs":{},"state":{"schema":{"global":{"bytes":0,"ints":0},"local":{"bytes":0,"ints":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":[],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"teal":1,"source":"contracts/Calculator.algo.ts:3","pc":[0]},{"teal":2,"source":"contracts/Calculator.algo.ts:3","pc":[1,2,3]},{"teal":3,"source":"contracts/Calculator.algo.ts:3","pc":[4,5,6,7,8,9,10]},{"teal":15,"source":"contracts/Calculator.algo.ts:3","pc":[11,12]},{"teal":16,"source":"contracts/Calculator.algo.ts:3","pc":[13]},{"teal":17,"source":"contracts/Calculator.algo.ts:3","pc":[14,15]},{"teal":18,"source":"contracts/Calculator.algo.ts:3","pc":[16]},{"teal":19,"source":"contracts/Calculator.algo.ts:3","pc":[17,18]},{"teal":20,"source":"contracts/Calculator.algo.ts:3","pc":[19]},{"teal":21,"source":"contracts/Calculator.algo.ts:3","pc":[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]},{"teal":25,"source":"contracts/Calculator.algo.ts:3","errorMessage":"The requested action is not implemented in this contract. Are you using the correct OnComplete? Did you set your app ID?","pc":[46]},{"teal":35,"source":"contracts/Calculator.algo.ts:11","pc":[47,48,49]},{"teal":39,"source":"contracts/Calculator.algo.ts:12","pc":[50,51]},{"teal":40,"source":"contracts/Calculator.algo.ts:12","pc":[52,53]},{"teal":41,"source":"contracts/Calculator.algo.ts:12","pc":[54]},{"teal":42,"source":"contracts/Calculator.algo.ts:11","pc":[55]},{"teal":52,"source":"contracts/Calculator.algo.ts:22","pc":[56,57,58]},{"teal":56,"source":"contracts/Calculator.algo.ts:23","pc":[59,60]},{"teal":57,"source":"contracts/Calculator.algo.ts:23","pc":[61,62]},{"teal":58,"source":"contracts/Calculator.algo.ts:23","pc":[63]},{"teal":59,"source":"contracts/Calculator.algo.ts:23","pc":[64,65,66]},{"teal":60,"source":"contracts/Calculator.algo.ts:23","pc":[67,68]},{"teal":61,"source":"contracts/Calculator.algo.ts:23","pc":[69,70]},{"teal":62,"source":"contracts/Calculator.algo.ts:23","pc":[71]},{"teal":63,"source":"contracts/Calculator.algo.ts:23","pc":[72,73,74]},{"teal":66,"source":"contracts/Calculator.algo.ts:23","pc":[75,76]},{"teal":67,"source":"contracts/Calculator.algo.ts:23","pc":[77,78]},{"teal":68,"source":"contracts/Calculator.algo.ts:23","pc":[79]},{"teal":71,"source":"contracts/Calculator.algo.ts:22","pc":[80]},{"teal":76,"source":"contracts/Calculator.algo.ts:35","pc":[81]},{"teal":79,"source":"contracts/Calculator.algo.ts:35","pc":[82,83,84]},{"teal":80,"source":"contracts/Calculator.algo.ts:35","pc":[85,86,87]},{"teal":83,"source":"contracts/Calculator.algo.ts:35","pc":[88,89,90]},{"teal":84,"source":"contracts/Calculator.algo.ts:35","pc":[91]},{"teal":87,"source":"contracts/Calculator.algo.ts:35","pc":[92,93,94]},{"teal":88,"source":"contracts/Calculator.algo.ts:35","pc":[95]},{"teal":91,"source":"contracts/Calculator.algo.ts:35","pc":[96,97,98]},{"teal":92,"source":"contracts/Calculator.algo.ts:35","pc":[99]},{"teal":93,"source":"contracts/Calculator.algo.ts:35","pc":[100]},{"teal":94,"source":"contracts/Calculator.algo.ts:35","pc":[101]},{"teal":95,"source":"contracts/Calculator.algo.ts:35","pc":[102]},{"teal":96,"source":"contracts/Calculator.algo.ts:35","pc":[103]},{"teal":108,"source":"contracts/Calculator.algo.ts:35","pc":[104,105,106]},{"teal":111,"source":"contracts/Calculator.algo.ts:35","pc":[107,108]},{"teal":116,"source":"contracts/Calculator.algo.ts:38","pc":[109,110]},{"teal":117,"source":"contracts/Calculator.algo.ts:38","pc":[111,112,113,114,115]},{"teal":118,"source":"contracts/Calculator.algo.ts:38","pc":[116]},{"teal":119,"source":"contracts/Calculator.algo.ts:38","pc":[117,118,119]},{"teal":124,"source":"contracts/Calculator.algo.ts:39","pc":[120,121]},{"teal":125,"source":"contracts/Calculator.algo.ts:39","pc":[122,123]},{"teal":126,"source":"contracts/Calculator.algo.ts:39","pc":[124,125,126]},{"teal":127,"source":"contracts/Calculator.algo.ts:39","pc":[127,128]},{"teal":128,"source":"contracts/Calculator.algo.ts:38","pc":[129,130,131]},{"teal":133,"source":"contracts/Calculator.algo.ts:40","pc":[132,133]},{"teal":134,"source":"contracts/Calculator.algo.ts:40","pc":[134,135,136,137,138,139,140,141,142,143,144,145]},{"teal":135,"source":"contracts/Calculator.algo.ts:40","pc":[146]},{"teal":136,"source":"contracts/Calculator.algo.ts:40","pc":[147,148,149]},{"teal":141,"source":"contracts/Calculator.algo.ts:41","pc":[150,151]},{"teal":142,"source":"contracts/Calculator.algo.ts:41","pc":[152,153]},{"teal":143,"source":"contracts/Calculator.algo.ts:41","pc":[154,155,156]},{"teal":144,"source":"contracts/Calculator.algo.ts:41","pc":[157,158]},{"teal":145,"source":"contracts/Calculator.algo.ts:40","pc":[159,160,161]},{"teal":149,"source":"contracts/Calculator.algo.ts:42","errorMessage":"Invalid operation","pc":[162]},{"teal":154,"source":"contracts/Calculator.algo.ts:44","pc":[163,164]},{"teal":157,"source":"contracts/Calculator.algo.ts:35","pc":[165,166]},{"teal":158,"source":"contracts/Calculator.algo.ts:35","pc":[167]},{"teal":163,"source":"contracts/Calculator.algo.ts:54","pc":[168]},{"teal":166,"source":"contracts/Calculator.algo.ts:54","pc":[169,170,171]},{"teal":167,"source":"contracts/Calculator.algo.ts:54","pc":[172,173,174]},{"teal":170,"source":"contracts/Calculator.algo.ts:54","pc":[175,176,177]},{"teal":171,"source":"contracts/Calculator.algo.ts:54","pc":[178]},{"teal":172,"source":"contracts/Calculator.algo.ts:54","pc":[179]},{"teal":173,"source":"contracts/Calculator.algo.ts:54","pc":[180]},{"teal":174,"source":"contracts/Calculator.algo.ts:54","pc":[181,182,183]},{"teal":175,"source":"contracts/Calculator.algo.ts:54","pc":[184]},{"teal":176,"source":"contracts/Calculator.algo.ts:54","pc":[185]},{"teal":177,"source":"contracts/Calculator.algo.ts:54","pc":[186]},{"teal":178,"source":"contracts/Calculator.algo.ts:54","pc":[187]},{"teal":179,"source":"contracts/Calculator.algo.ts:54","pc":[188]},{"teal":180,"source":"contracts/Calculator.algo.ts:54","pc":[189]},{"teal":190,"source":"contracts/Calculator.algo.ts:54","pc":[190,191,192]},{"teal":194,"source":"contracts/Calculator.algo.ts:55","pc":[193,194,195,196,197,198,199,200,201]},{"teal":195,"source":"contracts/Calculator.algo.ts:55","pc":[202,203]},{"teal":196,"source":"contracts/Calculator.algo.ts:55","pc":[204]},{"teal":197,"source":"contracts/Calculator.algo.ts:54","pc":[205]},{"teal":200,"source":"contracts/Calculator.algo.ts:3","pc":[206]},{"teal":201,"source":"contracts/Calculator.algo.ts:3","pc":[207]},{"teal":204,"source":"contracts/Calculator.algo.ts:3","pc":[208,209,210,211,212,213]},{"teal":205,"source":"contracts/Calculator.algo.ts:3","pc":[214,215,216]},{"teal":206,"source":"contracts/Calculator.algo.ts:3","pc":[217,218,219,220]},{"teal":209,"source":"contracts/Calculator.algo.ts:3","errorMessage":"this contract does not implement the given ABI method for create NoOp","pc":[221]},{"teal":212,"source":"contracts/Calculator.algo.ts:3","pc":[222,223,224,225,226,227]},{"teal":213,"source":"contracts/Calculator.algo.ts:3","pc":[228,229,230,231,232,233]},{"teal":214,"source":"contracts/Calculator.algo.ts:3","pc":[234,235,236]},{"teal":215,"source":"contracts/Calculator.algo.ts:3","pc":[237,238,239,240,241,242]},{"teal":218,"source":"contracts/Calculator.algo.ts:3","errorMessage":"this contract does not implement the given ABI method for call NoOp","pc":[243]}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCmludGNibG9jayAxCmJ5dGVjYmxvY2sgMHgxNTFmN2M3NQoKLy8gVGhpcyBURUFMIHdhcyBnZW5lcmF0ZWQgYnkgVEVBTFNjcmlwdCB2MC4xMDcuMgovLyBodHRwczovL2dpdGh1Yi5jb20vYWxnb3JhbmRmb3VuZGF0aW9uL1RFQUxTY3JpcHQKCi8vIFRoaXMgY29udHJhY3QgaXMgY29tcGxpYW50IHdpdGggYW5kL29yIGltcGxlbWVudHMgdGhlIGZvbGxvd2luZyBBUkNzOiBbIEFSQzQgXQoKLy8gVGhlIGZvbGxvd2luZyB0ZW4gbGluZXMgb2YgVEVBTCBoYW5kbGUgaW5pdGlhbCBwcm9ncmFtIGZsb3cKLy8gVGhpcyBwYXR0ZXJuIGlzIHVzZWQgdG8gbWFrZSBpdCBlYXN5IGZvciBhbnlvbmUgdG8gcGFyc2UgdGhlIHN0YXJ0IG9mIHRoZSBwcm9ncmFtIGFuZCBkZXRlcm1pbmUgaWYgYSBzcGVjaWZpYyBhY3Rpb24gaXMgYWxsb3dlZAovLyBIZXJlLCBhY3Rpb24gcmVmZXJzIHRvIHRoZSBPbkNvbXBsZXRlIGluIGNvbWJpbmF0aW9uIHdpdGggd2hldGhlciB0aGUgYXBwIGlzIGJlaW5nIGNyZWF0ZWQgb3IgY2FsbGVkCi8vIEV2ZXJ5IHBvc3NpYmxlIGFjdGlvbiBmb3IgdGhpcyBjb250cmFjdCBpcyByZXByZXNlbnRlZCBpbiB0aGUgc3dpdGNoIHN0YXRlbWVudAovLyBJZiB0aGUgYWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgY29udHJhY3QsIGl0cyByZXNwZWN0aXZlIGJyYW5jaCB3aWxsIGJlICIqTk9UX0lNUExFTUVOVEVEIiB3aGljaCBqdXN0IGNvbnRhaW5zICJlcnIiCnR4biBBcHBsaWNhdGlvbklECiEKcHVzaGludCA2CioKdHhuIE9uQ29tcGxldGlvbgorCnN3aXRjaCAqY2FsbF9Ob09wICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqY3JlYXRlX05vT3AgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVECgoqTk9UX0lNUExFTUVOVEVEOgoJLy8gVGhlIHJlcXVlc3RlZCBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoaXMgY29udHJhY3QuIEFyZSB5b3UgdXNpbmcgdGhlIGNvcnJlY3QgT25Db21wbGV0ZT8gRGlkIHlvdSBzZXQgeW91ciBhcHAgSUQ/CgllcnIKCi8vIGdldFN1bShhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NAovLwovLyBDYWxjdWxhdGVzIHRoZSBzdW0gb2YgdHdvIG51bWJlcnMKLy8KLy8gQHBhcmFtIGEKLy8gQHBhcmFtIGIKLy8gQHJldHVybnMgVGhlIHN1bSBvZiBhIGFuZCBiCmdldFN1bToKCXByb3RvIDIgMQoKCS8vIGNvbnRyYWN0cy9DYWxjdWxhdG9yLmFsZ28udHM6MTIKCS8vIHJldHVybiBhICsgYjsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCSsKCXJldHN1YgoKLy8gZ2V0RGlmZmVyZW5jZShhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NAovLwovLyBDYWxjdWxhdGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIG51bWJlcnMKLy8KLy8gQHBhcmFtIGEKLy8gQHBhcmFtIGIKLy8gQHJldHVybnMgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGFuZCBiLgpnZXREaWZmZXJlbmNlOgoJcHJvdG8gMiAxCgoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czoyMwoJLy8gcmV0dXJuIGEgPj0gYiA/IGEgLSBiIDogYiAtIGE7CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0Cgk+PQoJYnogKnRlcm5hcnkwX2ZhbHNlCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0CgktCgliICp0ZXJuYXJ5MF9lbmQKCip0ZXJuYXJ5MF9mYWxzZToKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCS0KCip0ZXJuYXJ5MF9lbmQ6CglyZXRzdWIKCi8vIGRvTWF0aCh1aW50NjQsdWludDY0LHN0cmluZyl1aW50NjQKKmFiaV9yb3V0ZV9kb01hdGg6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGVjIDAgLy8gMHgxNTFmN2M3NQoKCS8vIG9wZXJhdGlvbjogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglleHRyYWN0IDIgMAoKCS8vIGI6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJYnRvaQoKCS8vIGE6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZG9NYXRoKHVpbnQ2NCx1aW50NjQsc3RyaW5nKXVpbnQ2NAoJY2FsbHN1YiBkb01hdGgKCWl0b2IKCWNvbmNhdAoJbG9nCglpbnRjIDAgLy8gMQoJcmV0dXJuCgovLyBkb01hdGgoYTogdWludDY0LCBiOiB1aW50NjQsIG9wZXJhdGlvbjogc3RyaW5nKTogdWludDY0Ci8vCi8vIEEgbWV0aG9kIHRoYXQgdGFrZXMgdHdvIG51bWJlcnMgYW5kIGRvZXMgZWl0aGVyIGFkZGl0aW9uIG9yIHN1YnRyYWN0aW9uCi8vCi8vIEBwYXJhbSBhIFRoZSBmaXJzdCB1aW50NjQKLy8gQHBhcmFtIGIgVGhlIHNlY29uZCB1aW50NjQKLy8gQHBhcmFtIG9wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0uIENhbiBiZSBlaXRoZXIgJ3N1bScgb3IgJ2RpZmZlcmVuY2UnCi8vCi8vIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbgpkb01hdGg6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJcHVzaGJ5dGVzIDB4CgoJLy8gKmlmMF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy9DYWxjdWxhdG9yLmFsZ28udHM6MzgKCS8vIG9wZXJhdGlvbiA9PT0gJ3N1bScKCWZyYW1lX2RpZyAtMyAvLyBvcGVyYXRpb246IHN0cmluZwoJcHVzaGJ5dGVzIDB4NzM3NTZkIC8vICJzdW0iCgk9PQoJYnogKmlmMF9lbHNlaWYxX2NvbmRpdGlvbgoKCS8vICppZjBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czozOQoJLy8gcmVzdWx0ID0gdGhpcy5nZXRTdW0oYSwgYikKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCWNhbGxzdWIgZ2V0U3VtCglmcmFtZV9idXJ5IDAgLy8gcmVzdWx0OiB1aW50NjQKCWIgKmlmMF9lbmQKCippZjBfZWxzZWlmMV9jb25kaXRpb246CgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjQwCgkvLyBvcGVyYXRpb24gPT09ICdkaWZmZXJlbmNlJwoJZnJhbWVfZGlnIC0zIC8vIG9wZXJhdGlvbjogc3RyaW5nCglwdXNoYnl0ZXMgMHg2NDY5NjY2NjY1NzI2NTZlNjM2NSAvLyAiZGlmZmVyZW5jZSIKCT09CglieiAqaWYwX2Vsc2UKCgkvLyAqaWYwX2Vsc2VpZjFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czo0MQoJLy8gcmVzdWx0ID0gdGhpcy5nZXREaWZmZXJlbmNlKGEsIGIpCglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CgljYWxsc3ViIGdldERpZmZlcmVuY2UKCWZyYW1lX2J1cnkgMCAvLyByZXN1bHQ6IHVpbnQ2NAoJYiAqaWYwX2VuZAoKKmlmMF9lbHNlOgoJLy8gSW52YWxpZCBvcGVyYXRpb24KCWVycgoKKmlmMF9lbmQ6CgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjQ0CgkvLyByZXR1cm4gcmVzdWx0OwoJZnJhbWVfZGlnIDAgLy8gcmVzdWx0OiB1aW50NjQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gaGVsbG8oc3RyaW5nKXN0cmluZwoqYWJpX3JvdXRlX2hlbGxvOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlYyAwIC8vIDB4MTUxZjdjNzUKCgkvLyBuYW1lOiBzdHJpbmcKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgoJLy8gZXhlY3V0ZSBoZWxsbyhzdHJpbmcpc3RyaW5nCgljYWxsc3ViIGhlbGxvCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWludGMgMCAvLyAxCglyZXR1cm4KCi8vIGhlbGxvKG5hbWU6IHN0cmluZyk6IHN0cmluZwovLwovLyBBIGRlbW9uc3RyYXRpb24gbWV0aG9kIHVzZWQgaW4gdGhlIEFsZ29LaXQgZnVsbHN0YWNrIHRlbXBsYXRlLgovLyBHcmVldHMgdGhlIHVzZXIgYnkgbmFtZS4KLy8KLy8gQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHVzZXIgdG8gZ3JlZXQuCi8vIEByZXR1cm5zIEEgZ3JlZXRpbmcgbWVzc2FnZSB0byB0aGUgdXNlci4KaGVsbG86Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjU1CgkvLyByZXR1cm4gJ0hlbGxvLCAnICsgbmFtZTsKCXB1c2hieXRlcyAweDQ4NjU2YzZjNmYyYzIwIC8vICJIZWxsbywgIgoJZnJhbWVfZGlnIC0xIC8vIG5hbWU6IHN0cmluZwoJY29uY2F0CglyZXRzdWIKCiphYmlfcm91dGVfY3JlYXRlQXBwbGljYXRpb246CglpbnRjIDAgLy8gMQoJcmV0dXJuCgoqY3JlYXRlX05vT3A6CglwdXNoYnl0ZXMgMHhiODQ0N2IzNiAvLyBtZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKCl2b2lkIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9jcmVhdGVBcHBsaWNhdGlvbgoKCS8vIHRoaXMgY29udHJhY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBnaXZlbiBBQkkgbWV0aG9kIGZvciBjcmVhdGUgTm9PcAoJZXJyCgoqY2FsbF9Ob09wOgoJcHVzaGJ5dGVzIDB4NzZhN2VmMzMgLy8gbWV0aG9kICJkb01hdGgodWludDY0LHVpbnQ2NCxzdHJpbmcpdWludDY0IgoJcHVzaGJ5dGVzIDB4MDJiZWNlMTEgLy8gbWV0aG9kICJoZWxsbyhzdHJpbmcpc3RyaW5nIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9kb01hdGggKmFiaV9yb3V0ZV9oZWxsbwoKCS8vIHRoaXMgY29udHJhY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBnaXZlbiBBQkkgbWV0aG9kIGZvciBjYWxsIE5vT3AKCWVycg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEw"},"byteCode":{"approval":"CiABASYBBBUffHUxGBSBBgsxGQiNDACwAAAAAAAAAAAAAACiAAAAAAAAAAAAAACKAgGL/4v+CImKAgGL/4v+D0EACIv/i/4JQgAFi/6L/wmJKDYaA1cCADYaAhc2GgEXiAAFFlCwIkOKAwGAAIv9gANzdW0SQQAMi/6L/4j/sIwAQgAfi/2ACmRpZmZlcmVuY2USQQAMi/6L/4j/m4wAQgABAIsAjACJKDYaAVcCAIgADEkVFlcGAkxQULAiQ4oBAYAHSGVsbG8sIIv/UIkiQ4AEuER7NjYaAI4B//EAgAR2p+8zgAQCvs4RNhoAjgL/Xv+1AA==","clear":"Cg=="},"compilerInfo":{"compiler":"algod","compilerVersion":{"major":4,"minor":4,"patch":1,"commitHash":"7b607ce4"}}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the Calculator contract + */ +export type CalculatorArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'doMath(uint64,uint64,string)uint64': { + /** + * The first uint64 + */ + a: bigint | number + /** + * The second uint64 + */ + b: bigint | number + /** + * The operation to perform. Can be either 'sum' or 'difference' + */ + operation: string + } + 'hello(string)string': { + /** + * The name of the user to greet. + */ + name: string + } + 'createApplication()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'doMath(uint64,uint64,string)uint64': [a: bigint | number, b: bigint | number, operation: string] + 'hello(string)string': [name: string] + 'createApplication()void': [] + } +} + +/** + * The return type for each method + */ +export type CalculatorReturns = { + 'doMath(uint64,uint64,string)uint64': bigint + 'hello(string)string': string + 'createApplication()void': void +} + +/** + * Defines the types of available calls and state of the Calculator smart contract. + */ +export type CalculatorTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'doMath(uint64,uint64,string)uint64' | 'doMath', { + argsObj: CalculatorArgs['obj']['doMath(uint64,uint64,string)uint64'] + argsTuple: CalculatorArgs['tuple']['doMath(uint64,uint64,string)uint64'] + /** + * The result of the operation + */ + returns: CalculatorReturns['doMath(uint64,uint64,string)uint64'] + }> + & Record<'hello(string)string' | 'hello', { + argsObj: CalculatorArgs['obj']['hello(string)string'] + argsTuple: CalculatorArgs['tuple']['hello(string)string'] + /** + * A greeting message to the user. + */ + returns: CalculatorReturns['hello(string)string'] + }> + & Record<'createApplication()void' | 'createApplication', { + argsObj: CalculatorArgs['obj']['createApplication()void'] + argsTuple: CalculatorArgs['tuple']['createApplication()void'] + returns: CalculatorReturns['createApplication()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type CalculatorSignatures = keyof CalculatorTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type CalculatorNonVoidMethodSignatures = keyof CalculatorTypes['methods'] extends infer T ? T extends keyof CalculatorTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the Calculator smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = CalculatorTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the Calculator smart contract to the method's return type + */ +export type MethodReturn = CalculatorTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type CalculatorCreateCallParams = + | Expand & {method: 'createApplication'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema> + | Expand & {method: 'createApplication()void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema> +/** + * Defines arguments required for the deploy method. + */ +export type CalculatorDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: CalculatorCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the Calculator smart contract + */ +export abstract class CalculatorParamsFactory { + /** + * Gets available create ABI call param factories + */ + static get create() { + return { + _resolveByMethod(params: TParams) { + switch(params.method) { + case 'createApplication': + case 'createApplication()void': + return CalculatorParamsFactory.create.createApplication(params) + } + throw new Error(`Unknown ' + verb + ' method`) + }, + + /** + * Constructs create ABI call params for the Calculator smart contract using the createApplication()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + createApplication(params: CallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} { + return { + ...params, + method: 'createApplication()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + + /** + * Constructs a no op call for the doMath(uint64,uint64,string)uint64 ABI method + * + * A method that takes two numbers and does either addition or subtraction + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static doMath(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'doMath(uint64,uint64,string)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.operation], + } + } + /** + * Constructs a no op call for the hello(string)string ABI method + * + * A demonstration method used in the AlgoKit fullstack template. + Greets the user by name. + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static hello(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'hello(string)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.name], + } + } +} + +/** + * A factory to create and deploy one or more instance of the Calculator smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class CalculatorFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `CalculatorFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClientInterface { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new CalculatorClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new CalculatorClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the Calculator smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: CalculatorDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + createParams: params.createParams?.method ? CalculatorParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (CalculatorCreateCallParams & { args: Uint8Array[] }) : undefined, + }) + return { result: result.result, appClient: new CalculatorClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Calculator smart contract using the createApplication()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create params + */ + createApplication: (params: CallParams & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { + return this.appFactory.params.create(CalculatorParamsFactory.create.createApplication(params)) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Calculator smart contract using the createApplication()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create transaction + */ + createApplication: (params: CallParams & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { + return this.appFactory.createTransaction.create(CalculatorParamsFactory.create.createApplication(params)) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Calculator smart contract using an ABI method call using the createApplication()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create result + */ + createApplication: async (params: CallParams & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { + const result = await this.appFactory.send.create(CalculatorParamsFactory.create.createApplication(params)) + return { result: { ...result.result, return: result.result.return as unknown as (undefined | CalculatorReturns['createApplication()void']) }, appClient: new CalculatorClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the Calculator smart contract + */ +export class CalculatorClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `CalculatorClient` + * + * @param appClient An `AppClient` instance which has been created with the Calculator app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `CalculatorClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Checks for decode errors on the given return value and maps the return value to the return type for the given method + * @returns The typed return value or undefined if there was no value + */ + decodeReturnValue(method: TSignature, returnValue: ABIReturn | undefined) { + return returnValue !== undefined ? getArc56ReturnValue>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined + } + + /** + * Returns a new `CalculatorClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new CalculatorClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `CalculatorClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new CalculatorClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClientInterface { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the Calculator smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. + * + * A method that takes two numbers and does either addition or subtraction + * + * @param params The params for the smart contract call + * @returns The call params: The result of the operation + */ + doMath: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(CalculatorParamsFactory.doMath(params)) + }, + + /** + * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. + * + * A demonstration method used in the AlgoKit fullstack template. + Greets the user by name. + + * + * @param params The params for the smart contract call + * @returns The call params: A greeting message to the user. + */ + hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(CalculatorParamsFactory.hello(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the Calculator smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. + * + * A method that takes two numbers and does either addition or subtraction + * + * @param params The params for the smart contract call + * @returns The call transaction: The result of the operation + */ + doMath: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(CalculatorParamsFactory.doMath(params)) + }, + + /** + * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. + * + * A demonstration method used in the AlgoKit fullstack template. + Greets the user by name. + + * + * @param params The params for the smart contract call + * @returns The call transaction: A greeting message to the user. + */ + hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(CalculatorParamsFactory.hello(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the Calculator smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. + * + * A method that takes two numbers and does either addition or subtraction + * + * @param params The params for the smart contract call + * @returns The call result: The result of the operation + */ + doMath: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(CalculatorParamsFactory.doMath(params)) + return {...result, return: result.return as unknown as (undefined | CalculatorReturns['doMath(uint64,uint64,string)uint64'])} + }, + + /** + * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. + * + * A demonstration method used in the AlgoKit fullstack template. + Greets the user by name. + + * + * @param params The params for the smart contract call + * @returns The call result: A greeting message to the user. + */ + hello: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(CalculatorParamsFactory.hello(params)) + return {...result, return: result.return as unknown as (undefined | CalculatorReturns['hello(string)string'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new CalculatorClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current Calculator app + */ + state = { + } + + public newGroup(): CalculatorComposer { + const client = this + const composer = this.algorand.newGroup() + let promiseChain:Promise = Promise.resolve() + const resultMappers: Array any)> = [] + return { + /** + * Add a doMath(uint64,uint64,string)uint64 method call against the Calculator contract + */ + doMath(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.doMath(params))) + resultMappers.push((v) => client.decodeReturnValue('doMath(uint64,uint64,string)uint64', v)) + return this + }, + /** + * Add a hello(string)string method call against the Calculator contract + */ + hello(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hello(params))) + resultMappers.push((v) => client.decodeReturnValue('hello(string)string', v)) + return this + }, + /** + * Add a clear state call to the Calculator contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + } + } + } as unknown as CalculatorComposer + } +} +export type CalculatorComposer = { + /** + * Calls the doMath(uint64,uint64,string)uint64 ABI method. + * + * A method that takes two numbers and does either addition or subtraction + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + doMath(params?: CallParams): CalculatorComposer<[...TReturns, CalculatorReturns['doMath(uint64,uint64,string)uint64'] | undefined]> + + /** + * Calls the hello(string)string ABI method. + * + * A demonstration method used in the AlgoKit fullstack template. + Greets the user by name. + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + hello(params?: CallParams): CalculatorComposer<[...TReturns, CalculatorReturns['hello(string)string'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the Calculator smart contract. + * + * @param args The arguments for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): CalculatorComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): CalculatorComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type CalculatorComposerResults = Expand + diff --git a/examples/s-tls/projects/s-tls-contracts/jest.config.js b/examples/s-tls/projects/s-tls-contracts/jest.config.js new file mode 100644 index 0000000..6f5ef4e --- /dev/null +++ b/examples/s-tls/projects/s-tls-contracts/jest.config.js @@ -0,0 +1,6 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + testTimeout: 60000 +}; diff --git a/examples/s-tls/projects/s-tls-contracts/package.json b/examples/s-tls/projects/s-tls-contracts/package.json new file mode 100644 index 0000000..a8a1c58 --- /dev/null +++ b/examples/s-tls/projects/s-tls-contracts/package.json @@ -0,0 +1,36 @@ +{ + "name": "s-tls-contracts", + "version": "0.0.0", + "license": "MIT", + "scripts": { + "generate-client": "algokit generate client contracts/artifacts/ --language typescript --output contracts/clients/{contract_name}Client.ts", + "compile-contract": "tealscript contracts/*.algo.ts contracts/artifacts", + "generate-components": "algokit-generate-component contracts/artifacts/Calculator.arc32.json contracts/artifacts/components", + "build": "npm run compile-contract && npm run generate-client", + "test": "npm run build && jest", + "lint": "eslint . --ext .ts", + "fix": "eslint . --ext .ts --fix" + }, + "dependencies": { + "@algorandfoundation/algokit-utils": "^7.0.0", + "algosdk": ">=2.9.0 <3.0" + }, + "devDependencies": { + "@algorandfoundation/algokit-client-generator": "^4.0.0", + "@algorandfoundation/tealscript": "latest", + "@jest/globals": "^29.5.0", + "@joe-p/algokit-generate-component": "^0.2.0", + "@typescript-eslint/eslint-plugin": "^5.13.0", + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^7.32.0 || ^8.2.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-airbnb-typescript": "^17.0.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-prettier": "^5.0.1", + "jest": "^29.5.0", + "prettier": "^3.0.3", + "ts-jest": "^29.1.0", + "typescript": "5.0.2" + } +} diff --git a/examples/s-tls/projects/s-tls-contracts/tsconfig.json b/examples/s-tls/projects/s-tls-contracts/tsconfig.json new file mode 100644 index 0000000..5e3106d --- /dev/null +++ b/examples/s-tls/projects/s-tls-contracts/tsconfig.json @@ -0,0 +1,103 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/examples/s-tls/projects/s-tls-frontend/.algokit.toml b/examples/s-tls/projects/s-tls-frontend/.algokit.toml new file mode 100644 index 0000000..f11e2b6 --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/.algokit.toml @@ -0,0 +1,11 @@ +[algokit] +min_version = "v2.0.0" + +[project] +type = "frontend" +name = 's-tls-frontend' +artifacts = "src/contracts" + +[project.run] +build = { commands = ['npm run build'], description = 'Build frontend' } +test = { commands = ['npm run test'], description = 'Run frontend tests' } diff --git a/examples/s-tls/projects/s-tls-frontend/.algokit/.copier-answers.yml b/examples/s-tls/projects/s-tls-frontend/.algokit/.copier-answers.yml new file mode 100644 index 0000000..2682fb5 --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/.algokit/.copier-answers.yml @@ -0,0 +1,8 @@ +# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY +_commit: 1.1.1 +_src_path: gh:algorandfoundation/algokit-react-frontend-template +author_email: None +author_name: None +preset_name: starter +project_name: s-tls-frontend + diff --git a/examples/s-tls/projects/s-tls-frontend/.env.template b/examples/s-tls/projects/s-tls-frontend/.env.template new file mode 100644 index 0000000..eb4b229 --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/.env.template @@ -0,0 +1,67 @@ +# ====================== +# LocalNet configuration +# uncomment below to use +# ====================== + +VITE_ENVIRONMENT=local + +# Algod +VITE_ALGOD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +VITE_ALGOD_SERVER=http://localhost +VITE_ALGOD_PORT=4001 +VITE_ALGOD_NETWORK=localnet + +# Indexer +VITE_INDEXER_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +VITE_INDEXER_SERVER=http://localhost +VITE_INDEXER_PORT=8980 + +# KMD +# Please note: +# 1. This is only needed for LocalNet since +# by default KMD provider is ignored on other networks. +# 2. AlgoKit LocalNet starts with a single wallet called 'unencrypted-default-wallet', +# with heaps of tokens available for testing. +VITE_KMD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +VITE_KMD_SERVER=http://localhost +VITE_KMD_PORT=4002 +VITE_KMD_WALLET="unencrypted-default-wallet" +VITE_KMD_PASSWORD="" + +# # ====================== +# # TestNet configuration: +# # uncomment below to use +# # ====================== + +# VITE_ENVIRONMENT=local + +# # Algod +# VITE_ALGOD_TOKEN="" +# VITE_ALGOD_SERVER="https://testnet-api.algonode.cloud" +# VITE_ALGOD_PORT="" +# VITE_ALGOD_NETWORK="testnet" + +# # Indexer +# VITE_INDEXER_TOKEN="" +# VITE_INDEXER_SERVER="https://testnet-idx.algonode.cloud" +# VITE_INDEXER_PORT="" + + +# # ====================== +# # MainNet configuration: +# # uncomment below to use +# # ====================== + +# VITE_ENVIRONMENT=production + +# # Algod +# VITE_ALGOD_TOKEN="" +# VITE_ALGOD_SERVER="https://mainnet-api.algonode.cloud" +# VITE_ALGOD_PORT="" +# VITE_ALGOD_NETWORK="mainnet" + +# # Indexer +# VITE_INDEXER_TOKEN="" +# VITE_INDEXER_SERVER="https://mainnet-idx.algonode.cloud" +# VITE_INDEXER_PORT="" + diff --git a/examples/s-tls/projects/s-tls-frontend/.gitignore b/examples/s-tls/projects/s-tls-frontend/.gitignore new file mode 100644 index 0000000..b1ce837 --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/.gitignore @@ -0,0 +1,38 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + + +# dotenv environment variable files +.env +env/ + +# misc +/dist +.DS_Store + + +npm-debug.log* +yarn-debug.log* +yarn-error.log* +/test-results/ +/playwright-report/ +/playwright/.cache/ + +# PyCharm +.idea +!.idea/ +.idea/* +!.idea/runConfigurations/ + +.vercel +.netlify diff --git a/examples/s-tls/projects/s-tls-frontend/.npmrc b/examples/s-tls/projects/s-tls-frontend/.npmrc new file mode 100644 index 0000000..c42da84 --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/.npmrc @@ -0,0 +1 @@ +engine-strict = true diff --git a/examples/s-tls/projects/s-tls-frontend/.vscode/extensions.json b/examples/s-tls/projects/s-tls-frontend/.vscode/extensions.json new file mode 100644 index 0000000..6d0554a --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "EditorConfig.EditorConfig", + "dotenv.dotenv-vscode", + ] +} + diff --git a/examples/s-tls/projects/s-tls-frontend/.vscode/launch.json b/examples/s-tls/projects/s-tls-frontend/.vscode/launch.json new file mode 100644 index 0000000..7edaf04 --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/.vscode/launch.json @@ -0,0 +1,68 @@ +{ + "configurations": [ + { + "type": "msedge", + "request": "launch", + "name": "Run (Edge)", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}", + "presentation": { + "hidden": false, + "group": "2. Web" + } + }, + { + "type": "chrome", + "request": "launch", + "name": "Run (Chrome)", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}", + "presentation": { + "hidden": false, + "group": "2. Web" + } + }, + { + "type": "firefox", + "request": "launch", + "name": "Run (Firefox)", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}", + "presentation": { + "hidden": false, + "group": "2. Web" + } + }, + { + "name": "Run dApp", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev"], + "cwd": "${workspaceRoot}", + "console": "integratedTerminal", + "skipFiles": ["/**", "node_modules/**"], + "presentation": { + "hidden": false, + "group": "1. Run Project", + "order": 1 + } + }, + { + "name": "Run dApp (+ LocalNet)", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev"], + "cwd": "${workspaceRoot}", + "console": "integratedTerminal", + "skipFiles": ["/**", "node_modules/**"], + "preLaunchTask": "Start AlgoKit LocalNet", + "presentation": { + "hidden": false, + "group": "1. Run Project", + "order": 1 + } + } + ] +} diff --git a/examples/s-tls/projects/s-tls-frontend/.vscode/settings.json b/examples/s-tls/projects/s-tls-frontend/.vscode/settings.json new file mode 100644 index 0000000..f34d28b --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "editor.formatOnSave": true, + + "dotenv.enableAutocloaking": false, + +} diff --git a/examples/s-tls/projects/s-tls-frontend/.vscode/tasks.json b/examples/s-tls/projects/s-tls-frontend/.vscode/tasks.json new file mode 100644 index 0000000..d611c4f --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/.vscode/tasks.json @@ -0,0 +1,15 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Start AlgoKit LocalNet", + "command": "algokit", + "args": ["localnet", "start"], + "type": "shell", + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + } + ] +} diff --git a/examples/s-tls/projects/s-tls-frontend/README.md b/examples/s-tls/projects/s-tls-frontend/README.md new file mode 100644 index 0000000..da97047 --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/README.md @@ -0,0 +1,76 @@ +# s-tls-frontend + +This starter React project has been generated using AlgoKit. See below for default getting started instructions. + +# Setup + +### Initial Setup + +#### 1. Clone the Repository +Start by cloning this repository to your local machine. + +#### 2. Install Pre-requisites +Ensure the following pre-requisites are installed and properly configured: + +- **npm**: Node package manager. Install from [Node.js Installation Guide](https://nodejs.org/en/download/). Verify with `npm -v` to see version `18.12`+. +- **AlgoKit CLI**: Essential for project setup and operations. Install the latest version from [AlgoKit CLI Installation Guide](https://github.com/algorandfoundation/algokit-cli#install). Verify installation with `algokit --version`, expecting `2.0.0` or later. + +#### 3. Bootstrap Your Local Environment +Run the following commands within the project folder: + +- **Install Project Dependencies**: With `algokit project bootstrap all`, ensure all dependencies are ready. + +### Development Workflow + +#### Terminal +Directly manage and interact with your project using AlgoKit commands: + +1. **Build Contracts**: `algokit project run build` builds react web app and links with smart contracts in workspace, if any. +2. Remaining set of command for linting, testing and deployment can be found in respective [package.json](./package.json) file and [.algokit.toml](./.algokit.toml) files. + +#### VS Code +For a seamless experience with breakpoint debugging and other features: + +1. **Open Project**: In VS Code, open the repository root. +2. **Install Extensions**: Follow prompts to install recommended extensions. +3. **Debugging**: + - Use `F5` to start debugging. + - **Windows Users**: Select the Python interpreter at `./.venv/Scripts/python.exe` via `Ctrl/Cmd + Shift + P` > `Python: Select Interpreter` before the first run. + +#### Other IDEs +While primarily optimized for VS Code, Jetbrains WebStorm has base support for this project: + +1. **Open Project**: In your JetBrains IDE, open the repository root. +2. **Automatic Setup**: The IDE should configure the Python interpreter and virtual environment. +3. **Debugging**: Use `Shift+F10` or `Ctrl+R` to start debugging. Note: Windows users may encounter issues with pre-launch tasks due to a known bug. See [JetBrains forums](https://youtrack.jetbrains.com/issue/IDEA-277486/Shell-script-configuration-cannot-run-as-before-launch-task) for workarounds. + +## AlgoKit Workspaces and Project Management +This project supports both standalone and monorepo setups through AlgoKit workspaces. Leverage [`algokit project run`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md) commands for efficient monorepo project orchestration and management across multiple projects within a workspace. + +> Please note, by default frontend is pre configured to run against Algorand LocalNet. If you want to run against TestNet or MainNet, comment out the current environment variable and uncomment the relevant one in [`.env`](.env) file that is created after running bootstrap command and based on [`.env.template`](.env.template). + +# Algorand Wallet integrations + +The template comes with [`use-wallet`](https://github.com/txnlab/use-wallet) integration, which provides a React hook for connecting to an Algorand wallet providers. The following wallet providers are included by default: +- LocalNet: +- - [KMD/Local Wallet](https://github.com/TxnLab/use-wallet#kmd-algorand-key-management-daemon) - Algorand's Key Management Daemon (KMD) is a service that manages Algorand private keys and signs transactions. Works best with AlgoKit LocalNet and allows you to easily test and interact with your dApps locally. +- TestNet and others: +- - [Pera Wallet](https://perawallet.app). +- - [Defly Wallet](https://defly.app). +- - [Exodus Wallet](https://www.exodus.com). +- - [Daffi Wallet](https://www.daffi.me). + +Refer to official [`use-wallet`](https://github.com/txnlab/use-wallet) documentation for detailed guidelines on how to integrate with other wallet providers (such as WalletConnect v2). Too see implementation details on the use wallet hook and initialization of extra wallet providers refer to [`App.tsx`](./src/App.tsx). + +# Tools + +This project makes use of React and Tailwind to provider a base project configuration to develop frontends for your Algorand dApps and interactions with smart contracts. The following tools are in use: + +- [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-ts) - Various TypeScript utilities to simplify interactions with Algorand and AlgoKit. +- [React](https://reactjs.org/) - A JavaScript library for building user interfaces. +- [use-wallet](https://github.com/txnlab/use-wallet) - A React hook for connecting to an Algorand wallet providers. +- [npm](https://www.npmjs.com/): Node.js package manager +It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. +# Integrating with smart contracts and application clients + +Refer to the detailed guidance on [integrating with smart contracts and application clients](./src/contracts/README.md). In essence, for any smart contract codebase generated with AlgoKit or other tools that produce compile contracts into ARC34 compliant app specifications, you can use the `algokit generate` command to generate TypeScript or Python typed client. Once generated simply drag and drop the generated client into `./src/contracts` and import it into your React components as you see fit. diff --git a/examples/s-tls/projects/s-tls-frontend/index.html b/examples/s-tls/projects/s-tls-frontend/index.html new file mode 100644 index 0000000..5a2ef4f --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/index.html @@ -0,0 +1,12 @@ + + + + + + AlgoKit React Template + + +
+ + + diff --git a/examples/s-tls/projects/s-tls-frontend/package.json b/examples/s-tls/projects/s-tls-frontend/package.json new file mode 100644 index 0000000..7d3fb81 --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/package.json @@ -0,0 +1,64 @@ +{ + "name": "s-tls-frontend", + "version": "0.1.0", + "author": { + "name": "None", + "email": "None" + }, + "private": true, + "type": "module", + "engines": { + "node": ">=20.0", + "npm": ">=9.0" + }, + "devDependencies": { + "@algorandfoundation/algokit-client-generator": "^5.0.0", + "@types/node": "^18.17.14", + "@types/react": "^18.2.11", + "@types/react-dom": "^18.2.4", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.14", + "ts-node": "^10.9.1", + "typescript": "^5.1.6", + "vite": "^5.0.0", + "vite-plugin-node-polyfills": "^0.22.0" + }, + "dependencies": { + "@algorandfoundation/algokit-utils": "^9.0.0", + "@blockshake/defly-connect": "^1.2.1", + "@perawallet/connect": "^1.4.1", + "@txnlab/use-wallet": "^4.0.0", + "@txnlab/use-wallet-react": "^4.0.0", + "algosdk": "^3.0.0", + "notistack": "^3.0.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "tslib": "^2.6.2" + }, + "scripts": { + "generate:app-clients": "algokit project link --all", + "dev": "npm run generate:app-clients && vite", + "build": "npm run generate:app-clients && tsc && vite build", + "preview": "vite preview" + }, + "eslintConfig": { + "extends": [ + "react-app" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "overrides": { + "ws@>7.0.0 <7.5.9": "7.5.10" + } +} diff --git a/examples/s-tls/projects/s-tls-frontend/public/index.html b/examples/s-tls/projects/s-tls-frontend/public/index.html new file mode 100644 index 0000000..0d3a3a5 --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/public/index.html @@ -0,0 +1,37 @@ + + + + + + + + + + React App + + + +
+ + + diff --git a/examples/s-tls/projects/s-tls-frontend/public/robots.txt b/examples/s-tls/projects/s-tls-frontend/public/robots.txt new file mode 100644 index 0000000..e9e57dc --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/examples/s-tls/projects/s-tls-frontend/src/App.tsx b/examples/s-tls/projects/s-tls-frontend/src/App.tsx new file mode 100644 index 0000000..f346006 --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/src/App.tsx @@ -0,0 +1,56 @@ +import { SupportedWallet, WalletId, WalletManager, WalletProvider } from '@txnlab/use-wallet-react' +import { SnackbarProvider } from 'notistack' +import Home from './Home' +import { getAlgodConfigFromViteEnvironment, getKmdConfigFromViteEnvironment } from './utils/network/getAlgoClientConfigs' + +let supportedWallets: SupportedWallet[] +if (import.meta.env.VITE_ALGOD_NETWORK === 'localnet') { + const kmdConfig = getKmdConfigFromViteEnvironment() + supportedWallets = [ + { + id: WalletId.KMD, + options: { + baseServer: kmdConfig.server, + token: String(kmdConfig.token), + port: String(kmdConfig.port), + }, + }, + ] +} else { + supportedWallets = [ + { id: WalletId.DEFLY }, + { id: WalletId.PERA }, + { id: WalletId.EXODUS }, + // If you are interested in WalletConnect v2 provider + // refer to https://github.com/TxnLab/use-wallet for detailed integration instructions + ] +} + +export default function App() { + const algodConfig = getAlgodConfigFromViteEnvironment() + + const walletManager = new WalletManager({ + wallets: supportedWallets, + defaultNetwork: algodConfig.network, + networks: { + [algodConfig.network]: { + algod: { + baseServer: algodConfig.server, + port: algodConfig.port, + token: String(algodConfig.token), + }, + }, + }, + options: { + resetNetwork: true, + }, + }) + + return ( + + + + + + ) +} diff --git a/examples/s-tls/inject_content/Home.tsx b/examples/s-tls/projects/s-tls-frontend/src/Home.tsx similarity index 100% rename from examples/s-tls/inject_content/Home.tsx rename to examples/s-tls/projects/s-tls-frontend/src/Home.tsx diff --git a/examples/s-tls/projects/s-tls-frontend/src/assets/logo.svg b/examples/s-tls/projects/s-tls-frontend/src/assets/logo.svg new file mode 100644 index 0000000..7169476 --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/src/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/examples/s-tls/projects/s-tls-frontend/src/components/Account.tsx b/examples/s-tls/projects/s-tls-frontend/src/components/Account.tsx new file mode 100644 index 0000000..081ce47 --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/src/components/Account.tsx @@ -0,0 +1,24 @@ +import { useWallet } from '@txnlab/use-wallet-react' +import { useMemo } from 'react' +import { ellipseAddress } from '../utils/ellipseAddress' +import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' + +const Account = () => { + const { activeAddress } = useWallet() + const algoConfig = getAlgodConfigFromViteEnvironment() + + const networkName = useMemo(() => { + return algoConfig.network === '' ? 'localnet' : algoConfig.network.toLocaleLowerCase() + }, [algoConfig.network]) + + return ( +
+ ) +} + +export default Account diff --git a/examples/s-tls/inject_content/AppCalls.tsx b/examples/s-tls/projects/s-tls-frontend/src/components/AppCalls.tsx similarity index 100% rename from examples/s-tls/inject_content/AppCalls.tsx rename to examples/s-tls/projects/s-tls-frontend/src/components/AppCalls.tsx diff --git a/examples/s-tls/projects/s-tls-frontend/src/components/ConnectWallet.tsx b/examples/s-tls/projects/s-tls-frontend/src/components/ConnectWallet.tsx new file mode 100644 index 0000000..8814cd5 --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/src/components/ConnectWallet.tsx @@ -0,0 +1,86 @@ +import { useWallet, Wallet, WalletId } from '@txnlab/use-wallet-react' +import Account from './Account' + +interface ConnectWalletInterface { + openModal: boolean + closeModal: () => void +} + +const ConnectWallet = ({ openModal, closeModal }: ConnectWalletInterface) => { + const { wallets, activeAddress } = useWallet() + + const isKmd = (wallet: Wallet) => wallet.id === WalletId.KMD + + return ( + +
+

Select wallet provider

+ +
+ {activeAddress && ( + <> + +
+ + )} + + {!activeAddress && + wallets?.map((wallet) => ( + + ))} +
+ +
+ + {activeAddress && ( + + )} +
+ +
+ ) +} +export default ConnectWallet diff --git a/examples/s-tls/projects/s-tls-frontend/src/components/ErrorBoundary.tsx b/examples/s-tls/projects/s-tls-frontend/src/components/ErrorBoundary.tsx new file mode 100644 index 0000000..435bf61 --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/src/components/ErrorBoundary.tsx @@ -0,0 +1,46 @@ +import React, { ReactNode } from 'react' + +interface ErrorBoundaryProps { + children: ReactNode +} + +interface ErrorBoundaryState { + hasError: boolean + error: Error | null +} + +class ErrorBoundary extends React.Component { + constructor(props: ErrorBoundaryProps) { + super(props) + this.state = { hasError: false, error: null } + } + + static getDerivedStateFromError(error: Error): ErrorBoundaryState { + // Update state so the next render will show the fallback UI. + return { hasError: true, error: error } + } + + render(): ReactNode { + if (this.state.hasError) { + // You can render any custom fallback UI + return ( +
+
+
+

Error occured

+

+ {this.state.error?.message.includes('Attempt to get default algod configuration') + ? 'Please make sure to set up your environment variables correctly. Create a .env file based on .env.template and fill in the required values. This controls the network and credentials for connections with Algod and Indexer.' + : this.state.error?.message} +

+
+
+
+ ) + } + + return this.props.children + } +} + +export default ErrorBoundary diff --git a/examples/s-tls/projects/s-tls-frontend/src/components/Transact.tsx b/examples/s-tls/projects/s-tls-frontend/src/components/Transact.tsx new file mode 100644 index 0000000..59d7cdd --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/src/components/Transact.tsx @@ -0,0 +1,80 @@ +import { algo, AlgorandClient } from '@algorandfoundation/algokit-utils' +import { useWallet } from '@txnlab/use-wallet-react' +import { useSnackbar } from 'notistack' +import { useState } from 'react' +import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' + +interface TransactInterface { + openModal: boolean + setModalState: (value: boolean) => void +} + +const Transact = ({ openModal, setModalState }: TransactInterface) => { + const [loading, setLoading] = useState(false) + const [receiverAddress, setReceiverAddress] = useState('') + + const algodConfig = getAlgodConfigFromViteEnvironment() + const algorand = AlgorandClient.fromConfig({ algodConfig }) + + const { enqueueSnackbar } = useSnackbar() + + const { transactionSigner, activeAddress } = useWallet() + + const handleSubmitAlgo = async () => { + setLoading(true) + + if (!transactionSigner || !activeAddress) { + enqueueSnackbar('Please connect wallet first', { variant: 'warning' }) + return + } + + try { + enqueueSnackbar('Sending transaction...', { variant: 'info' }) + const result = await algorand.send.payment({ + signer: transactionSigner, + sender: activeAddress, + receiver: receiverAddress, + amount: algo(1), + }) + enqueueSnackbar(`Transaction sent: ${result.txIds[0]}`, { variant: 'success' }) + setReceiverAddress('') + } catch (e) { + enqueueSnackbar('Failed to send transaction', { variant: 'error' }) + } + + setLoading(false) + } + + return ( + +
+

Send payment transaction

+
+ { + setReceiverAddress(e.target.value) + }} + /> +
+ + +
+
+
+ ) +} + +export default Transact diff --git a/examples/s-tls/projects/s-tls-frontend/src/contracts/Calculator.ts b/examples/s-tls/projects/s-tls-frontend/src/contracts/Calculator.ts new file mode 100644 index 0000000..01af943 --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/src/contracts/Calculator.ts @@ -0,0 +1,742 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^7 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app' +import { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56' +import { + AppClient as _AppClient, + AppClientMethodCallParams, + AppClientParams, + AppClientBareCallParams, + CallOnComplete, + AppClientCompilationParams, + ResolveAppClientByCreatorAndName, + ResolveAppClientByNetwork, + CloneAppClientParams, +} from '@algorandfoundation/algokit-utils/types/app-client' +import { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer' +import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' +import SimulateResponse = modelsv2.SimulateResponse + +export const APP_SPEC: Arc56Contract = {"name":"Calculator","desc":"","methods":[{"name":"doMath","desc":"A method that takes two numbers and does either addition or subtraction","args":[{"name":"a","type":"uint64","desc":"The first uint64"},{"name":"b","type":"uint64","desc":"The second uint64"},{"name":"operation","type":"string","desc":"The operation to perform. Can be either 'sum' or 'difference'"}],"returns":{"type":"uint64","desc":"The result of the operation"},"actions":{"create":[],"call":["NoOp"]}},{"name":"hello","desc":"A demonstration method used in the AlgoKit fullstack template.\nGreets the user by name.","args":[{"name":"name","type":"string","desc":"The name of the user to greet."}],"returns":{"type":"string","desc":"A greeting message to the user."},"actions":{"create":[],"call":["NoOp"]}},{"name":"createApplication","args":[],"returns":{"type":"void"},"actions":{"create":["NoOp"],"call":[]}}],"arcs":[4,56],"structs":{},"state":{"schema":{"global":{"bytes":0,"ints":0},"local":{"bytes":0,"ints":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":[],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"teal":1,"source":"contracts/Calculator.algo.ts:3","pc":[0]},{"teal":2,"source":"contracts/Calculator.algo.ts:3","pc":[1,2,3]},{"teal":3,"source":"contracts/Calculator.algo.ts:3","pc":[4,5,6,7,8,9,10]},{"teal":15,"source":"contracts/Calculator.algo.ts:3","pc":[11,12]},{"teal":16,"source":"contracts/Calculator.algo.ts:3","pc":[13]},{"teal":17,"source":"contracts/Calculator.algo.ts:3","pc":[14,15]},{"teal":18,"source":"contracts/Calculator.algo.ts:3","pc":[16]},{"teal":19,"source":"contracts/Calculator.algo.ts:3","pc":[17,18]},{"teal":20,"source":"contracts/Calculator.algo.ts:3","pc":[19]},{"teal":21,"source":"contracts/Calculator.algo.ts:3","pc":[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]},{"teal":25,"source":"contracts/Calculator.algo.ts:3","errorMessage":"The requested action is not implemented in this contract. Are you using the correct OnComplete? Did you set your app ID?","pc":[46]},{"teal":35,"source":"contracts/Calculator.algo.ts:11","pc":[47,48,49]},{"teal":39,"source":"contracts/Calculator.algo.ts:12","pc":[50,51]},{"teal":40,"source":"contracts/Calculator.algo.ts:12","pc":[52,53]},{"teal":41,"source":"contracts/Calculator.algo.ts:12","pc":[54]},{"teal":42,"source":"contracts/Calculator.algo.ts:11","pc":[55]},{"teal":52,"source":"contracts/Calculator.algo.ts:22","pc":[56,57,58]},{"teal":56,"source":"contracts/Calculator.algo.ts:23","pc":[59,60]},{"teal":57,"source":"contracts/Calculator.algo.ts:23","pc":[61,62]},{"teal":58,"source":"contracts/Calculator.algo.ts:23","pc":[63]},{"teal":59,"source":"contracts/Calculator.algo.ts:23","pc":[64,65,66]},{"teal":60,"source":"contracts/Calculator.algo.ts:23","pc":[67,68]},{"teal":61,"source":"contracts/Calculator.algo.ts:23","pc":[69,70]},{"teal":62,"source":"contracts/Calculator.algo.ts:23","pc":[71]},{"teal":63,"source":"contracts/Calculator.algo.ts:23","pc":[72,73,74]},{"teal":66,"source":"contracts/Calculator.algo.ts:23","pc":[75,76]},{"teal":67,"source":"contracts/Calculator.algo.ts:23","pc":[77,78]},{"teal":68,"source":"contracts/Calculator.algo.ts:23","pc":[79]},{"teal":71,"source":"contracts/Calculator.algo.ts:22","pc":[80]},{"teal":76,"source":"contracts/Calculator.algo.ts:35","pc":[81]},{"teal":79,"source":"contracts/Calculator.algo.ts:35","pc":[82,83,84]},{"teal":80,"source":"contracts/Calculator.algo.ts:35","pc":[85,86,87]},{"teal":83,"source":"contracts/Calculator.algo.ts:35","pc":[88,89,90]},{"teal":84,"source":"contracts/Calculator.algo.ts:35","pc":[91]},{"teal":87,"source":"contracts/Calculator.algo.ts:35","pc":[92,93,94]},{"teal":88,"source":"contracts/Calculator.algo.ts:35","pc":[95]},{"teal":91,"source":"contracts/Calculator.algo.ts:35","pc":[96,97,98]},{"teal":92,"source":"contracts/Calculator.algo.ts:35","pc":[99]},{"teal":93,"source":"contracts/Calculator.algo.ts:35","pc":[100]},{"teal":94,"source":"contracts/Calculator.algo.ts:35","pc":[101]},{"teal":95,"source":"contracts/Calculator.algo.ts:35","pc":[102]},{"teal":96,"source":"contracts/Calculator.algo.ts:35","pc":[103]},{"teal":108,"source":"contracts/Calculator.algo.ts:35","pc":[104,105,106]},{"teal":111,"source":"contracts/Calculator.algo.ts:35","pc":[107,108]},{"teal":116,"source":"contracts/Calculator.algo.ts:38","pc":[109,110]},{"teal":117,"source":"contracts/Calculator.algo.ts:38","pc":[111,112,113,114,115]},{"teal":118,"source":"contracts/Calculator.algo.ts:38","pc":[116]},{"teal":119,"source":"contracts/Calculator.algo.ts:38","pc":[117,118,119]},{"teal":124,"source":"contracts/Calculator.algo.ts:39","pc":[120,121]},{"teal":125,"source":"contracts/Calculator.algo.ts:39","pc":[122,123]},{"teal":126,"source":"contracts/Calculator.algo.ts:39","pc":[124,125,126]},{"teal":127,"source":"contracts/Calculator.algo.ts:39","pc":[127,128]},{"teal":128,"source":"contracts/Calculator.algo.ts:38","pc":[129,130,131]},{"teal":133,"source":"contracts/Calculator.algo.ts:40","pc":[132,133]},{"teal":134,"source":"contracts/Calculator.algo.ts:40","pc":[134,135,136,137,138,139,140,141,142,143,144,145]},{"teal":135,"source":"contracts/Calculator.algo.ts:40","pc":[146]},{"teal":136,"source":"contracts/Calculator.algo.ts:40","pc":[147,148,149]},{"teal":141,"source":"contracts/Calculator.algo.ts:41","pc":[150,151]},{"teal":142,"source":"contracts/Calculator.algo.ts:41","pc":[152,153]},{"teal":143,"source":"contracts/Calculator.algo.ts:41","pc":[154,155,156]},{"teal":144,"source":"contracts/Calculator.algo.ts:41","pc":[157,158]},{"teal":145,"source":"contracts/Calculator.algo.ts:40","pc":[159,160,161]},{"teal":149,"source":"contracts/Calculator.algo.ts:42","errorMessage":"Invalid operation","pc":[162]},{"teal":154,"source":"contracts/Calculator.algo.ts:44","pc":[163,164]},{"teal":157,"source":"contracts/Calculator.algo.ts:35","pc":[165,166]},{"teal":158,"source":"contracts/Calculator.algo.ts:35","pc":[167]},{"teal":163,"source":"contracts/Calculator.algo.ts:54","pc":[168]},{"teal":166,"source":"contracts/Calculator.algo.ts:54","pc":[169,170,171]},{"teal":167,"source":"contracts/Calculator.algo.ts:54","pc":[172,173,174]},{"teal":170,"source":"contracts/Calculator.algo.ts:54","pc":[175,176,177]},{"teal":171,"source":"contracts/Calculator.algo.ts:54","pc":[178]},{"teal":172,"source":"contracts/Calculator.algo.ts:54","pc":[179]},{"teal":173,"source":"contracts/Calculator.algo.ts:54","pc":[180]},{"teal":174,"source":"contracts/Calculator.algo.ts:54","pc":[181,182,183]},{"teal":175,"source":"contracts/Calculator.algo.ts:54","pc":[184]},{"teal":176,"source":"contracts/Calculator.algo.ts:54","pc":[185]},{"teal":177,"source":"contracts/Calculator.algo.ts:54","pc":[186]},{"teal":178,"source":"contracts/Calculator.algo.ts:54","pc":[187]},{"teal":179,"source":"contracts/Calculator.algo.ts:54","pc":[188]},{"teal":180,"source":"contracts/Calculator.algo.ts:54","pc":[189]},{"teal":190,"source":"contracts/Calculator.algo.ts:54","pc":[190,191,192]},{"teal":194,"source":"contracts/Calculator.algo.ts:55","pc":[193,194,195,196,197,198,199,200,201]},{"teal":195,"source":"contracts/Calculator.algo.ts:55","pc":[202,203]},{"teal":196,"source":"contracts/Calculator.algo.ts:55","pc":[204]},{"teal":197,"source":"contracts/Calculator.algo.ts:54","pc":[205]},{"teal":200,"source":"contracts/Calculator.algo.ts:3","pc":[206]},{"teal":201,"source":"contracts/Calculator.algo.ts:3","pc":[207]},{"teal":204,"source":"contracts/Calculator.algo.ts:3","pc":[208,209,210,211,212,213]},{"teal":205,"source":"contracts/Calculator.algo.ts:3","pc":[214,215,216]},{"teal":206,"source":"contracts/Calculator.algo.ts:3","pc":[217,218,219,220]},{"teal":209,"source":"contracts/Calculator.algo.ts:3","errorMessage":"this contract does not implement the given ABI method for create NoOp","pc":[221]},{"teal":212,"source":"contracts/Calculator.algo.ts:3","pc":[222,223,224,225,226,227]},{"teal":213,"source":"contracts/Calculator.algo.ts:3","pc":[228,229,230,231,232,233]},{"teal":214,"source":"contracts/Calculator.algo.ts:3","pc":[234,235,236]},{"teal":215,"source":"contracts/Calculator.algo.ts:3","pc":[237,238,239,240,241,242]},{"teal":218,"source":"contracts/Calculator.algo.ts:3","errorMessage":"this contract does not implement the given ABI method for call NoOp","pc":[243]}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCmludGNibG9jayAxCmJ5dGVjYmxvY2sgMHgxNTFmN2M3NQoKLy8gVGhpcyBURUFMIHdhcyBnZW5lcmF0ZWQgYnkgVEVBTFNjcmlwdCB2MC4xMDcuMgovLyBodHRwczovL2dpdGh1Yi5jb20vYWxnb3JhbmRmb3VuZGF0aW9uL1RFQUxTY3JpcHQKCi8vIFRoaXMgY29udHJhY3QgaXMgY29tcGxpYW50IHdpdGggYW5kL29yIGltcGxlbWVudHMgdGhlIGZvbGxvd2luZyBBUkNzOiBbIEFSQzQgXQoKLy8gVGhlIGZvbGxvd2luZyB0ZW4gbGluZXMgb2YgVEVBTCBoYW5kbGUgaW5pdGlhbCBwcm9ncmFtIGZsb3cKLy8gVGhpcyBwYXR0ZXJuIGlzIHVzZWQgdG8gbWFrZSBpdCBlYXN5IGZvciBhbnlvbmUgdG8gcGFyc2UgdGhlIHN0YXJ0IG9mIHRoZSBwcm9ncmFtIGFuZCBkZXRlcm1pbmUgaWYgYSBzcGVjaWZpYyBhY3Rpb24gaXMgYWxsb3dlZAovLyBIZXJlLCBhY3Rpb24gcmVmZXJzIHRvIHRoZSBPbkNvbXBsZXRlIGluIGNvbWJpbmF0aW9uIHdpdGggd2hldGhlciB0aGUgYXBwIGlzIGJlaW5nIGNyZWF0ZWQgb3IgY2FsbGVkCi8vIEV2ZXJ5IHBvc3NpYmxlIGFjdGlvbiBmb3IgdGhpcyBjb250cmFjdCBpcyByZXByZXNlbnRlZCBpbiB0aGUgc3dpdGNoIHN0YXRlbWVudAovLyBJZiB0aGUgYWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgY29udHJhY3QsIGl0cyByZXNwZWN0aXZlIGJyYW5jaCB3aWxsIGJlICIqTk9UX0lNUExFTUVOVEVEIiB3aGljaCBqdXN0IGNvbnRhaW5zICJlcnIiCnR4biBBcHBsaWNhdGlvbklECiEKcHVzaGludCA2CioKdHhuIE9uQ29tcGxldGlvbgorCnN3aXRjaCAqY2FsbF9Ob09wICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqY3JlYXRlX05vT3AgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVECgoqTk9UX0lNUExFTUVOVEVEOgoJLy8gVGhlIHJlcXVlc3RlZCBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoaXMgY29udHJhY3QuIEFyZSB5b3UgdXNpbmcgdGhlIGNvcnJlY3QgT25Db21wbGV0ZT8gRGlkIHlvdSBzZXQgeW91ciBhcHAgSUQ/CgllcnIKCi8vIGdldFN1bShhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NAovLwovLyBDYWxjdWxhdGVzIHRoZSBzdW0gb2YgdHdvIG51bWJlcnMKLy8KLy8gQHBhcmFtIGEKLy8gQHBhcmFtIGIKLy8gQHJldHVybnMgVGhlIHN1bSBvZiBhIGFuZCBiCmdldFN1bToKCXByb3RvIDIgMQoKCS8vIGNvbnRyYWN0cy9DYWxjdWxhdG9yLmFsZ28udHM6MTIKCS8vIHJldHVybiBhICsgYjsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCSsKCXJldHN1YgoKLy8gZ2V0RGlmZmVyZW5jZShhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NAovLwovLyBDYWxjdWxhdGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIG51bWJlcnMKLy8KLy8gQHBhcmFtIGEKLy8gQHBhcmFtIGIKLy8gQHJldHVybnMgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGFuZCBiLgpnZXREaWZmZXJlbmNlOgoJcHJvdG8gMiAxCgoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czoyMwoJLy8gcmV0dXJuIGEgPj0gYiA/IGEgLSBiIDogYiAtIGE7CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0Cgk+PQoJYnogKnRlcm5hcnkwX2ZhbHNlCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0CgktCgliICp0ZXJuYXJ5MF9lbmQKCip0ZXJuYXJ5MF9mYWxzZToKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCS0KCip0ZXJuYXJ5MF9lbmQ6CglyZXRzdWIKCi8vIGRvTWF0aCh1aW50NjQsdWludDY0LHN0cmluZyl1aW50NjQKKmFiaV9yb3V0ZV9kb01hdGg6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGVjIDAgLy8gMHgxNTFmN2M3NQoKCS8vIG9wZXJhdGlvbjogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglleHRyYWN0IDIgMAoKCS8vIGI6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJYnRvaQoKCS8vIGE6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZG9NYXRoKHVpbnQ2NCx1aW50NjQsc3RyaW5nKXVpbnQ2NAoJY2FsbHN1YiBkb01hdGgKCWl0b2IKCWNvbmNhdAoJbG9nCglpbnRjIDAgLy8gMQoJcmV0dXJuCgovLyBkb01hdGgoYTogdWludDY0LCBiOiB1aW50NjQsIG9wZXJhdGlvbjogc3RyaW5nKTogdWludDY0Ci8vCi8vIEEgbWV0aG9kIHRoYXQgdGFrZXMgdHdvIG51bWJlcnMgYW5kIGRvZXMgZWl0aGVyIGFkZGl0aW9uIG9yIHN1YnRyYWN0aW9uCi8vCi8vIEBwYXJhbSBhIFRoZSBmaXJzdCB1aW50NjQKLy8gQHBhcmFtIGIgVGhlIHNlY29uZCB1aW50NjQKLy8gQHBhcmFtIG9wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0uIENhbiBiZSBlaXRoZXIgJ3N1bScgb3IgJ2RpZmZlcmVuY2UnCi8vCi8vIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbgpkb01hdGg6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJcHVzaGJ5dGVzIDB4CgoJLy8gKmlmMF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy9DYWxjdWxhdG9yLmFsZ28udHM6MzgKCS8vIG9wZXJhdGlvbiA9PT0gJ3N1bScKCWZyYW1lX2RpZyAtMyAvLyBvcGVyYXRpb246IHN0cmluZwoJcHVzaGJ5dGVzIDB4NzM3NTZkIC8vICJzdW0iCgk9PQoJYnogKmlmMF9lbHNlaWYxX2NvbmRpdGlvbgoKCS8vICppZjBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czozOQoJLy8gcmVzdWx0ID0gdGhpcy5nZXRTdW0oYSwgYikKCWZyYW1lX2RpZyAtMiAvLyBiOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjQKCWNhbGxzdWIgZ2V0U3VtCglmcmFtZV9idXJ5IDAgLy8gcmVzdWx0OiB1aW50NjQKCWIgKmlmMF9lbmQKCippZjBfZWxzZWlmMV9jb25kaXRpb246CgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjQwCgkvLyBvcGVyYXRpb24gPT09ICdkaWZmZXJlbmNlJwoJZnJhbWVfZGlnIC0zIC8vIG9wZXJhdGlvbjogc3RyaW5nCglwdXNoYnl0ZXMgMHg2NDY5NjY2NjY1NzI2NTZlNjM2NSAvLyAiZGlmZmVyZW5jZSIKCT09CglieiAqaWYwX2Vsc2UKCgkvLyAqaWYwX2Vsc2VpZjFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL0NhbGN1bGF0b3IuYWxnby50czo0MQoJLy8gcmVzdWx0ID0gdGhpcy5nZXREaWZmZXJlbmNlKGEsIGIpCglmcmFtZV9kaWcgLTIgLy8gYjogdWludDY0CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0CgljYWxsc3ViIGdldERpZmZlcmVuY2UKCWZyYW1lX2J1cnkgMCAvLyByZXN1bHQ6IHVpbnQ2NAoJYiAqaWYwX2VuZAoKKmlmMF9lbHNlOgoJLy8gSW52YWxpZCBvcGVyYXRpb24KCWVycgoKKmlmMF9lbmQ6CgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjQ0CgkvLyByZXR1cm4gcmVzdWx0OwoJZnJhbWVfZGlnIDAgLy8gcmVzdWx0OiB1aW50NjQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gaGVsbG8oc3RyaW5nKXN0cmluZwoqYWJpX3JvdXRlX2hlbGxvOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlYyAwIC8vIDB4MTUxZjdjNzUKCgkvLyBuYW1lOiBzdHJpbmcKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgoJLy8gZXhlY3V0ZSBoZWxsbyhzdHJpbmcpc3RyaW5nCgljYWxsc3ViIGhlbGxvCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWludGMgMCAvLyAxCglyZXR1cm4KCi8vIGhlbGxvKG5hbWU6IHN0cmluZyk6IHN0cmluZwovLwovLyBBIGRlbW9uc3RyYXRpb24gbWV0aG9kIHVzZWQgaW4gdGhlIEFsZ29LaXQgZnVsbHN0YWNrIHRlbXBsYXRlLgovLyBHcmVldHMgdGhlIHVzZXIgYnkgbmFtZS4KLy8KLy8gQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHVzZXIgdG8gZ3JlZXQuCi8vIEByZXR1cm5zIEEgZ3JlZXRpbmcgbWVzc2FnZSB0byB0aGUgdXNlci4KaGVsbG86Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvQ2FsY3VsYXRvci5hbGdvLnRzOjU1CgkvLyByZXR1cm4gJ0hlbGxvLCAnICsgbmFtZTsKCXB1c2hieXRlcyAweDQ4NjU2YzZjNmYyYzIwIC8vICJIZWxsbywgIgoJZnJhbWVfZGlnIC0xIC8vIG5hbWU6IHN0cmluZwoJY29uY2F0CglyZXRzdWIKCiphYmlfcm91dGVfY3JlYXRlQXBwbGljYXRpb246CglpbnRjIDAgLy8gMQoJcmV0dXJuCgoqY3JlYXRlX05vT3A6CglwdXNoYnl0ZXMgMHhiODQ0N2IzNiAvLyBtZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKCl2b2lkIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9jcmVhdGVBcHBsaWNhdGlvbgoKCS8vIHRoaXMgY29udHJhY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBnaXZlbiBBQkkgbWV0aG9kIGZvciBjcmVhdGUgTm9PcAoJZXJyCgoqY2FsbF9Ob09wOgoJcHVzaGJ5dGVzIDB4NzZhN2VmMzMgLy8gbWV0aG9kICJkb01hdGgodWludDY0LHVpbnQ2NCxzdHJpbmcpdWludDY0IgoJcHVzaGJ5dGVzIDB4MDJiZWNlMTEgLy8gbWV0aG9kICJoZWxsbyhzdHJpbmcpc3RyaW5nIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9kb01hdGggKmFiaV9yb3V0ZV9oZWxsbwoKCS8vIHRoaXMgY29udHJhY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBnaXZlbiBBQkkgbWV0aG9kIGZvciBjYWxsIE5vT3AKCWVycg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEw"},"byteCode":{"approval":"CiABASYBBBUffHUxGBSBBgsxGQiNDACwAAAAAAAAAAAAAACiAAAAAAAAAAAAAACKAgGL/4v+CImKAgGL/4v+D0EACIv/i/4JQgAFi/6L/wmJKDYaA1cCADYaAhc2GgEXiAAFFlCwIkOKAwGAAIv9gANzdW0SQQAMi/6L/4j/sIwAQgAfi/2ACmRpZmZlcmVuY2USQQAMi/6L/4j/m4wAQgABAIsAjACJKDYaAVcCAIgADEkVFlcGAkxQULAiQ4oBAYAHSGVsbG8sIIv/UIkiQ4AEuER7NjYaAI4B//EAgAR2p+8zgAQCvs4RNhoAjgL/Xv+1AA==","clear":"Cg=="},"compilerInfo":{"compiler":"algod","compilerVersion":{"major":4,"minor":4,"patch":1,"commitHash":"7b607ce4"}}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the Calculator contract + */ +export type CalculatorArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'doMath(uint64,uint64,string)uint64': { + /** + * The first uint64 + */ + a: bigint | number + /** + * The second uint64 + */ + b: bigint | number + /** + * The operation to perform. Can be either 'sum' or 'difference' + */ + operation: string + } + 'hello(string)string': { + /** + * The name of the user to greet. + */ + name: string + } + 'createApplication()void': Record + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'doMath(uint64,uint64,string)uint64': [a: bigint | number, b: bigint | number, operation: string] + 'hello(string)string': [name: string] + 'createApplication()void': [] + } +} + +/** + * The return type for each method + */ +export type CalculatorReturns = { + 'doMath(uint64,uint64,string)uint64': bigint + 'hello(string)string': string + 'createApplication()void': void +} + +/** + * Defines the types of available calls and state of the Calculator smart contract. + */ +export type CalculatorTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'doMath(uint64,uint64,string)uint64' | 'doMath', { + argsObj: CalculatorArgs['obj']['doMath(uint64,uint64,string)uint64'] + argsTuple: CalculatorArgs['tuple']['doMath(uint64,uint64,string)uint64'] + /** + * The result of the operation + */ + returns: CalculatorReturns['doMath(uint64,uint64,string)uint64'] + }> + & Record<'hello(string)string' | 'hello', { + argsObj: CalculatorArgs['obj']['hello(string)string'] + argsTuple: CalculatorArgs['tuple']['hello(string)string'] + /** + * A greeting message to the user. + */ + returns: CalculatorReturns['hello(string)string'] + }> + & Record<'createApplication()void' | 'createApplication', { + argsObj: CalculatorArgs['obj']['createApplication()void'] + argsTuple: CalculatorArgs['tuple']['createApplication()void'] + returns: CalculatorReturns['createApplication()void'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type CalculatorSignatures = keyof CalculatorTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type CalculatorNonVoidMethodSignatures = keyof CalculatorTypes['methods'] extends infer T ? T extends keyof CalculatorTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the Calculator smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = CalculatorTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the Calculator smart contract to the method's return type + */ +export type MethodReturn = CalculatorTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type CalculatorCreateCallParams = + | Expand & {method: 'createApplication'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema> + | Expand & {method: 'createApplication()void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema> +/** + * Defines arguments required for the deploy method. + */ +export type CalculatorDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: CalculatorCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the Calculator smart contract + */ +export abstract class CalculatorParamsFactory { + /** + * Gets available create ABI call param factories + */ + static get create() { + return { + _resolveByMethod(params: TParams) { + switch(params.method) { + case 'createApplication': + case 'createApplication()void': + return CalculatorParamsFactory.create.createApplication(params) + } + throw new Error(`Unknown ' + verb + ' method`) + }, + + /** + * Constructs create ABI call params for the Calculator smart contract using the createApplication()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + createApplication(params: CallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} { + return { + ...params, + method: 'createApplication()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + + /** + * Constructs a no op call for the doMath(uint64,uint64,string)uint64 ABI method + * + * A method that takes two numbers and does either addition or subtraction + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static doMath(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'doMath(uint64,uint64,string)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.a, params.args.b, params.args.operation], + } + } + /** + * Constructs a no op call for the hello(string)string ABI method + * + * A demonstration method used in the AlgoKit fullstack template. + Greets the user by name. + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static hello(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'hello(string)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.name], + } + } +} + +/** + * A factory to create and deploy one or more instance of the Calculator smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class CalculatorFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `CalculatorFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new CalculatorClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new CalculatorClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the Calculator smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: CalculatorDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + createParams: params.createParams?.method ? CalculatorParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (CalculatorCreateCallParams & { args: Uint8Array[] }) : undefined, + }) + return { result: result.result, appClient: new CalculatorClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Calculator smart contract using the createApplication()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create params + */ + createApplication: (params: CallParams & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { + return this.appFactory.params.create(CalculatorParamsFactory.create.createApplication(params)) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Calculator smart contract using the createApplication()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create transaction + */ + createApplication: (params: CallParams & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { + return this.appFactory.createTransaction.create(CalculatorParamsFactory.create.createApplication(params)) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the Calculator smart contract using an ABI method call using the createApplication()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create result + */ + createApplication: async (params: CallParams & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => { + const result = await this.appFactory.send.create(CalculatorParamsFactory.create.createApplication(params)) + return { result: { ...result.result, return: result.result.return as unknown as (undefined | CalculatorReturns['createApplication()void']) }, appClient: new CalculatorClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the Calculator smart contract + */ +export class CalculatorClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `CalculatorClient` + * + * @param appClient An `AppClient` instance which has been created with the Calculator app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `CalculatorClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Checks for decode errors on the given return value and maps the return value to the return type for the given method + * @returns The typed return value or undefined if there was no value + */ + decodeReturnValue(method: TSignature, returnValue: ABIReturn | undefined) { + return returnValue !== undefined ? getArc56ReturnValue>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined + } + + /** + * Returns a new `CalculatorClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new CalculatorClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `CalculatorClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new CalculatorClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the Calculator smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. + * + * A method that takes two numbers and does either addition or subtraction + * + * @param params The params for the smart contract call + * @returns The call params: The result of the operation + */ + doMath: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(CalculatorParamsFactory.doMath(params)) + }, + + /** + * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. + * + * A demonstration method used in the AlgoKit fullstack template. + Greets the user by name. + + * + * @param params The params for the smart contract call + * @returns The call params: A greeting message to the user. + */ + hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(CalculatorParamsFactory.hello(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the Calculator smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. + * + * A method that takes two numbers and does either addition or subtraction + * + * @param params The params for the smart contract call + * @returns The call transaction: The result of the operation + */ + doMath: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(CalculatorParamsFactory.doMath(params)) + }, + + /** + * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. + * + * A demonstration method used in the AlgoKit fullstack template. + Greets the user by name. + + * + * @param params The params for the smart contract call + * @returns The call transaction: A greeting message to the user. + */ + hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(CalculatorParamsFactory.hello(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the Calculator smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the Calculator smart contract using the `doMath(uint64,uint64,string)uint64` ABI method. + * + * A method that takes two numbers and does either addition or subtraction + * + * @param params The params for the smart contract call + * @returns The call result: The result of the operation + */ + doMath: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(CalculatorParamsFactory.doMath(params)) + return {...result, return: result.return as unknown as (undefined | CalculatorReturns['doMath(uint64,uint64,string)uint64'])} + }, + + /** + * Makes a call to the Calculator smart contract using the `hello(string)string` ABI method. + * + * A demonstration method used in the AlgoKit fullstack template. + Greets the user by name. + + * + * @param params The params for the smart contract call + * @returns The call result: A greeting message to the user. + */ + hello: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(CalculatorParamsFactory.hello(params)) + return {...result, return: result.return as unknown as (undefined | CalculatorReturns['hello(string)string'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new CalculatorClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current Calculator app + */ + state = { + } + + public newGroup(): CalculatorComposer { + const client = this + const composer = this.algorand.newGroup() + let promiseChain:Promise = Promise.resolve() + const resultMappers: Array any)> = [] + return { + /** + * Add a doMath(uint64,uint64,string)uint64 method call against the Calculator contract + */ + doMath(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.doMath(params))) + resultMappers.push((v) => client.decodeReturnValue('doMath(uint64,uint64,string)uint64', v)) + return this + }, + /** + * Add a hello(string)string method call against the Calculator contract + */ + hello(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hello(params))) + resultMappers.push((v) => client.decodeReturnValue('hello(string)string', v)) + return this + }, + /** + * Add a clear state call to the Calculator contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + } + } + } as unknown as CalculatorComposer + } +} +export type CalculatorComposer = { + /** + * Calls the doMath(uint64,uint64,string)uint64 ABI method. + * + * A method that takes two numbers and does either addition or subtraction + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + doMath(params?: CallParams): CalculatorComposer<[...TReturns, CalculatorReturns['doMath(uint64,uint64,string)uint64'] | undefined]> + + /** + * Calls the hello(string)string ABI method. + * + * A demonstration method used in the AlgoKit fullstack template. + Greets the user by name. + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + hello(params?: CallParams): CalculatorComposer<[...TReturns, CalculatorReturns['hello(string)string'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the Calculator smart contract. + * + * @param args The arguments for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): CalculatorComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): CalculatorComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type CalculatorComposerResults = Expand + diff --git a/examples/s-tls/projects/s-tls-frontend/src/contracts/README.md b/examples/s-tls/projects/s-tls-frontend/src/contracts/README.md new file mode 100644 index 0000000..04629b1 --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/src/contracts/README.md @@ -0,0 +1,14 @@ +## How to connect my web app with Algorand smart contracts? + +The following folder is reserved for the Algorand Application Clients. The clients are used to interact with instances of Algorand Smart Contracts (ASC1s) deployed on-chain. + +To integrate this react frontend template with your smart contracts codebase, perform the following steps: + +1. Generate the typed client using `algokit generate client -l typescript -o {path/to/this/folder}` or using the dedicated `link` command `algokit project link` (ensure to invoke it from the root of this react project). Using the `link` command is especially useful within workspaces that have multiple contract projects. +2. The generated typescript client should be ready to be imported and used in this react frontend template, making it a full fledged dApp. + +> Please note, by default this template defines `"generate:app-clients": "algokit project link --all"` which is a shortcut to automatically link TEAL code from all `contract` projects in the workspace as typed clients into the `frontend` project that is invoking the `link` command. Refer to [documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/link.md) to read more about `link` command. + +## **How to interact with the smart contract?** + +The generated client provides a set of functions that can be used to interact with the ABI (Application Binary Interface) compliant Algorand smart contract. For example, if the smart contract has a function called `hello`, the generated client will have a function called `hello` that can be used to interact with the smart contract. Refer to a [full-stack end-to-end starter template](https://github.com/algorandfoundation/algokit-fullstack-template) for a reference example on invoking and interacting with typescript typed clients generated. diff --git a/examples/s-tls/projects/s-tls-frontend/src/interfaces/network.ts b/examples/s-tls/projects/s-tls-frontend/src/interfaces/network.ts new file mode 100644 index 0000000..a458edc --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/src/interfaces/network.ts @@ -0,0 +1,26 @@ +import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/types/network-client' +import type { TokenHeader } from 'algosdk/dist/types/client/urlTokenBaseHTTPClient' + +export interface AlgoViteClientConfig extends AlgoClientConfig { + /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ + server: string + /** The port to use e.g. 4001, 443, etc. */ + port: string | number + /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ + token: string | TokenHeader + /** String representing current Algorand Network type (testnet/mainnet and etc) */ + network: string +} + +export interface AlgoViteKMDConfig extends AlgoClientConfig { + /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ + server: string + /** The port to use e.g. 4001, 443, etc. */ + port: string | number + /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ + token: string | TokenHeader + /** KMD wallet name */ + wallet: string + /** KMD wallet password */ + password: string +} diff --git a/examples/s-tls/projects/s-tls-frontend/src/main.tsx b/examples/s-tls/projects/s-tls-frontend/src/main.tsx new file mode 100644 index 0000000..431a30c --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/src/main.tsx @@ -0,0 +1,13 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App' +import './styles/App.css' +import ErrorBoundary from './components/ErrorBoundary' + +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + + + + + , +) diff --git a/examples/s-tls/projects/s-tls-frontend/src/styles/App.css b/examples/s-tls/projects/s-tls-frontend/src/styles/App.css new file mode 100644 index 0000000..ee2b188 --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/src/styles/App.css @@ -0,0 +1,126 @@ +/* App.css */ + +.hero { + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; + background-color: #38b2ac; +} + +.hero-content { + text-align: center; + border-radius: 0.5rem; + padding: 1.5rem; + max-width: 24rem; + background-color: #ffffff; + margin: 0 auto; +} + +.text-4xl { + font-size: 2.25rem; + line-height: 2.5rem; +} + +.font-bold { + font-weight: 700; +} + +.py-6 { + padding-top: 1.5rem; + padding-bottom: 1.5rem; +} + +.grid { + display: grid; +} + +.btn { + margin: 0.5rem; +} + +.btn-primary { + background-color: #1a202c; + color: #fff; +} + +.divider { + border-top: 1px solid #e2e8f0; + margin-top: 1rem; + margin-bottom: 1rem; +} + +.modal { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: rgba(0, 0, 0, 0.6); + display: none; + z-index: 9999; + overflow: auto; +} + +.modal-open { + display: block; +} + +.modal-box { + margin: 2.5em auto; + background: #fff; + border-radius: 0.5em; + width: 40em; + max-width: 90vw; + padding: 1em; +} + +.font-bold { + font-weight: bold; +} + +.text-2xl { + font-size: 1.5rem; +} + +.m-2 { + margin: 0.5rem; +} + +.pt-5 { + padding-top: 1.25rem; +} + +.grid { + display: grid; +} + +.btn { + margin: 0.5rem; + padding: 0.5rem 1rem; + background-color: #00aba2; + color: #fff; +} + +.btn-warning { + background-color: #d69e2e; +} + +.border-1 { + border-width: 1px; +} + +.border-teal-800 { + border-color: #2c7a7b; +} + +.modal-action { + display: grid; + margin-top: 1rem; +} + +.divider { + border-top: 1px solid #e2e8f0; + margin-top: 1rem; + margin-bottom: 1rem; +} diff --git a/examples/s-tls/projects/s-tls-frontend/src/utils/ellipseAddress.ts b/examples/s-tls/projects/s-tls-frontend/src/utils/ellipseAddress.ts new file mode 100644 index 0000000..db97e48 --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/src/utils/ellipseAddress.ts @@ -0,0 +1,3 @@ +export function ellipseAddress(address: string | null, width = 6): string { + return address ? `${address.slice(0, width)}...${address.slice(-width)}` : (address ?? '') +} diff --git a/examples/s-tls/projects/s-tls-frontend/src/utils/network/getAlgoClientConfigs.ts b/examples/s-tls/projects/s-tls-frontend/src/utils/network/getAlgoClientConfigs.ts new file mode 100644 index 0000000..b5121f8 --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/src/utils/network/getAlgoClientConfigs.ts @@ -0,0 +1,41 @@ +import { AlgoViteClientConfig, AlgoViteKMDConfig } from '../../interfaces/network' + +export function getAlgodConfigFromViteEnvironment(): AlgoViteClientConfig { + if (!import.meta.env.VITE_ALGOD_SERVER) { + throw new Error('Attempt to get default algod configuration without specifying VITE_ALGOD_SERVER in the environment variables') + } + + return { + server: import.meta.env.VITE_ALGOD_SERVER, + port: import.meta.env.VITE_ALGOD_PORT, + token: import.meta.env.VITE_ALGOD_TOKEN, + network: import.meta.env.VITE_ALGOD_NETWORK, + } +} + +export function getIndexerConfigFromViteEnvironment(): AlgoViteClientConfig { + if (!import.meta.env.VITE_INDEXER_SERVER) { + throw new Error('Attempt to get default algod configuration without specifying VITE_INDEXER_SERVER in the environment variables') + } + + return { + server: import.meta.env.VITE_INDEXER_SERVER, + port: import.meta.env.VITE_INDEXER_PORT, + token: import.meta.env.VITE_INDEXER_TOKEN, + network: import.meta.env.VITE_ALGOD_NETWORK, + } +} + +export function getKmdConfigFromViteEnvironment(): AlgoViteKMDConfig { + if (!import.meta.env.VITE_KMD_SERVER) { + throw new Error('Attempt to get default kmd configuration without specifying VITE_KMD_SERVER in the environment variables') + } + + return { + server: import.meta.env.VITE_KMD_SERVER, + port: import.meta.env.VITE_KMD_PORT, + token: import.meta.env.VITE_KMD_TOKEN, + wallet: import.meta.env.VITE_KMD_WALLET, + password: import.meta.env.VITE_KMD_PASSWORD, + } +} diff --git a/examples/s-tls/projects/s-tls-frontend/src/vite-env.d.ts b/examples/s-tls/projects/s-tls-frontend/src/vite-env.d.ts new file mode 100644 index 0000000..67c2d30 --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/src/vite-env.d.ts @@ -0,0 +1,24 @@ +/// + +interface ImportMetaEnv { + readonly VITE_ENVIRONMENT: string + + readonly VITE_ALGOD_TOKEN: string + readonly VITE_ALGOD_SERVER: string + readonly VITE_ALGOD_PORT: string + readonly VITE_ALGOD_NETWORK: string + + readonly VITE_INDEXER_TOKEN: string + readonly VITE_INDEXER_SERVER: string + readonly VITE_INDEXER_PORT: string + + readonly VITE_KMD_TOKEN: string + readonly VITE_KMD_SERVER: string + readonly VITE_KMD_PORT: string + readonly VITE_KMD_PASSWORD: string + readonly VITE_KMD_WALLET: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/examples/s-tls/projects/s-tls-frontend/tsconfig.json b/examples/s-tls/projects/s-tls-frontend/tsconfig.json new file mode 100644 index 0000000..443b6bd --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/tsconfig.json @@ -0,0 +1,38 @@ +{ + "compilerOptions": { + "target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + "module": "ES2022" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + "declaration": true /* Generates corresponding '.d.ts' file. */, + "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, + "sourceMap": true /* Generates corresponding '.map' file. */, + "strict": true /* Enable all strict type-checking options. */, + "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, + "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, + "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */, + "skipLibCheck": true /* Skip type checking of declaration files. */, + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, + "allowJs": false, + "allowSyntheticDefaultImports": true, + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "outDir": "./dist/" + }, + "include": [ + "src/**/*.ts", + "src/**/*.tsx", + "vite.config.js", + "src/utils/", + "src/utils/", + "src/main.tsx", + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/examples/s-tls/projects/s-tls-frontend/tsconfig.node.json b/examples/s-tls/projects/s-tls-frontend/tsconfig.node.json new file mode 100644 index 0000000..9d31e2a --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/examples/s-tls/projects/s-tls-frontend/vite.config.ts b/examples/s-tls/projects/s-tls-frontend/vite.config.ts new file mode 100644 index 0000000..e42dc7c --- /dev/null +++ b/examples/s-tls/projects/s-tls-frontend/vite.config.ts @@ -0,0 +1,15 @@ +import react from '@vitejs/plugin-react' +import { defineConfig } from 'vite' +import { nodePolyfills } from 'vite-plugin-node-polyfills' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + react(), + nodePolyfills({ + globals: { + Buffer: true, + }, + }), + ], +}) diff --git a/examples/s-ts/.algokit/.copier-answers.yml b/examples/s-ts/.algokit/.copier-answers.yml index c7a810e..4c23afb 100644 --- a/examples/s-ts/.algokit/.copier-answers.yml +++ b/examples/s-ts/.algokit/.copier-answers.yml @@ -1,6 +1,6 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 2.1.8-11-g7668422 -_src_path: /var/folders/96/k83m8nkj3ts72l4jw7378sm80000gn/T/tmpmq4qoksj/template +_commit: +_src_path: author_email: None author_name: None contract_name: hello_world diff --git a/examples/s-ts/.algokit/generators/create-devcontainer/copier.yaml b/examples/s-ts/.algokit/generators/create-devcontainer/copier.yaml new file mode 100644 index 0000000..e98f334 --- /dev/null +++ b/examples/s-ts/.algokit/generators/create-devcontainer/copier.yaml @@ -0,0 +1,4 @@ +_tasks: + - "echo '==== Successfully generated new .devcontainer.json file 🚀 ===='" + +_templates_suffix: ".j2" diff --git a/examples/s-ts/.algokit/generators/create-devcontainer/devcontainer.json b/examples/s-ts/.algokit/generators/create-devcontainer/devcontainer.json new file mode 100644 index 0000000..6452c65 --- /dev/null +++ b/examples/s-ts/.algokit/generators/create-devcontainer/devcontainer.json @@ -0,0 +1,19 @@ +{ + "forwardPorts": [4001, 4002, 8980, 5173], + "portsAttributes": { + "4001": { + "label": "algod" + }, + "4002": { + "label": "kmd" + }, + "8980": { + "label": "indexer" + }, + "5173": { + "label": "vite" + } + }, + "postCreateCommand": "mkdir -p ~/.config/algokit && pipx install algokit && sudo chown -R codespace:codespace ~/.config/algokit", + "postStartCommand": "for i in {1..5}; do algokit localnet status > /dev/null 2>&1 && break || sleep 30; algokit localnet reset; done" +} diff --git a/examples/s-ts/.editorconfig b/examples/s-ts/.editorconfig new file mode 100644 index 0000000..5e550a1 --- /dev/null +++ b/examples/s-ts/.editorconfig @@ -0,0 +1,10 @@ +[*] +charset = utf-8 +insert_final_newline = true +end_of_line = lf +indent_style = space +indent_size = 2 +tab_width = 2 +max_line_length = 140 +trim_trailing_whitespace = true +single_quote = true diff --git a/examples/s-ts/.gitattributes b/examples/s-ts/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/examples/s-ts/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/examples/s-ts/.gitignore b/examples/s-ts/.gitignore new file mode 100644 index 0000000..4105eb2 --- /dev/null +++ b/examples/s-ts/.gitignore @@ -0,0 +1,170 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Ruff (linter) +.ruff_cache/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +.idea/ +!.idea/runConfigurations + +# macOS +.DS_Store + +# Received approval test files +*.received.* + +# NPM +node_modules + diff --git a/examples/s-ts/copy_files.sh b/examples/s-ts/copy_files.sh deleted file mode 100644 index 749b01f..0000000 --- a/examples/s-ts/copy_files.sh +++ /dev/null @@ -1,23 +0,0 @@ - -#!/bin/bash -# Script to copy required files to the frontend project -# Usage: ./copy_files.sh - - -project_name="$1" -frontend_root="./projects/${project_name}-frontend" - -# Ensure directories exist -mkdir -p "${frontend_root}/src/components" - -# Copy files -cp "./inject_content/Home.tsx" "${frontend_root}/src/Home.tsx" -cp "./inject_content/AppCalls.tsx" "${frontend_root}/src/components/AppCalls.tsx" - -echo "Template completed successfully!" -# remove inject_content folder -rm -rf "./inject_content" -# self destruct the file -rm -f "$0" - - diff --git a/examples/s-ts/projects/.gitkeep b/examples/s-ts/projects/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit.toml b/examples/s-ts/projects/s-ts-contracts/.algokit.toml new file mode 100644 index 0000000..bb2b2d4 --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/.algokit.toml @@ -0,0 +1,44 @@ +[algokit] +min_version = "v2.6.0" + +[generate.smart-contract] +description = "Generate a new smart contract for existing project" +path = ".algokit/generators/create_contract" + +[generate.env-file] +description = "Generate a new generic or Algorand network specific .env file" +path = ".algokit/generators/create_env_file" + +[project] +type = 'contract' +name = 's-ts-contracts' +artifacts = 'smart_contracts/artifacts' + +[project.deploy] +command = "npm run deploy:ci" + +[project.deploy.testnet] +environment_secrets = [ + "DEPLOYER_MNEMONIC", +] + +[project.deploy.mainnet] +environment_secrets = [ + "DEPLOYER_MNEMONIC", +] + +[project.run] +# Commands intended for use locally and in CI +build = { commands = [ + 'npm run build', +], description = 'Build all smart contracts in the project' } +audit-teal = { commands = [ + # 🚨 IMPORTANT 🚨: For strict TEAL validation, remove --exclude statements. The default starter contract is not for production. Ensure thorough testing and adherence to best practices in smart contract development. This is not a replacement for a professional audit. + 'algokit task analyze smart_contracts/artifacts --recursive --force --exclude rekey-to --exclude is-updatable --exclude missing-fee-check --exclude is-deletable --exclude can-close-asset --exclude can-close-account --exclude unprotected-deletable --exclude unprotected-updatable', +], description = 'Audit TEAL files' } + +# Commands intented for CI only, prefixed with `ci-` by convention +ci-teal-diff = { commands = [ + 'git add -N ./smart_contracts/artifacts', + 'git diff --exit-code --minimal ./smart_contracts/artifacts', +], description = 'Check TEAL files for differences' } diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/.copier-answers.yml b/examples/s-ts/projects/s-ts-contracts/.algokit/.copier-answers.yml new file mode 100644 index 0000000..ec8d6d2 --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/.algokit/.copier-answers.yml @@ -0,0 +1,9 @@ +# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY +_commit: 0.3.7 +_src_path: gh:algorandfoundation/algokit-typescript-template +author_email: None +author_name: None +contract_name: hello_world +preset_name: starter +project_name: s-ts-contracts + diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/copier.yaml b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/copier.yaml new file mode 100644 index 0000000..82f2c4a --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/copier.yaml @@ -0,0 +1,15 @@ +_tasks: + - "echo '==== Successfully initialized new smart contract 🚀 ===='" + +contract_name: + type: str + help: Name of your new contract. + placeholder: "my-new-contract" + default: "my-new-contract" + +include_tests: + type: bool + help: Should we include testing files? + default: 'yes' + +_templates_suffix: ".j2" diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.algo.ts.j2 b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.algo.ts.j2 new file mode 100644 index 0000000..344c1a1 --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.algo.ts.j2 @@ -0,0 +1,7 @@ +import { Contract } from '@algorandfoundation/algorand-typescript' + +export class {{ contract_name.split('_')|map('capitalize')|join }} extends Contract { + {% if preset_name != 'starter' %}public {% endif %}hello(name: string): string { + return `Hello, ${name}` + } +} diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 new file mode 100644 index 0000000..4626980 --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 @@ -0,0 +1,33 @@ +import { AlgorandClient } from '@algorandfoundation/algokit-utils' +import { {{ contract_name.split('_')|map('capitalize')|join }}Factory } from '../artifacts/{{ contract_name }}/{{ contract_name.split('_')|map('capitalize')|join }}Client' + +// Below is a showcase of various deployment options you can use in TypeScript Client +export async function deploy() { + console.log('=== Deploying {{ contract_name.split('_')|map('capitalize')|join }} ===') + + const algorand = AlgorandClient.fromEnvironment() + const deployer = await algorand.account.fromEnvironment('DEPLOYER') + + const factory = algorand.client.getTypedAppFactory({{ contract_name.split('_')|map('capitalize')|join }}Factory, { + defaultSender: deployer.addr, + }) + + const { appClient, result } = await factory.deploy({ onUpdate: 'append', onSchemaBreak: 'append' }) + + // If app was just created fund the app account + if (['create', 'replace'].includes(result.operationPerformed)) { + await algorand.send.payment({ + amount: (1).algo(), + sender: deployer.addr, + receiver: appClient.appAddress, + }) + } + + const method = 'hello' + const response = await appClient.send.hello({ + args: { name: 'world' }, + }) + console.log( + `Called ${method} on ${appClient.appClient.appName} (${appClient.appClient.appId}) with name = world, received: ${response.return}`, + ) +} diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 new file mode 100644 index 0000000..146e270 --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.e2e.spec.ts{% endif %}.j2 @@ -0,0 +1,36 @@ +import { Config } from '@algorandfoundation/algokit-utils' +import { algorandFixture } from '@algorandfoundation/algokit-utils/testing' +import { Address } from 'algosdk' +import { beforeAll, beforeEach, describe, expect, test } from 'vitest' +import { {{ contract_name.split('_')|map('capitalize')|join }}Factory } from '../artifacts/{{ contract_name }}/{{ contract_name.split('_')|map('capitalize')|join }}Client' + +describe('{{ contract_name.split('_')|map('capitalize')|join }} contract', () => { + const localnet = algorandFixture() + beforeAll(() => { + Config.configure({ + debug: true, + // traceAll: true, + }) + }) + beforeEach(localnet.newScope) + + const deploy = async (account: Address) => { + const factory = localnet.algorand.client.getTypedAppFactory({{ contract_name.split('_')|map('capitalize')|join }}Factory, { + defaultSender: account, + }) + + const { appClient } = await factory.deploy({ onUpdate: 'append', onSchemaBreak: 'append' }) + return { client: appClient } + } + + test('says hello', async () => { + const { testAccount } = localnet.context + const { client } = await deploy(testAccount) + + const result = await client.send.hello({ args: { name: 'World' } }) + + expect(result.return).toBe('Hello World') + }) + +}) + diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.spec.ts{% endif %}.j2 b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.spec.ts{% endif %}.j2 new file mode 100644 index 0000000..e7a7414 --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/{% if include_tests %}contract.spec.ts{% endif %}.j2 @@ -0,0 +1,14 @@ +import { TestExecutionContext } from '@algorandfoundation/algorand-typescript-testing' +import { describe, expect, it } from 'vitest' +import { {{ contract_name.split('_')|map('capitalize')|join }} } from './contract.algo' + +describe('{{ contract_name.split('_')|map('capitalize')|join }} contract', () => { + const ctx = new TestExecutionContext() + it('Logs the returned value when sayHello is called', () => { + const contract = ctx.contract.create({{ contract_name.split('_')|map('capitalize')|join }}) + + const result = contract.hello('Sally') + + expect(result).toBe('Hello Sally') + }) +}) diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/copier.yaml b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/copier.yaml new file mode 100644 index 0000000..afa2cac --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/copier.yaml @@ -0,0 +1,49 @@ +_tasks: + - "echo '==== Successfully generated new .env file 🚀 ===='" + +target_network: + type: str + help: Name of your target network. + choices: + - mainnet + - testnet + - localnet + - custom + default: "localnet" + when: "{{ not use_generic_env }}" + +custom_network_name: + type: str + help: Name of your custom Algorand network. + placeholder: "custom" + when: "{{ not use_generic_env and target_network == 'custom' }}" + +is_localnet: + type: bool + help: Whether to deploy on localnet. + placeholder: "true" + default: "{{ target_network == 'localnet' and not use_generic_env }}" + when: 'false' + +is_testnet: + type: bool + help: Whether to deploy on testnet. + placeholder: "true" + default: "{{ target_network == 'testnet' and not use_generic_env }}" + when: 'false' + +is_mainnet: + type: bool + help: Whether to deploy on mainnet. + placeholder: "true" + default: "{{ target_network == 'mainnet' and not use_generic_env }}" + when: 'false' + +is_customnet: + type: bool + help: Whether to deploy on custom network. + placeholder: "true" + default: "{{ target_network == 'custom' and not use_generic_env }}" + when: 'false' + +_templates_suffix: ".j2" diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} new file mode 100644 index 0000000..cfc9f21 --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_customnet %}.env.{{custom_network_name}}{% endif %} @@ -0,0 +1,7 @@ +# this file contains algorand network settings for interacting with testnet via algonode +ALGOD_TOKEN={YOUR_ALGOD_TOKEN} +ALGOD_SERVER={YOUR_ALGOD_SERVER_URL} +ALGOD_PORT={YOUR_ALGOD_PORT} +INDEXER_TOKEN={YOUR_INDEXER_TOKEN} +INDEXER_SERVER={YOUR_INDEXER_SERVER_URL} +INDEXER_PORT={YOUR_INDEXER_PORT} diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} new file mode 100644 index 0000000..fcbf442 --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_localnet %}.env.localnet{% endif %} @@ -0,0 +1,7 @@ +# this file should contain environment variables specific to algokit localnet +ALGOD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +ALGOD_SERVER=http://localhost +ALGOD_PORT=4001 +INDEXER_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +INDEXER_SERVER=http://localhost +INDEXER_PORT=8980 diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} new file mode 100644 index 0000000..bb9a787 --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_mainnet %}.env.mainnet{% endif %} @@ -0,0 +1,3 @@ +# this file contains algorand network settings for interacting with testnet via algonode +ALGOD_SERVER=https://mainnet-api.algonode.cloud +INDEXER_SERVER=https://mainnet-idx.algonode.cloud diff --git a/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} new file mode 100644 index 0000000..eeea43d --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/.algokit/generators/create_env_file/{% if is_testnet %}.env.testnet{% endif %} @@ -0,0 +1,3 @@ +# this file contains algorand network settings for interacting with testnet via algonode +ALGOD_SERVER=https://testnet-api.algonode.cloud +INDEXER_SERVER=https://testnet-idx.algonode.cloud diff --git a/examples/s-ts/projects/s-ts-contracts/.gitignore b/examples/s-ts/projects/s-ts-contracts/.gitignore new file mode 100644 index 0000000..25494bf --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/.gitignore @@ -0,0 +1,62 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +# Dependency directories +node_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# Editor/OS directories and files +.DS_Store +*.suo + +# IntelliJ family +.idea +!.idea/ +.idea/* +!.idea/runConfigurations/ + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# Compiled code +dist/ +build/ + +# Coverage report +coverage + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# Received approval test files +*.received.* + +# AlgoKit +debug_traces/ +.algokit/static-analysis/ # Replace with .algokit/static-analysis/tealer/ to enable snapshot checks in CI +.algokit/sources diff --git a/examples/s-ts/projects/s-ts-contracts/.tours/getting-started-with-your-algokit-project.tour b/examples/s-ts/projects/s-ts-contracts/.tours/getting-started-with-your-algokit-project.tour new file mode 100644 index 0000000..2ad6a00 --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/.tours/getting-started-with-your-algokit-project.tour @@ -0,0 +1,46 @@ +{ + "$schema": "https://aka.ms/codetour-schema", + "title": "Getting Started with Your AlgoKit Project", + "steps": [ + { + "file": "README.md", + "description": "Welcome to your brand new AlgoKit template-based project. In this tour, we will guide you through the main features and capabilities included in the template.", + "line": 3 + }, + { + "file": "README.md", + "description": "Start by ensuring you have followed the setup of pre-requisites.", + "line": 9 + }, + { + "file": ".algokit.toml", + "description": "This is the main configuration file used by algokit-cli to manage the project. The default template includes a starter 'Hello World' contract that is deployed via the `algokit-utils` package. To create a new smart contract, you can use the [`algokit generate`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md) command and invoke a pre-bundled generator template by running `algokit generate smart-contract` (see how it is defined in the `.algokit.toml`, you can create your own generators if needed). This action will create a new folder in the `smart_contracts` directory, named after your project. Each folder contains a `contract.algo.ts` file, which is the entry point for your contract implementation, and `deployConfig.ts` file, that perform the deployment of the contract. Additionally you can define custom commands to run (similar to `npm` scripts), see definitions under `[project]` section in `.algokit.toml`.", + "line": 1 + }, + { + "file": "smart_contracts/hello_world/deploy-config.ts", + "description": "The default deployment scripts invoke a sample method on the starter contract that demonstrates how to interact with your deployed Algorand on-chain applications using the [`AlgoKit Typed Clients`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md#1-typed-clients) feature. The invocation if deploy is aliased in `.algokit.toml` file, allowing simple deployments via `algokit project deploy` command.", + "line": 32 + }, + { + "file": ".env.localnet.template", + "description": "Environment files are a crucial mechanism that allows you to set up the [`algokit deploy`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/deploy.md) feature to simplify deploying your contracts in CI/CD environments (please note we still recommend careful evaluation when it comes to deployment to MainNet). Clone the file and remove the `.template` suffix to apply the changes to deployment scripts and launch configurations. The network prefix `localnet|testnet|mainnet` is primarily optimized for `algokit deploy`. The order of loading the variables is `.env.{network}` < `.env`.", + "line": 2 + }, + { + "file": ".vscode/launch.json", + "description": "Refer to the pre-bundled Visual Studio launch configurations, offering various options on how to execute the build and deployment of your smart contracts. Alternatively execute `algokit project run` to see list of available custom commands.", + "line": 5 + }, + { + "file": ".vscode/extensions.json", + "description": "We highly recommend installing the recommended extensions to get the most out of this template starter project in your VSCode IDE.", + "line": 3 + }, + { + "file": "smart_contracts/index.ts", + "description": "Uncomment the following line to enable artifacts required for the [AlgoKit AVM Debugger](https://github.com/algorandfoundation/algokit-avm-vscode-debugger) that run for every single call rather than just failures. This VSCode plugin is available on the [VSCode Extension Marketplace](https://marketplace.visualstudio.com/items?itemName=algorandfoundation.algokit-avm-vscode-debugger) for every call. A new folder will be automatically created in the `.algokit` directory with source maps of all TEAL contracts in this workspace, as well as traces that will appear in a folder at the root of the workspace. You can then use the traces as entry points to trigger the debug extension. Make sure to have the `.algokit.toml` file available at the root of the workspace.", + "line": 13 + } + ] +} diff --git a/examples/s-ts/projects/s-ts-contracts/.vscode/extensions.json b/examples/s-ts/projects/s-ts-contracts/.vscode/extensions.json new file mode 100644 index 0000000..270814b --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "editorconfig.editorconfig", + "vsls-contrib.codetour", + "algorandfoundation.algokit-avm-vscode-debugger" + ] +} diff --git a/examples/s-ts/projects/s-ts-contracts/.vscode/launch.json b/examples/s-ts/projects/s-ts-contracts/.vscode/launch.json new file mode 100644 index 0000000..093ebb1 --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/.vscode/launch.json @@ -0,0 +1,58 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Build & Deploy contracts", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "deploy"], + "cwd": "${workspaceFolder}/smart_contracts", + "console": "integratedTerminal", + "skipFiles": ["/**", "node_modules/**"], + "preLaunchTask": "Build contracts (+ LocalNet)", + "env": { + "ALGOD_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "ALGOD_SERVER": "http://localhost", + "ALGOD_PORT": "4001", + "INDEXER_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "INDEXER_SERVER": "http://localhost", + "INDEXER_PORT": "8980" + } + }, + { + "name": "Deploy contracts", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "deploy"], + "cwd": "${workspaceFolder}/smart_contracts", + "console": "integratedTerminal", + "skipFiles": ["/**", "node_modules/**"], + "env": { + "ALGOD_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "ALGOD_SERVER": "http://localhost", + "ALGOD_PORT": "4001", + "INDEXER_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "INDEXER_SERVER": "http://localhost", + "INDEXER_PORT": "8980" + } + }, + { + "name": "Build contracts", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "build"], + "cwd": "${workspaceFolder}", + "console": "integratedTerminal", + "skipFiles": ["/**", "node_modules/**"], + }, + { + "type": "avm", + "request": "launch", + "name": "Debug AVM executions", + "simulateTraceFile": "${workspaceFolder}/${command:PickSimulateTraceFile}", + "stopOnEntry": true + } + ] +} diff --git a/examples/s-ts/projects/s-ts-contracts/.vscode/settings.json b/examples/s-ts/projects/s-ts-contracts/.vscode/settings.json new file mode 100644 index 0000000..ccf1564 --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "files.eol": "\n", + "algorandTypeScript.languageServer.enable": true, + } diff --git a/examples/s-ts/projects/s-ts-contracts/.vscode/tasks.json b/examples/s-ts/projects/s-ts-contracts/.vscode/tasks.json new file mode 100644 index 0000000..55310ab --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/.vscode/tasks.json @@ -0,0 +1,69 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Build contracts", + "type": "npm", + "script": "build", + "path": "${workspaceFolder}", + "options": { + "cwd": "${workspaceFolder}" + }, + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [] + }, + { + "label": "Build contracts (+ LocalNet)", + "type": "npm", + "script": "build", + "path": "${workspaceFolder}", + "options": { + "cwd": "${workspaceFolder}" + }, + "dependsOn": "Start AlgoKit LocalNet", + "problemMatcher": [] + }, + { + "label": "Start AlgoKit LocalNet", + "command": "algokit", + "args": ["localnet", "start"], + "type": "shell", + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + }, + { + "label": "Stop AlgoKit LocalNet", + "command": "algokit", + "args": ["localnet", "stop"], + "type": "shell", + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + }, + { + "label": "Reset AlgoKit LocalNet", + "command": "algokit", + "args": ["localnet", "reset"], + "type": "shell", + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + }, + { + "label": "Analyze TEAL contracts with AlgoKit Tealer integration", + "command": "algokit", + "args": ["task", "analyze", "${workspaceFolder}/.algokit", "--recursive", "--force"], + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + } + ] +} diff --git a/examples/s-ts/projects/s-ts-contracts/README.md b/examples/s-ts/projects/s-ts-contracts/README.md new file mode 100644 index 0000000..4303b31 --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/README.md @@ -0,0 +1,107 @@ +# s-ts-contracts + +This project has been generated using AlgoKit. See below for default getting started instructions. + +# Setup + +### Pre-requisites + +- [Nodejs 22](https://nodejs.org/en/download) or later +- [AlgoKit CLI 2.5](https://github.com/algorandfoundation/algokit-cli?tab=readme-ov-file#install) or later +- [Docker](https://www.docker.com/) (only required for LocalNet) +- [Puya Compiler 4.4.4](https://pypi.org/project/puyapy/) or later + +> For interactive tour over the codebase, download [vsls-contrib.codetour](https://marketplace.visualstudio.com/items?itemName=vsls-contrib.codetour) extension for VS Code, then open the [`.codetour.json`](./.tours/getting-started-with-your-algokit-project.tour) file in code tour extension. + +### Initial Setup + +#### 1. Clone the Repository +Start by cloning this repository to your local machine. + +#### 2. Install Pre-requisites +Ensure the following pre-requisites are installed and properly configured: + +- **Docker**: Required for running a local Algorand network. +- **AlgoKit CLI**: Essential for project setup and operations. Verify installation with `algokit --version`, expecting `2.6.0` or later. + +#### 3. Bootstrap Your Local Environment +Run the following commands within the project folder: + +- **Setup Project**: Execute `algokit project bootstrap all` to install dependencies and setup npm dependencies. +- **Configure environment**: Execute `algokit generate env-file -a target_network localnet` to create a `.env.localnet` file with default configuration for `localnet`. +- **Start LocalNet**: Use `algokit localnet start` to initiate a local Algorand network. + +### Development Workflow + +#### Terminal +Directly manage and interact with your project using AlgoKit commands: + +1. **Build Contracts**: `algokit project run build` compiles all smart contracts. You can also specify a specific contract by passing the name of the contract folder as an extra argument. +For example: `algokit project run build -- hello_world` will only build the `hello_world` contract. +2. **Deploy**: Use `algokit project deploy localnet` to deploy contracts to the local network. You can also specify a specific contract by passing the name of the contract folder as an extra argument. +For example: `algokit project deploy localnet -- hello_world` will only deploy the `hello_world` contract. + +#### VS Code +For a seamless experience with breakpoint debugging and other features: + +1. **Open Project**: In VS Code, open the repository root. +2. **Install Extensions**: Follow prompts to install recommended extensions. +3. **Debugging**: + - Use `F5` to start debugging. + +#### JetBrains IDEs +While primarily optimized for VS Code, JetBrains IDEs are supported: + +1. **Open Project**: In your JetBrains IDE, open the repository root. +2. **Automatic Setup**: The IDE should configure the Node.js environment. +3. **Debugging**: Use `Shift+F10` or `Ctrl+R` to start debugging. Note: Windows users may encounter issues with pre-launch tasks due to a known bug. See [JetBrains forums](https://youtrack.jetbrains.com/issue/IDEA-277486/Shell-script-configuration-cannot-run-as-before-launch-task) for workarounds. + +## AlgoKit Workspaces and Project Management +This project supports both standalone and monorepo setups through AlgoKit workspaces. Leverage [`algokit project run`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md) commands for efficient monorepo project orchestration and management across multiple projects within a workspace. + +## AlgoKit Generators + +This template provides a set of [algokit generators](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md) that allow you to further modify the project instantiated from the template to fit your needs, as well as giving you a base to build your own extensions to invoke via the `algokit generate` command. + +### Generate Smart Contract + +By default the template creates a single `HelloWorld` contract under hello_world folder in the `smart_contracts` directory. To add a new contract: + +1. From the root of the project (`../`) execute `algokit generate smart-contract`. This will create a new starter smart contract and deployment configuration file under `{your_contract_name}` subfolder in the `smart_contracts` directory. +2. Each contract potentially has different creation parameters and deployment steps. Hence, you need to define your deployment logic in `deploy-config.ts` file. +3. Technically, you need to reference your contract deployment logic in the `index.ts` file. However, by default, `index.ts` will auto import all TypeScript deployment files under `smart_contracts` directory. If you want to manually import specific contracts, modify the default code provided by the template in `index.ts` file. + +> Please note, above is just a suggested convention tailored for the base configuration and structure of this template. The default code supplied by the template in the `index.ts` file is tailored for the suggested convention. You are free to modify the structure and naming conventions as you see fit. + +### Generate '.env' files + +By default the template instance does not contain any env files to deploy to different networks. Using [`algokit project deploy`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/deploy.md) against `localnet` | `testnet` | `mainnet` will use default values for `algod` and `indexer` unless overwritten via `.env` or `.env.{target_network}`. + +To generate a new `.env` or `.env.{target_network}` file, run `algokit generate env-file` + +### Debugging Smart Contracts + +This project is optimized to work with AlgoKit AVM Debugger extension. To activate it: + +Refer to the commented header in the `index.ts` file in the `smart_contracts` folder.Since you have opted in to include VSCode launch configurations in your project, you can also use the `Debug TEAL via AlgoKit AVM Debugger` launch configuration to interactively select an available trace file and launch the debug session for your smart contract. + + +For information on using and setting up the `AlgoKit AVM Debugger` VSCode extension refer [here](https://github.com/algorandfoundation/algokit-avm-vscode-debugger). To install the extension from the VSCode Marketplace, use the following link: [AlgoKit AVM Debugger extension](https://marketplace.visualstudio.com/items?itemName=algorandfoundation.algokit-avm-vscode-debugger). + +# Tools + +This project makes use of Algorand TypeScript to build Algorand smart contracts. The following tools are in use: + +- [Algorand](https://www.algorand.com/) - Layer 1 Blockchain; [Developer portal](https://dev.algorand.co/), [Why Algorand?](https://dev.algorand.co/getting-started/why-algorand/) +- [AlgoKit](https://github.com/algorandfoundation/algokit-cli) - One-stop shop tool for developers building on the Algorand network; [docs](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/algokit.md), [intro tutorial](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/tutorials/intro.md) +- [Algorand TypeScript](https://github.com/algorandfoundation/puya-ts/) - A semantically and syntactically compatible, typed TypeScript language that works with standard TypeScript tooling and allows you to express smart contracts (apps) and smart signatures (logic signatures) for deployment on the Algorand Virtual Machine (AVM); [docs](https://github.com/algorandfoundation/puya-ts/), [examples](https://github.com/algorandfoundation/puya-ts/tree/main/examples) +- [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-ts) - A set of core Algorand utilities that make it easier to build solutions on Algorand. +- [NPM](https://www.npmjs.com/): TypeScript packaging and dependency management. +- [TypeScript](https://www.typescriptlang.org/): Strongly typed programming language that builds on JavaScript +- [ts-node-dev](https://github.com/wclr/ts-node-dev): TypeScript development execution environment + + +It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. + + + diff --git a/examples/s-ts/projects/s-ts-contracts/package.json b/examples/s-ts/projects/s-ts-contracts/package.json new file mode 100644 index 0000000..ce7ecfb --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/package.json @@ -0,0 +1,34 @@ +{ + "name": "smart_contracts", + "version": "1.0.0", + "description": "Smart contract deployer", + "main": "smart_contracts/index.ts", + "scripts": { + "build": "algokit compile ts smart_contracts --output-source-map --out-dir artifacts && algokit generate client smart_contracts/artifacts --output {app_spec_dir}/{contract_name}Client.ts", + "deploy": "ts-node-dev --transpile-only --watch .env -r dotenv/config smart_contracts/index.ts", + "deploy:ci": "ts-node --transpile-only -r dotenv/config smart_contracts/index.ts", + "check-types": "tsc --noEmit" + }, + "engines": { + "node": ">=22.0", + "npm": ">=9.0" + }, + "dependencies": { + "@algorandfoundation/algorand-typescript": "^1.0.1" + }, + "devDependencies": { + "@algorandfoundation/algokit-client-generator": "^6.0.0", + "@algorandfoundation/algokit-utils": "^9.0.0", + "@algorandfoundation/algokit-utils-debug": "^1.0.4", + "@algorandfoundation/puya-ts": "^1.0.1", + "@rollup/plugin-typescript": "^12.1.2", + "@tsconfig/node22": "^22.0.0", + "algosdk": "^3.0.0", + "dotenv": "^16.4.7", + "ts-node-dev": "^2.0.0", + "typescript": "^5.7.3" + }, + "overrides": { + "esbuild": "0.25.0" + } +} diff --git a/examples/s-ts/projects/s-ts-contracts/smart_contracts/hello_world/contract.algo.ts b/examples/s-ts/projects/s-ts-contracts/smart_contracts/hello_world/contract.algo.ts new file mode 100644 index 0000000..3737e90 --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/smart_contracts/hello_world/contract.algo.ts @@ -0,0 +1,7 @@ +import { Contract } from '@algorandfoundation/algorand-typescript' + +export class HelloWorld extends Contract { + hello(name: string): string { + return `Hello, ${name}` + } +} diff --git a/examples/s-ts/projects/s-ts-contracts/smart_contracts/hello_world/deploy-config.ts b/examples/s-ts/projects/s-ts-contracts/smart_contracts/hello_world/deploy-config.ts new file mode 100644 index 0000000..6b9d652 --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/smart_contracts/hello_world/deploy-config.ts @@ -0,0 +1,33 @@ +import { AlgorandClient } from '@algorandfoundation/algokit-utils' +import { HelloWorldFactory } from '../artifacts/hello_world/HelloWorldClient' + +// Below is a showcase of various deployment options you can use in TypeScript Client +export async function deploy() { + console.log('=== Deploying HelloWorld ===') + + const algorand = AlgorandClient.fromEnvironment() + const deployer = await algorand.account.fromEnvironment('DEPLOYER') + + const factory = algorand.client.getTypedAppFactory(HelloWorldFactory, { + defaultSender: deployer.addr, + }) + + const { appClient, result } = await factory.deploy({ onUpdate: 'append', onSchemaBreak: 'append' }) + + // If app was just created fund the app account + if (['create', 'replace'].includes(result.operationPerformed)) { + await algorand.send.payment({ + amount: (1).algo(), + sender: deployer.addr, + receiver: appClient.appAddress, + }) + } + + const method = 'hello' + const response = await appClient.send.hello({ + args: { name: 'world' }, + }) + console.log( + `Called ${method} on ${appClient.appClient.appName} (${appClient.appClient.appId}) with name = world, received: ${response.return}`, + ) +} diff --git a/examples/s-ts/projects/s-ts-contracts/smart_contracts/index.ts b/examples/s-ts/projects/s-ts-contracts/smart_contracts/index.ts new file mode 100644 index 0000000..6030d0e --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/smart_contracts/index.ts @@ -0,0 +1,62 @@ +import { Config } from '@algorandfoundation/algokit-utils' +import { registerDebugEventHandlers } from '@algorandfoundation/algokit-utils-debug' +import { consoleLogger } from '@algorandfoundation/algokit-utils/types/logging' +import * as fs from 'node:fs' +import * as path from 'node:path' + +// Uncomment the traceAll option to enable auto generation of AVM Debugger compliant sourceMap and simulation trace file for all AVM calls. +// Learn more about using AlgoKit AVM Debugger to debug your TEAL source codes and inspect various kinds of Algorand transactions in atomic groups -> https://github.com/algorandfoundation/algokit-avm-vscode-Debugger + +Config.configure({ + logger: consoleLogger, + debug: true, + // traceAll: true, +}) +registerDebugEventHandlers() + +// base directory +const baseDir = path.resolve(__dirname) + +// function to validate and dynamically import a module +async function importDeployerIfExists(dir: string) { + const deployerPath = path.resolve(dir, 'deploy-config') + if (fs.existsSync(deployerPath + '.ts') || fs.existsSync(deployerPath + '.js')) { + const deployer = await import(deployerPath) + return { ...deployer, name: path.basename(dir) } + } + return null +} + +// get a list of all deployers from the subdirectories +async function getDeployers() { + const directories = fs + .readdirSync(baseDir, { withFileTypes: true }) + .filter((dirent) => dirent.isDirectory()) + .map((dirent) => path.resolve(baseDir, dirent.name)) + + const deployers = await Promise.all(directories.map(importDeployerIfExists)) + return deployers.filter((deployer) => deployer !== null) // Filter out null values +} + +// execute all the deployers +(async () => { + const contractName = process.argv.length > 2 ? process.argv[2] : undefined + const contractDeployers = await getDeployers() + + const filteredDeployers = contractName + ? contractDeployers.filter(deployer => deployer.name === contractName) + : contractDeployers + + if (contractName && filteredDeployers.length === 0) { + console.warn(`No deployer found for contract name: ${contractName}`) + return + } + + for (const deployer of filteredDeployers) { + try { + await deployer.deploy() + } catch (e) { + console.error(`Error deploying ${deployer.name}:`, e) + } + } +})() diff --git a/examples/s-ts/projects/s-ts-contracts/tsconfig.json b/examples/s-ts/projects/s-ts-contracts/tsconfig.json new file mode 100644 index 0000000..d989075 --- /dev/null +++ b/examples/s-ts/projects/s-ts-contracts/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "target": "ES2020", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "strict": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "allowJs": false, + "allowSyntheticDefaultImports": true, + "module": "CommonJS", + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "lib": [ + "ESNext" + ], + }, + "include": ["smart_contracts/**/*.ts"], + "exclude": ["node_modules", "dist", "coverage"] +} diff --git a/examples/s-ts/projects/s-ts-frontend/.algokit.toml b/examples/s-ts/projects/s-ts-frontend/.algokit.toml new file mode 100644 index 0000000..3d3078d --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/.algokit.toml @@ -0,0 +1,11 @@ +[algokit] +min_version = "v2.0.0" + +[project] +type = "frontend" +name = 's-ts-frontend' +artifacts = "src/contracts" + +[project.run] +build = { commands = ['npm run build'], description = 'Build frontend' } +test = { commands = ['npm run test'], description = 'Run frontend tests' } diff --git a/examples/s-ts/projects/s-ts-frontend/.algokit/.copier-answers.yml b/examples/s-ts/projects/s-ts-frontend/.algokit/.copier-answers.yml new file mode 100644 index 0000000..3692b48 --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/.algokit/.copier-answers.yml @@ -0,0 +1,8 @@ +# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY +_commit: 1.1.1 +_src_path: gh:algorandfoundation/algokit-react-frontend-template +author_email: None +author_name: None +preset_name: starter +project_name: s-ts-frontend + diff --git a/examples/s-ts/projects/s-ts-frontend/.env.template b/examples/s-ts/projects/s-ts-frontend/.env.template new file mode 100644 index 0000000..eb4b229 --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/.env.template @@ -0,0 +1,67 @@ +# ====================== +# LocalNet configuration +# uncomment below to use +# ====================== + +VITE_ENVIRONMENT=local + +# Algod +VITE_ALGOD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +VITE_ALGOD_SERVER=http://localhost +VITE_ALGOD_PORT=4001 +VITE_ALGOD_NETWORK=localnet + +# Indexer +VITE_INDEXER_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +VITE_INDEXER_SERVER=http://localhost +VITE_INDEXER_PORT=8980 + +# KMD +# Please note: +# 1. This is only needed for LocalNet since +# by default KMD provider is ignored on other networks. +# 2. AlgoKit LocalNet starts with a single wallet called 'unencrypted-default-wallet', +# with heaps of tokens available for testing. +VITE_KMD_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +VITE_KMD_SERVER=http://localhost +VITE_KMD_PORT=4002 +VITE_KMD_WALLET="unencrypted-default-wallet" +VITE_KMD_PASSWORD="" + +# # ====================== +# # TestNet configuration: +# # uncomment below to use +# # ====================== + +# VITE_ENVIRONMENT=local + +# # Algod +# VITE_ALGOD_TOKEN="" +# VITE_ALGOD_SERVER="https://testnet-api.algonode.cloud" +# VITE_ALGOD_PORT="" +# VITE_ALGOD_NETWORK="testnet" + +# # Indexer +# VITE_INDEXER_TOKEN="" +# VITE_INDEXER_SERVER="https://testnet-idx.algonode.cloud" +# VITE_INDEXER_PORT="" + + +# # ====================== +# # MainNet configuration: +# # uncomment below to use +# # ====================== + +# VITE_ENVIRONMENT=production + +# # Algod +# VITE_ALGOD_TOKEN="" +# VITE_ALGOD_SERVER="https://mainnet-api.algonode.cloud" +# VITE_ALGOD_PORT="" +# VITE_ALGOD_NETWORK="mainnet" + +# # Indexer +# VITE_INDEXER_TOKEN="" +# VITE_INDEXER_SERVER="https://mainnet-idx.algonode.cloud" +# VITE_INDEXER_PORT="" + diff --git a/examples/s-ts/projects/s-ts-frontend/.gitignore b/examples/s-ts/projects/s-ts-frontend/.gitignore new file mode 100644 index 0000000..b1ce837 --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/.gitignore @@ -0,0 +1,38 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + + +# dotenv environment variable files +.env +env/ + +# misc +/dist +.DS_Store + + +npm-debug.log* +yarn-debug.log* +yarn-error.log* +/test-results/ +/playwright-report/ +/playwright/.cache/ + +# PyCharm +.idea +!.idea/ +.idea/* +!.idea/runConfigurations/ + +.vercel +.netlify diff --git a/examples/s-ts/projects/s-ts-frontend/.npmrc b/examples/s-ts/projects/s-ts-frontend/.npmrc new file mode 100644 index 0000000..c42da84 --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/.npmrc @@ -0,0 +1 @@ +engine-strict = true diff --git a/examples/s-ts/projects/s-ts-frontend/.vscode/extensions.json b/examples/s-ts/projects/s-ts-frontend/.vscode/extensions.json new file mode 100644 index 0000000..6d0554a --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "EditorConfig.EditorConfig", + "dotenv.dotenv-vscode", + ] +} + diff --git a/examples/s-ts/projects/s-ts-frontend/.vscode/launch.json b/examples/s-ts/projects/s-ts-frontend/.vscode/launch.json new file mode 100644 index 0000000..7edaf04 --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/.vscode/launch.json @@ -0,0 +1,68 @@ +{ + "configurations": [ + { + "type": "msedge", + "request": "launch", + "name": "Run (Edge)", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}", + "presentation": { + "hidden": false, + "group": "2. Web" + } + }, + { + "type": "chrome", + "request": "launch", + "name": "Run (Chrome)", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}", + "presentation": { + "hidden": false, + "group": "2. Web" + } + }, + { + "type": "firefox", + "request": "launch", + "name": "Run (Firefox)", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}", + "presentation": { + "hidden": false, + "group": "2. Web" + } + }, + { + "name": "Run dApp", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev"], + "cwd": "${workspaceRoot}", + "console": "integratedTerminal", + "skipFiles": ["/**", "node_modules/**"], + "presentation": { + "hidden": false, + "group": "1. Run Project", + "order": 1 + } + }, + { + "name": "Run dApp (+ LocalNet)", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev"], + "cwd": "${workspaceRoot}", + "console": "integratedTerminal", + "skipFiles": ["/**", "node_modules/**"], + "preLaunchTask": "Start AlgoKit LocalNet", + "presentation": { + "hidden": false, + "group": "1. Run Project", + "order": 1 + } + } + ] +} diff --git a/examples/s-ts/projects/s-ts-frontend/.vscode/settings.json b/examples/s-ts/projects/s-ts-frontend/.vscode/settings.json new file mode 100644 index 0000000..f34d28b --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "editor.formatOnSave": true, + + "dotenv.enableAutocloaking": false, + +} diff --git a/examples/s-ts/projects/s-ts-frontend/.vscode/tasks.json b/examples/s-ts/projects/s-ts-frontend/.vscode/tasks.json new file mode 100644 index 0000000..d611c4f --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/.vscode/tasks.json @@ -0,0 +1,15 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Start AlgoKit LocalNet", + "command": "algokit", + "args": ["localnet", "start"], + "type": "shell", + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + } + ] +} diff --git a/examples/s-ts/projects/s-ts-frontend/README.md b/examples/s-ts/projects/s-ts-frontend/README.md new file mode 100644 index 0000000..62ee6e2 --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/README.md @@ -0,0 +1,76 @@ +# s-ts-frontend + +This starter React project has been generated using AlgoKit. See below for default getting started instructions. + +# Setup + +### Initial Setup + +#### 1. Clone the Repository +Start by cloning this repository to your local machine. + +#### 2. Install Pre-requisites +Ensure the following pre-requisites are installed and properly configured: + +- **npm**: Node package manager. Install from [Node.js Installation Guide](https://nodejs.org/en/download/). Verify with `npm -v` to see version `18.12`+. +- **AlgoKit CLI**: Essential for project setup and operations. Install the latest version from [AlgoKit CLI Installation Guide](https://github.com/algorandfoundation/algokit-cli#install). Verify installation with `algokit --version`, expecting `2.0.0` or later. + +#### 3. Bootstrap Your Local Environment +Run the following commands within the project folder: + +- **Install Project Dependencies**: With `algokit project bootstrap all`, ensure all dependencies are ready. + +### Development Workflow + +#### Terminal +Directly manage and interact with your project using AlgoKit commands: + +1. **Build Contracts**: `algokit project run build` builds react web app and links with smart contracts in workspace, if any. +2. Remaining set of command for linting, testing and deployment can be found in respective [package.json](./package.json) file and [.algokit.toml](./.algokit.toml) files. + +#### VS Code +For a seamless experience with breakpoint debugging and other features: + +1. **Open Project**: In VS Code, open the repository root. +2. **Install Extensions**: Follow prompts to install recommended extensions. +3. **Debugging**: + - Use `F5` to start debugging. + - **Windows Users**: Select the Python interpreter at `./.venv/Scripts/python.exe` via `Ctrl/Cmd + Shift + P` > `Python: Select Interpreter` before the first run. + +#### Other IDEs +While primarily optimized for VS Code, Jetbrains WebStorm has base support for this project: + +1. **Open Project**: In your JetBrains IDE, open the repository root. +2. **Automatic Setup**: The IDE should configure the Python interpreter and virtual environment. +3. **Debugging**: Use `Shift+F10` or `Ctrl+R` to start debugging. Note: Windows users may encounter issues with pre-launch tasks due to a known bug. See [JetBrains forums](https://youtrack.jetbrains.com/issue/IDEA-277486/Shell-script-configuration-cannot-run-as-before-launch-task) for workarounds. + +## AlgoKit Workspaces and Project Management +This project supports both standalone and monorepo setups through AlgoKit workspaces. Leverage [`algokit project run`](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/run.md) commands for efficient monorepo project orchestration and management across multiple projects within a workspace. + +> Please note, by default frontend is pre configured to run against Algorand LocalNet. If you want to run against TestNet or MainNet, comment out the current environment variable and uncomment the relevant one in [`.env`](.env) file that is created after running bootstrap command and based on [`.env.template`](.env.template). + +# Algorand Wallet integrations + +The template comes with [`use-wallet`](https://github.com/txnlab/use-wallet) integration, which provides a React hook for connecting to an Algorand wallet providers. The following wallet providers are included by default: +- LocalNet: +- - [KMD/Local Wallet](https://github.com/TxnLab/use-wallet#kmd-algorand-key-management-daemon) - Algorand's Key Management Daemon (KMD) is a service that manages Algorand private keys and signs transactions. Works best with AlgoKit LocalNet and allows you to easily test and interact with your dApps locally. +- TestNet and others: +- - [Pera Wallet](https://perawallet.app). +- - [Defly Wallet](https://defly.app). +- - [Exodus Wallet](https://www.exodus.com). +- - [Daffi Wallet](https://www.daffi.me). + +Refer to official [`use-wallet`](https://github.com/txnlab/use-wallet) documentation for detailed guidelines on how to integrate with other wallet providers (such as WalletConnect v2). Too see implementation details on the use wallet hook and initialization of extra wallet providers refer to [`App.tsx`](./src/App.tsx). + +# Tools + +This project makes use of React and Tailwind to provider a base project configuration to develop frontends for your Algorand dApps and interactions with smart contracts. The following tools are in use: + +- [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-ts) - Various TypeScript utilities to simplify interactions with Algorand and AlgoKit. +- [React](https://reactjs.org/) - A JavaScript library for building user interfaces. +- [use-wallet](https://github.com/txnlab/use-wallet) - A React hook for connecting to an Algorand wallet providers. +- [npm](https://www.npmjs.com/): Node.js package manager +It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. +# Integrating with smart contracts and application clients + +Refer to the detailed guidance on [integrating with smart contracts and application clients](./src/contracts/README.md). In essence, for any smart contract codebase generated with AlgoKit or other tools that produce compile contracts into ARC34 compliant app specifications, you can use the `algokit generate` command to generate TypeScript or Python typed client. Once generated simply drag and drop the generated client into `./src/contracts` and import it into your React components as you see fit. diff --git a/examples/s-ts/projects/s-ts-frontend/index.html b/examples/s-ts/projects/s-ts-frontend/index.html new file mode 100644 index 0000000..5a2ef4f --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/index.html @@ -0,0 +1,12 @@ + + + + + + AlgoKit React Template + + +
+ + + diff --git a/examples/s-ts/projects/s-ts-frontend/package.json b/examples/s-ts/projects/s-ts-frontend/package.json new file mode 100644 index 0000000..0e50c2e --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/package.json @@ -0,0 +1,64 @@ +{ + "name": "s-ts-frontend", + "version": "0.1.0", + "author": { + "name": "None", + "email": "None" + }, + "private": true, + "type": "module", + "engines": { + "node": ">=20.0", + "npm": ">=9.0" + }, + "devDependencies": { + "@algorandfoundation/algokit-client-generator": "^5.0.0", + "@types/node": "^18.17.14", + "@types/react": "^18.2.11", + "@types/react-dom": "^18.2.4", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.14", + "ts-node": "^10.9.1", + "typescript": "^5.1.6", + "vite": "^5.0.0", + "vite-plugin-node-polyfills": "^0.22.0" + }, + "dependencies": { + "@algorandfoundation/algokit-utils": "^9.0.0", + "@blockshake/defly-connect": "^1.2.1", + "@perawallet/connect": "^1.4.1", + "@txnlab/use-wallet": "^4.0.0", + "@txnlab/use-wallet-react": "^4.0.0", + "algosdk": "^3.0.0", + "notistack": "^3.0.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "tslib": "^2.6.2" + }, + "scripts": { + "generate:app-clients": "algokit project link --all", + "dev": "npm run generate:app-clients && vite", + "build": "npm run generate:app-clients && tsc && vite build", + "preview": "vite preview" + }, + "eslintConfig": { + "extends": [ + "react-app" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "overrides": { + "ws@>7.0.0 <7.5.9": "7.5.10" + } +} diff --git a/examples/s-ts/projects/s-ts-frontend/public/index.html b/examples/s-ts/projects/s-ts-frontend/public/index.html new file mode 100644 index 0000000..0d3a3a5 --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/public/index.html @@ -0,0 +1,37 @@ + + + + + + + + + + React App + + + +
+ + + diff --git a/examples/s-ts/projects/s-ts-frontend/public/robots.txt b/examples/s-ts/projects/s-ts-frontend/public/robots.txt new file mode 100644 index 0000000..e9e57dc --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/examples/s-ts/projects/s-ts-frontend/src/App.tsx b/examples/s-ts/projects/s-ts-frontend/src/App.tsx new file mode 100644 index 0000000..f346006 --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/src/App.tsx @@ -0,0 +1,56 @@ +import { SupportedWallet, WalletId, WalletManager, WalletProvider } from '@txnlab/use-wallet-react' +import { SnackbarProvider } from 'notistack' +import Home from './Home' +import { getAlgodConfigFromViteEnvironment, getKmdConfigFromViteEnvironment } from './utils/network/getAlgoClientConfigs' + +let supportedWallets: SupportedWallet[] +if (import.meta.env.VITE_ALGOD_NETWORK === 'localnet') { + const kmdConfig = getKmdConfigFromViteEnvironment() + supportedWallets = [ + { + id: WalletId.KMD, + options: { + baseServer: kmdConfig.server, + token: String(kmdConfig.token), + port: String(kmdConfig.port), + }, + }, + ] +} else { + supportedWallets = [ + { id: WalletId.DEFLY }, + { id: WalletId.PERA }, + { id: WalletId.EXODUS }, + // If you are interested in WalletConnect v2 provider + // refer to https://github.com/TxnLab/use-wallet for detailed integration instructions + ] +} + +export default function App() { + const algodConfig = getAlgodConfigFromViteEnvironment() + + const walletManager = new WalletManager({ + wallets: supportedWallets, + defaultNetwork: algodConfig.network, + networks: { + [algodConfig.network]: { + algod: { + baseServer: algodConfig.server, + port: algodConfig.port, + token: String(algodConfig.token), + }, + }, + }, + options: { + resetNetwork: true, + }, + }) + + return ( + + + + + + ) +} diff --git a/examples/s-ts/inject_content/Home.tsx b/examples/s-ts/projects/s-ts-frontend/src/Home.tsx similarity index 100% rename from examples/s-ts/inject_content/Home.tsx rename to examples/s-ts/projects/s-ts-frontend/src/Home.tsx diff --git a/examples/s-ts/projects/s-ts-frontend/src/assets/logo.svg b/examples/s-ts/projects/s-ts-frontend/src/assets/logo.svg new file mode 100644 index 0000000..7169476 --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/src/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/examples/s-ts/projects/s-ts-frontend/src/components/Account.tsx b/examples/s-ts/projects/s-ts-frontend/src/components/Account.tsx new file mode 100644 index 0000000..081ce47 --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/src/components/Account.tsx @@ -0,0 +1,24 @@ +import { useWallet } from '@txnlab/use-wallet-react' +import { useMemo } from 'react' +import { ellipseAddress } from '../utils/ellipseAddress' +import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' + +const Account = () => { + const { activeAddress } = useWallet() + const algoConfig = getAlgodConfigFromViteEnvironment() + + const networkName = useMemo(() => { + return algoConfig.network === '' ? 'localnet' : algoConfig.network.toLocaleLowerCase() + }, [algoConfig.network]) + + return ( +
+ ) +} + +export default Account diff --git a/examples/s-ts/inject_content/AppCalls.tsx b/examples/s-ts/projects/s-ts-frontend/src/components/AppCalls.tsx similarity index 100% rename from examples/s-ts/inject_content/AppCalls.tsx rename to examples/s-ts/projects/s-ts-frontend/src/components/AppCalls.tsx diff --git a/examples/s-ts/projects/s-ts-frontend/src/components/ConnectWallet.tsx b/examples/s-ts/projects/s-ts-frontend/src/components/ConnectWallet.tsx new file mode 100644 index 0000000..8814cd5 --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/src/components/ConnectWallet.tsx @@ -0,0 +1,86 @@ +import { useWallet, Wallet, WalletId } from '@txnlab/use-wallet-react' +import Account from './Account' + +interface ConnectWalletInterface { + openModal: boolean + closeModal: () => void +} + +const ConnectWallet = ({ openModal, closeModal }: ConnectWalletInterface) => { + const { wallets, activeAddress } = useWallet() + + const isKmd = (wallet: Wallet) => wallet.id === WalletId.KMD + + return ( + +
+

Select wallet provider

+ +
+ {activeAddress && ( + <> + +
+ + )} + + {!activeAddress && + wallets?.map((wallet) => ( + + ))} +
+ +
+ + {activeAddress && ( + + )} +
+ +
+ ) +} +export default ConnectWallet diff --git a/examples/s-ts/projects/s-ts-frontend/src/components/ErrorBoundary.tsx b/examples/s-ts/projects/s-ts-frontend/src/components/ErrorBoundary.tsx new file mode 100644 index 0000000..435bf61 --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/src/components/ErrorBoundary.tsx @@ -0,0 +1,46 @@ +import React, { ReactNode } from 'react' + +interface ErrorBoundaryProps { + children: ReactNode +} + +interface ErrorBoundaryState { + hasError: boolean + error: Error | null +} + +class ErrorBoundary extends React.Component { + constructor(props: ErrorBoundaryProps) { + super(props) + this.state = { hasError: false, error: null } + } + + static getDerivedStateFromError(error: Error): ErrorBoundaryState { + // Update state so the next render will show the fallback UI. + return { hasError: true, error: error } + } + + render(): ReactNode { + if (this.state.hasError) { + // You can render any custom fallback UI + return ( +
+
+
+

Error occured

+

+ {this.state.error?.message.includes('Attempt to get default algod configuration') + ? 'Please make sure to set up your environment variables correctly. Create a .env file based on .env.template and fill in the required values. This controls the network and credentials for connections with Algod and Indexer.' + : this.state.error?.message} +

+
+
+
+ ) + } + + return this.props.children + } +} + +export default ErrorBoundary diff --git a/examples/s-ts/projects/s-ts-frontend/src/components/Transact.tsx b/examples/s-ts/projects/s-ts-frontend/src/components/Transact.tsx new file mode 100644 index 0000000..59d7cdd --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/src/components/Transact.tsx @@ -0,0 +1,80 @@ +import { algo, AlgorandClient } from '@algorandfoundation/algokit-utils' +import { useWallet } from '@txnlab/use-wallet-react' +import { useSnackbar } from 'notistack' +import { useState } from 'react' +import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs' + +interface TransactInterface { + openModal: boolean + setModalState: (value: boolean) => void +} + +const Transact = ({ openModal, setModalState }: TransactInterface) => { + const [loading, setLoading] = useState(false) + const [receiverAddress, setReceiverAddress] = useState('') + + const algodConfig = getAlgodConfigFromViteEnvironment() + const algorand = AlgorandClient.fromConfig({ algodConfig }) + + const { enqueueSnackbar } = useSnackbar() + + const { transactionSigner, activeAddress } = useWallet() + + const handleSubmitAlgo = async () => { + setLoading(true) + + if (!transactionSigner || !activeAddress) { + enqueueSnackbar('Please connect wallet first', { variant: 'warning' }) + return + } + + try { + enqueueSnackbar('Sending transaction...', { variant: 'info' }) + const result = await algorand.send.payment({ + signer: transactionSigner, + sender: activeAddress, + receiver: receiverAddress, + amount: algo(1), + }) + enqueueSnackbar(`Transaction sent: ${result.txIds[0]}`, { variant: 'success' }) + setReceiverAddress('') + } catch (e) { + enqueueSnackbar('Failed to send transaction', { variant: 'error' }) + } + + setLoading(false) + } + + return ( + +
+

Send payment transaction

+
+ { + setReceiverAddress(e.target.value) + }} + /> +
+ + +
+
+
+ ) +} + +export default Transact diff --git a/examples/s-ts/projects/s-ts-frontend/src/contracts/HelloWorld.ts b/examples/s-ts/projects/s-ts-frontend/src/contracts/HelloWorld.ts new file mode 100644 index 0000000..36f013c --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/src/contracts/HelloWorld.ts @@ -0,0 +1,581 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^7 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app' +import { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56' +import { + AppClient as _AppClient, + AppClientMethodCallParams, + AppClientParams, + AppClientBareCallParams, + CallOnComplete, + AppClientCompilationParams, + ResolveAppClientByCreatorAndName, + ResolveAppClientByNetwork, + CloneAppClientParams, +} from '@algorandfoundation/algokit-utils/types/app-client' +import { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer' +import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' +import SimulateResponse = modelsv2.SimulateResponse + +export const APP_SPEC: Arc56Contract = {"name":"HelloWorld","structs":{},"methods":[{"name":"hello","args":[{"type":"string","name":"name"}],"returns":{"type":"string"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":0},"local":{"ints":0,"bytes":0}},"keys":{"global":{},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[37],"errorMessage":"OnCompletion must be NoOp && can only call when creating"},{"pc":[26],"errorMessage":"OnCompletion must be NoOp && can only call when not creating"},{"pc":[47],"errorMessage":"invalid array length header"},{"pc":[55],"errorMessage":"invalid number of bytes for arc4.dynamic_array"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgSGVsbG9Xb3JsZCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2hlbGxvX3JvdXRlQDMKICAgIGVycgoKbWFpbl9oZWxsb19yb3V0ZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gaGVsbG8obmFtZTogc3RyaW5nKTogc3RyaW5nIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiBoZWxsbwoKbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oZWxsb193b3JsZC9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBIZWxsb1dvcmxkIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czo6SGVsbG9Xb3JsZC5oZWxsb1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmhlbGxvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2hlbGxvX3dvcmxkL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gaGVsbG8obmFtZTogc3RyaW5nKTogc3RyaW5nIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgcHVzaGludCAwIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czo1CiAgICAvLyByZXR1cm4gYEhlbGxvLCAke25hbWV9YAogICAgcHVzaGJ5dGVzICJIZWxsbywgIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaGVsbG9fd29ybGQvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBoZWxsbyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcgewogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="},"byteCode":{"approval":"CzEbQQAYgAQCvs4RNhoAjgEAAQAxGRQxGBBEQgALMRkUMRgUEESBAUM2GgFJgQBZgQIISwEVEkRXAgCAB0hlbGxvLCBMUEkVFlcGAkxQgAQVH3x1TFCwgQFD","clear":"C4EBQw=="},"compilerInfo":{"compiler":"puya","compilerVersion":{"major":5,"minor":3,"patch":2}},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +/** + * The argument types for the HelloWorld contract + */ +export type HelloWorldArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'hello(string)string': { + name: string + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'hello(string)string': [name: string] + } +} + +/** + * The return type for each method + */ +export type HelloWorldReturns = { + 'hello(string)string': string +} + +/** + * Defines the types of available calls and state of the HelloWorld smart contract. + */ +export type HelloWorldTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'hello(string)string' | 'hello', { + argsObj: HelloWorldArgs['obj']['hello(string)string'] + argsTuple: HelloWorldArgs['tuple']['hello(string)string'] + returns: HelloWorldReturns['hello(string)string'] + }> +} + +/** + * Defines the possible abi call signatures. + */ +export type HelloWorldSignatures = keyof HelloWorldTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type HelloWorldNonVoidMethodSignatures = keyof HelloWorldTypes['methods'] extends infer T ? T extends keyof HelloWorldTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the HelloWorld smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = HelloWorldTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the HelloWorld smart contract to the method's return type + */ +export type MethodReturn = HelloWorldTypes['methods'][TSignature]['returns'] + + +/** + * Defines supported create method params for this smart contract + */ +export type HelloWorldCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type HelloWorldDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: HelloWorldCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the HelloWorld smart contract + */ +export abstract class HelloWorldParamsFactory { + /** + * Constructs a no op call for the hello(string)string ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static hello(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'hello(string)string' as const, + args: Array.isArray(params.args) ? params.args : [params.args.name], + } + } +} + +/** + * A factory to create and deploy one or more instance of the HelloWorld smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class HelloWorldFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `HelloWorldFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new HelloWorldClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new HelloWorldClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the HelloWorld smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: HelloWorldDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new HelloWorldClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the HelloWorld smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the HelloWorld smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the HelloWorld smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new HelloWorldClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the HelloWorld smart contract + */ +export class HelloWorldClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `HelloWorldClient` + * + * @param appClient An `AppClient` instance which has been created with the HelloWorld app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `HelloWorldClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Checks for decode errors on the given return value and maps the return value to the return type for the given method + * @returns The typed return value or undefined if there was no value + */ + decodeReturnValue(method: TSignature, returnValue: ABIReturn | undefined) { + return returnValue !== undefined ? getArc56ReturnValue>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined + } + + /** + * Returns a new `HelloWorldClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new HelloWorldClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `HelloWorldClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new HelloWorldClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the HelloWorld smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(HelloWorldParamsFactory.hello(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the HelloWorld smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + hello: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(HelloWorldParamsFactory.hello(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the HelloWorld smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the HelloWorld smart contract using the `hello(string)string` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + hello: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(HelloWorldParamsFactory.hello(params)) + return {...result, return: result.return as unknown as (undefined | HelloWorldReturns['hello(string)string'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new HelloWorldClient(this.appClient.clone(params)) + } + + /** + * Methods to access state for the current HelloWorld app + */ + state = { + } + + public newGroup(): HelloWorldComposer { + const client = this + const composer = this.algorand.newGroup() + let promiseChain:Promise = Promise.resolve() + const resultMappers: Array any)> = [] + return { + /** + * Add a hello(string)string method call against the HelloWorld contract + */ + hello(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hello(params))) + resultMappers.push((v) => client.decodeReturnValue('hello(string)string', v)) + return this + }, + /** + * Add a clear state call to the HelloWorld contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + } + } + } as unknown as HelloWorldComposer + } +} +export type HelloWorldComposer = { + /** + * Calls the hello(string)string ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + hello(params?: CallParams): HelloWorldComposer<[...TReturns, HelloWorldReturns['hello(string)string'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the HelloWorld smart contract. + * + * @param args The arguments for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): HelloWorldComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): HelloWorldComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type HelloWorldComposerResults = Expand + diff --git a/examples/s-ts/projects/s-ts-frontend/src/contracts/README.md b/examples/s-ts/projects/s-ts-frontend/src/contracts/README.md new file mode 100644 index 0000000..04629b1 --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/src/contracts/README.md @@ -0,0 +1,14 @@ +## How to connect my web app with Algorand smart contracts? + +The following folder is reserved for the Algorand Application Clients. The clients are used to interact with instances of Algorand Smart Contracts (ASC1s) deployed on-chain. + +To integrate this react frontend template with your smart contracts codebase, perform the following steps: + +1. Generate the typed client using `algokit generate client -l typescript -o {path/to/this/folder}` or using the dedicated `link` command `algokit project link` (ensure to invoke it from the root of this react project). Using the `link` command is especially useful within workspaces that have multiple contract projects. +2. The generated typescript client should be ready to be imported and used in this react frontend template, making it a full fledged dApp. + +> Please note, by default this template defines `"generate:app-clients": "algokit project link --all"` which is a shortcut to automatically link TEAL code from all `contract` projects in the workspace as typed clients into the `frontend` project that is invoking the `link` command. Refer to [documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/project/link.md) to read more about `link` command. + +## **How to interact with the smart contract?** + +The generated client provides a set of functions that can be used to interact with the ABI (Application Binary Interface) compliant Algorand smart contract. For example, if the smart contract has a function called `hello`, the generated client will have a function called `hello` that can be used to interact with the smart contract. Refer to a [full-stack end-to-end starter template](https://github.com/algorandfoundation/algokit-fullstack-template) for a reference example on invoking and interacting with typescript typed clients generated. diff --git a/examples/s-ts/projects/s-ts-frontend/src/interfaces/network.ts b/examples/s-ts/projects/s-ts-frontend/src/interfaces/network.ts new file mode 100644 index 0000000..a458edc --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/src/interfaces/network.ts @@ -0,0 +1,26 @@ +import { AlgoClientConfig } from '@algorandfoundation/algokit-utils/types/network-client' +import type { TokenHeader } from 'algosdk/dist/types/client/urlTokenBaseHTTPClient' + +export interface AlgoViteClientConfig extends AlgoClientConfig { + /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ + server: string + /** The port to use e.g. 4001, 443, etc. */ + port: string | number + /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ + token: string | TokenHeader + /** String representing current Algorand Network type (testnet/mainnet and etc) */ + network: string +} + +export interface AlgoViteKMDConfig extends AlgoClientConfig { + /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */ + server: string + /** The port to use e.g. 4001, 443, etc. */ + port: string | number + /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */ + token: string | TokenHeader + /** KMD wallet name */ + wallet: string + /** KMD wallet password */ + password: string +} diff --git a/examples/s-ts/projects/s-ts-frontend/src/main.tsx b/examples/s-ts/projects/s-ts-frontend/src/main.tsx new file mode 100644 index 0000000..431a30c --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/src/main.tsx @@ -0,0 +1,13 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App' +import './styles/App.css' +import ErrorBoundary from './components/ErrorBoundary' + +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + + + + + , +) diff --git a/examples/s-ts/projects/s-ts-frontend/src/styles/App.css b/examples/s-ts/projects/s-ts-frontend/src/styles/App.css new file mode 100644 index 0000000..ee2b188 --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/src/styles/App.css @@ -0,0 +1,126 @@ +/* App.css */ + +.hero { + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; + background-color: #38b2ac; +} + +.hero-content { + text-align: center; + border-radius: 0.5rem; + padding: 1.5rem; + max-width: 24rem; + background-color: #ffffff; + margin: 0 auto; +} + +.text-4xl { + font-size: 2.25rem; + line-height: 2.5rem; +} + +.font-bold { + font-weight: 700; +} + +.py-6 { + padding-top: 1.5rem; + padding-bottom: 1.5rem; +} + +.grid { + display: grid; +} + +.btn { + margin: 0.5rem; +} + +.btn-primary { + background-color: #1a202c; + color: #fff; +} + +.divider { + border-top: 1px solid #e2e8f0; + margin-top: 1rem; + margin-bottom: 1rem; +} + +.modal { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: rgba(0, 0, 0, 0.6); + display: none; + z-index: 9999; + overflow: auto; +} + +.modal-open { + display: block; +} + +.modal-box { + margin: 2.5em auto; + background: #fff; + border-radius: 0.5em; + width: 40em; + max-width: 90vw; + padding: 1em; +} + +.font-bold { + font-weight: bold; +} + +.text-2xl { + font-size: 1.5rem; +} + +.m-2 { + margin: 0.5rem; +} + +.pt-5 { + padding-top: 1.25rem; +} + +.grid { + display: grid; +} + +.btn { + margin: 0.5rem; + padding: 0.5rem 1rem; + background-color: #00aba2; + color: #fff; +} + +.btn-warning { + background-color: #d69e2e; +} + +.border-1 { + border-width: 1px; +} + +.border-teal-800 { + border-color: #2c7a7b; +} + +.modal-action { + display: grid; + margin-top: 1rem; +} + +.divider { + border-top: 1px solid #e2e8f0; + margin-top: 1rem; + margin-bottom: 1rem; +} diff --git a/examples/s-ts/projects/s-ts-frontend/src/utils/ellipseAddress.ts b/examples/s-ts/projects/s-ts-frontend/src/utils/ellipseAddress.ts new file mode 100644 index 0000000..db97e48 --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/src/utils/ellipseAddress.ts @@ -0,0 +1,3 @@ +export function ellipseAddress(address: string | null, width = 6): string { + return address ? `${address.slice(0, width)}...${address.slice(-width)}` : (address ?? '') +} diff --git a/examples/s-ts/projects/s-ts-frontend/src/utils/network/getAlgoClientConfigs.ts b/examples/s-ts/projects/s-ts-frontend/src/utils/network/getAlgoClientConfigs.ts new file mode 100644 index 0000000..b5121f8 --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/src/utils/network/getAlgoClientConfigs.ts @@ -0,0 +1,41 @@ +import { AlgoViteClientConfig, AlgoViteKMDConfig } from '../../interfaces/network' + +export function getAlgodConfigFromViteEnvironment(): AlgoViteClientConfig { + if (!import.meta.env.VITE_ALGOD_SERVER) { + throw new Error('Attempt to get default algod configuration without specifying VITE_ALGOD_SERVER in the environment variables') + } + + return { + server: import.meta.env.VITE_ALGOD_SERVER, + port: import.meta.env.VITE_ALGOD_PORT, + token: import.meta.env.VITE_ALGOD_TOKEN, + network: import.meta.env.VITE_ALGOD_NETWORK, + } +} + +export function getIndexerConfigFromViteEnvironment(): AlgoViteClientConfig { + if (!import.meta.env.VITE_INDEXER_SERVER) { + throw new Error('Attempt to get default algod configuration without specifying VITE_INDEXER_SERVER in the environment variables') + } + + return { + server: import.meta.env.VITE_INDEXER_SERVER, + port: import.meta.env.VITE_INDEXER_PORT, + token: import.meta.env.VITE_INDEXER_TOKEN, + network: import.meta.env.VITE_ALGOD_NETWORK, + } +} + +export function getKmdConfigFromViteEnvironment(): AlgoViteKMDConfig { + if (!import.meta.env.VITE_KMD_SERVER) { + throw new Error('Attempt to get default kmd configuration without specifying VITE_KMD_SERVER in the environment variables') + } + + return { + server: import.meta.env.VITE_KMD_SERVER, + port: import.meta.env.VITE_KMD_PORT, + token: import.meta.env.VITE_KMD_TOKEN, + wallet: import.meta.env.VITE_KMD_WALLET, + password: import.meta.env.VITE_KMD_PASSWORD, + } +} diff --git a/examples/s-ts/projects/s-ts-frontend/src/vite-env.d.ts b/examples/s-ts/projects/s-ts-frontend/src/vite-env.d.ts new file mode 100644 index 0000000..67c2d30 --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/src/vite-env.d.ts @@ -0,0 +1,24 @@ +/// + +interface ImportMetaEnv { + readonly VITE_ENVIRONMENT: string + + readonly VITE_ALGOD_TOKEN: string + readonly VITE_ALGOD_SERVER: string + readonly VITE_ALGOD_PORT: string + readonly VITE_ALGOD_NETWORK: string + + readonly VITE_INDEXER_TOKEN: string + readonly VITE_INDEXER_SERVER: string + readonly VITE_INDEXER_PORT: string + + readonly VITE_KMD_TOKEN: string + readonly VITE_KMD_SERVER: string + readonly VITE_KMD_PORT: string + readonly VITE_KMD_PASSWORD: string + readonly VITE_KMD_WALLET: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/examples/s-ts/projects/s-ts-frontend/tsconfig.json b/examples/s-ts/projects/s-ts-frontend/tsconfig.json new file mode 100644 index 0000000..443b6bd --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/tsconfig.json @@ -0,0 +1,38 @@ +{ + "compilerOptions": { + "target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + "module": "ES2022" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + "declaration": true /* Generates corresponding '.d.ts' file. */, + "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, + "sourceMap": true /* Generates corresponding '.map' file. */, + "strict": true /* Enable all strict type-checking options. */, + "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, + "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, + "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */, + "skipLibCheck": true /* Skip type checking of declaration files. */, + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, + "allowJs": false, + "allowSyntheticDefaultImports": true, + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "outDir": "./dist/" + }, + "include": [ + "src/**/*.ts", + "src/**/*.tsx", + "vite.config.js", + "src/utils/", + "src/utils/", + "src/main.tsx", + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/examples/s-ts/projects/s-ts-frontend/tsconfig.node.json b/examples/s-ts/projects/s-ts-frontend/tsconfig.node.json new file mode 100644 index 0000000..9d31e2a --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/examples/s-ts/projects/s-ts-frontend/vite.config.ts b/examples/s-ts/projects/s-ts-frontend/vite.config.ts new file mode 100644 index 0000000..e42dc7c --- /dev/null +++ b/examples/s-ts/projects/s-ts-frontend/vite.config.ts @@ -0,0 +1,15 @@ +import react from '@vitejs/plugin-react' +import { defineConfig } from 'vite' +import { nodePolyfills } from 'vite-plugin-node-polyfills' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + react(), + nodePolyfills({ + globals: { + Buffer: true, + }, + }), + ], +}) diff --git a/tests/test_templates.py b/tests/test_templates.py index e3bc46b..0953c86 100644 --- a/tests/test_templates.py +++ b/tests/test_templates.py @@ -28,6 +28,7 @@ TEST_ARGS = ["algokit", "project", "run", "test"] LINT_ARGS = ["algokit", "project", "run", "lint"] DEFAULT_CHILD_TEMPLATE_REF = "prep/beta-release" +CONTRACT_TEMPLATES_WITH_BETA_REF = {"python", "typescript"} def _load_copier_yaml(path: Path) -> dict[str, str | bool | dict]: @@ -243,8 +244,13 @@ def get_answered_questions_from_copier_yaml( "FRONTEND_TEMPLATE_REF", DEFAULT_CHILD_TEMPLATE_REF ) contract_template_url = os.getenv("CONTRACT_TEMPLATE_URL") + default_contract_template_ref = ( + DEFAULT_CHILD_TEMPLATE_REF + if contract_template in CONTRACT_TEMPLATES_WITH_BETA_REF + else None + ) contract_template_ref = os.getenv( - "CONTRACT_TEMPLATE_REF", DEFAULT_CHILD_TEMPLATE_REF + "CONTRACT_TEMPLATE_REF", default_contract_template_ref ) contract_template_url = os.getenv( f"{contract_template.upper()}_CONTRACT_TEMPLATE_URL", contract_template_url